欧几里得算法, 中国剩余定理
关于gcd(最大公约数)的欧几里得算法
朴素的欧几里得算法
欧几里得算法依赖于一个朴素的公式:
如果 $ a, b $ 的最大公约数为 $c$ , 那么 $ a, a mod b $ 的最大公约数也为 $c$ .
易于理解的, $ gcd(a, b) \times lcm(a, b) = a \times b $ .
C++的代码实现:
1 | int gcd(int a, int b) { |
exgcd(拓展欧几里得算法)
exgcd是干什么的
exgcd可以用于求解如下式子:
或者
然后进一步求解如下的情况:
显然只要把第一个式子乘上 $ \frac{c}{gcd(a, b)} $ 就可以.
那我们如何求解呢
我们设 $d = gcd(a, b) $.
首先我们知道如下式显然成立:
考虑 $ gcd(a, b) $ 的求解过程:
我们可以设想一个式子:
把 $(1)$ 式代入 $(2)$ 式:
化简得:
再合并得:
显然 $(4)$ 式和 $(1)$ 式是等价的.
于是我们便根据 $(4)$ 推出了 $(1)$ 的解.
显然一定有一组解在 $ ({a, b} )= ({1, 0}) $ 下 $ ax + by = gcd(a, b) $ 成立
于是我们便可以递归的写出代码:
1 | std::pair <int, int> exgcd(int a, int b) { |
exgcd求逆元
定义一个同余方程 $ ax \equiv 1 \pmod{ b}$, 即 $ax + by = 1$ , 显然 $a, x$ 互为逆元.
运行 $exgcd(a, m) $ 即可.
附: 裴蜀定理 (Bézout’s Identity)
如果 $gcd(a, b) \nmid c $, 则原方程无整数解.
中国剩余定理(CRT)
朴素的中国剩余定理解决同余方程组
概念
例如对于以下的一元线性同余方程组:
中国剩余定理给出了它的有解的判定条件, 并用构造法给出了在有解情况下解的具体形式.
中国剩余定理说明: 假设整数 $ m_1, m_2, … , m_n $ 其中任两数互质,则对任意的整数: $ a_1, a_2, … , a_n$ , 方程组有解,并且通解可以用如下方式构造得到:
- 设 $ M = \prod_{i = 1}^{n} m_i, \ M_i = \frac{M}{m_i}$. 显然 $ M_i$ 是除 $m_i$ 之外 $m$ 集合中所有的元素的乘积.
- 设 $t_i = M_{i}^{-1}$ , 即 $M_i$ 在 $\%m_i$ 意义下的倒数, 使得 $t_i \cdot M_i \equiv 1 \pmod{m_i} $.
- 则 $x = kM + \sum_{i = 1}^{n}a_i t_i M_i$.
证明
易于理解的, $(a \cdot b) \% m = (a \% m) \cdot (b \% m), \ \ \ (a + b) \% m = (a \% m) + (b \% m)$.
对于给定的 $ i $, 有 $ \ \ t_i \cdot M_i \equiv 1 \pmod{m_i} $, 所以有 $ {a_i t_i M_t} \equiv a_i \pmod{m_i} $
而对于任意 $j \neq i $ , $ {a_i t_i M_t} \equiv 0 \pmod{m_i} $
显然 $\sum_{i = 1}^{n}a_i t_i M_i$ 是方程的一个解.
因为 $\forall i, M \% a_i = 0$, 所以 $k \cdot M + \sum_{i = 1}^{n}a_i t_i M_i$ 也是方程的解.
附上代码:
1 | int _crt(int k) { |
exCRT
裴蜀等式
对于任意两个整数 ( a ) 和 ( b ),以及它们的最大公约数 ( d ),裴祖等式一定可以写成:
一个重要推论: $(a, b)$ 互质的条件是存在整数 $(x, y)$ 使得 $ax + by = 1$.
证明
考虑简单形式:
可转化为:
根据 $Bézout’s Identity$ 若 $ gcd(m_1, m_2) \mid a_2 - a_1 $ 则原方程有解.
如果有解, 设 $ d = gcd(m_1,m_2) , p_1 = \frac{m_1}{d}, p_2 = \frac{m_2}{d}$
显然 $gcd(p_1,p_2) = 1$ 可以用exgcd求解.
我们设该方程的一组解 $x, y$
$k_1 = \frac{x(a_2-a_1)}{d}, x = \frac{m_1x(a_2-a_1)}{d} + a_1$
原方程即转化为 :
我们只要把方程转化 $n - 1$ 次就可以解决问题.
复杂度为 $\mathcal O((n - 1)\log n)$
Lucas定理
Lucas定理用于求解大组合数取模的问题, 其中模数必须为素数.
定义
对于 $ \binom{\lfloor n / p\rfloor}{\lfloor m / p\rfloor} $ 可以递归求解.
( 证明 )
艹我不会