[学习笔记]Pollard-Rho
生活随笔
收集整理的這篇文章主要介紹了
[学习笔记]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)題。
- 上一篇: JavaFX FileChooser文件
- 下一篇: 从 SPIR-V 到 ISPC:将 GP