加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

大数分解Pollard_rho模板

发布时间:2020-12-14 04:57:53 所属栏目:大数据 来源:网络整理
导读:发现我之前写的Pollard_rho模板是假的。。。 学(抄)了一发真的,但跑的贼慢 ll mult(ll x,ll y,ll Mo) { x %= Mo;y %= Mo; ll tmp=(ll)((long double)x *y /Mo+ 1e-8 ) *Mo ; return (x *y -tmp+Mo) %Mo ;}ll pwr(ll x,ll Mo) { ll z= 1 ;x %= Mo;y %= (Mo-

发现我之前写的Pollard_rho模板是假的。。。
学(抄)了一发真的,但跑的贼慢

ll mult(ll x,ll y,ll Mo) {
    x%=Mo;y%=Mo;
    ll tmp=(ll)((long double)x*y/Mo+1e-8)*Mo;
    return (x*y-tmp+Mo)%Mo;
}

ll pwr(ll x,ll Mo) {
    ll z=1;x%=Mo;y%=(Mo-1);
    for(;y;y>>=1,x=mult(x,x,Mo))
        if (y&1) z=mult(z,Mo);
    return z;
}

ll gcd(ll x,ll y) {
    if (!x) return 1;
    if (x<0) return gcd(-x,y);
    return y?gcd(y,x%y):x;
}

bool check(ll a,ll n,ll x,ll t) {
    ll res=pwr(a,n),lst=res;
    fo(i,1,t) {
        res=mult(res,res,n);
        if (res==1&&lst!=1&&lst!=n-1) return 1;
        lst=res;
    }
    if (res!=1) return 1;
    else return 0;
} 

bool Miller_Rabin(ll n) {
    if (n<2) return 0;
    if (n==2) return 1;
    if (!(n&1)) return 0;
    ll x=n-1,t=0;
    while (!(x&1)) x>>=1,t++;
    fo(i,S) {
        ll a=rand()%(n-1)+1;
        if (check(a,n,t)) return 0;
    }
    return 1;
}

ll Pollard_rho(ll n,ll t) {
    int i=1,k=2;
    ll x0=rand()%n,y=x0;
    while (1) {
        i++;
        x0=(mult(x0,x0,n)+t)%n;
        ll d=gcd(y-x0,n);
        if(d!=1&&d!=n) return d;  
        if(y==x0) return n;  
        if(i==k) y=x0,k<<=1;  
    }  
}

void find(ll n) {
    if (n==1) return;
    if (Miller_Rabin(n)) {
        pri[++tot]=n;
        return;
    }
    ll p=n;
    while (p>=n) p=Pollard_rho(p,rand()%(n-1)+1);
    find(p);find(n/p);
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读