先讲一个很基础的事实
我之前曾经证明过
(a,b)=(a,b+a)
具体请看这里:点击传送
同样的道理,我也有
(a,b)=(a,b−a)
为了避免一些不必要的麻烦,所有的最大公约数我都定义为正数,并且我们避免讨论
(0,0)
上面两个式子意味着什么呢?
意味着
(a,b)=(a,b+ka)
那么也就可以导出我们的辗转相除公式:
(a,b)=(a,b mod a)
因为取模其实就是减去若干个
a
裴蜀定理的内容
最简洁的表达就一句话:对于
a,b∈N∗,x,y∈Z,
ax+by=(a,b)一定有解
分析一下,令
g=(a,b)
扫描二维码关注公众号,回复:
10418253 查看本文章
既然
ax+by=g有解,那么肯定
ax+by=2g,3g,…也有解,
ax+by=−g,−2g,−3g,…也有解
那么换句话说,
f(x,y)=ax+by的值域是
{…,−3g,−2g,−g,0,g,2g,3g,…}
证明1
这个思路来自百度百科,点击查看原文
令
g=(a,b)
假设
a,b的线性组合能得到的最小正整数为
s=axs+bys,因为
g∣a,g∣b,所以
g∣s
令
r=a mod s,设
q=⌊sa⌋,则
r=a−qs=a(1−xs)+b(−ys),所以
r也是
a,b的线性组合
显然
r∈[0,s),而刚才已经假设
s是线性组合得到的最小正整数,所以必有
r=0
那么
s∣a,同理
s∣b,所以
s∣g
而最开始说了
g∣s
所以
s=g
证明2
我们将会用这个式子建立一个递推:
(a,b)=(b,a mod b),进而证明裴蜀定理
假设要求的是
ax+by=(a,b)中的
(x,y),已知的是
bx′+(a mod b)y′=(a,b)中的
(x′,y′)
现在令
ax+by=bx′+(amodb)y′
用
a−b⌊ba⌋代替
a mod b,可以把右端整理成
a(y′)+b(x′−⌊ba⌋y′)
进而得到
x=y′,y=(x′−⌊ba⌋y′)
这是一个递归的过程,最终状态是
(a,b)=b,令这个时候的
x=0,y=1即可倒推出最初方程的解
在上述算法进行过程中,我们就已经求出了一组
(x,y)使得
ax+by=(a,b),而根据算法过程可以发现这个算法肯定是可以一直进行到底的,所以解肯定存在,也就证明了裴蜀定理
多个正整数的线性组合的值域
假设我们有
a1,a2,a3,…,an,设
g=(a1,a2,a3,…,an)
同样设
s为线性组合能得到的最小正整数
同样,首先
g∣s
同样,得到
r=a1 mod s是
a1,a2,…,an的线性组合,同样得到
r∈[0,s)
同样推出
r=0
同样得到
s∣ai,同样得到
s=g
因此这个线性组合的值域同样还是
{…,−3g,−2g,−g,0,g,2g,3g,…}
不定方程
ax+by=c的解法
既然
ax+by的值域是
{kg},那么
c∈{kg}就是方程
ax+by=c有解的充要条件
我们先找到
ax+by=(a,b)的一组解
(x0,y0),用到的方法就是上面介绍的递归方法
显然
gc(x0,y0)就是一个原方程的解
但是很多应用场景需要我们求出
x0的最小正整数解,所以这个时候就要研究方程的解集
举个例子就会发现
ax+by=c的解集比
ax+by=(a,b)的解集更大,比如
a=2,b=4,c=8,那么
x=2,y=1是
2x+4y=8的解,却不是
x+2y=4的解
因为你把解缩小一半之后得到的是
x=1,y=21,虽然也满足方程
x+2y=4,却不是整数解,所以从
ax+by=(a,b)入手不合适
假设
x已经确定了,那么可以得到
y=bc−ax,为了让
y是一个整数,必须
c≡ax(modb)
这个方程看起来把
a除过去就能解出
x了,为了能除过去,我们需要逆元存在,根据已知条件,假设
c=c′g,接着令
a=a′g,b=b′g,那么上述方程就是
c′≡a′x(modb′)(注意这一步没有让解集发生变化,因为我把方程的左右两端都除以了一个数)
这个时候
(a′,b′)=1,就可以求出
x=c′a′−1
而根据
c′≡a′x(modb′)还可以得到
a(x1−x2)≡0(modb′)
也就是任意两个解的差是
b′的整数倍
假设
x0,y0是
a′x+b′y=c′的一组解,可以发现
x0+b′,y0−a′也是解,这就是说我找到了
a′x+b′y=c′的解集:
x0+kb′,y0−ka′
那么问题就成了怎么找到一组
x0,y0,使得
a′x0+b′y0=c′
这个问题其实很简单,我们使用证明2中介绍的递归方法,就可以找到
a′x+b′y=1的一组解,再同时乘以
c′就能得到
a′x+b′y=c′的一组解了
求不定方程
ax+by=c解集的算法流程
经过如上分析,最终我们可以得到一个求方程
ax+by=c解系的完整方案:
如果
c不是
(a,b)的倍数,无解,否则:
令
g=(a,b),a′=a/g,b′=b/g,c′=c/g
先用递归方法求出一组
x0,y0使得
a′x0+b′y0=c′,那么解集就是
x=x0c′+kb′y=y0c′+ka′