C++ 素性检验的最快算法

C++ 素性检验的最快算法,c++,algorithm,math,primes,C++,Algorithm,Math,Primes,我需要测试真正大的数之间的间隔的素性(在长-长的范围内),所以我需要一些快速算法来检查一个数是否为素数。请提出你的想法。我想出了一个非常好的算法,比检查所有除数要快得多——当然,这也让我破解了公钥加密 等等,我只需要关上窗户,头顶上有所有这些黑色的直升机 (或看看)一个好方法是测试。然而,应该注意的是,这只是一个概率测试。最快的可能是在预计算的素数列表中查找它。看,他们有多达2^43112609-1(已知的最大素数)。我认为渐近最快的电流(非概率)素数测试是“Lenstra/Pomerance改

我需要测试真正大的数之间的间隔的素性(在长-长的范围内),所以我需要一些快速算法来检查一个数是否为素数。请提出你的想法。

我想出了一个非常好的算法,比检查所有除数要快得多——当然,这也让我破解了公钥加密

等等,我只需要关上窗户,头顶上有所有这些黑色的直升机


(或看看)

一个好方法是测试。然而,应该注意的是,这只是一个概率测试。

最快的可能是在预计算的素数列表中查找它。看,他们有多达2^43112609-1(已知的最大素数)。

我认为渐近最快的电流(非概率)素数测试是“Lenstra/Pomerance改进AKS”,其复杂性本质上是O(n^6)

但是,
long
(假设一个典型的系统是64位整数)的范围实际上并没有那么大。特别是,只有约2亿个素数小于2^32,因此在该范围内,使用快速概率测试,然后使用预计算的素数列表进行试除法(或者仅在素数列表中查找数字,如果有)将非常快,这可能是正确的方法。

我建议使用该算法的。我已经用了几个月了,速度非常快


具体来说,函数mpz_probab_prime_p可以实现这一点,您还可以使用另一个函数mpz_nexttime来查找下一个大于一个数的素数。如果您愿意,我可以发布代码示例。

Cobbal和grokus是对的。Miller-Rabin测试是可用算法中最有用的。是的,这是可能的,但真的不应该吓跑你。该测试是最广泛用于实际目的的测试


请注意,通过重复测试,误报概率(没有误报)可以任意降低。

请看我的答案:


考试很快。如果您在64位或更小的范围内工作,您可以使用30030的GCD来为大多数数字节省一点时间。

如果您想测试长-长的素性,则是一个不错的选择。这个测试做一个强伪素数测试和一个Lucas测试,因此速度非常快。预计有一些复合材料通过了这项测试,但到目前为止还不知道,当然1015以下也没有例外。例如,在Mathematica中使用了这种测试的一种变体。

我认为最好的算法是“阿里素性测试”。

吉姆·辛克莱证明,对七个基数2、325、9375、28178、450775、9780504、1795265022进行米勒·拉宾测试,可以确定一个小于2^64的数是否为素数。请参阅。

您只需要检查它是素数,还是需要找到它的素数因子?素数因子分解很困难。这就是RSA加密的基础。虽然你没有回答Stephen的问题,所以我假设你只是想测试一个数的素数。你是否需要确定它是否是素数,或者你是否满足于有很高的正确答案概率?这个问题似乎离题了,因为它是关于数论的。试试math.stackexchange.com。分解复合数(破解RSA需要)不同于仅仅测试一个数是否为素数(不一定需要找到任何特定的因子)。事实上,实现RSA需要找到具有数百位数字的素数,这在简单的“检查所有潜在因子”算法中是不可行的。是的,但如果有一种更快的测试素数的方法,你就不会在这里告诉任何人;-)问题是无论如何都要以傻瓜的身份结束。这是行不通的。没有一台计算机有足够的存储空间来保存这么长的列表。根据对
pi(2^64)
@Dietrich的粗略估计,这个列表需要超过十亿GB的存储空间,而不需要压缩。但是OP不需要那么多。在概率测试之后,你不需要进行除法。如果运行probabilist test n迭代,则错误答案的概率为1/2^n,因此如果n=100,则算法将在10^30次中出错1次。与进行试验划分相比,最好只运行更多的概率测试迭代。特别是,在实际硬件上,由于异常高能的宇宙射线翻转寄存器值,概率测试的失败概率不比确定性测试的失败概率差(或其他零星硬件故障)Miller Rabin可以在广义Riemann假设的假设下调整为确定性。由于GRH被广泛认为是正确的,我可以设想一个场景,您在使用此测试时,好像它被证明是确定性的,因为它是迄今为止最快的。@Mark:对于指定的输入范围,我们不需要假设GRH是正确的,我们只需要一个较弱的假设,即M-R的确定性版本在LONGLONG_MAX以下没有误报。这可能更容易证明,尽管我仍然不想尝试通过详尽的测试来证明。