我在python中写了两个素数测试。第一个是基于试验分割,第二个是使用Eratosthenes的筛子。我的理解是,筛子的时间复杂度应该比试验时小,因此筛子应该渐近更快。
然而,当我运行它时,试验分裂要快得多。例如,当Test.xml
时,XSD
只需不到一秒钟,但n = 6*(10**11)
几乎永远不会结束!我把筛子写错了吗?
我的代码是:
is_prime(n)
答案 0 :(得分:2)
对于Erastothenes的筛子,您每次都要重新计算筛子。应该缓存筛子,以便您只生成一次。当您构建筛子一次然后执行许多素性检查时,它可以正常工作;如果你只检查一个号码,效率非常低。
顺便说一句,这意味着您需要预测最高素数并生成最多该数字的筛选表。
完成后,is_prime_sieve
变为简单:
def is_prime_sieve(n):
return prime[n]
您不需要while
循环。
答案 1 :(得分:1)
筛子从1到n找到所有素数。计算一个筛子比对这些数字进行试验分割要快得多。显然,如果您确定从1到n的所有素数,然后丢弃前n-1个数字的所有信息,那效率非常低。
这就像比较公共汽车和双座跑车的速度。如果您需要从A到B需要五十个人,公共汽车要快得多。如果您乘坐一名乘客,猜猜是什么,跑车速度更快。
答案 2 :(得分:0)
但是,即使采用传统的建造筛子的方法,仍然发生了太多的交易。 我已经开发出一种提取素数而无需除法(数据管理目的除外)的方法,以适应Eratosthenes的基本筛选。我不必设置任何上限或下限,该算法是完全开放式的。我开发了一个数据字符串,可以从该字符串中计算出范围内的任何位置,并提取子集范围内的所有素数。我不浪费除法运算。