欧几里得算法 以及 扩展
欧几里得算法
int gcd(int a, int b)
{
return b==0?a:gcd(b,a%b);
// whlie (b^=a^=b^=a%=b); return a;
}
证明:
如果 且 ,则 。所以 ,即 。
相反,如果 且 ,则 。所以 ,即 。
若 为 与 的公因数,那么我们证明了 与 的公因数相同。
因为 与 的公因数相同, 与 的公因数相同,所以 与 的公因数相同,即 与 的公因数相同。
因为 ,所以我们有了边界条件。
其他:
(1)由唯一分解定理,可知 。
(2)由于 辗转相除法 与 斐波那契数列 的性质,对两个大的相邻的斐波那契数求最大公倍数是较慢的。(优化辗转相除法)
gcd(a,b) ans=1
1、a,b除以2,直到为奇数为止,记录a,b除以2的次数中较小的那个,记为x。ans*=2^x
;
2、新得到的a,b用欧几理德算法。但是每次得到的a%b都要除以2直到为奇数。
3、ans*=b
;
扩展欧几里得算法
int exgcd(int a, int b, int &x, int &y)
{
if (b == 0)
{
x = 1, y = 0;
return a;
}
int r = exgcd(b, a%b, y, x);
y -= a/b*x;
return r;
}
证明:
由 裴蜀定理 可知,,所以当且仅当 是 的倍数时,该不定方程才有解。
设:
则有
又因为 可得
由 恒等定理 可得:。
特别的,当 时 。
应用:
(1)解不定方程 ,则 为原方程的一组解,且 的值最小。
其他的解为 。
int BDFC(int a, int b, int c, int &x, int &y)
{
int d = exgcd(a, b, x, y);
if (c%d) return -1;
int k = c/d;
x *= k, y *= k;
}
(2)求解线性同余方程(同余方程也可以写为不定方程的形式)。
(3)求模意义下的逆元。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现