数学 / 数论 不定方程 假设我们面前有两种不能拆开的包,一种每包 3 个物品,另一种每包 5 个。我们想要恰好 29 个,应该各拿多少包呢?如果算出来要拿半包,它就没有解决这个问题。在这个页面里,我们会从这样的整包计数开始,看看当答案必须是整数时,解方程的方法会发生什么变化。这一页从整数和带余除法出发;[[divisibility|整除]]和[[congruences|同余]]两页把这些工具讲得更细,这里用到的部分仍会重新说明。
找到几个答案,和证明没有遗漏其他答案,是两件不同的事。我们会把找到的数放回题目检查,也会问:会不会还有别的解?每次得到全部解的结论时,都要说明为什么没有遗漏。
01 为什么答案必须是整数?02 把计算变成坐标上的点03 先不找答案,判断有没有可能04 带余除法怎样帮我们找到一个解05 怎样证明所有解都找到了?06 回到最初的整包问题07 未知数相乘时,换一种思路08 用余数证明不可能09 把推理用到旁边的题目上10 它为什么和线性代数有关系我们用 x x x 表示 3 个装的包数,用 y y y 表示 5 个装的包数。字母只是给还没确定的数起一个名字。如果 x = 3 x = 3 x = 3 ,第一种包一共提供 3 + 3 + 3 = 3 × 3 = 9 3 + 3 + 3 = 3 \times 3 = 9 3 + 3 + 3 = 3 × 3 = 9 个物品;如果 y = 4 y = 4 y = 4 ,第二种提供 5 + 5 + 5 + 5 = 5 × 4 = 20 5 + 5 + 5 + 5 = 5 \times 4 = 20 5 + 5 + 5 + 5 = 5 × 4 = 20 个。加起来就是 9 + 20 = 29 9 + 20 = 29 9 + 20 = 29 。
3 x + 5 y = 29 , x , y ∈ { 0 , 1 , 2 , 3 , … } 3x+5y=29,\qquad x,y\in\{0,1,2,3,\ldots\} 3 x + 5 y = 29 , x , y ∈ { 0 , 1 , 2 , 3 , … } 符号 ∈ \in ∈ 的意思是“属于”。花括号列出允许使用的数,省略号表示还可以继续。这里 x x x 、y y y 可以是 0,因为某一种包可以一包也不拿;不能是负数,因为包数不能为负;也不能是分数。0、1、2、…… 这些数叫作非负整数。
下面两个滑块改变的是两种包的包数。绿色框中有 3 个点,黄色框中有 5 个点,每个点就是一个物品。目标 29 保持不变,我们可以观察 3 x 3x 3 x 和 5 y 5y 5 y 怎样合成总数。再试一试 x = 8 x = 8 x = 8 、y = 1 y = 1 y = 1 :3 × 8 + 5 × 1 = 24 + 5 = 29 3 \times 8 + 5 \times 1 = 24 + 5 = 29 3 × 8 + 5 × 1 = 24 + 5 = 29 ,这又是一个办法。
3 × 3 + 5 × 4 = 9 + 20 = 29 3 \times 3+ 5 \times 4= 9+ 20= 29 3 × 3 + 5 × 4 = 9 + 20 = 29 恰好是 29 个。重置为 3 包和 4 包 现在把方程和整包这个故事分开。整数也可以是负数:……、− 3 -3 − 3 、− 2 -2 − 2 、− 1 -1 − 1 、0、1、2、3、……。我们用 Z \mathbb Z Z 表示所有整数。例如 x = − 2 x = -2 x = − 2 、y = 7 y = 7 y = 7 也满足 3 × ( − 2 ) + 5 × 7 = − 6 + 35 = 29 3 \times (-2) + 5 \times 7 = -6 + 35 = 29 3 × ( − 2 ) + 5 × 7 = − 6 + 35 = 29 。它是这个方程的整数解,却不是一个能实际拿包的方案。所以解题时一定要说清:我们找的是所有整数解,还是只找非负整数解。
要求未知数只能取整数的方程,叫作不定方程 。接下来的二元一次例子会出现没有整数解或有无穷多个整数解的情况,而后面的非线性例子恰好只有六个整数解。关键在于未知数的取值被限制为整数 。
不用同时猜两个数:选定 x x x 后,凑到 29 的要求就决定了 y y y 应该是多少。在等式两边减去 3 x 3x 3 x ,左边会留下 5 y 5y 5 y 。把这个等式的两边除以不为零的 5,就能得到 y y y 。
3 x + 5 y = 29 3 x + 5 y − 3 x = 29 − 3 x 5 y = 29 − 3 x y = 29 − 3 x 5 \begin{aligned}3x+5y&=29\\3x+5y-3x&=29-3x\\5y&=29-3x\\y&=\frac{29-3x}{5}\end{aligned} 3 x + 5 y 3 x + 5 y − 3 x 5 y y = 29 = 29 − 3 x = 29 − 3 x = 5 29 − 3 x x = 0 x = 0 x = 0 时,y = ( 29 − 3 × 0 ) / 5 = 29 / 5 = 5.8 y = (29 - 3 \times 0)/5 = 29/5 = 5.8 y = ( 29 − 3 × 0 ) /5 = 29/5 = 5.8 。它确实满足等式:3 × 0 + 5 × 5.8 = 29 3 \times 0 + 5 \times 5.8 = 29 3 × 0 + 5 × 5.8 = 29 ,可是 5.8 不是整数。x = 3 x = 3 x = 3 时,y = ( 29 − 9 ) / 5 = 20 / 5 = 4 y = (29 - 9)/5 = 20/5 = 4 y = ( 29 − 9 ) /5 = 20/5 = 4 ,这次是整数。如果允许未知数取实数,两组都可以;如果要求取整数,只有后一组可以。这里实数包括整数、分数,也包括数轴上的其他数。
为了把区别画出来,我们让两条数轴在零的位置相交。横着的轴记录 x x x ,竖着的轴记录 y y y 。(3, 4) 的意思是:从交点向右走 3 格,再向上走 4 格。在两个坐标都是整数的位置,我们放一个灰点。这样整齐排开的点叫作整数格点 。我们要找的是算出的点恰好落在灰点上的情况,而不是落在灰点之间。
整数坐标小点、计算出的点与实数解直线 0 2 4 6 8 10 0 1 2 3 4 5 6 x y 灰点:两个坐标都是整数。绿点:算出的解恰好落在灰点上。黄色点:满足方程,可是 y y y 不是整数。十行都算完后会出现紫色线段。
每按一次,保留之前的点,再计算下一个整数 x x x 。页面不会自己前进,我们可以停在任意一行检查。
先从 x = 0 x = 0 x = 0 开始。按按钮计算 y y y 。 重置之前,已经算过的各行都保留。 x x x y y y 整包?
为什么紫色图像是一条直线?让 x x x 增加 h h h ,代入 x + h x + h x + h ,得到 y = ( 29 − 3 x − 3 h ) / 5 = ( 29 − 3 x ) / 5 − 3 h / 5 y = (29 - 3x - 3h)/5 = (29 - 3x)/5 - 3h/5 y = ( 29 − 3 x − 3 h ) /5 = ( 29 − 3 x ) /5 − 3 h /5 。也就是说,横着变化 h h h ,竖着总会变化 − 3 h / 5 -3h/5 − 3 h /5 ,当 h ≠ 0 h \ne 0 h = 0 时,把竖直变化 − 3 h / 5 -3h/5 − 3 h /5 除以水平变化 h h h ,得到 − 3 / 5 -3/5 − 3/5 ,两种变化的比例固定。这就是斜率为 − 3 / 5 -3/5 − 3/5 的直线;斜率记录的是竖直变化除以水平变化。直线上也包含分数坐标,只有其中两个坐标都为整数的点,才回答了整数解的问题。
如果只找非负包数,x x x 不可能超过 9:一旦 x ≥ 10 x \ge 10 x ≥ 10 ,第一种包就至少提供 3 × 10 = 30 3 \times 10 = 30 3 × 10 = 30 个,已经超过 29。所以对这道具体的整包题,检查 x = 0 x = 0 x = 0 到 9 确实覆盖了全部非负可能。但它还没有覆盖全部整数解,因为 x x x 可以为负,y y y 也就可以更大。要处理全部整数,我们需要一个不受这幅有限图像限制的证明。
把每包大小改成 6 和 9,再把目标改成 31。我们先不试很多组数,而是观察:6 和 9 都是 3 的倍数。不管取多少包,每一种提供的总数仍是 3 的倍数,两种加起来也改变不了这一点。
6 x + 9 y = 3 ( 2 x + 3 y ) , 31 = 3 ⋅ 10 + 1 6x+9y=3(2x+3y),\qquad 31=3\cdot10+1 6 x + 9 y = 3 ( 2 x + 3 y ) , 31 = 3 ⋅ 10 + 1 只要 x x x 、y y y 是整数,2 x + 3 y 2x + 3y 2 x + 3 y 就是整数,因此左边恰好是 3 乘以一个整数。31 却不是,31 除以 3 商 10、余 1。所以 6 x + 9 y = 31 6x + 9y = 31 6 x + 9 y = 31 没有整数解,即使允许 x x x 、y y y 为负也不行。这和“试了很多次没找到”不同:我们已经证明它不可能存在。
现在把同样的想法写成一般形式。暂时设 a a a 、b b b 是正整数,目标 c c c 是整数。如果存在整数 A A A ,使 a = d A a = dA a = d A ,我们就说正整数 d d d 整除 a a a ,记作 d ∣ a d \mid a d ∣ a 。能够同时整除 a a a 和 b b b 的数叫作公因数,其中最大的正数叫作最大公因数,记作 gcd ( a , b ) \gcd (a, b) g cd( a , b ) 。这里它一定存在:1 是公因数,而 a a a 的正因数不会超过正数 a a a ,所以可选的数是一个非空的有限集合。
d = gcd ( a , b ) , a = d A , b = d B a x + b y = d A x + d B y = d ( A x + B y ) \begin{aligned}d&=\gcd(a,b),\quad a=dA,\quad b=dB\\ax+by&=dAx+dBy=d(Ax+By)\end{aligned} d a x + b y = g cd( a , b ) , a = d A , b = d B = d A x + d B y = d ( A x + B y ) 假如 a x + b y = c ax + by = c a x + b y = c 有整数解,最后一行就说明 c c c 等于 d d d 乘以整数 A x + B y Ax + By A x + B y ,因此必须有 d ∣ c d \mid c d ∣ c 。我们把这样的条件叫作 必要条件:缺少它,解一定不存在。但目前还不能说满足它就一定有解。反过来的方向,还需要另外证明。
6 的正因数是 {1, 2, 3, 6},9 的正因数是 {1, 3, 9},共同拥有的最大数是 3。目标 30 满足必要条件,因为 30 = 3 × 10 30 = 3 \times 10 30 = 3 × 10 。但这一步只告诉我们可以继续找。接下来我们要真的构造出一个解,而不是把“没有被排除”当成“已经证明有解”。
我们现在的目标,是把最大公因数写成“a a a 乘一个整数,再加上 b b b 乘一个整数”。为什么要这样写?因为只要 d d d 整除 c c c ,我们就能把这两个整数同时乘以 c / d c/d c / d ,让右边从 d d d 变成 c c c 。带余除法正好能帮我们做出这种表示。
先用 3 和 5 完整做一遍 从 5 里拿走一组 3,剩下 2;再从 3 里拿走一组 2,剩下 1;最后 2 恰好包含两组 1,不剩东西。每一步新的余数,都小于刚才用来除的那个数。
5 = 1 ⋅ 3 + 2 3 = 1 ⋅ 2 + 1 2 = 2 ⋅ 1 + 0 \begin{aligned}5&=1\cdot3+2\\3&=1\cdot2+1\\2&=2\cdot1+0\end{aligned} 5 3 2 = 1 ⋅ 3 + 2 = 1 ⋅ 2 + 1 = 2 ⋅ 1 + 0 每个小方块代表 1。总数这一行的小方块,在下面分成了绿色的等组和黄色的余数,你可以上下对照。进入下一步时,旧的分组大小成为新的总数,刚才的余数成为新的分组大小。
5 = 1 × 3 + 2 5= 1\times 3+ 2 5 = 1 × 3 + 2 5 − 1 × 3 = 2 5- 1\times 3= 2 5 − 1 × 3 = 2 接下来用 2 去分 3。新的余数 2 小于原来的分组大小 3。
上一次相除 下一次相除 重置相除
最后一个非零余数是 1。为了把它写成最初的 3 和 5 的组合,我们倒着读第二个等式:1 = 3 − 2 1 = 3 - 2 1 = 3 − 2 。而第一个等式说明 2 = 5 − 3 2 = 5 - 3 2 = 5 − 3 。把这里的 2 换掉,再把括号前的负号分别乘进去。
1 = 3 − 2 = 3 − ( 5 − 3 ) = 3 − 5 + 3 = 2 ⋅ 3 − 1 ⋅ 5 29 = 29 ⋅ 1 = 29 ( 2 ⋅ 3 − 1 ⋅ 5 ) = 3 ⋅ 58 + 5 ⋅ ( − 29 ) \begin{aligned}1&=3-2\\&=3-(5-3)\\&=3-5+3\\&=2\cdot3-1\cdot5\\29&=29\cdot1\\&=29(2\cdot3-1\cdot5)\\&=3\cdot58+5\cdot(-29)\end{aligned} 1 29 = 3 − 2 = 3 − ( 5 − 3 ) = 3 − 5 + 3 = 2 ⋅ 3 − 1 ⋅ 5 = 29 ⋅ 1 = 29 ( 2 ⋅ 3 − 1 ⋅ 5 ) = 3 ⋅ 58 + 5 ⋅ ( − 29 ) 所以 ( 58 , − 29 ) (58, -29) ( 58 , − 29 ) 是 3 x + 5 y = 29 3x + 5y = 29 3 x + 5 y = 29 的一个整数解。直接检查:3 × 58 = 174 3 \times 58 = 174 3 × 58 = 174 ,5 × ( − 29 ) = − 145 5 \times (-29) = -145 5 × ( − 29 ) = − 145 ,而 174 − 145 = 29 174 - 145 = 29 174 − 145 = 29 。它不是一个实际的拿包方案,不过我们当前的目标只是找到一个整数解,这一步已经完成。稍后我们会从一个解走到其他全部解,其中就包含 (3, 4)。
为什么这样的相除一定会停下来? 对两个正整数 U U U 、V V V ,我们从 U U U 中不断拿走整组 V V V ,直到剩下的数小于 V V V 。如果一开始 U < V U < V U < V ,那就一组也不拿。每次至少减少 1,又不能剩下负数,所以一定只需要有限次。用 q q q 记录拿走的组数,用 r r r 记录余数,就得到 U = q V + r U = qV + r U = q V + r ,其中 q q q 是非负整数,0 ≤ r < V 0 \le r < V 0 ≤ r < V 。
如果 r r r 不为零,就对新的一对数 ( V , r ) (V, r) ( V , r ) 重复这件事。每次第二个数都会变成更小的正整数。正整数不可能这样无限下降:从 V V V 开始,最多经过 V − 1 V - 1 V − 1 、V − 2 V - 2 V − 2 、……、1 中的有限个数。因此最终一定出现余数 0。这种反复做带余除法的方法,叫作辗转相除法。
为什么最后保留下来的非零数是最大公因数? 这一步不能只靠观察。我们要证明,把 ( U , V ) (U, V) ( U , V ) 换成 ( V , r ) (V, r) ( V , r ) 时,公因数一个也没变。假如 k k k 同时整除 U U U 、V V V ,就能写 U = k m U = km U = k m 、V = k n V = kn V = k n 。于是 r = U − q V = k m − q k n = k ( m − q n ) r = U - qV = km - qkn = k(m - qn) r = U − q V = k m − q k n = k ( m − q n ) ,说明 k k k 也整除 r r r 。所以 U U U 、V V V 的每一个公因数,也都是 V V V 、r r r 的公因数。
反过来,假如 k k k 同时整除 V V V 、r r r ,就写 V = k n V = kn V = k n 、r = k s r = ks r = k s 。这样 U = q V + r = q k n + k s = k ( q n + s ) U = qV + r = qkn + ks = k(qn + s) U = q V + r = q k n + k s = k ( q n + s ) ,所以 k k k 也整除 U U U 。两个方向都证明了:替换前后的公因数完全相同。最后得到的一对数是 ( d , 0 ) (d, 0) ( d , 0 ) 。d d d 的每个正因数也整除 0,因为 0 = k × 0 0 = k \times 0 0 = k × 0 ;其中最大的就是 d d d 自己。既然每次替换都没有改变公因数,这个 d d d 也就是最初 a a a 、b b b 的最大公因数。
为什么 d d d 一定能写成 a a a 、b b b 的整数倍之和? 最开始,a = 1 a + 0 b a = 1a + 0b a = 1 a + 0 b 、b = 0 a + 1 b b = 0a + 1b b = 0 a + 1 b ,已经都是我们要的形式。假设某一步的两个数能写成 U = m a + n b U = ma + nb U = ma + nb 、V = p a + s b V = pa + sb V = p a + s b ,其中系数都是整数。下一步的余数就是 U − q V U - qV U − q V 。把它展开,就能看清新系数是什么。
r = U − q V = ( m a + n b ) − q ( p a + s b ) = m a + n b − q p a − q s b = ( m − q p ) a + ( n − q s ) b \begin{aligned}r&=U-qV\\&=(ma+nb)-q(pa+sb)\\&=ma+nb-qpa-qsb\\&=(m-qp)a+(n-qs)b\end{aligned} r = U − q V = ( ma + nb ) − q ( p a + s b ) = ma + nb − q p a − q s b = ( m − q p ) a + ( n − q s ) b m − q p m - qp m − q p 、n − q s n - qs n − q s 仍是整数,因为整数相加、相减、相乘后还是整数。所以每往前一步,这种形式都被保留下来。最后留下的 d d d 是过程中保留过的一个数。如果第一次相除就整除,d d d 可能直接是原来的数;否则它是后面出现的余数。两种情况都保持这个形式,因此一定存在整数 u u u 、v v v ,使 a u + b v = d au + bv = d a u + b v = d 。像前面那样倒着把余数替换回去,就能算出 u u u 、v v v 。这条结论常叫作贝祖等式 ;名字只是为了方便引用,并没有代替刚才的证明。
c = d k ( k ∈ Z ) a u + b v = d a ( k u ) + b ( k v ) = k ( a u + b v ) = k d = c \begin{gathered}c=dk\quad(k\in\mathbb Z)\\au+bv=d\\\begin{aligned}a(ku)+b(kv)&=k(au+bv)\\&=kd\\&=c\end{aligned}\end{gathered} c = d k ( k ∈ Z ) a u + b v = d a ( k u ) + b ( k v ) = k ( a u + b v ) = k d = c 如果 d d d 整除 c c c ,那么 k = c / d k = c/d k = c / d 是整数,最后一行就真的构造出整数解 x = k u x = ku x = k u 、y = k v y = kv y = k v 。于是两个方向都完整了:对正整数 a a a 、b b b ,a x + b y = c ax + by = c a x + b y = c 有整数解,当且仅当 gcd ( a , b ) \gcd(a, b) g cd( a , b ) 整除 c c c 。“当且仅当”就是两边可以互相推出的意思。请注意,这里保证的是整数解,还没有保证非负。
对 6 x + 9 y = 30 6x + 9y = 30 6 x + 9 y = 30 ,带余除法给出 9 = 1 × 6 + 3 9 = 1 \times 6 + 3 9 = 1 × 6 + 3 、6 = 2 × 3 + 0 6 = 2 \times 3 + 0 6 = 2 × 3 + 0 。倒过来就是 3 = 9 − 6 3 = 9 - 6 3 = 9 − 6 。因为 30 / 3 = 10 30/3 = 10 30/3 = 10 ,两边乘以 10,得到 30 = 10 × 9 − 10 × 6 = 6 × ( − 10 ) + 9 × 10 30 = 10 \times 9 - 10 \times 6 = 6 \times (-10) + 9 \times 10 30 = 10 × 9 − 10 × 6 = 6 × ( − 10 ) + 9 × 10 。所以 ( − 10 , 10 ) (-10, 10) ( − 10 , 10 ) 是一个解。而 3 不管乘哪个整数,都得不到 31,这也和前面的必要条件证明吻合。
回到 3 x + 5 y = 29 3x + 5y = 29 3 x + 5 y = 29 ,从解 (3, 4) 开始。让 x x x 增加 5,就给总数增加 3 × 5 = 15 3 \times 5 = 15 3 × 5 = 15 ;同时让 y y y 减少 3,又从总数拿走 5 × 3 = 15 5 \times 3 = 15 5 × 3 = 15 。两个变化抵消,所以 (8, 1) 还是解。反方向走一步则得到 ( − 2 , 7 ) (-2, 7) ( − 2 , 7 ) 。重复整数次这样的移动,我们就想到 x = 3 + 5 t x = 3 + 5t x = 3 + 5 t 、y = 4 − 3 t y = 4 - 3t y = 4 − 3 t ,其中 t t t 可以是任意整数,也可以为负或为零。
3 ( 3 + 5 t ) + 5 ( 4 − 3 t ) = 9 + 15 t + 20 − 15 t = 29 \begin{gathered}3(3+5t)+5(4-3t)\\=9+15t+20-15t\\=29\end{gathered} 3 ( 3 + 5 t ) + 5 ( 4 − 3 t ) = 9 + 15 t + 20 − 15 t = 29 代入证明了:我们用这个规则造出来的每一对数都正确。但会不会有另一个解,这个规则永远走不到?为了回答它,我们从任意一个整数解 ( x , y ) (x, y) ( x , y ) 出发,也就是不预先假定它属于刚才的列表。把它满足的等式 3 x + 5 y = 29 3x + 5y = 29 3 x + 5 y = 29 ,减去已知等式 3 × 3 + 5 × 4 = 29 3 \times 3 + 5 \times 4 = 29 3 × 3 + 5 × 4 = 29 。
3 ( x − 3 ) + 5 ( y − 4 ) = 0 Δ x = x − 3 , Δ y = y − 4 3 Δ x = − 5 Δ y \begin{aligned}3(x-3)+5(y-4)&=0\\\Delta x&=x-3,\quad\Delta y=y-4\\3\Delta x&=-5\Delta y\end{aligned} 3 ( x − 3 ) + 5 ( y − 4 ) Δ x 3Δ x = 0 = x − 3 , Δ y = y − 4 = − 5Δ y 符号 Δ \Delta Δ 在这里表示变化:Δ x \Delta x Δ x 就是 x − 3 x - 3 x − 3 ,不是在做一种新的乘法。我们需要证明 Δ x \Delta x Δ x 是 5 的倍数。这一步不能凭感觉把整除关系里的 3 划掉。我们可以使用前面已经算出的 2 × 3 − 5 = 1 2 \times 3 - 5 = 1 2 × 3 − 5 = 1 。把两边乘以 Δ x \Delta x Δ x ,然后把 3 Δ x 3\Delta x 3Δ x 换成 − 5 Δ y -5\Delta y − 5Δ y 。
Δ x = ( 2 ⋅ 3 − 5 ) Δ x = 2 ( 3 Δ x ) − 5 Δ x = 2 ( − 5 Δ y ) − 5 Δ x = 5 ( − 2 Δ y − Δ x ) \begin{aligned}\Delta x&=(2\cdot3-5)\Delta x=2(3\Delta x)-5\Delta x\\&=2(-5\Delta y)-5\Delta x=5(-2\Delta y-\Delta x)\end{aligned} Δ x = ( 2 ⋅ 3 − 5 ) Δ x = 2 ( 3Δ x ) − 5Δ x = 2 ( − 5Δ y ) − 5Δ x = 5 ( − 2Δ y − Δ x ) 括号里是整数,所以存在整数 t t t ,使 Δ x = 5 t \Delta x = 5t Δ x = 5 t 。把它代入 3 Δ x = − 5 Δ y 3\Delta x = -5\Delta y 3Δ x = − 5Δ y ,得到 15 t = − 5 Δ y 15t = -5\Delta y 15 t = − 5Δ y ;再除以不为零的 − 5 -5 − 5 ,得到 Δ y = − 3 t \Delta y = -3t Δ y = − 3 t 。因此,刚才任意拿来的解都必须写成 x = 3 + 5 t x = 3 + 5t x = 3 + 5 t 、y = 4 − 3 t y = 4 - 3t y = 4 − 3 t 。两个方向都证明了:造出来的全是解,所有整数解也全能造出来。这才叫完整的解答 。
把同一段推理写成一般形式 现在设 a a a 、b > 0 b > 0 b > 0 ,d = gcd ( a , b ) d = \gcd (a, b) d = g cd( a , b ) ,并且 d d d 整除 c c c 。设 ( x 0 , y 0 ) (x_{0}, y_{0}) ( x 0 , y 0 ) 是已经找到的一个整数解;右下角的 0 只是给起点做标记。记 A = a / d A = a/d A = a / d 、B = b / d B = b/d B = b / d ,它们都是正整数。A A A 、B B B 不可能有大于 1 的公因数 h h h :否则 d h dh d h 就会同时整除 a a a 、b b b ,而 h > 1 h > 1 h > 1 又使 d h > d dh > d d h > d ,这和 d d d 是最大公因数矛盾。因此 A A A 、B B B 的最大公因数是 1,我们说它们互质。
a x + b y = c a x 0 + b y 0 = c a ( x − x 0 ) + b ( y − y 0 ) = 0 A Δ x + B Δ y = 0 A Δ x = − B Δ y \begin{gathered}ax+by=c\\ax_0+by_0=c\\a(x-x_0)+b(y-y_0)=0\\A\Delta x+B\Delta y=0\\A\Delta x=-B\Delta y\end{gathered} a x + b y = c a x 0 + b y 0 = c a ( x − x 0 ) + b ( y − y 0 ) = 0 A Δ x + B Δ y = 0 A Δ x = − B Δ y 最后一行是把前一行除以 d d d 得到的,因为 d > 0 d > 0 d > 0 ,这个除法合法。A A A 、B B B 互质,所以前面完整证明过的辗转相除论证保证,存在整数 u u u 、v v v ,使 u A + v B = 1 uA + vB = 1 u A + v B = 1 。两边乘以 Δ x \Delta x Δ x ,再把 A Δ x A\Delta x A Δ x 换成 − B Δ y -B\Delta y − B Δ y ,右边的两项就都会带上 B B B 。
Δ x = ( u A + v B ) Δ x = u ( A Δ x ) + v B Δ x = − u B Δ y + v B Δ x = B ( − u Δ y + v Δ x ) \begin{aligned}\Delta x&=(uA+vB)\Delta x\\&=u(A\Delta x)+vB\Delta x\\&=-uB\Delta y+vB\Delta x\\&=B(-u\Delta y+v\Delta x)\end{aligned} Δ x = ( u A + v B ) Δ x = u ( A Δ x ) + v B Δ x = − u B Δ y + v B Δ x = B ( − u Δ y + v Δ x ) 因此存在整数 t t t ,使 Δ x = B t \Delta x = Bt Δ x = B t 。再代入 A Δ x = − B Δ y A\Delta x = -B\Delta y A Δ x = − B Δ y ,得到 A B t = − B Δ y ABt = -B\Delta y A B t = − B Δ y 。因为 B > 0 B > 0 B > 0 ,可以除以 B B B ,得到 Δ y = − A t \Delta y = -At Δ y = − A t 。反过来,这样的变化总会抵消:a ( B t ) + b ( − A t ) = ( a b / d ) t − ( b a / d ) t = 0 a(Bt) + b(-At) = (ab/d)t - (ba/d)t = 0 a ( B t ) + b ( − A t ) = ( ab / d ) t − ( ba / d ) t = 0 。我们再次完成了两个方向,因此全部整数解恰好是下面这些。
x = x 0 + b d t , y = y 0 − a d t , t ∈ Z \boxed{x=x_0+\frac bd\,t,\qquad y=y_0-\frac ad\,t,\qquad t\in\mathbb Z} x = x 0 + d b t , y = y 0 − d a t , t ∈ Z 这也解释了为什么我们可以换一个方便的起点。从整包方程通过辗转相除得到的 ( 58 , − 29 ) (58, -29) ( 58 , − 29 ) 出发,取 t = − 11 t = -11 t = − 11 ,就有 x = 58 + 5 × ( − 11 ) = 3 x = 58 + 5 \times (-11) = 3 x = 58 + 5 × ( − 11 ) = 3 、y = − 29 − 3 × ( − 11 ) = 4 y = -29 - 3 \times (-11) = 4 y = − 29 − 3 × ( − 11 ) = 4 。改从 (3, 4) 开始,只是给同一批解换了参数编号。对 6 x + 9 y = 30 6x + 9y = 30 6 x + 9 y = 30 ,d = 3 d = 3 d = 3 ,每步的移动是 ( 9 / 3 , − 6 / 3 ) = ( 3 , − 2 ) (9/3, -6/3) = (3, -2) ( 9/3 , − 6/3 ) = ( 3 , − 2 ) 。从 ( − 10 , 10 ) (-10, 10) ( − 10 , 10 ) 走四步,得到 ( − 10 + 12 , 10 − 8 ) = ( 2 , 2 ) (-10 + 12, 10 - 8) = (2, 2) ( − 10 + 12 , 10 − 8 ) = ( 2 , 2 ) 。
下面模型的横坐标仍是 x x x ,纵坐标仍是 y y y 。绿点都是整数解,黄色圆圈标出当前选择。选定方程后,让 t t t 改变一个整数步。直角虚线的横向一段表示 x x x 的变化,竖向一段表示 y y y 的变化,旁边的算式检查总数仍然固定。也可以试一下目标 31:那里没有整数解,是因为算术上的矛盾,不是因为点藏在画面外面。
方程固定,只改变整数参数 0 x y (-12, 13) (-7, 10) (-2, 7) (3, 4) (8, 1) (13, -2) (18, -5) 图里只画出七个标好坐标的点,向两边还可以继续。横纵方向分别按这个例子缩放;请读坐标,不要用屏幕上的角度判断数值。
整数参数 t0
d = 1 d = 1 d = 1 x = 3 + 5 × ( 0 ) = 3 x = 3+ 5\times (0) = 3 x = 3 + 5 × ( 0 ) = 3 y = 4 − 3 × ( 0 ) = 4 y = 4- 3\times (0) = 4 y = 4 − 3 × ( 0 ) = 4 3 × ( 3 ) + 5 × ( 4 ) 3\times (3) + 5\times (4) 3 × ( 3 ) + 5 × ( 4 ) = 9 + ( 20 ) = 29 = 9+ ( 20) = 29 = 9 + ( 20 ) = 29 向前一步,x x x 增加 5,y y y 减少 3。总数的变化是 3 × 5 − 5 × 3 = 15 − 15 = 0 3 \times 5 - 5 \times 3 = 15 - 15 = 0 3 × 5 − 5 × 3 = 15 − 15 = 0 。
两个数都非负,所以这个点可以表示包数。
读数 d d d 来自下面这些带余除法;前面的证明已经说明,最后保留下来的非零数就是最大公因数。
3 = 0 × 5 + 3 3= 0\times 5+ 3 3 = 0 × 5 + 3 5 = 1 × 3 + 2 5= 1\times 3+ 2 5 = 1 × 3 + 2 3 = 1 × 2 + 1 3= 1\times 2+ 1 3 = 1 × 2 + 1 2 = 2 × 1 + 0 2= 2\times 1+ 0 2 = 2 × 1 + 0 3 x + 5 y = 29 3x + 5y = 29 3 x + 5 y = 29 的全部整数解已经是 x = 3 + 5 t x = 3 + 5t x = 3 + 5 t 、y = 4 − 3 t y = 4 - 3t y = 4 − 3 t 。现在回到整包题,还要同时满足 x ≥ 0 x \ge 0 x ≥ 0 、y ≥ 0 y \ge 0 y ≥ 0 。所以我们把两个不等式都放到同一个参数 t t t 上,而不是分别选择两个互不相关的数。
3 + 5 t ≥ 0 ⟹ 5 t ≥ − 3 ⟹ t ≥ − 3 5 4 − 3 t ≥ 0 ⟹ 4 ≥ 3 t ⟹ t ≤ 4 3 \begin{aligned}3+5t\ge0&\ \Longrightarrow\ 5t\ge-3\ \Longrightarrow\ t\ge-\frac35\\4-3t\ge0&\ \Longrightarrow\ 4\ge3t\ \Longrightarrow\ t\le\frac43\end{aligned} 3 + 5 t ≥ 0 4 − 3 t ≥ 0 ⟹ 5 t ≥ − 3 ⟹ t ≥ − 5 3 ⟹ 4 ≥ 3 t ⟹ t ≤ 3 4 第一行两边减去 3,得到 5 t ≥ − 3 5t\ge-3 5 t ≥ − 3 ;两边除以正数 5,不等号方向不变。第二行两边加上 3 t 3t 3 t ,得到 4 ≥ 3 t 4\ge3t 4 ≥ 3 t ;两边除以正数 3,同样不改变不等号方向。合起来就是 − 3 / 5 ≤ t ≤ 4 / 3 -3/5 \le t \le 4/3 − 3/5 ≤ t ≤ 4/3 。因为 − 1 < − 3 / 5 < 0 -1 < -3/5 < 0 − 1 < − 3/5 < 0 ,而 1 < 4 / 3 < 2 1 < 4/3 < 2 1 < 4/3 < 2 ,这个区间中只有两个整数:0 和 1。
t t t x = 3 + 5 t x = 3 + 5t x = 3 + 5 t y = 4 − 3 t y = 4 - 3t y = 4 − 3 t 检查总数 0 3 + 0 = 3 3 + 0 = 3 3 + 0 = 3 4 − 0 = 4 4 - 0 = 4 4 − 0 = 4 3 × 3 + 5 × 4 = 29 3 \times 3 + 5 \times 4 = 29 3 × 3 + 5 × 4 = 29 1 3 + 5 = 8 3 + 5 = 8 3 + 5 = 8 4 − 3 = 1 4 - 3 = 1 4 − 3 = 1 3 × 8 + 5 × 1 = 29 3 \times 8 + 5 \times 1 = 29 3 × 8 + 5 × 1 = 29
所以整包方案恰好只有 (3, 4) 和 (8, 1)。这个“恰好”现在有两个依据:前面检查过全部非负 x x x ,刚才又从已经证明完整的整数通解中筛选。写竞赛解答时,要让读者看到这个没有遗漏的理由,而不是只列出两个碰巧算对的方案就结束。
为了反复使用,我们把“不小于 r r r 的最小整数”记作 ⌈ r ⌉ \lceil r\rceil ⌈ r ⌉ ,把“不大于 r r r 的最大整数”记作 ⌊ r ⌋ \lfloor r\rfloor ⌊ r ⌋ 。这是向上取整和向下取整的定义。比如 ⌈ − 3 / 5 ⌉ = 0 \lceil -3/5\rceil = 0 ⌈ − 3/5 ⌉ = 0 ,因为 0 是它右边遇到的第一个整数;⌊ 4 / 3 ⌋ = 1 \lfloor 4/3\rfloor = 1 ⌊ 4/3 ⌋ = 1 ,因为 1 是它左边最后一个整数。记 A = a / d > 0 A = a/d > 0 A = a / d > 0 、B = b / d > 0 B = b/d > 0 B = b / d > 0 ,两个非负条件就可以写成下面这样。
x 0 + B t ≥ 0 ⟺ t ≥ − x 0 B y 0 − A t ≥ 0 ⟺ t ≤ y 0 A ⌈ − x 0 B ⌉ ≤ t ≤ ⌊ y 0 A ⌋ , t ∈ Z \begin{aligned}x_0+Bt\ge0&\ \Longleftrightarrow\ t\ge-\frac{x_0}{B}\\y_0-At\ge0&\ \Longleftrightarrow\ t\le\frac{y_0}{A}\\\left\lceil-\frac{x_0}{B}\right\rceil&\le t\le\left\lfloor\frac{y_0}{A}\right\rfloor,\qquad t\in\mathbb Z\end{aligned} x 0 + B t ≥ 0 y 0 − A t ≥ 0 ⌈ − B x 0 ⌉ ⟺ t ≥ − B x 0 ⟺ t ≤ A y 0 ≤ t ≤ ⌊ A y 0 ⌋ , t ∈ Z 如果下面的整数界限反而大于上面的界限,那就没有非负解,即使整数解存在。例如 3 x + 5 y = 1 3x + 5y = 1 3 x + 5 y = 1 有整数解 ( 2 , − 1 ) (2, -1) ( 2 , − 1 ) ,因为 6 − 5 = 1 6 - 5 = 1 6 − 5 = 1 ;全部解是 x = 2 + 5 t x = 2 + 5t x = 2 + 5 t 、y = − 1 − 3 t y = -1 - 3t y = − 1 − 3 t 。非负要求 t ≥ − 2 / 5 t \ge -2/5 t ≥ − 2/5 ,也就是整数 t ≥ 0 t \ge 0 t ≥ 0 ,同时 t ≤ − 1 / 3 t \le -1/3 t ≤ − 1/3 ,也就是整数 t ≤ − 1 t \le -1 t ≤ − 1 。两者无法同时满足。这就是为什么 gcd ( a , b ) \gcd(a, b) g cd( a , b ) | c c c 本身还不能直接解决实际计数问题。
到目前为止我们知道了 反复做带余除法,可以把最大公因数 d d d 写成 a u + b v au + bv a u + b v ,其中 u , v u, v u , v 是整数。再乘以 c / d c/d c / d 就得到一个解 ,比如 3 x + 5 y = 29 3x + 5y = 29 3 x + 5 y = 29 的 ( 58 , − 29 ) (58, -29) ( 58 , − 29 ) 。 有了一个解,就能得到全部解:对整包问题,x = 3 + 5 t x = 3 + 5t x = 3 + 5 t ,y = 4 − 3 t y = 4 - 3t y = 4 − 3 t ,t t t 是任意整数。我们也证明了没有别的解 。 包数不能是负数。要求 x ≥ 0 x \ge 0 x ≥ 0 、y ≥ 0 y \ge 0 y ≥ 0 后,只剩 t = 0 t = 0 t = 0 和 t = 1 t = 1 t = 1 ,所以只有 ( 3 , 4 ) (3, 4) ( 3 , 4 ) 和 ( 8 , 1 ) (8, 1) ( 8 , 1 ) 两种取法。 接下来:未知数互相相乘时该怎么办。
到现在为止,每个未知数都只是乘以固定的系数,这样的方程是一次的 。现在考虑 x y = x + y + 3 xy = x + y + 3 x y = x + y + 3 ,仍要求 x x x 、y y y 是整数。这里出现了两个未知数的乘积 x y xy x y ,方程的结构变了,前面的二元一次通解公式不能直接使用。我们要找一个办法,把它变成可以列完的整数问题。
既然有乘积,我们就试着把它写成两个因数。先把两边都减去 x x x 、y y y ,得到 x y − x − y = 3 xy - x - y = 3 x y − x − y = 3 。左边看起来接近 ( x − 1 ) ( y − 1 ) (x - 1)(y - 1) ( x − 1 ) ( y − 1 ) ,但我们先展开检查:( x − 1 ) ( y − 1 ) = x y − x − y + 1 (x - 1)(y - 1) = xy - x - y + 1 ( x − 1 ) ( y − 1 ) = x y − x − y + 1 。差的正好是 + 1 +1 + 1 ,所以在原等式两边都加上 1。
x y = x + y + 3 x y − x − y = 3 x y − x − y + 1 = 4 ( x − 1 ) ( y − 1 ) = 4 \begin{aligned}xy&=x+y+3\\xy-x-y&=3\\xy-x-y+1&=4\\(x-1)(y-1)&=4\end{aligned} x y x y − x − y x y − x − y + 1 ( x − 1 ) ( y − 1 ) = x + y + 3 = 3 = 4 = 4 记 u = x − 1 u = x - 1 u = x − 1 、v = y − 1 v = y - 1 v = y − 1 ,方程就成了 u v = 4 uv = 4 uv = 4 。整数减去 1 还是整数;反过来,每个整数 u u u 也都给出整数 x = u + 1 x = u + 1 x = u + 1 。所以这个替换不会丢掉整数对,也不会凭空增加整数对。接下来要列出 4 的全部有序因数对。“有序”是说第一个数负责 x x x ,第二个负责 y y y ,交换位置可能得到不同的解。
两个因数都不能为零,因为乘积是 4。它们必须同号,因为一正一负相乘会得到负数。如果都为正,每一个至少是 1,所以任何一个都不能超过 4。检查 u = 1 u = 1 u = 1 、2、3、4,对应的 v = 4 / u v = 4/u v = 4/ u 分别为 4、2、4 / 3 4/3 4/3 、1,其中第三个不是整数。如果都为负,就写 u = − s u = -s u = − s 、v = − r v = -r v = − r ,其中 s s s 、r r r 为正。此时 u v = s r = 4 uv = sr = 4 uv = sr = 4 ,所以全部负因数对,就是刚才三个正因数对同时变号。
( u , v ) (u, v) ( u , v ) x = u + 1 x = u + 1 x = u + 1 y = v + 1 y = v + 1 y = v + 1 ( x , y ) (x, y) ( x , y ) (1, 4) 1 + 1 = 2 1+ 1 = 2 1 + 1 = 2 4 + 1 = 5 4+ 1 = 5 4 + 1 = 5 (2, 5) (-1, -4) − 1 + 1 = 0 -1+ 1 = 0 − 1 + 1 = 0 − 4 + 1 = − 3 -4+ 1 = -3 − 4 + 1 = − 3 (0, -3) (2, 2) 2 + 1 = 3 2+ 1 = 3 2 + 1 = 3 2 + 1 = 3 2+ 1 = 3 2 + 1 = 3 (3, 3) (-2, -2) − 2 + 1 = − 1 -2+ 1 = -1 − 2 + 1 = − 1 − 2 + 1 = − 1 -2+ 1 = -1 − 2 + 1 = − 1 (-1, -1) (4, 1) 4 + 1 = 5 4+ 1 = 5 4 + 1 = 5 1 + 1 = 2 1+ 1 = 2 1 + 1 = 2 (5, 2) (-4, -1) − 4 + 1 = − 3 -4+ 1 = -3 − 4 + 1 = − 3 − 1 + 1 = 0 -1+ 1 = 0 − 1 + 1 = 0 (-3, 0)
在下面选一对因数,模型会给两个坐标分别加 1,再单独算原方程的左边和右边。由于每一步变形都能倒过来做,而且因数对已经列全,这六对就是全部整数解。如果题目要求的是正整数 x x x 、y y y ,我们就只保留 (2, 5)、(3, 3)、(5, 2),其余三对含有零或负数。
下面矩形里,每个小方块边长为 1、面积为 1。横向标记 ∣ u ∣ |u| ∣ u ∣ 、纵向标记 ∣ v ∣ |v| ∣ v ∣ 表示绝对值,也就是去掉负号后数的大小。例如 ∣ − 2 ∣ = 2 |-2| = 2 ∣ − 2∣ = 2 ,∣ 2 ∣ = 2 |2| = 2 ∣2∣ = 2 。两个边长相乘,数出的就是四个小方块。对负因数对,矩形只表示大小,两个负号仍要在算式中另外检查。
把每一对因数放回原方程 (1, 4) (-1, -4) (2, 2) (-2, -2) (4, 1) (-4, -1)
用因数的大小排出四个小方块 |u| = 1 |v| = 4 1 × 4 = 4 每格是一个单位小方块。矩形有 ∣ u ∣ |u| ∣ u ∣ 列、∣ v ∣ |v| ∣ v ∣ 行。切换因数对改变排列方式,但总共仍是四格。
u = 1 , v = 4 u = 1, v = 4 u = 1 , v = 4 ; u v = uv = uv = 1 × ( 4 ) = 4 1\times (4) = 4 1 × ( 4 ) = 4 x = u + 1 = 1 + 1 = 2 x = u + 1 = 1+ 1 = 2 x = u + 1 = 1 + 1 = 2 y = v + 1 = 4 + 1 = 5 y = v + 1 = 4+ 1 = 5 y = v + 1 = 4 + 1 = 5 x y = 2 × ( 5 ) = 10 xy = 2\times (5) = 10 x y = 2 × ( 5 ) = 10 x + y + 3 = 2 + ( 5 ) + 3 = 10 x + y + 3 = 2+ (5) + 3 = 10 x + y + 3 = 2 + ( 5 ) + 3 = 10 重置为 (1, 4) 不是每个方程都能变成方便的乘积。来看 x 2 + y 2 = 3 x^{2} + y^{2} = 3 x 2 + y 2 = 3 ,要求 x x x 、y y y 是整数,这里的 x 2 x^{2} x 2 就是 x × x x \times x x × x 。我们可以试几个绝对值小的整数,但“没试出来”不是无解的理由。我们将证明:左边和右边除以 4 的余数根本对不上 。这也和同余有关:两个整数模 4 同余,就是说它们的差能被 4 整除,也就是除以 4 时余数相同。
这两种说法为什么一样?把两个整数写成 4 q + r 4q + r 4 q + r 、4 s + u 4s + u 4 s + u ,其中 r r r 、u u u 都是 0、1、2、3 之一。两数的差就是 4 ( q − s ) + ( r − u ) 4(q - s) + (r - u) 4 ( q − s ) + ( r − u ) 。余数相同时,它能被 4 整除;反过来,如果差能被 4 整除,那么 r − u r - u r − u 也必须是 4 的倍数。但 − 3 ≤ r − u ≤ 3 -3 \le r - u \le 3 − 3 ≤ r − u ≤ 3 ,这之间唯一的 4 的倍数是 0,所以 r = u r = u r = u 。
每个整数 n n n ,包括负整数,都落在某一段从 4 q 4q 4 q 到 4 q + 3 4q + 3 4 q + 3 的整数里,因此 n = 4 q + r n = 4q + r n = 4 q + r ,其中 r r r 是 0、1、2、3 之一。要严格选出 q q q ,可以取 q = ⌊ n / 4 ⌋ q = \lfloor n/4\rfloor q = ⌊ n /4 ⌋ ,于是 q ≤ n / 4 < q + 1 q \le n/4 < q + 1 q ≤ n /4 < q + 1 ;两边乘以 4,再减去 4 q 4q 4 q ,得到 0 ≤ n − 4 q < 4 0 \le n - 4q < 4 0 ≤ n − 4 q < 4 。例如 − 1 = 4 × ( − 1 ) + 3 -1 = 4 \times (-1) + 3 − 1 = 4 × ( − 1 ) + 3 。现在把四种形式分别平方,检查哪些部分是 4 的倍数。
( 4 q ) 2 = 16 q 2 = 4 ( 4 q 2 ) ( 4 q + 1 ) 2 = 16 q 2 + 8 q + 1 = 4 ( 4 q 2 + 2 q ) + 1 ( 4 q + 2 ) 2 = 16 q 2 + 16 q + 4 = 4 ( 4 q 2 + 4 q + 1 ) ( 4 q + 3 ) 2 = 16 q 2 + 24 q + 9 = 4 ( 4 q 2 + 6 q + 2 ) + 1 \begin{aligned}(4q)^2&=16q^2\\&=4(4q^2)\\(4q+1)^2&=16q^2+8q+1\\&=4(4q^2+2q)+1\\(4q+2)^2&=16q^2+16q+4\\&=4(4q^2+4q+1)\\(4q+3)^2&=16q^2+24q+9\\&=4(4q^2+6q+2)+1\end{aligned} ( 4 q ) 2 ( 4 q + 1 ) 2 ( 4 q + 2 ) 2 ( 4 q + 3 ) 2 = 16 q 2 = 4 ( 4 q 2 ) = 16 q 2 + 8 q + 1 = 4 ( 4 q 2 + 2 q ) + 1 = 16 q 2 + 16 q + 4 = 4 ( 4 q 2 + 4 q + 1 ) = 16 q 2 + 24 q + 9 = 4 ( 4 q 2 + 6 q + 2 ) + 1 这里每次展开都用了 ( a + b ) 2 = a 2 + a b + b a + b 2 = a 2 + 2 a b + b 2 (a + b)^{2} = a^{2} + ab + ba + b^{2} = a^{2} + 2ab + b^{2} ( a + b ) 2 = a 2 + ab + ba + b 2 = a 2 + 2 ab + b 2 ,它就是把两个括号逐项相乘的结果。右边每个括号里都是整数,所以任何整数平方除以 4,只会余 0 或余 1。两个平方相加,余数的和只有 0 + 0 = 0 0 + 0 = 0 0 + 0 = 0 、0 + 1 = 1 0 + 1 = 1 0 + 1 = 1 、1 + 0 = 1 1 + 0 = 1 1 + 0 = 1 、1 + 1 = 2 1 + 1 = 2 1 + 1 = 2 ,都还不到 4,不需要再减去 4,也没有一个是 3。
x 2 + y 2 = 3 x^{2} + y^{2} = 3 x 2 + y 2 = 3 的右边除以 4 余 3。如果等式两边是同一个整数,余数也必须相同。现在余数不可能相同,所以它没有整数解。同一段计算也排除了所有除以 4 余 3 的目标。但反过来的结论并没有证明:通过这个余数检查,只是没有被这项必要条件排除。就像前面证明一次方程的可解条件时那样,两个方向不能混为一谈。
每道题先想一想:完整的答案需要什么?是证明不可能,是找到一个解再说明全部移动,还是列全因数对?下面的解答可以自己展开,不会自动出现。我们对照的不只是最终数值,还有为什么没有遗漏。
1. 求 4 x + 6 y = 18 4x + 6y = 18 4 x + 6 y = 18 的全部整数解,再找出其中非负的解。 6 = 1 × 4 + 2 6 = 1 \times 4 + 2 6 = 1 × 4 + 2 ,4 = 2 × 2 + 0 4 = 2 \times 2 + 0 4 = 2 × 2 + 0 ,所以 d = 2 d = 2 d = 2 。18 = 2 × 9 18 = 2 \times 9 18 = 2 × 9 ,因此有整数解。回代得到 2 = 6 − 4 2 = 6 - 4 2 = 6 − 4 ,两边乘以 9,得到 18 = 6 × 9 + 4 × ( − 9 ) 18 = 6 \times 9 + 4 \times (-9) 18 = 6 × 9 + 4 × ( − 9 ) ,一个解是 ( − 9 , 9 ) (-9, 9) ( − 9 , 9 ) 。完整的移动是 ( 6 / 2 , − 4 / 2 ) = ( 3 , − 2 ) (6/2, -4/2) = (3, -2) ( 6/2 , − 4/2 ) = ( 3 , − 2 ) 。走三步得到 (0, 3),我们用它作为更方便的起点。
x = 3 t , y = 3 − 2 t , t ∈ Z x ≥ 0 ⇒ t ≥ 0 , y ≥ 0 ⇒ t ≤ 3 2 \begin{aligned}x&=3t,\qquad y=3-2t,\qquad t\in\mathbb Z\\x\ge0&\Rightarrow t\ge0,\qquad y\ge0\Rightarrow t\le\frac32\end{aligned} x x ≥ 0 = 3 t , y = 3 − 2 t , t ∈ Z ⇒ t ≥ 0 , y ≥ 0 ⇒ t ≤ 2 3 整数参数只有 t = 0 t = 0 t = 0 、1,对应 (0, 3)、(3, 1)。检查:4 × 0 + 6 × 3 = 18 4 \times 0 + 6 \times 3 = 18 4 × 0 + 6 × 3 = 18 ,4 × 3 + 6 × 1 = 12 + 6 = 18 4 \times 3 + 6 \times 1 = 12 + 6 = 18 4 × 3 + 6 × 1 = 12 + 6 = 18 。通解证明保证参数公式覆盖全部整数解,两个不等式再恰好筛出非负的那些。
2. 为什么 10 x + 15 y = 7 10x + 15y = 7 10 x + 15 y = 7 没有整数解? 把左边提取公因数:10 x + 15 y = 5 ( 2 x + 3 y ) 10x + 15y = 5(2x + 3y) 10 x + 15 y = 5 ( 2 x + 3 y ) 。x x x 、y y y 是整数时,括号里是整数,所以左边是 5 的倍数。但 7 = 5 × 1 + 2 7 = 5 \times 1 + 2 7 = 5 × 1 + 2 ,余数是 2。相等的数不可能有这两个不同余数,所以无整数解。这里用公因数 5 就足够得到矛盾,无解证明不需要再另算一遍最大公因数。
3. 求 x y = 2 x + 2 y xy = 2x + 2y x y = 2 x + 2 y 的全部整数解。 先把两边都减去 2 x 2x 2 x 、2 y 2y 2 y 。我们想得到乘积,而 ( x − 2 ) ( y − 2 ) (x - 2)(y - 2) ( x − 2 ) ( y − 2 ) 展开后是 x y − 2 x − 2 y + 4 xy - 2x - 2y + 4 x y − 2 x − 2 y + 4 。所以两边加上缺少的 4,得到 ( x − 2 ) ( y − 2 ) = 4 (x - 2)(y - 2) = 4 ( x − 2 ) ( y − 2 ) = 4 。前面已经证明 4 的全部有序因数对是 (1, 4)、(2, 2)、(4, 1)、( − 1 , − 4 ) (-1, -4) ( − 1 , − 4 ) 、( − 2 , − 2 ) (-2, -2) ( − 2 , − 2 ) 、( − 4 , − 1 ) (-4, -1) ( − 4 , − 1 ) 。这次要给两个坐标分别加 2,而不是加 1。
( x , y ) ∈ { ( 3 , 6 ) , ( 4 , 4 ) , ( 6 , 3 ) , ( 1 , − 2 ) , ( 0 , 0 ) , ( − 2 , 1 ) } (x,y)\in\left\{\begin{gathered}(3,6),(4,4),(6,3),\\(1,-2),(0,0),(-2,1)\end{gathered}\right\} ( x , y ) ∈ { ( 3 , 6 ) , ( 4 , 4 ) , ( 6 , 3 ) , ( 1 , − 2 ) , ( 0 , 0 ) , ( − 2 , 1 ) } 对任何列出的因数对 u u u 、v v v ,都有 u v = 4 uv = 4 uv = 4 。令 x = u + 2 x = u + 2 x = u + 2 、y = v + 2 y = v + 2 y = v + 2 ,左边 x y = u v + 2 u + 2 v + 4 = 2 u + 2 v + 8 xy = uv + 2u + 2v + 4 = 2u + 2v + 8 x y = uv + 2 u + 2 v + 4 = 2 u + 2 v + 8 ;右边 2 x + 2 y = 2 ( u + 2 ) + 2 ( v + 2 ) = 2 u + 2 v + 8 2x + 2y = 2(u + 2) + 2(v + 2) = 2u + 2v + 8 2 x + 2 y = 2 ( u + 2 ) + 2 ( v + 2 ) = 2 u + 2 v + 8 。这样一次验证了六个解。反过来,任何原方程的解都必须进入刚才的完整因数表,所以没有其他解。
如果系数是零,或者是负数呢? 主证明明确要求 a a a 、b > 0 b > 0 b > 0 ,是为了保证除法和非负不等式中的方向清楚。不能把零硬塞进那个证明的分母。如果 a = 0 a = 0 a = 0 、b ≠ 0 b \ne 0 b = 0 ,方程就是 b y = c by = c b y = c ;只有 c / b c/b c / b 是整数时才有解,此时 y = c / b y = c/b y = c / b ,而 x x x 可以是任意整数。如果 b = 0 b = 0 b = 0 、a ≠ 0 a \ne 0 a = 0 ,就要求 x = c / a x = c/a x = c / a 是整数,而 y y y 任意。如果两个系数都是零,左边总是零:c = 0 c = 0 c = 0 时每一对整数都满足,c ≠ 0 c \ne 0 c = 0 时一对也不满足。
非零负系数可以通过改变对应未知数的符号来处理。例如定义 X = − x X = -x X = − x ,− 3 x + 5 y = 29 -3x + 5y = 29 − 3 x + 5 y = 29 就变成 3 X + 5 y = 29 3X + 5y = 29 3 X + 5 y = 29 。每个整数 x x x 都恰好对应一个整数 X X X ,反过来 x = − X x = -X x = − X ,所以整数解不会改变。我们已知 X = 3 + 5 t X = 3 + 5t X = 3 + 5 t 、y = 4 − 3 t y = 4 - 3t y = 4 − 3 t ,于是 x = − 3 − 5 t x = -3 - 5t x = − 3 − 5 t 。检查:− 3 ( − 3 − 5 t ) + 5 ( 4 − 3 t ) = 9 + 15 t + 20 − 15 t = 29 -3(-3 - 5t) + 5(4 - 3t) = 9 + 15t + 20 - 15t = 29 − 3 ( − 3 − 5 t ) + 5 ( 4 − 3 t ) = 9 + 15 t + 20 − 15 t = 29 。如果还有非负限制,也要一同翻译:x ≥ 0 x \ge 0 x ≥ 0 对应的是 X ≤ 0 X \le 0 X ≤ 0 ,而不是 X ≥ 0 X \ge 0 X ≥ 0 。
现在我们可以把前面做过的事情和线性代数接起来,而不必突然引入一种没解释的方法。在线性代数里,一对数可以竖着写成一列,这里我们把这样的列叫作向量。两列相加,就是第一个数和第一个数相加,第二个数和第二个数相加;一列乘以某个数,就是每个位置都乘以它。这些操作描述的,正是我们刚才使用的坐标移动。
( 2 2 ) + t ( 3 − 2 ) = ( 2 + 3 t 2 − 2 t ) \begin{pmatrix}2\\2\end{pmatrix}+t\begin{pmatrix}3\\-2\end{pmatrix}=\begin{pmatrix}2+3t\\2-2t\end{pmatrix} ( 2 2 ) + t ( 3 − 2 ) = ( 2 + 3 t 2 − 2 t ) 对 6 x + 9 y = 30 6x + 9y = 30 6 x + 9 y = 30 ,我们从 (2, 2) 开始。列 ( 3 , − 2 ) (3, -2) ( 3 , − 2 ) 表示一种移动:第一个坐标加 3,第二个坐标减 2。方程检查一对数的方法,是把第一个数乘以 6,第二个数乘以 9,再相加。我们可以用一行 [6 9] 记录这个操作,叫作只有一行的矩阵。这里的矩阵乘法就是下面这个定义。
M = ( 6 9 ) M ( x y ) = 6 x + 9 y M ( 2 2 ) = 12 + 18 = 30 M ( 3 − 2 ) = 18 − 18 = 0 \begin{gathered}M=\begin{pmatrix}6&9\end{pmatrix}\\M\begin{pmatrix}x\\y\end{pmatrix}=6x+9y\\M\begin{pmatrix}2\\2\end{pmatrix}=12+18=30\\M\begin{pmatrix}3\\-2\end{pmatrix}=18-18=0\end{gathered} M = ( 6 9 ) M ( x y ) = 6 x + 9 y M ( 2 2 ) = 12 + 18 = 30 M ( 3 − 2 ) = 18 − 18 = 0 把加法写进矩阵符号之前,我们先展开里面的普通算术。列 p p p 的两个数记作 p 1 p_{1} p 1 、p 2 p_{2} p 2 ,另一列 z z z 的两个数记作 z 1 z_{1} z 1 、z 2 z_{2} z 2 。右下角的 1、2 表示第一个、第二个位置,不是幂。两列相加后,两个位置分别是 p 1 + z 1 p_{1} + z_{1} p 1 + z 1 、p 2 + z 2 p_{2} + z_{2} p 2 + z 2 。现在第一个乘以 6,第二个乘以 9。
M ( p + z ) = 6 ( p 1 + z 1 ) + 9 ( p 2 + z 2 ) = 6 p 1 + 6 z 1 + 9 p 2 + 9 z 2 = ( 6 p 1 + 9 p 2 ) + ( 6 z 1 + 9 z 2 ) = M p + M z \begin{aligned}&M(p+z)\\&=6(p_1+z_1)+9(p_2+z_2)\\&=6p_1+6z_1+9p_2+9z_2\\&=(6p_1+9p_2)+(6z_1+9z_2)\\&=Mp+Mz\end{aligned} M ( p + z ) = 6 ( p 1 + z 1 ) + 9 ( p 2 + z 2 ) = 6 p 1 + 6 z 1 + 9 p 2 + 9 z 2 = ( 6 p 1 + 9 p 2 ) + ( 6 z 1 + 9 z 2 ) = M p + M z 减法也一样展开:6 ( w 1 − p 1 ) + 9 ( w 2 − p 2 ) = 6 w 1 − 6 p 1 + 9 w 2 − 9 p 2 = ( 6 w 1 + 9 w 2 ) − ( 6 p 1 + 9 p 2 ) 6(w_{1} - p_{1}) + 9(w_{2} - p_{2}) = 6w_{1} - 6p_{1} + 9w_{2} - 9p_{2} = (6w_{1} + 9w_{2}) - (6p_{1} + 9p_{2}) 6 ( w 1 − p 1 ) + 9 ( w 2 − p 2 ) = 6 w 1 − 6 p 1 + 9 w 2 − 9 p 2 = ( 6 w 1 + 9 w 2 ) − ( 6 p 1 + 9 p 2 ) ,简写为 M ( w − p ) = M w − M p M(w - p) = Mw - Mp M ( w − p ) = M w − M p 。因此下面简短的矩阵规则,来自刚才逐项使用的分配律,不是突然增加的假设。
这个移动给总数带来的变化是零,所以它可以加到原来的解上。更一般地,如果列 p p p 满足 M p = c Mp = c M p = c ,而列 z z z 满足 M z = 0 Mz = 0 M z = 0 ,利用普通乘法的分配律,就有 M ( p + z ) = M p + M z = c + 0 = c M(p + z) = Mp + Mz = c + 0 = c M ( p + z ) = M p + M z = c + 0 = c 。反过来,如果另一列 w w w 也满足 M w = c Mw = c M w = c ,两式相减得到 M ( w − p ) = M w − M p = c − c = 0 M(w - p) = Mw - Mp = c - c = 0 M ( w − p ) = M w − M p = c − c = 0 。于是每一个解,都可以写成“一个特定解,加上一个使输出为零的移动”。
给这些移动起名字之前,我们先把减法画出来。起点 (2, 2) 保持固定。在下面第 1 步,选一个 6 x + 9 y = 30 6x + 9y = 30 6 x + 9 y = 30 上的解;第 2 步把它的横坐标减去 2,纵坐标也减去 2。图中每一个点都做同样的减法。我们可以观察起点怎样变成原点,同时比较点与点之间保持不变的坐标差。
减去 (2, 2) 的平移 -4 -2 0 2 4 6 8 -4 -2 0 2 4 6 (5, 0) x y 小黄色圈是起点,大黄色圈是当前选择的点,绿色虚线表示两点间的坐标变化。减去 (2, 2) 会让每一个点左移 2、下移 2;点与点之间的变化保持不变。
选择整数解,t1
1. 原来的解 2. 减去 (2, 2) 重置平移
x = 2 + 3 × ( 1 ) = 5 x = 2 + 3 \times (1) = 5 x = 2 + 3 × ( 1 ) = 5 y = 2 − 2 × ( 1 ) = 0 y = 2 - 2 \times (1) = 0 y = 2 − 2 × ( 1 ) = 0 6 x + 9 y = 30 + ( 0 ) = 30 6x + 9y = 30+ (0) = 30 6 x + 9 y = 30 + ( 0 ) = 30 t = 1 t = 1 t = 1 时,选中的解是 (5, 0)。它相对 (2, 2) 的变化为 ( 5 − 2 , 0 − 2 ) = ( 3 , − 2 ) (5 - 2, 0 - 2) = (3, -2) ( 5 − 2 , 0 − 2 ) = ( 3 , − 2 ) 。按第 2 步,让这些差值成为新的坐标。
让矩阵输出为零的所有移动组成的集合,叫作矩阵的核 ,也叫零空间 。这个名字记录的就是刚才解释过的 M z = 0 Mz = 0 M z = 0 。对这一行 [6 9],把 z z z 写成 ( u , v ) (u, v) ( u , v ) ,就有 6 u + 9 v = 0 6u + 9v = 0 6 u + 9 v = 0 ,两边除以 3 得到 2 u + 3 v = 0 2u + 3v = 0 2 u + 3 v = 0 。记 s = u / 3 s = u/3 s = u /3 ;如果允许实数,这总能做到。于是 u = 3 s u = 3s u = 3 s ,v = − 2 u / 3 = − 2 s v = -2u/3 = -2s v = − 2 u /3 = − 2 s 。所以全部使输出为零的实数移动,就是 s ( 3 , − 2 ) s(3, -2) s ( 3 , − 2 ) 。
( x y ) = ( 2 2 ) + s ( 3 − 2 ) , s ∈ R ( x y ) = ( 2 2 ) + t ( 3 − 2 ) , t ∈ Z \begin{aligned}\begin{pmatrix}x\\y\end{pmatrix}&=\begin{pmatrix}2\\2\end{pmatrix}+s\begin{pmatrix}3\\-2\end{pmatrix},\quad s\in\mathbb R\\\begin{pmatrix}x\\y\end{pmatrix}&=\begin{pmatrix}2\\2\end{pmatrix}+t\begin{pmatrix}3\\-2\end{pmatrix},\quad t\in\mathbb Z\end{aligned} ( x y ) ( x y ) = ( 2 2 ) + s ( 3 − 2 ) , s ∈ R = ( 2 2 ) + t ( 3 − 2 ) , t ∈ Z 这里 R \mathbb R R 表示实数。允许 s s s 取任意实数,就填满整条直线;例如 s = 1 / 2 s = 1/2 s = 1/2 时得到 ( 7 / 2 , 1 ) (7/2, 1) ( 7/2 , 1 ) ,它是实数解,不过第一个坐标不是整数。限制坐标都为整数,就只留下直线上分开的点。为什么这时 s s s 必须为整数?如果 u = 3 s u = 3s u = 3 s 、v = − 2 s v = -2s v = − 2 s 都是整数,那么 s = u + v s = u + v s = u + v ,因为 3 s − 2 s = s 3s - 2s = s 3 s − 2 s = s ,而两个整数的和还是整数。反过来,s s s 为整数又确实使两个坐标都是整数。这样就严格证明了参数限制,而不是只根据图像猜测。
这里有一个容易出错的地方。更大的移动 ( 9 , − 6 ) (9, -6) ( 9 , − 6 ) 也让输出为零,因为 6 × 9 + 9 × ( − 6 ) = 54 − 54 = 0 6 \times 9 + 9 \times (-6) = 54 - 54 = 0 6 × 9 + 9 × ( − 6 ) = 54 − 54 = 0 。如果参数可以取实数,它表示同一个方向。但如果从 (2, 2) 出发,只允许 ( 9 , − 6 ) (9, -6) ( 9 , − 6 ) 的整数倍,就会漏掉 (5, 0):到那里需要的变化 ( 3 , − 2 ) (3, -2) ( 3 , − 2 ) ,只是大移动的三分之一。这就是为什么整数通解必须用 ( b / d , − a / d ) (b/d, -a/d) ( b / d , − a / d ) ,不能直接写 ( b , − a ) (b, -a) ( b , − a ) 。前面的互质论证保证了,这个更小的移动会走到全部整数解。
线性代数帮助我们解释解的形状,以及“特定解加上使输出为零的移动”这一结构。数论则进一步问:这个实数图形里,到底有没有整数点?例如 2 x + 4 y = 1 2x + 4y = 1 2 x + 4 y = 1 有实数解 ( 1 / 2 , 0 ) (1/2, 0) ( 1/2 , 0 ) ,因为 2 × 1 / 2 + 0 = 1 2 \times 1/2 + 0 = 1 2 × 1/2 + 0 = 1 ;但 x x x 、y y y 为整数时,左边是 2 ( x + 2 y ) 2(x + 2y) 2 ( x + 2 y ) ,必为偶数,所以没有整数解。解出了实数范围里的线性方程,并没有自动解决整数问题。
回到最初的整包题:方程给出一条实数直线,整数条件从中筛出格点,实际计数又只保留两个坐标都非负的点。我们分别证明了每一次筛选的理由。题目允许哪些数,决定了什么才算答案;变形有没有丢解或增加假解,决定了结果是否可靠。说明这些理由后,才算回答了最开始的问题。