• Miller_Rabin、 Pollard_rho Template


    Multiply and pow Function:

    //计算 (a*b)%c.   a,b都是ll的数,直接相乘可能溢出的
    //  a,b,c <2^63
    ll mult_modq(ll a,ll b,ll c){
        a %= c;
        b %= c;
        ll ret = 0;
        while(b){
            if(b & 1){ret += a;ret %= c;}
            a <<= 1;
            if(a >= c)a %= c;
            b >>= 1;
        }
        return ret;
    }
    
    //计算  x^n %c
    ll pow_mod(ll x,ll n,ll mod){
        if(n == 1)return x%mod;
        x %= mod;
        ll tmp = x;
        ll ret = 1;
        while(n){
            if(n & 1) ret = mult_mod(ret, tmp, mod);
            tmp = mult_mod(tmp, tmp, mod);
            n >>= 1;
        }
        return ret;
    }

    Miller_Rabin Prime Number test:

    return TRUE when Prime Number (BE POSSIBLITY)

    return FALSE when not a Prime Number

    //以a为基,n-1=x*2^t      a^(n-1)=1(mod n)  验证n是不是合数
    //一定是合数返回true,不一定返回false
    bool check(ll a,ll n,ll x,ll t){
        ll ret = pow_mod(a, x, n);
        ll last = ret;
        for(int i = 1; i <= t; ++i){
            ret = mult_mod(ret,ret,n);
            if(ret == 1 && last !=1 && last != n - 1) return true;//合数
            last = ret;
        }
        if(ret != 1) return true;
        return false;
    }
    
    // Miller_Rabin()算法素数判定
    //是素数返回true.(可能是伪素数,但概率极小)
    //合数返回false;
    
    bool Miller_Rabin(ll n){
        if(n < 2)   return false;
        if(n == 2)    return true;
        if((n & 1) == 0)    return false;//偶数
        ll x = n - 1;
        ll t = 0;
        while((x & 1) == 0){x >>= 1; ++t;}
        for(int i = 0; i <S ; ++i){
            ll a = rand() % (n - 1) + 1;
            if(check(a,n,x,t))
                return false;//合数
        }
        return true;
    }

    Pollard_rho Algorithm

    The quality factor decomposition :

    ll factor[100];//质因数分解结果(刚返回时是无序的)
    int tol;//质因数的个数。数组小标从0开始
    
    ll gcd(ll a,ll b){
        if(a == 0)  return 1;
        if(a < 0) return gcd(-a,b);
        while(b){
            ll t = a % b;
            a = b;
            b = t;
        }
        return a;
    }
    
    ll Pollard_rho(ll x,ll c){
        ll i = 1, k = 2;
        ll x0 = rand()%x;
        ll y = x0;
        while(1){
            ++i;
            x0 = (mult_mod(x0,x0,x)+c)%x;
            ll d = gcd(y-x0,x);
            if(d != 1 && d != x) return d;
            if(y == x0) return x;
            if(i == k){y = x0; k += k;}
        }
    }
    //对n进行素因子分解
    void findfac(ll n){
        if(Miller_Rabin(n)){
            factor[tol++] = n;
            return;
        }
        ll p = n;
        while(p >= n)   p = Pollard_rho(p,rand()%(n-1)+1);
        findfac(p);
        findfac(n/p);
    }
  • 相关阅读:
    解决Windows 2000无法访问Windows XP共享目录的问题
    手动清除后门程序Iexplores.exe
    超级天使投资网访谈
    中國web2.0現狀與趨勢調查報告
    google AdSense的佣金政策 (GOOGLE 研究 → Google 服务 → Adsense )
    分类信息和搜索引擎
    web 2.0是生产关系:说徐博客赚钱
    赛门铁克联手八笛众和推在线安全服务 狼人:
    2009年六大网络安全威胁:SQL注入攻击位列榜首 狼人:
    网民关注iPhone、Google、微软和安全 狼人:
  • 原文地址:https://www.cnblogs.com/wushuaiyi/p/4062412.html
Copyright © 2020-2023  润新知