Pollard-Rho学习笔记
Pollard-Rho 还是很容易理解的,其作用就是找一个数
复杂度大致是
首先引入生日悖论:一年
这个就让我们明白了在值域为
于是我们设计一个伪随机数
为什么要这样做呢?我们设
然后我们相当于就是需要在较快的时间内判断环是否出现。
这里简单介绍一下 floyd 判环,因为这是主要思想,其他做法也只是这个做法的优化。我们把
至于优化,这里讲倍增优化,我们第
我们考虑到如果每次都要判
分解质因数还需要 Miller-Rabin 的辅助,Miller-Rabin 相对简单,故不再赘述。
分解质因数代码:
点击查看代码
#define ll __int128 #define int long long struct Miller_Rabin{ int pri[13]={0,2,3,5,7,11,13,17,19,23,29,31,37},cnt=12; inline bool chk(ll n,ll p){ if(n%p==0) return false; ll num=n-1,t=0; while(num%2==0) num/=2,t++; ll v=qpow(p,num,n),s=0; if(v==1) return true; for(;s<t;s++){ if(v==n-1) return true; v=v*v%n; } if(s==t) return false; return true; } inline bool is_pri(int n){ for(int i=1;i<=cnt;i++){ if(pri[i]==n) return true; if(!chk(n,pri[i])) return false; } return true; } }Test; struct Pollard_Rho{ int k=127; inline ll F(ll x,ll c,ll mod){ x%=mod; return (x*x+c)%mod; } inline ll abs(ll x){return (x>0)?x:-x;} inline int gt_div(ll x){ int c=rand()%(x-1)+1; ll s=0,t=0,v=1; ll tt=0; for(int w=1;;w<<=1,s=t){ for(int num=1;num<=w;num++){ tt++; t=F(t,c,x); v=v*(abs(t-s)%x)%x; if(!v) return x; if(num%k==0){ int d=__gcd(v,x); if(d>1) return d; } } int d=__gcd(v,x); if(d>1) return d; } } }Pr; inline void fac(int x){ if(x==1) return ; if(Test.is_pri(x)){ cout<<x<<' '; return ; } int now=x; while(now==x) now=Pr.gt_div(x); x/=now; fac(x); fac(now); }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!