专题·扩展欧几里得定理【including 求解二元一次方程,线性同余方程

初见安~这里是基础数论专题(3)~【详见数论专栏】

p.s:本文章假设你已经掌握了欧几里得算法——辗转相除法求最大公约数(gcd)

一、二元一次方程

形如\large ax+by=c的含有两个未知数且最高次数为1的方程我们称之为二元一次方程。

很显然,一般的二元一次方程的解都是有很多组的,并没有唯一解。

我们先不讨论其他的,尝试一下解方程的整数解:)

我们知道,在辗转相除法中,gcd(a,b)=gcd(b,a % b)。而取余的操作又可以写成:a - a / b * b(这里是整除),所以带入原式子可以得到:

\large ax+by=c; bx'+(a-a/b*b)y'=c;

再由此可得:

\large x = y'; y = x' -a/b*y'

而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为整数)作为解成立。即

\large a * (x_{0} + d_{1} * k) + b * (y_{0} + d_{2} * k) = c。再结合ax + by = c可得:\large \frac{d_{1}}{d_{2}} = -\frac{b}{a} = -\frac{\frac{b}{gcd(a, b)}}{\frac{a}{gcd(a, b)}}

所以可以表示得到:\large d_{1} = \frac{b}{gcd(a, b)}, d_{2} = -\frac{a}{gcd(a, b)}

所以方程的解就可以表示为:

\large x = x_{0} + k * \frac{b}{gcd(a, b)}, y = y_{0} - k * \frac{a}{gdc(a, b)}

如上述例子中,x0 = -22,y0 = 28,则通解为:(-22 + 26k, 28 - 33k)(k为整数)。

如此解法,就是扩展欧几里得定理。

代码实现的话直接套用我们表格旁的公式,递归gcd后回溯时计算即可。【记得保存x'】

二、线性同余方程

形如\large ax\equiv b(mod n),即\large ax mod n=b且唯一未知数为一次的方程为线性同余方程。

x为同余方程a关于b模n的解。也就是说ax和b同余。x一定为整数。

那么线性同余方程如何求解呢?首先我们观察——\large ax mod n=b,那么为我们可以通过取余的性质转化为\large ax+ny=b这么一个二元一次方程来求解就行啦。

但是这里有一个问题——同余和二元一次方程还是有区别的,同余的话不一定有解。在欧几里得定理的基础上,我们可以求得\large ax+ny=gcd(a,n)的整数解,但是如果b并不是gcd(a,n)的倍数的话,求解出来的同余方程的解就是个分数了,也就是无解

那么如果有解呢——因为同余方程有个取余的操作,也就是说x % d = x,(x + d)%d=x。所以如果有解,则恰好有gcd(a,n)个解

求解同余方程的时候一定要注意一个问题——你求的ax + ny到底是b还是gcd(a, n),因为这涉及到一个到底是处理结果x还是处理a、n的问题,一定要小心。

代码的话就在扩欧的最后特判是否有解即可,具体操作具体到题目上。

关于求同余方程最小正整数解的问题,在逆元(传送门建设中)讲解后补充上~

迎评:)
——End——

你可能感兴趣的:(数论)