浅谈扩展欧几里得定理(附裴蜀定理)
关于扩展欧几里得定理
众所周知,扩展欧几里得定理是用来求形如(a,b,c皆为整数)这样的方程的一组解[注,仅是一组解]的定理
它的原理比较复杂,本人学了挺久才懂了一点,这里就不谈了,扩欧的核心是它的思想,它的思想可以用来解决许多题
该方程有解的条件 :
要使(a,b,c皆为整数) 有解,我们设k=gcd(a,b),可以将原方程写成
的形式
即
a,b,c均为整数
一定是整数即
一定是k的倍数
k|c 即 gcd(a,b)|c // k|c数学里为 c%k=0
由此可见,该方程有解的条件为c%gcd(a,b)=0
求解方法 :
由于是求解的一组解,在方程有解的条件下,我们可以考虑先求出
的一组解,
为什么这样考虑呢,这样子变化有什么好处呢?当我们将原方程转变为这样的方程之后,实际上我们求出的x与y并不是
原方程的解,我们可以理解为转变后的方程的解为x'与y',实际上该方程是将原方程除以
c/gcd(a,b)后所得到的,所以原方程的解为那么我们先求出
原方程的解便只需乘以c/gcd(a,b)就能得到了
另外说明,c=gcd(a,b)是原方程有解的最小情况,利用这个性质,裴蜀定理也就不难写出来了
那么该如何求解呢?
众所周知(又是这个词,词穷) gcd的写法return b==0?a:gcd(b,a%b);(为了节约篇幅强行压缩)关键的一步就是
gcd(a,b)==gcd(b,a%b)了,这个的成立性就不证明了,我们求解是需要利用到gcd的这个特性的
我们可以得到这样一个方程(这里的%显示不出来就用mod代替了),然后我们将gcd(b,a%b)中的b和a代入原方程
那么可以得到gcd(b,a%b) = bx+(a%b)y,注意,此时的x与y也不是原方程的解,也可以理解为x',y'这样子我们就可以得到
(这里是将gcd(a,b)的a,b反代入原方程),又因为电脑中的取模运算a%b是等价于a-a/b*b的
所以我们又可以将最后一个方程变成bx'+(a-a/b*b)y',然后与第一个方程放在一起便有
,然后拆项移项,变成
,最后便能得出这样的转移方程
,有了这样的转移方程,那么我们可以递归地写出代码了,递归结束条件就是b==0时,此时的方程
ax+by=gcd(a,b),b==0,所以就是ax=a,那么x=1,y=0
那么扩展欧几里得便讲完了,下面说一下上文提到的裴蜀定理
裴蜀定理
题目描述
给出n个数(A1...An)现求一组整数序列(X1...Xn)使得S=A1X1+...AnXn>0,且S的值最小
输入输出格式
输入格式:
第一行给出数字N,代表有N个数 下面一行给出N个数
输出格式:
S的最小值
我们可以将A1X1+A2X2+...+AnXn看成许多个ax+by,那么我们要求的便是c的最小值,上文说过,c的最小值就是gcd(a,b),所以我们只需求出所有的gcd便可
附上代码
注,如若有误或者哪里讲得不清楚,请联系本人更改或者在下方留言,谢谢啦~\(≧▽≦)/~
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】