zoukankan      html  css  js  c++  java
  • Millar_rabin和Pollard_Rho

    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

  • 相关阅读:
    sql小练习
    登录测试点
    游戏签到
    移动端和pc端微信加入群聊
    小说
    微信语言输入
    linux tar压缩解压缩命令详解
    linux使用nginx配置web服务器
    FFmpeg 视频处理入门教程
    Git学习
  • 原文地址:https://www.cnblogs.com/xtestw/p/3778728.html
Copyright © 2011-2022 走看看