Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 寻找64位以上数字的快速确定素性测试_Algorithm_Math_Primes - Fatal编程技术网

Algorithm 寻找64位以上数字的快速确定素性测试

Algorithm 寻找64位以上数字的快速确定素性测试,algorithm,math,primes,Algorithm,Math,Primes,我一直在寻找确定一个数字是否为素数的方法,但大多数方法要么是概率的(Miller-Rabin),要么是小于64位的数字 另一种解决方案是使用蛮力方法,并进行一些改进或筛选,但当数字超过64位阈值时,这两种方法都不是很有效。您要查找的内容不存在。没有一种简单的确定素性测试能够始终适用于所有整数范围 你已经知道米勒-拉宾测试了。它可以确定特定的范围;有关详细信息,请参阅或。如果假设Riemann假设,那么n是素数,如果n是所有整数a的a-SPRP(Miller强伪素数),且1

我一直在寻找确定一个数字是否为素数的方法,但大多数方法要么是概率的(Miller-Rabin),要么是小于64位的数字


另一种解决方案是使用蛮力方法,并进行一些改进或筛选,但当数字超过64位阈值时,这两种方法都不是很有效。

您要查找的内容不存在。没有一种简单的确定素性测试能够始终适用于所有整数范围

你已经知道米勒-拉宾测试了。它可以确定特定的范围;有关详细信息,请参阅或。如果假设Riemann假设,那么n是素数,如果n是所有整数a的a-SPRP(Miller强伪素数),且1 对于n到2128的数字,计算n的系数并不难− 1并使用Pocklington测试来证明素性。您可以使用试用除法、Pollard rho或ECM来执行因式分解。还有一些测试()可以基于部分因子分解证明素性。更大的n也可以用Pocklington检验证明为素数,尽管有时分解会变得困难


对于高达101000的n,快速ECPP素数测试并非不合理,但对于该范围内的较大数字,可能需要一段时间。除此之外,除非你的数字有某种特殊的形式,否则你的运气很差。

我假设你想要的是一个可证明正确的答案,而不是完全避免随机性

  • 进行几轮米勒-拉宾素性测试。如果失败,你知道这个数字是复合的,你就完成了
  • 因式分解n-1。为此,最简单的是Pollard的rho算法。如果速度不够快,使用二次筛
  • 使用相同的方法递归检查因子是否为素数。如果它们是复合的,继续分解它们
  • 使用Lucas素性检验:尝试找到n-1阶模n的乘法群的生成元。选取一个随机数a,检查a^(n-1)=1(mod n),以及a^((n-1)/p)≠ 1(mod n)表示n-1的所有素因子p。如果这是真的,a是一个生成器,n是一个可证明的素数,那么就完成了
  • 如果n为素数,则成功找到生成器的概率为(1-1/p1)(1-1/p2)。。。其中p1,p2。。。是n-1的不同素因子。这至少是1/O(日志n)。所以在O(logn)尝试之后,你应该成功地证明了n是素数
  • 如果你一直无法证明n是素数,回到步骤1。也许它毕竟是复合材料

  • 数字的长度有上限吗?例如,65位、28位、2000万位……目前,如果可能的话,我希望能够至少达到128位。您的计算机故障概率有限,因此给出了错误的答案。如果您运行了足够多的M-R测试,那么您可以确保计算机出现故障的可能性比M-R测试更大,从而为您提供了一个复合数字。另一种选择是看一看,这是确定的,但可能很慢。但有多少会“足够”?@罗伯特。M-R测试将质数报告为复合数的可能性为25%。如果运行
    n
    独立的M-R测试,则有
    2^(-2n)
    的可能是组合被错误地标记为素数。因此,如果你对一个数字运行128次测试,那么它被错误地标记为素数的可能性是1/2^256。实际上,我确实希望完全避免随机性。我想百分之百肯定(除了电脑错误)的答案。。。然而,如果我也想要速度,这似乎很难或不可能。这个算法使用随机性,但它只影响性能,而不影响正确性。一旦它产生了答案,答案是100%保证是正确的。如果你想有一个确定性的版本,你可以使用“1,2,3,4,…”而不是随机数,或一些简单的伪随机序列。在这种情况下,很难证明它需要多长时间,但它仍然有效。好吧,但米勒拉宾的问题是,如果它说一个数字是复合的,它总是对的,但如果它说这个数字是素数,它就不对了,对吗?如果我沿着1,2,3,4的路线走下去,它会不会比蛮力法更糟糕呢?可以证明,如果你随机选择你的基数,米勒-拉宾法至少会在3/4的时间内有效(证明这个数字是复合的),而卢卡斯法至少会在1/O的时间内有效(证明这个数字是素数)。两者都是“合理的经常”。如果你按照1,2,3,4的顺序进行,证明并不十分有效,但在实践中,你也可能同样快速地找到一个工作基础。它们只是很多,没有先验的理由认为小数字不太可能起作用。我将在我的博客上查看这个Pocklington测试,我有和。