关闭

随机化素性测试

标签: 算法
252人阅读 评论(0) 收藏 举报
分类:

这是之前看《算法之道》中提及的一个问题。
书中提到的素性测试依赖的理论基础是费马小定理。
定理表述为:如果p是素数,则对于任意整数aapa可以被p整除。
用模算术表示为:
apamodp
同时,因为我们架设p是素数,分解:
apa=a(ap11)
如果a不包含因子p,那ap11一定包含因子p
那么用模算术表示为:
ap11modp


所以如果我们如果要验证n是否为素数,
我们可以选取小于n的正整数a去判断费马小定理是否成立。
如果小定理不成立,那n一定不是素数,
但是如果小定理成立,却不能判断n一定是素数。
也就是说某些合数一样能通过随机化的素性测试。
如果n是合数,那么绝大部分a都不能通过素性测试。


但是卡米克(Carmichael)数是一种能通过所有费马小定理测试。
但是这种数极其稀少,所以如果我们不考虑卡米克数。
书中就说到一个用蒙特卡罗算法来进行素性测试。
并可以使得错误的概率达到任意小的程度。


但是书说了这么一个引理:
如果存在一个相对n为素的a,使得an11modn
则小于n的所有数里至少存在一半(n/2)满足这种条件的整数。


证明:
如果存在整数a,有 an11modn
则对于任意小于n且满足飞马小定理测试的b
整数ab也将使得费马小定理不成立:
(ab)n1an1bn1an11modn


尼玛,这个证明能得出如上结论么?
在我看来最多只能证明,如果已经存在一个a不能通过素性测试。
那么,只要存在一个数b,通过素性测试,
就一定存在一个数ab,不能通过素性测试。
也就是说能通过素性测试的数一定小于通不过的数,这个我认同。
但是作者加强了条件:
<n的所有数里,能通过素性测试的一定少于通不过测试的数。
至少我觉得这个结论也许是对的,但是如上的证明是不够的。
上面的证明没有无法说明ab也在<n的范围内。


写在最后:
说实在的,如果n很大,除非进行大数运算。
素性测试的计算量非常大,就算n很小,比如n取10001,a取2,
210001已经是一个非常巨大的数。

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    文章分类