Python 素数计算算法的速度毫无意义
我的问题相当简单,我正在尝试计算第n个素数,但是在我编写的两种方法之间,我希望运行得更快的方法似乎较慢。说实话,这毫无意义。我最初使用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
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++){