欧几里得算法 & 扩展欧几里得算法
一、欧几里得算法
欧几里得算法,也叫辗转相除,简称 gcd
,用于计算两个整数的最大公约数
引理:
证明:
设
则
而
假设
设
将
则
那么此时
所以
即
得证!
当
int gcd(int a,int b){return b?gcd(b,a%b):a;}
二、扩展欧几里得算法
扩展欧几里得算法,简称 exgcd
,一般用来求解不定方程,求解线性同余方程,求解模的逆元等
引理:存在
证明:
当
当
设
又因
则
解得
因为当
而每一组的解可根据后一组得到
所以第一组的解
得证!
根据上面的证明,在实现的时候采用递归做法
先递归进入下一层,等到到达最后一层即 b=0 时就返回x=1 , y=0
再根据
不断算出当层的解并返回,最终返回至第一层,得到原解
void exgcd(int a,int b)
{
if(b)
{
exgcd(b,a%b);
int k=x;
x=y;
y=k-a/b*y;
}
else y=(x=1)-1;
}
-
应用一:
exgcd
解不定方程(使用不将 与 转为互质的方法)
对于 的不定方程,设
当 时无整数解
当 时,将方程右边 后转换为 的形式
可以根据扩展欧几里得算法求得一组整数解 ,
而这只是转换后的方程的解,原方程的一组解应再 转变回去
则原方程解为 ,
通解 , ,其中 为整数 -
应用二:
exgcd
解线性同余方程
关于 的模方程 的解
方程转换为 其中 一般为非正整数
则问题变为用exgcd
解不定方程
解得
通解为
设 (已证明 为通解的最小间隔)
则 的最小正整数解为
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探