Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/kubernetes/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 素数计算算法的速度毫无意义_Python_C_Algorithm - Fatal编程技术网

Python 素数计算算法的速度毫无意义

Python 素数计算算法的速度毫无意义,python,c,algorithm,Python,C,Algorithm,我的问题相当简单,我正在尝试计算第n个素数,但是在我编写的两种方法之间,我希望运行得更快的方法似乎较慢。说实话,这毫无意义。我最初使用python编写了解决方案,代码如下: import time import math start1 = time.time() primes = [2] count = 3 primes_len = 1 while primes_len <= 10001: is_prime = True for i in range(primes_le

我的问题相当简单,我正在尝试计算第n个素数,但是在我编写的两种方法之间,我希望运行得更快的方法似乎较慢。说实话,这毫无意义。我最初使用python编写了解决方案,代码如下:

import time
import math


start1 = time.time()
primes = [2]
count = 3
primes_len = 1
while primes_len <= 10001:
    is_prime = True
    for i in range(primes_len):
        if count % primes[i] == 0:
            is_prime = False
            break
    if is_prime:
        primes_len += 1
        primes.append(count)
    count += 2
print(primes[-1])
end1 = time.time()

start2 = time.time()

listPrime = [2]
upTo = 1000000
isPrime = True

for sayi in range(3, upTo, 2):
    for bölen in range(2,int(math.sqrt(sayi)+1)):

        if (sayi % bölen) == 0:
            isPrime = False
            break

        else:
            isPrime = True

    if isPrime == True :
        listPrime.append(sayi)
        if len(listPrime) == 10001:
            break

print(listPrime[-1])

end2 = time.time()
print(end1-start1)
print(end2-start2)
导入时间
输入数学
start1=time.time()
素数=[2]
计数=3
素数n=1

当素数在第一个循环中时,你忘记了只求平方根。

考虑循环之间的差异

    for(int i = 0; i < primes_found; i++){
for(int i=0;i

对于(int i=2;i test
,这是浪费时间

第二个循环迭代所有的值,直到
sqrt(test)
。这是低效的,因为许多除法候选者本身不是素数

显然,第一种方法的效率低下是最糟糕的


另一种方法是使用素数列表进行迭代,但在
primes[i]*primes[i]>test
1时停止

另请参阅,了解可能更快的方法



1更好:使用
primes[i]>test/primes[i]
避免溢出。

简单:第一个不会在sqrt(n)处停止。
#include <stdio.h>
#include <time.h> 
#include <stdlib.h>
#include <math.h>

int main(int argc, char **argv){
    if(argc != 2){
        printf("You must provide one argument as the nth prime to calculate");
        return 0;
    }

    clock_t begin = clock();
    long LIMIT = strtol(argv[1], NULL, 10);;
    int count = 3;
    int primes_found = 1;
    int primes[LIMIT];
    primes[0] = 2;
    int is_prime;
    while(primes_found < LIMIT){
        is_prime = 1;
        for(int i = 2; i <= (int) sqrt(count); i++){
            if(count % i == 0){
                is_prime = 0;
                break;
            }
        }
        if(is_prime == 1){
            primes[primes_found] = count;
            primes_found += 1;
        }
        count += 2;
    }
    printf("%d\n", primes[LIMIT - 1]);
    clock_t end = clock();
    double time_spent = (double)(end - begin) / CLOCKS_PER_SEC;
    printf("%f\n", time_spent);
    return 0;
}
    for(int i = 0; i < primes_found; i++){
    for(int i = 2; i <= (int) sqrt(count); i++){