BZOJ 3667 Pollard-rho &Miller-Rabin
来源:互联网 发布:q宠大乐斗刷战斗力软件 编辑:程序博客网 时间:2024/05/17 04:02
论O(1)快速乘和O(logn)快速乘的差距….
//By SiriusRen#include <cstdio>#include <algorithm>using namespace std;typedef long long ll;ll shai[10]={2,3,5,7,11,13,17,19,23,29};ll mul(ll a,ll b,ll p){ ll d=((long double)a/p*b+1e-8); ll res=a*b-d*p; res=res<0?res+p:res; return res;}ll pow(ll x,ll y,ll mod){ x%=mod;ll res=1; while(y){ if(y&1)res=mul(res,x,mod); x=mul(x,x,mod),y>>=1; }return res;}bool check(ll a,ll n,ll r,int s){ ll x=pow(a,r,n),pre=x; for(int i=1;i<=s;i++){ x=mul(x,x,n); if(x==1&&pre!=1&&pre!=n-1)return 0; pre=x; }return x==1;}bool miller_rabin(ll n){ if(n<=1)return 0; ll r=n-1,s=0; while(!(r&1))r>>=1,s++; for(int i=0;i<10;i++){ if(shai[i]==n)return 1; if(!check(shai[i],n,r,s))return 0; }return 1;}ll gcd(ll x,ll y){return y?gcd(y,x%y):x;}ll prime_factor(ll n,ll c){ ll k=2,x=rand()%n,y=x,p=1; for(int i=1;p==1;i++){ x=(mul(x,x,n)+c)%n; p=gcd(abs(x-y),n); if(i==k)y=x,k<<=1; }return p;}ll ans,xx;int cases;void pollard_rho(ll n){ if(n==1)return; if(miller_rabin(n)){ans=max(ans,n);return;} ll p=n; while(p==n)p=prime_factor(n,rand()%(n-1)); pollard_rho(p),pollard_rho(n/p);}int main(){ scanf("%d",&cases); while(cases--){ ans=0,scanf("%lld",&xx),pollard_rho(xx); if(ans!=xx)printf("%lld\n",ans); else puts("Prime"); }}
//By SiriusRen#include <cstdio>#include <algorithm>using namespace std;typedef unsigned long long ll;ll shai[10]={2,3,5,7,11,13,17,19,23,29};ll mul(ll x,ll y,ll mod){ x%=mod;ll res=0; while(y){ if(y&1)res=(res+x)%mod; x=(x+x)%mod; y>>=1; }return res;}ll pow(ll x,ll y,ll mod){ x%=mod;ll res=1; while(y){ if(y&1)res=mul(res,x,mod); x=mul(x,x,mod),y>>=1; }return res;}bool check(ll a,ll n,ll r,int s){ ll x=pow(a,r,n),pre=x; for(int i=1;i<=s;i++){ x=mul(x,x,n); if(x==1&&pre!=1&&pre!=n-1)return 0; pre=x; }return x==1;}bool miller_rabin(ll n){ if(n<=1)return 0; ll r=n-1,s=0; while(!(r&1))r>>=1,s++; for(int i=0;i<10;i++){ if(shai[i]==n)return 1; if(!check(shai[i],n,r,s))return 0; }return 1;}ll gcd(ll x,ll y){return y?gcd(y,x%y):x;}ll prime_factor(ll n,ll c){ ll k=2,x=rand()%n,y=x,p=1; for(int i=1;p==1;i++){ x=(mul(x,x,n)+c)%n; p=gcd(abs((long long)x-(long long)y),(long long)n); if(i==k)y=x,k<<=1; }return p;}ll ans,xx;int cases;void pollard_rho(ll n){ if(n==1)return; if(miller_rabin(n)){ans=max(ans,n);return;} ll p=n; while(p==n)p=prime_factor(n,rand()%(n-1)); pollard_rho(p),pollard_rho(n/p);}int main(){ scanf("%d",&cases); while(cases--){ ans=0,scanf("%llu",&xx),pollard_rho(xx); if(ans!=xx)printf("%llu\n",ans); else puts("Prime"); }}
0 0
- BZOJ 3667 Pollard-rho &Miller-Rabin
- 【Pollard Rho模板】【bzoj 3667】: Rabin-Miller算法
- bzoj 3667: Rabin-Miller算法 (Miller_rabbin+Pollard rho)
- POJ1811--miller rabin&pollard rho
- POJ1811 miller-rabin素数测试pollard-rho质因子分解
- Miller-Rabin素数测试和Pollard-rho大整数分解
- [POJ 1811]Prime Test---Miller-Rabin算法&Pollard-rho算法
- Miller-Rabin及Pollard-Rho算法学习小记
- BZOJ 4802 欧拉函数(素数判定Miller-Rabin+素因子分解Pollard-rho+欧拉函数)
- Pollard的rho启发式因子分解算法 & [CodeVS 4939] 欧拉函数:Miller-Rabin + Pollard-rho 质因数分解
- poj1811(Miller-Rabin(素数测试)与Pollard rho(整数的因子分解))
- Poj 1811 Prime Test 素数测试 Miller-Rabin 与 整数的因子分解 Pollard rho
- POJ 1811 Prime Test Miller-Rabin算法和Pollard rho算法
- HDU 3864 D_num Miller Rabin 质数判断+Pollard Rho大整数分解
- POJ1811 (Prime Test Pollard rho整数分解,Miller-Rabin素数测试)
- POJ 1811 Prime Test(素数判定Miller-Rabin+素因子分解Pollard-rho)
- POJ 2429 GCD & LCM Inverse(素数判定Miller-Rabin+素因子分解Pollard-rho)
- POJ 2429 GCD & LCM Inverse【miller-rabin算法+pollard rho 算法】
- HDMI EDID解读
- 【视频】如何考虑预调度
- AOP的简单练习
- MongoDB常用操作
- numpy.random.RandomState()和numpy.random.seed()解读
- BZOJ 3667 Pollard-rho &Miller-Rabin
- 对视频序列的 运动检测 目标跟踪(运动目标的检测与跟踪)
- vagrant中的一些名字
- 8.环境搭建-spark客户端安装
- 整数缓存
- JavaWeb中的相对路径和绝对路径
- HEXO + GIT 管理静态博客
- UIPageViewController
- Binocular Disparity map 双目视差图