标签:前言 ttl math str mil 情况下 nes 测试 span
\(Miller-Rabin\)素数测试是一个很好的筛素数方法,它的优点在于速度快且准确性较高,但依然有可能出错。
\(MR\)素数测试利用费马小定理快速判断一个数是否是素数,但是由于这种方法只是较高概率不出现错误,并不是完全正确的,所以在时间充裕的情况下可不必使用这个方法。
因为当\(n\)是素数,且\(gcd(a,n)=1\)时,\(a^{n?1}\equiv1(mod\ n)\)。
所以我们可以多随机几个\(a\)(用于增加算法的准确性),然后判断\(a^{n?1}\equiv1(mod\ n)\)成不成立。
由于\(n\)不是素数时\(a^{n?1}\equiv1(mod\ n)\)几乎不成立,所以如果多个\(a\)测试过后,\(a^{n?1}\equiv1(mod\ n)\)均成立,就可以认为\(n\)是素数了。
但是还有这么一种合数,对于任意\(p\)为素数,\(gcd(a,p)=1\),\(a^{p?1}\equiv1(mod\ p)\)都成立。
这种数叫做卡迈克尔数(又称MR测试杀手)。
当然,这种数是很少的,在\(1\sim100000000\)范围内的整数中,只有\(255\)个卡迈克尔数。当碰到卡迈克尔数时,\(MR\)素数判断就毫无用武之地了(一个较好的方法是拿来特判)。
所以,在时间充裕的情况下,最好还是使用线性筛。
标签:前言 ttl math str mil 情况下 nes 测试 span
原文地址:https://www.cnblogs.com/chenxiaoran666/p/Miller_Rabin.html