浅谈:从最大公约数到不定方程

先讲一个很基础的事实

我之前曾经证明过 ( a , b ) = ( a , b + a ) (a,b) = (a,b+a)

具体请看这里:点击传送

同样的道理,我也有 ( a , b ) = ( a , b a ) (a,b) = (a,b-a)

为了避免一些不必要的麻烦,所有的最大公约数我都定义为正数,并且我们避免讨论 ( 0 , 0 ) (0,0)

上面两个式子意味着什么呢?

意味着 ( a , b ) = ( a , b + k a ) (a,b) = (a,b+ka)

那么也就可以导出我们的辗转相除公式:

( a , b ) = ( a , b   m o d   a ) (a,b) = (a, b\ mod\ a)

因为取模其实就是减去若干个 a a

裴蜀定理的内容

最简洁的表达就一句话:对于 a , b N , x , y Z a,b \in N^*,x,y \in Z a x + b y = ( a , b ) ax+by=(a,b) 一定有解

分析一下,令 g = ( a , b ) g=(a,b)

扫描二维码关注公众号,回复: 10418253 查看本文章

既然 a x + b y = g ax+by=g 有解,那么肯定 a x + b y = 2 g , 3 g , ax+by=2g,3g,\dots 也有解, a x + b y = g , 2 g , 3 g , ax+by=-g,-2g,-3g,\dots 也有解

那么换句话说, f ( x , y ) = a x + b y f(x,y) = ax+by 的值域是 { , 3 g , 2 g , g , 0 , g , 2 g , 3 g , } \{\dots,-3g,-2g,-g,0,g,2g,3g,\dots\}

证明1

这个思路来自百度百科,点击查看原文

g = ( a , b ) g = (a,b)

假设 a , b a,b 的线性组合能得到的最小正整数为 s = a x s + b y s s=ax_s+by_s ,因为 g a , g b g|a,g|b ,所以 g s g|s

r = a   m o d   s r = a\ mod\ s ,设 q = a s q = \lfloor \frac{a}{s} \rfloor ,则 r = a q s = a ( 1 x s ) + b ( y s ) r = a - qs = a(1-x_s)+b(-y_s) ,所以 r r 也是 a , b a,b 的线性组合

显然 r [ 0 , s ) r \in [0,s) ,而刚才已经假设 s s 是线性组合得到的最小正整数,所以必有 r = 0 r=0

那么 s a s|a ,同理 s b s|b ,所以 s g s|g

而最开始说了 g s g|s

所以 s = g s=g

证明2

我们将会用这个式子建立一个递推: ( a , b ) = ( b , a   m o d   b ) (a,b) = (b,a\ mod\ b) ,进而证明裴蜀定理

假设要求的是 a x + b y = ( a , b ) ax+by = (a,b) 中的 ( x , y ) (x,y) ,已知的是 b x + ( a   m o d   b ) y = ( a , b ) bx'+(a\ mod\ b)y' = (a,b) 中的 ( x , y ) (x',y')

现在令 a x + b y = b x + ( a m o d    b ) y ax+by = bx'+(a \mod b)y'

