初见安~这里是基础数论专题(3)~【详见数论专栏】
p.s:本文章假设你已经掌握了欧几里得算法——辗转相除法求最大公约数(gcd)
形如的含有两个未知数且最高次数为1的方程我们称之为二元一次方程。
很显然,一般的二元一次方程的解都是有很多组的,并没有唯一解。
我们先不讨论其他的,尝试一下解方程的整数解:)
我们知道,在辗转相除法中,gcd(a,b)=gcd(b,a % b)。而取余的操作又可以写成:a - a / b * b(这里是整除),所以带入原式子可以得到:
再由此可得:
而x‘ 和y'在辗转相除法中都可以逆推回来,也就是说可以得到这么一个表格:
以99x + 78y = 6为例
a | b | a/b | x | y |
99 | 78 | 1 | -22 | 28 |
78 | 21 | 3 | 6 | -22 |
21 | 15 | 1 | -4 | 6 |
15 | 6 | 2 | 2 | -4 |
6 | 3 | 2 | 0 | 2 |
3 | 0 | NA | 2 | 0 |
左边两列由上往下通过辗转相除法推出,靠右两列从下往上通过刚才得出的公式推出,得到一组特解:x = -22, y = 28。
那么如何表示出所有的解呢?
很明显的,在特解(x0, y0)的基础上,其余均有(x0 + d1 * k, y0 + d2 * k)(k为整数)作为解成立。即
所以方程的解就可以表示为:
如上述例子中,x0 = -22,y0 = 28,则通解为:(-22 + 26k, 28 - 33k)(k为整数)。
如此解法,就是扩展欧几里得定理。
代码实现的话直接套用我们表格旁的公式,递归gcd后回溯时计算即可。【记得保存x'】
形如,即且唯一未知数为一次的方程为线性同余方程。
x为同余方程a关于b模n的解。也就是说ax和b同余。x一定为整数。
那么线性同余方程如何求解呢?首先我们观察——,那么为我们可以通过取余的性质转化为这么一个二元一次方程来求解就行啦。
但是这里有一个问题——同余和二元一次方程还是有区别的,同余的话不一定有解。在欧几里得定理的基础上,我们可以求得的整数解,但是如果b并不是gcd(a,n)的倍数的话,求解出来的同余方程的解就是个分数了,也就是无解。
那么如果有解呢——因为同余方程有个取余的操作,也就是说x % d = x,(x + d)%d=x。所以如果有解,则恰好有gcd(a,n)个解。
求解同余方程的时候一定要注意一个问题——你求的ax + ny到底是b还是gcd(a, n),因为这涉及到一个到底是处理结果x还是处理a、n的问题,一定要小心。
代码的话就在扩欧的最后特判是否有解即可,具体操作具体到题目上。
关于求同余方程最小正整数解的问题,在逆元(传送门建设中)讲解后补充上~
迎评:)
——End——