欧几里得算法
欧几里得(辗转相除)算法
最大公因数gcd求法(辗转相除法)
易得:
多减几次得:
对于边界
int gcd(int a, int b) {
return !b ? a : gcd(b, a%b);
}
exgcd(拓展欧几里得算法)
此算法可用于解不定方程和求非质数意义下的逆元):
方程:ax + by = c (a,b,c均为整数,求x,y的整数解)
核心思路:在求gcd的末状态求出
具体做法:
当c 不是 gcd(a,b) 的倍数,时无x,y整数解。(裴蜀定理)
否则:ax + by = k * gcd,可先求出x/k,y/k
gcd末状态:
a = gcd, b = 0。此时
gcd的转移方法是:ax + by = gcd = bx' + (a -
整理一下:x = x' -
递归回去可得一组x/k,y/k的整数解, 再乘上k就是一组x,y的特解
接下来就是求通解:
先令有解{x1,y1}{x2,y2}
整理一下:
代码:
void exgcd(long long a, long long b){
if(b == 0) {
x = 1, y = 0;
gcd = a;
return ;
}
exgcd(b, a % b);
tmp = x, x = y, y = tmp - (a/b) * y;
}
用
类欧几里得算法
给定
先求第一个,后面两个的思路类似于第一个。为了方便,我们定义:
整体思路:如果
具体做法:
对于
对于
转化右边的式子:
为了方便表示,令
递归即可。
对于
同样的做法,可以得到:
对于
否则:
其中
吐槽一下:这玩意写起来是真史,要是不给我公式要我手推出来写代码,不知道得调到什么时候。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具