高次同余方程
求解 .
大步小步算法,,要求 ,可在 时间复杂度内求解。
在 时没有大问题。
方程的解满足 .
令 ,则 .
两边同时乘上 可得,.
对于所有的 ,将 插入 中。
枚举所有的 ,查找表中是否存在 ,若存在则可以得到对应的 与 .
inline int BSGS(int a,int b,int p){ a%=p; b%=p; if(b==1)return 0; mp.clear(); int t=sqrt(p)+1,re=1;/*初值a^0*/ for(int i=0;i<t;i++)mp[re*b%p]=i,(re*=a)%=p;/*依次插入b*a^i*/ a=re;/*re=a^t%p*/ re=1; for(int i=0;i<=t;i++){ int j=mp.find(re)==mp.end()?-1:mp[re]; if(j>=0&&i*t-j>=0)return i*t-j; (re*=a)%=p; } return -1; }
扩展BSGS算法
求解 ,.
将不互质的情况转化为互质的情况,设 ,两边同时除以 .
得到,,即 .
当 且 时无解。
一直递归直到 ,假设一共递归了 次,设 .
原式即,.
于是用 做 ,注意还有一个系数 要乘进去,出入 中。
inline int BSGS(int a,int b,int p,int ad){ a%=p,b%=p; mp.clear(); int t=sqrt(p)+1,re=1; for(int i=0;i<t;i++)mp[re*b%p]=i,(re*=a)%=p; a=re; re=ad; for(int i=0;i<=t;i++){ int j=mp.find(re)==mp.end()?-1:mp[re]; if(j>=0&&i*t-j>=0)return i*t-j; (re*=a)%=p; } return -1; } inline int exBSGS(int a,int b,int p){ a%=p; b%=p; if(b==1||p==1)return 0;/*特判*/ int cnt=0,g=gcd(a,p),ad=1; while(g>1){ if(b%g)return -1;/*判断无解*/ cnt++;/*累加次数*/ b/=g; p/=g; (ad*=a/g)%=p;/*更新系数*/ if(ad==b)return cnt;/*ad=b则前面的一项a的指数为0,直接返回cnt*/ g=gcd(a,p); } int ans=BSGS(a,b,p,ad); if(ans==-1)return -1; return ans+cnt; }
也可以不将系数传进去,将 乘上系数的逆元即可,注意用 计算。
inline int inv(int a,int p){ int x,y; exgcd(a,p,x,y); return (x%p+p)%p; } inline int BSGS(int a,int b,int p){ a%=p,b%=p; mp.clear(); int t=sqrt(p)+1,re=1; for(int i=0;i<t;i++)mp[re*b%p]=i,(re*=a)%=p; a=re; re=1; for(int i=0;i<=t;i++){ int j=mp.find(re)==mp.end()?-1:mp[re]; if(j>=0&&i*t-j>=0)return i*t-j; (re*=a)%=p; } return -1; } inline int exBSGS(int a,int b,int p){ a%=p; b%=p; if(b==1||p==1)return 0; int cnt=0,g=gcd(a,p),ad=1; while(g>1){ if(b%g)return -1; cnt++; b/=g; p/=g; (ad*=a/g)%=p; if(ad==b)return cnt; g=gcd(a,p); } int ans=BSGS(a,b*inv(ad,p)%p,p);/*乘上系数的逆元*/ if(ans==-1)return -1; return ans+cnt; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具