首页 > 其他 > 详细

Millar_rabin和Pollard_Rho

时间:2014-06-10 00:39:21      阅读:433      评论:0      收藏:0      [点我收藏+]

1.Millar_rabin 素数判定

     基于以下两个基础:

  1.如果p是素数,且(a,p)=1,那么(a^(p-1))%p=1(费马小定理)

      2.对于0<x<p,(x^2)%p=1  =>  x=1 或者 x=p-1

    处理:

         把p-1写成u*(2^t),则a^(p-1)=(a^u)^2^2^2.....t次平方操作

    过程:

        随机产生一个数a,cur=a^u %p,对cur做t次平方操作,即cur=cur*cur %p,每次操作结束后,如果cur=1那么上一次的cur必须为1或者p-1否则为合数(上面的基础2),最终的cur必须为1(基础1)。

 注意:

       long long 在计算乘法的时候要防止溢出,用2进制模拟乘法。

2.Pollard_rho,因数分解

     用某种方法生成a,b.计算p=gcd(a-b,n),则p是n的一个因数,如果p=n或者p=1,则迭代的生成a,b,知道p不是n或者1,或者a,b出现循环。(通常b=(a*a+c)%p,在执行之前用Millar_rabin进行素数判定保证n不为素数).

     过程:

       func get_facts(n)

             if (n是素数){fac[tot++]=n; return;}

      p=n

            while (p>=n) p=Pollard_rho(n,rand()%(p-1)+1)

             get_facts(p)

             get_facts(n/p)

          end func

Millar_rabin和Pollard_Rho,布布扣,bubuko.com

Millar_rabin和Pollard_Rho

原文:http://www.cnblogs.com/xtestw/p/3778728.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!