这种素数筛的实现是不是适用于所有素数?还是只是侥幸(Python)

Posted

技术标签:

【中文标题】这种素数筛的实现是不是适用于所有素数?还是只是侥幸(Python)【英文标题】:Will this implementation of a prime sieve work for all primes? or is it just a fluke(Python)这种素数筛的实现是否适用于所有素数?还是只是侥幸(Python) 【发布时间】:2016-10-07 19:02:00 【问题描述】:
p = 2
for i in range(3,10000000000000000,2):
    if p%i >= 1:
        print(i)
        p = p*(i*i)

我已经对其进行了测试,它似乎至少可以在前 100 个素数上工作,它会准确地无限期地返回素数吗?(理论上不是字面意思)。

【问题讨论】:

那么你是在问python的数量限制吗?还是大数字的计算错误? 我想知道这是否是一个有效的筛子;它会在每次迭代时打印出一个素数吗? 它说 27 是素数,这是不正确的:27 == 3*3*3 我假设是 Python 3。 它也认为 125 是质数,但是125 == 5*5*5,对于 343 也是如此:343 == 7*7*7 【参考方案1】:

您的限制(除了代码正确性,cmets 已经指出)将基于 Python 允许的最大整数。事实证明,Python 在理论上具有无限的整数精度——受内存限制。

https://docs.python.org/2/library/stdtypes.html#numeric-types-int-float-long-complex

有四种不同的数字类型:纯整数、长整数、[...]。纯整数(也称为整数)在 C 中使用 long 实现,这为它们提供了至少 32 位的精度(sys.maxint 始终设置为当前平台的最大纯整数值,最小值为 -sys.maxint - 1)。长整数具有无限精度。 [...]

所以如果你取 sys.maxint 并增加它,你仍然会得到一个整数:

In [6]: sys.maxsize ** 10
Out[6]: 4455508415646675013373597242420117818453694838130159772560668808816707086990958982033203334310070688731662890013605553436739351074980172000127431349940128178077122187317837794167991459381249L

但是,一旦超出 sys.maxsize,就会有性能损失。

【讨论】:

谢谢!筛子实际上对主要力量不起作用,所以我不得不修理它。仍然有用的信息:) 谢谢@MoonMoon。当我最初阅读这个问题时,我认为它是关于计算限制的。

以上是关于这种素数筛的实现是不是适用于所有素数?还是只是侥幸(Python)的主要内容,如果未能解决你的问题,请参考以下文章

浅谈埃氏筛

素数专题——素数筛法

唯一分解定理

浅谈线性素数筛

LeetCode 204. Count Primes(线性素数筛)

素数筛思想