2012年(11)
分类: C/C++
2012-04-19 15:41:01
Fermat定理 若n是奇素数,a是任意正整数(1≤ a≤ n−1),则 an−1≡1pmod n。[]
Miller-Rabin算法的理论基础 如果n是一个奇素数,将n−1表示成2s*r的形式,r是奇数,a与n是互素的任何整数,那么ar≡1pmod n或者对某个j(0 ≤ j≤ s−1, j∈Z)等式a2jr≡−1 pmod n成立。[]
这个理论是由Fermat定理推导而来:n是一个奇素数,则方程 x2≡1pmod n只有±1两个解。
定理 3 设x,y和n是整数,如果x2 = y2pmod n, 但x≠± ypmod n,则(x−y)和n的公约数中有n的非平凡因子。
输入:一个大于3的奇整数n和一个大于等于1的安全参数t(用于确定测试轮数)。
输出:返回n是否是素数(概率意义上的,一般误判概率小于((1/2))80)即可)。
|
其中第(vi.)步是基于定理3得来的。 []
经过独立的t轮Miller-Rabin算法将一个合数误判为素数的可能性不大于4−t。这个概率是给予Fermat定理的算法中是最好的。这个误判概率是利用下面的两个定理证明的。
定理 1:设d = gcd(k,m)那么在有限群{g1,g + 2,···,gm = 1}中(g是有限群的生成元,m是有限群的阶)有d个元素满足方程xk = 1。
定理 2: 设p是一个素奇数,p−1 = 2sh(h是奇数),那么在乘法群(Z/pZ)*中满足方程 x2rt = −1pmod p(t是奇数)的元素个数是:0,如果r≥ s;2rgcd(h,t)如果r<s。
利用这两个定理,对算法输入n分3种情况讨论:
n是可以被某个素数的平方整除的时候;
n是两个不同的素数的乘积的时候;
n是两个以上不同素数乘积的时候。
这样就可以证明Miiler-Rabin算法的误判概率上界。
Miller-Rabin算法是一个概率算法,算法的计算集中于(b)步和(c)步的循环中,最坏情况是(iv.)的循环没有中途推出,则一轮Miller-Rabin算法的最坏情况复杂度为(1 + O(1))log2(n)(以模n乘法为基本操作)。如果以单精度乘法操作作为时间复杂度的衡量,则一轮优化的Miller-Rabin算法的最坏情况时间复杂度是O(log23(n))。从时间复杂度来看Miller-Rabin算法的性能是很好的。在实际应用中,Miller-Rabin算法的实际执行速度也很快。
代码实现:
点击(此处)折叠或打开