|
1
68
有很多方法可以做到 primality test . 实际上没有数据结构可供您查询。如果你有很多数字要测试,你应该运行一个 probabilistic test 因为它们更快,然后用 deterministic test 以确保数字是质数。 你应该知道,最快的算法背后的数学并不适合胆小的人。 |
|
|
2
188
一般素数测试的最快算法是 AKS . 维基百科的文章对它进行了详细的描述,并链接到了原文。 如果你想找到大的数字,可以研究具有特殊形式的素数,比如 Mersenne primes . 我通常实现的算法(易于理解和编码)如下(在python中):
这是经典的变种
有时,如果我真的想要速度和 范围有限 ,我实现了一个基于 Fermat's little theorem . 如果我真的想要更快的速度(即完全避免O(sqrt(n))算法),我会预先计算误报(请参见 Carmichael 然后进行二进制搜索。这是迄今为止我实现的最快的测试,唯一的缺点是范围有限。 |
|
3
24
在我看来,最好的方法是使用以前的方法。
有第一个列表
如果你想要一个真正的算法来制作你自己的素数,维基百科有很多关于素数的好东西。 here ,包括指向各种方法的链接,以及基本测试 here 基于概率和快速确定性方法。 我们应该齐心协力找到最初的十亿个(甚至更多)素数,并把它们发布到网上某个地方,这样人们就可以一次又一次地停止做同样的工作,而且……:-) |
|
|
4
8
|
|
|
5
6
根据维基百科,
the Sieve of Eratosthenes
有
complexity
|
|
|
6
4
在python 3中:
说明: 质数是一个只能被自身和1除尽的数。EX:2,3,5,7… 1)如果a;lt;2: 如果“a”小于2,则不是质数。 2)ELIF A!=2和a%2==0: 如果“a”可以被2除,那么它绝对不是素数。但是如果a=2,我们不想计算它,因为它是质数。因此,条件A!= 2 3)返回所有(范围(3,int(a)中i的%i 0.5)+1):**首先看一下all()命令在python中的作用。 从3开始,我们将“a”除以它的平方根(a**0.5)。如果“a”可分割,则输出将为假。 为什么是平方根?假设a=16。16的平方根=4。我们到15点才需要评估。我们只需要查到4点就可以知道这不是一个素数。 额外的: 查找一个范围内所有素数的循环。
|
|
|
7
3
可以用sympy .
来自sympy医生。第一步是寻找琐碎的因素,如果找到这些因素,可以快速返回。接下来,如果筛子足够大,则对筛子进行二分搜索。对于较小的数字,使用已知在其范围内没有反例的基来执行一组确定性米勒-拉宾测试。最后,如果数字大于2^64,则执行强BPSW测试。虽然这是一个可能的素数检验,我们相信反例存在,但没有已知的反例。 |
|
|
8
2
参加聚会太晚了,但希望这能有所帮助。如果你正在寻找大素数,这是相关的: 要测试大奇数,需要使用费马测试和/或米勒-拉宾测试。
这些测试使用了非常昂贵的模块化求幂,因为
所以在使用大炮之前,你需要做一些试验性的划分。但不要天真地这么做,有一种方法可以很快做到。 首先,将尽可能多的素数相乘到一个你用来表示大整数的词中。如果使用32位字,将3*5*7*11*13*17*19*23*29=3234846615相乘,然后用欧几里得算法测试的数字计算最大公因数。在第一步之后,该数字将减小到字大小以下,并在不执行完整的大整数除法的情况下继续该算法。如果是GCD!=1,这意味着你们相乘的一个素数除以这个数,所以你们有一个证据证明它不是素数。然后继续31*37*41*43*47=95041567,依此类推。 一旦你以这种方式测试了几百(或数千)个素数,你可以做40轮米勒拉宾测试来确认这个数字是素数,40轮之后你可以确定这个数字是素数,只有2^-80的机会不是(这更可能是你的硬件故障…)。 |
|
|
9
2
我比较了最流行的建议的效率,以确定一个数字是否是素数。我用过
第一个图比较了函数(在我的答案中会进一步解释),显示增加数字时,最后一个函数的增长速度不如第一个函数。
在第二个图中,我们可以看到,在素数的情况下,时间是稳定增长的,但非素数在时间上并没有那么快的增长(因为它们中的大多数可以在早期被消除)。
以下是我使用的功能:
下面是我的脚本,用于比较变量:
运行函数
然后,运行函数
我使用以下脚本绘制结果:
|
|
|
10
1
Python 3:
|
|
|
11
1
我有一个基本函数,它一直工作到(2^61)-1这里:
说明:
这个
这个
这个
例如:
这个
最后,
有关范围的更多信息,请查看此 website !
这个
希望这有帮助:) |
|
12
1
在蟒蛇中:
从数学形式主义到Python的更直接的转换将使用 所有(n%p!= 0… 但这需要对P的所有值进行严格的评估。 没有任何 如果找到真值,版本可以提前终止。 |
|
|
13
1
素数javascript的最佳算法
|
|
|
14
1
对于大数字,您不能简单地检查候选数字n是否可以被小于sqrt(n)的任何数字整除。有更多可扩展的测试可用,例如 Miller-Rabin primality test . 下面是Python中的实现:
你可以用它找到巨大的质数:
如果要测试随机整数,可能需要先测试候选数是否可以被小于1000的素数整除,然后再调用Miller Rabin。这将帮助您过滤掉明显的非素数,如10444344345。 |
|
|
15
0
类似于前面提到的AKS算法
|
|
|
16
0
找出一个范围内的一个或多个数字是否是质数。
|
|
|
17
0
|
|
|
18
0
你可以试试这个。
|
|
|
19
0
以前的大多数答案都是正确的,但这里还有一种方法可以检验一个数是素数。作为补充, 素数 是大于1的整数,其唯一因子是1及其本身。( source ) 解决方案: 通常,您可以构建一个循环并开始测试您的数字,看看它是否可以被1、2、3…整除到您正在测试的数字…等等,但是为了减少检查时间,您可以将数字除以数字值的一半,因为一个数字不能被超过一半的值整除。 例如,如果你想看到100是一个质数,你可以循环到50。 实际代码 :
|
|
|
20
0
我们可以使用Java流在O(Sqt(n))中实现这一点;考虑到非EMATCH是一种短路方法,当发现不需要用于确定结果时,停止该操作:
|
|
|
21
0
在Java-8流和lambda的帮助下,只需几行代码即可实现:
性能应接近 o(qRT(n)) . 也许有人觉得它有用。 |
|
|
22
0
这是我的答案:
如果下面的任何属性为true,则函数将返回true。这些性质在数学上定义了素数是什么。
|
|
|
23
-1
最小的记忆?这不是最小的,而是朝着正确的方向迈出的一步。
当然,您必须指定
|
|
|
24
-1
我认为最快的方法之一就是我的方法。
|
|
|
25
-1
|
|
|
26
-3
质数的第一个规则:如果除以2等于整数,则不等于质数。 要知道使用任何计算机语言最快的方法是使用字符串而不是数学进行类型匹配。匹配字符串浮点数。
|