SICP,费马测试问题

时间:2015-09-11 15:29:32

标签: algorithm sicp

SICP的

Section 1.2.6描述了费马素数测试的算法如下(我自己的话):

测试n是否为素数:

  1. a1 包含之间选择一个随机整数n-1
  2. 如果a^n %n = a,那么n可能是素数。
  3. 我坚持的部分是我们允许a = 1这一事实,因为在这种情况下,无论我们选择n(素数与否),测试都会通过。< / p>

2 个答案:

答案 0 :(得分:1)

你是对的;没有理由选择a = 1.也就是说,[1,n-1]上的均匀分布与[2,n-1]上的均匀分布之间的统计距离是O(1 / n) ),所以当n非常大(足够大以至于你不想进行试验分割)时,实际影响非常小(请记住,这已经是一个概率测试,所以很多其他的选择他们也不会工作。

答案 1 :(得分:0)

您链接的文字实际上是(强调我的):

  

费马的小定理:如果n是素数而a是任何小于n的正整数,那么提升到n次幂与模n一致。

     

(如果它们在除以n时具有相同的余数,则两个数字被认为是全等模式。当除以n时,数字a的余数也被称为模n的余数,或者简称为模数n。)

     

如果n不是素数,那么,通常,大多数数字a&lt; n不符合上述关系。这导致用于测试素数的以下算法:给定数n,选择随机数a&lt; n 并计算^ n模n的余数。如果结果不等于a,则n肯定不是素数。如果它是a,那么很有可能n是素数。现在选择另一个随机数a并用相同的方法测试它。如果它也满足等式,那么我们可以更加确信n是素数。 通过尝试越来越多的a值,我们可以增加对结果的信心。此算法称为Fermat测试。

到目前为止,它从未说过实际选择1.但是后来确实如此。我认为这是一个错误,虽然不是一个大问题。即使它对于给定值是正确的,您也应该测试多个值以确定。

pseudocode on Wikipedia使用[2, n - 1]作为范围。您应该在实践中使用此范围(尽管Fermat测试在实践中并未真正使用,因为Miller-Rabin更好)。