试验师比Sieve更快进行Primality Test?

时间:2015-06-05 16:53:22

标签: python primality-test

我在python中写了两个素数测试。第一个是基于试验分割,第二个是使用Eratosthenes的筛子。我的理解是,筛子的时间复杂度应该比试验时小,因此筛子应该渐近更快。

然而,当我运行它时,试验分裂要快得多。例如,当Test.xml时,XSD只需不到一秒钟,但n = 6*(10**11)几乎永远不会结束!我把筛子写错了吗?

我的代码是:

is_prime(n)

3 个答案:

答案 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的基本筛选。我不必设置任何上限或下限,该算法是完全开放式的。我开发了一个数据字符串,可以从该字符串中计算出范围内的任何位置,并提取子集范围内的所有素数。我不浪费除法运算。