贝祖定理
如果 \(a\)、\(b\) 是整数,那么一定存在整数 \(x\)、\(y\) 使得 \(ax+by=\gcd(a,b)\)。
换句话说,如果 \(ax+by=m\) 有解,那么 \(m\) 一定是 \(\gcd(a,b)\) 的若干倍。(可以来判断一个这样的式子有没有解)
有一个直接的应用就是 如果 \(ax+by=1\) 有解,那么 \(gcd(a,b)=1\)。
然而这并不能告诉我们x,y解是多少。
扩展欧几里得(exgcd)
首先对 \(a|b\) 一定有一个解 \(a\times 1+b\times 0=\gcd(a,b)\)。但是我们的 \(a\) 和 \(b\) 不一定满足该条件。不过我们可以辗转相除直到满足条件,然后回代:
\[ \begin{aligned} &b\times x_n+(a-\lfloor \frac ab\rfloor*b)\times y_n=\gcd(a,b) \\ \Rightarrow &a\times y_n + b\times(x_n – \lfloor \frac ab\rfloor\times y_n) = \gcd(a,b)\\ \Rightarrow &x_{n+1} = y_n , y_{n+1} = x_n – \lfloor \frac ab\rfloor\times y_n\\ \end{aligned} \]
1 |
|
解释一下 exgcd1()
的递推式。d
是最大公约数,这个在 b=0
,即上一层 a%b==0
时找到,更新传回即可。
我们 x
和 y
都是直接更新地址的,那我们这里的 y
其实就是传给上一层的
x
,相当于
y=x-(a/b)*y
,因为我们传下来的时候是将 x
和
y
颠倒的,那么这里 x
就和 y
互换,即 y-=(a/b)*x
,x
还是
x
,传上去就变成 y
了。
求逆元
上面得到的 \(x\) 即为 \(a\) 在 \(\pmod b\) 意义下的逆元。
注意,一个数的是有可能没有逆元的,需要提前判断,否则这时候
x
好像是返回 \(1\)。如果是有逆元的,解出来的
x
有可能是负数,这时候你可能需要
x=(x+mod)%mod
。
求不定方程
(我之前没用Markdown写得真难受)
(这个部分是我学了excrt之后才更新的)
(之前学的真是肤浅而且一团乱麻)
exgcd 既然可以求 \(ax+by=\gcd(a,b)\) 的解,那么一定就可以求 \(ax+by=c\) 的解。
假设 \(g=\gcd(a,b)\),那么我们先把方程两边同时乘 \(g/c\),那么是不是就可以求 \(x\) 和 \(y\) 了呢?那么求完之后我们在给他乘回去不就行了?
那就行了。
判断无解的情况:如果求出来的 \(g\) 并不能被 \(c\) 整除,说明在数论范围内它无解。
鉴于不定方程的性质,\(x\) 的最小正整数解是在 \(b\) 意义下取模的,\(y\) 的最小正整数解是在 \(a\) 意义下取模的。我们就可以求出 \(x\),\(y\) 的最小整数解和整数解的个数。因为 \(x\) 和 \(y\) 的增减性是相反的,我们也就可以相应算出最大值。
1 |
|