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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Pollar Rho算法

發布時間:2023/11/30 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Pollar Rho算法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

原本是想把這個算法搞懂的,然后在網上看了又看,覺得,還是有時間再來看吧,我錯了。

看到了一個大佬的博客,順帶收集一下板子

這個板子可以求大數的最大的因子。

#define LL long long bool IsPrime(LL);//返回素性測試結果 LL GCD(LL,LL);//返回兩個數的GCD LL Mix(LL,LL,LL);//返回兩個數在模運算下的乘積void MaxFactor(LL n,LL &ans) {if(n==1||n<=ans||IsPrime(n)){return;//判斷特殊情況:n為1或素數}for(LL c=rand()%(n-1)+1;;c++){//為防止隨機數無效化,使用死循環LL t1=rand()%(n-1)+1,t2=(Mix(t1,t1,n)+c)%n;LL p=1,i=0,g=0;while(t1!=t2){p=Mix(p,abs(t1-t2),n);if(!p){//乘積為0時說明找到了一個因子g=GCD(n,abs(t1-t2));if(g>1&&g<n){MaxFactor(g,ans);MaxFactor(n/g,ans);}return;}++i;if(i==127){//當有127個數時強制測試g=GCD(n,p);if(g>1&&g<n){MaxFactor(g,ans);MaxFactor(n/g,ans);return;}p=1,i=0;}t1=(Mix(t1,t1,n)+c)%n;t2=(Mix(t2,t2,n)+c)%n;t2=(Mix(t2,t2,n)+c)%n;}g=GCD(n,p);if(g>1&&g<n){//循環退出后收尾MaxFactor(g,ans);MaxFactor(n/g,ans);return;}} }

又找了一個板子,這個好像可以求出所有的因子(保存在數組factor中)

#include<iostream> #include<cmath> #include<cstring> #include<algorithm> #include<cstdio> #include<stdlib.h> #include<time.h> #define times 20 using namespace std; #define ll long long ll total; ll factor[110]; ll qmul(ll a,ll b,ll M){a%=M;b%=M;ll ans=0;while (b){if (b&1){ans=(ans+a)%M;}a=(a<<=1)%M;b>>=1;}return ans%M; }///快乘,因為兩個longlong的數相乘可能會溢出,所以這里轉乘法為加法,思想和快速冪相似 ll qpow(ll a,ll b,ll int M){ll ans=1;ll k=a;while(b){if(b&1)ans=qmul(ans,k,M)%M;k=qmul(k,k,M)%M;b>>=1;}return ans%M; } bool witness(ll a,ll n,ll x,ll sum){ll judge=qpow(a,x,n);if (judge==n-1||judge==1)return 1;while (sum--){judge=qmul(judge,judge,n);if (judge==n-1)return 1;}return 0; } bool miller(ll n){ ///判斷素數if (n<2)return 0;if (n==2)return 1;if ((n&1)==0)return 0;ll x=n-1;ll sum=0;while (x%2==0){x>>=1;sum++;}for (ll i=1;i<=times;i++){ll a=rand()%(n-1)+1;if (!witness(a,n,x,sum))return 0; ///費馬小定理的隨機數檢驗}return 1; } ll gcd(ll a,ll b){return b==0?a:gcd(b,a%b); } ll pollard(ll n,ll c){ll x,y,d,i=1,k=2;x=rand()%n;y=x;while (1){i++;x=(qmul(x,x,n)+c)%n; ///不斷調整xd=gcd(y-x,n);if (d<0)d=-d;if (d>1&&d<n)return d; ///找到因子if (y==x)return n; ///找到循環,返回n,重新來if (i==k){ ///一個優化y=x;k<<=1;}} } void find(ll n){///尋找這個數的素因子,并存起來if (miller(n)){factor[++total]=n;return ;}ll p=n;while (p>=n) p=pollard(p,rand()%(n-1)+1); ///不斷找因子,知道找到為止,返回n說明沒找到find(n/p);find(p); } int main(){ll n,m,i,t;scanf("%lld",&t);while (t--){scanf("%lld",&n);if (miller(n)) printf("Prime\n");else {memset(factor,0,sizeof(factor));total=0;find(n);sort(factor+1,factor+total+1);printf("%lld\n",factor[1]);}} }

總結

以上是生活随笔為你收集整理的Pollar Rho算法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。