a b a b a-b\lfloor \frac{a}{b} \rfloor 代替 a   m o d   b a\ mod\ b ,可以把右端整理成 a ( y ) + b ( x a b y ) a(y')+b(x'-\lfloor\frac{a}{b}\rfloor y')

进而得到 x = y , y = ( x a b y ) x = y', y=(x'-\lfloor\frac{a}{b}\rfloor y')

这是一个递归的过程,最终状态是 ( a , b ) = b (a,b) = b ,令这个时候的 x = 0 , y = 1 x=0,y=1 即可倒推出最初方程的解

在上述算法进行过程中,我们就已经求出了一组 ( x , y ) (x,y) 使得 a x + b y = ( a , b ) ax+by=(a,b) ,而根据算法过程可以发现这个算法肯定是可以一直进行到底的,所以解肯定存在,也就证明了裴蜀定理

多个正整数的线性组合的值域

假设我们有 a 1 , a 2 , a 3 , , a n a_1,a_2,a_3,\dots,a_n ,设 g = ( a 1 , a 2 , a 3 , , a n ) g = (a_1,a_2,a_3,\dots,a_n)

同样设 s s 为线性组合能得到的最小正整数

同样,首先 g s g|s

同样,得到 r = a 1   m o d   s r = a_1 \ mod\ s a 1 , a 2 , , a n a_1,a_2,\dots,a_n 的线性组合,同样得到 r [ 0 , s ) r \in [0,s)

同样推出 r = 0 r=0

同样得到 s a i s|a_i ,同样得到 s = g s = g

因此这个线性组合的值域同样还是 { , 3 g , 2 g , g , 0 , g , 2 g , 3 g , } \{\dots,-3g,-2g,-g,0,g,2g,3g,\dots\}

不定方程 a x + b y = c ax+by=c 的解法

既然 a x + b y ax+by 的值域是 { k g } \{kg\} ,那么 c { k g } c \in \{kg\} 就是方程 a x + b y = c ax+by=c 有解的充要条件

我们先找到 a x + b y = ( a , b ) ax+by=(a,b) 的一组解 ( x 0 , y 0 ) (x_0,y_0) ,用到的方法就是上面介绍的递归方法

显然 c g ( x 0 , y 0 ) \frac{c}{g}(x_0,y_0) 就是一个原方程的解

但是很多应用场景需要我们求出 x 0 x_0 的最小正整数解,所以这个时候就要研究方程的解集

举个例子就会发现 a x + b y = c ax+by=c 的解集比 a x + b y = ( a , b ) ax+by=(a,b) 的解集更大,比如 a = 2 , b = 4 , c = 8 a=2,b=4,c=8 ,那么 x = 2 , y = 1 x=2,y=1 2 x + 4 y = 8 2x+4y=8 的解,却不是 x + 2 y = 4 x+2y=4 的解

因为你把解缩小一半之后得到的是 x = 1 , y = 1 2 x=1,y=\frac{1}{2} ,虽然也满足方程 x + 2 y = 4 x+2y=4 ,却不是整数解,所以从 a x + b y = ( a , b ) ax+by = (a,b) 入手不合适

假设 x x 已经确定了,那么可以得到 y = c a x b y = \frac{c-ax}{b} ,为了让 y y 是一个整数,必须 c a x ( m o d    b ) c \equiv ax(\mod b)

这个方程看起来把 a a 除过去就能解出 x x 了,为了能除过去,我们需要逆元存在,根据已知条件,假设 c = c g c=c'g ,接着令 a = a g , b = b g a=a'g,b=b'g ,那么上述方程就是 c a x ( m o d    b ) c' \equiv a'x (\mod b') (注意这一步没有让解集发生变化,因为我把方程的左右两端都除以了一个数)

这个时候 ( a , b ) = 1 (a',b')=1 ,就可以求出 x = c a 1 x = c'a'^{-1}

而根据 c a x ( m o d    b ) c' \equiv a'x (\mod b') 还可以得到 a ( x 1 x 2 ) 0 ( m o d    b ) a(x_1-x_2) \equiv 0 (\mod b')

也就是任意两个解的差是 b b' 的整数倍

假设 x 0 , y 0 x_0,y_0 a x + b y = c a'x+b'y=c' 的一组解,可以发现 x 0 + b , y 0 a x_0+b',y_0-a' 也是解,这就是说我找到了 a x + b y = c a'x+b'y=c' 的解集: x 0 + k b , y 0 k a x_0+kb',y_0-ka'

那么问题就成了怎么找到一组 x 0 , y 0 x_0,y_0 ,使得 a x 0 + b y 0 = c a'x_0+b'y_0=c'

这个问题其实很简单,我们使用证明2中介绍的递归方法,就可以找到 a x + b y = 1 a'x+b'y=1 的一组解,再同时乘以 c c' 就能得到 a x + b y = c a'x+b'y=c' 的一组解了

求不定方程 a x + b y = c ax+by=c 解集的算法流程

经过如上分析,最终我们可以得到一个求方程 a x + b y = c ax+by=c 解系的完整方案:

如果 c c 不是 ( a , b ) (a,b) 的倍数,无解,否则:

g = ( a , b ) , a = a / g , b = b / g , c = c / g g=(a,b),a'=a/g,b'=b/g,c'=c/g

先用递归方法求出一组 x 0 , y 0 x_0,y_0 使得 a x 0 + b y 0 = c a'x_0+b'y_0=c' ,那么解集就是

x = x 0 c + k b y = y 0 c + k a x = x_0c' + kb' \\ y = y_0c' + ka'

发布了948 篇原创文章 · 获赞 77 · 访问量 21万+

猜你喜欢

转载自blog.csdn.net/FSAHFGSADHSAKNDAS/article/details/105168360
今日推荐