日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

[学习笔记]Pollard-Rho

發(fā)布時(shí)間:2025/3/18 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [学习笔记]Pollard-Rho 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

之前學(xué)的都是假的

%%zzt

Miller_Rabin:Miller-Rabin與二次探測(cè)

?

大質(zhì)數(shù)分解:

找到所有質(zhì)因子,再logn搞出質(zhì)因子的次數(shù)

方法:不斷找到一個(gè)約數(shù)d,遞歸d,n/d進(jìn)行分解,直到n是質(zhì)數(shù)

?

?

快速冪快速乘:

ll qk(ll a,ll b,ll m){ll d=((long double)a/m*b);ll r=a*b-d*m;return ((ull)r+m)%m; } ll qm(ll x,ll y,ll mod){ll ret=1;while(y){if(y&1) ret=qk(ret,x,mod);x=qk(x,x,mod);y>>=1;}return ret; }

注意快速乘:((ull)r+m)%m由于r可能<0或者>m,這一步是必須的

?

Miller-Rabin:

bool M_R(ll p){if(p==1) return false;if(p==2||p==3||p==5||p==7||p==11||p==61) return true;if(p%2==0||p%3==0||p%5==0||p%7==0) return false;int s=ctz(p-1);for(reg i=0;i<6;++i){int a=pri[i];ll k=(p-1)>>s;k=qm(a,k,p);if(k==1) continue;ll las=k;for(reg j=1;j<=s;++j){k=qk(k,k,p);if(k==1&&las!=p-1&&las!=1) return false;las=k;}if(k!=1) return false;}return true; }

?

?

二進(jìn)制gcd

ll gcd(ll a,ll b) {if(!a||!b) return a|b;#define ctz __builtin_ctzllint shift=ctz(a|b);b>>=shift;while(a){a>>=ctz(a);if(a<b)swap(a,b);a-=b;}return b<<shift;#undef ctz }

就是高精gcd才用的更相減損術(shù)

?

Pollard-Rho

主體1

ll P_R(ll p,ll c){ll x=0,y=0,d;int k=2,has=1;ll tmp=1;while(1){++has;x=ad(qk(x,x,p),c,p);tmp=qk(tmp,abs(y-x),p);if(x==y) return p;if(k==has){k<<=1;y=x;d=gcd(tmp,p);tmp=1;if(d>1) return d;}} }

注意tmp,把所有的abs(y-x)乘在一起,gcd顯然不變,并且減少了求gcd次數(shù)

?

主體2

void fin(ll p,int cnt){if(p==1||p<=ans) return;if(M_R(p)) {ans=max(ans,p);return;}ll d=P_R(p,cnt);while(d==p) --cnt,d=P_R(p,cnt);while(p%d==0) p/=d;fin(p,cnt);fin(d,cnt); }

如果要求質(zhì)因子,開個(gè)vector,最后去重即可

?

?

模板:

【模板】Pollard-Rho算法?

// luogu-judger-enable-o2 #include<bits/stdc++.h> #define reg register int #define il inline #define fi first #define se second #define mk(a,b) make_pair(a,b) #define numb (ch^'0') #define pb push_back #define solid const auto & #define enter cout<<endl #define pii pair<int,int> using namespace std; typedef long long ll; template<class T>il void rd(T &x){char ch;x=0;bool fl=false;while(!isdigit(ch=getchar()))(ch=='-')&&(fl=true);for(x=numb;isdigit(ch=getchar());x=x*10+numb);(fl==true)&&(x=-x);} template<class T>il void output(T x){if(x/10)output(x/10);putchar(x%10+'0');} template<class T>il void ot(T x){if(x<0) putchar('-'),x=-x;output(x);putchar(' ');} template<class T>il void prt(T a[],int st,int nd){for(reg i=st;i<=nd;++i) ot(a[i]);putchar('\n');} namespace Modulo{ const int mod=998244353; int ad(int x,int y){return (x+y)>=mod?x+y-mod:x+y;} void inc(int &x,int y){x=ad(x,y);} int mul(int x,int y){return (ll)x*y%mod;} void inc2(int &x,int y){x=mul(x,y);} int qm(int x,int y=mod-2){int ret=1;while(y){if(y&1) ret=mul(x,ret);x=mul(x,x);y>>=1;}return ret;} } //using namespace Modulo; namespace Miracle{ ll ans; ll qk(ll x,ll y,ll mod){ll d=((long double)x*y/mod);ll r=x*y-mod*d;return r<0?r+mod:(r>=mod?r-mod:r); } ll qm(ll x,ll y,ll mod){ll ret=1;while(y){if(y&1) ret=qk(ret,x,mod);x=qk(x,x,mod);y>>=1;}return ret; } ll ad(ll x,ll y,ll mod){return (x+y)>=mod?x+y-mod:x+y; } ll gcd(ll a,ll b){if(!a||!b) return a+b;#define ctz __builtin_ctzllint tmp=ctz(a|b);b>>=ctz(b);while(a){a>>=ctz(a);if(a<b) swap(a,b);a-=b;}return b<<tmp; } int pri[6]={2,3,5,7,11,61}; bool M_R(ll p){// cout<<"M_R "<<p<<endl;if(p==1) return false;if(p==2||p==3||p==5||p==7||p==11||p==61) return true;if(p%2==0||p%3==0||p%5==0||p%7==0) return false;int s=ctz(p-1);for(reg i=0;i<6;++i){ll a=pri[i];ll tmp=(p-1)>>s;ll now=qm(a,tmp,p);if(now==1||now==p-1) continue;for(reg j=1;j<=s;++j){ll las=now;now=qk(now,now,p);if(now==1&&las!=p-1&&las!=1) return false;}if(now!=1) return false;}return true; } ll P_R(ll p,ll c){// cout<<" P_R "<<p<<" "<<c<<endl; ll x,y,d;ll tmp=1,has=1,k=2;x=y=0;while(1){++has;x=ad(qk(x,x,p),c,p);tmp=qk(tmp,abs(y-x),p);if(x==y) return p;if(has==k){k<<=1;d=gcd(tmp,p);if(d>1) {// cout<<" ret "<<d<<endl;return d;}tmp=1;y=x;}} } void sol(ll n,int c){if(n==1||n<=ans) return;if(M_R(n)){ans=max(ans,n);return;}ll d=P_R(n,c);while(d==n) --c,d=P_R(n,c);while(n%d==0) n/=d;sol(n,c);sol(d,c); } int main(){int t;rd(t);srand(19260817);while(t--){ans=0;ll n;rd(n);sol(n,19260817);if(ans!=n) printf("%lld\n",ans);else printf("Prime\n");}return 0; }} signed main(){Miracle::main();return 0; }/*Author: *Miracle* */ View Code

?

轉(zhuǎn)載于:https://www.cnblogs.com/Miracevin/p/10858196.html

與50位技術(shù)專家面對(duì)面20年技術(shù)見證,附贈(zèng)技術(shù)全景圖

總結(jié)

以上是生活随笔為你收集整理的[学习笔记]Pollard-Rho的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。