现在的位置: 首页 > 综合 > 正文

Miller-Rabin素性检测

2018年04月23日 ⁄ 综合 ⁄ 共 1637字 ⁄ 字号 评论关闭

Miller-Rabin 素性检测,是一种概率性的素数测定法,它以费马小定理引出

费马小定理:如果n是一个素数,且a,n的最大公约数等于1,那么a^(n-1) =1 (mod n)。因为费马小定理是一个必要条件,逆命题不成立,但是使逆命题不成立的数非常少,所以可以概率测试;成功率号称在99.99%左右........

二次探测定理:如果n是一个素数,那么对于任意x(0<x<n) ,方程x^2≡1(mod n)的解为x=1,n-1

 证明:x^2≡1(mod n)等于x^2-1≡0(mod n)等于(x+1)(x-1)≡0(mod n);由于n是素数,所以x=1,n-1

Miller - Rabin 素性测试: (只考虑正整数)
       先假设要测试的数n是素数(若n为1 或 2则要另外判定)
       对于测试数n, 将n - 1 分解成 o * 2^k, 其中o表示一个奇数, k为正整数 .(只有k >= 1才能用得上二次探测定理, 下面的说明也假设k >= 1, 其实也就是n >= 3)
       
       于是n能通过以a为底的费马素性测试((a, n) = 1, 可以多选几个a, 提高准确率, 一般选前几个素数, 或其它随机数): 
                a^(n - 1) ≡1 (mod n) 
                a^(o * 2^k) ≡1 (mod n)
                (a^(o * 2^(k - 1)))^2 ≡1 (mod n)
                (a^(o * 2^(k - 1)) mod n)^2 ≡1 (mod n)
                
                由二次探测定理可知 a^(o * 2^(k - 1)) mod n 为 1 或 n - 1

        (核心)于是计算: a^(o * 2^(k - 1)) mod n
                1.若为n - 1,判定停止(因为无法再用二次探测定理)
                2.若为1, 但无法再提取指数中的因子2, 判定也停止(因为无法再用二次探测定理)
                3.若为1, 但还可提取指数中的因子2, 则提出此因子, 再次用二次推测定理判定
                4.若既不为1, 也不为n - 1, 则表明出现矛盾(与二次控测定理), 推翻n为素数的结论.

        最后若不能推翻n为素数, 则n很有可能为素数.那些通过以a为底的Miller - Rabin测试的数,称为以a为底的强伪素数.

优化:
        若n为以a为底的强伪素数 <=>   有且只有一个(因为两个或以上同时成立会出现矛盾)

                             i = 0, 1, 2, ... , k - 1, 使a^(o * 2^i) mod n = n - 1 或 a^o mod n = 1   (n >= 3)
        
        证明:
                1.当n为以a为底的强伪素数,  假若右边不成立, 但由判定过程可知n不为以a为底的强伪素数.矛盾.故此时右边必成立.
                2.当右边条件成立 

                                1)a^o mod n = 1 => a^(o * 2^i) mod n = 1 , i = 0, 1, 2, 3, ... , k - 1
                                   由判定过程可知n一定通过此判定, 一定为以a为底的强伪素数.
                                2)有且只有一个(因为两个或以上同时成立会出现矛盾)i = 0, 1, 2, ... , k - 1, 使a^(o * 2^i) mod n = n - 1  => a^(o * 2^j) mod n = 1, j = i + 1, i + 2, ... , k - 1
                                   由判定过程可知n一定通过此判定, 一定为以a为底的强伪素数.
               故判定过程可改为:
                1.将n - 1分解成 o * 2^k.(若n为1 或 2则要另外判定)
                2.计算a^o mod n
                          若为1 或 n - 1, 则此数通过判定.
                3.用公式: a^(o * 2^i) mod n = (a^(o * 2^(i - 1)) mod n)^2 mod n 循环计算, i = 1, 2, ... , k - 1  (正是这里减少了运算量)
                          若为n - 1, 则此数通过判定.
                4.到最后还不能跳出判定的数则显然为合数.

抱歉!评论已关闭.