数论基础定理与简单应用
基本符号
- \(\equiv\) ,可以表示恒等,同余
- \(a \mid b\) ,表示 \(b\) 是 \(a\) 的倍数。注意不是 \(a\) 是 \(b\) 的倍数
- \(a \nmid b\) ,表示 \(b\) 不是 \(a\) 的倍数,与整除相反
- \(\in\) ,属于,用于表示一个元素在一个集合当中
裴蜀定理
内容
- 对于任意整数 \(a, b\) ,设 \(d = gcd(a, b)\) ,存在一组整数 \((x, y)\) 满足 \(ax + by = d\) , 且对于任意一组整数 \((x, y)\) 都有 \(ax + by \mid d\)
费马小定理
内容
-
对于任意素数(质数) \(p\) , 都有任意整数 \(a\) 满足 \(a ^ p \equiv p (mod \quad p)\) ;当满足 \(p \nmid a\) 时也可以写成 \(a^{p - 1} \equiv 1 (mod \quad p)\)
对于第二个公式的前置条件 \(p \nmid a\) 你也许并未在代码或题解中见过或强调过,因为对于 OI 里的大部分题目 \(p\) 总大于 \(a\) ,所以基本不会出现 \(p \nmid a\) 的情况,但这并不代表改条件是可以忽视的
证明
前置知识:二项式定理,组合数
显然,当 \(a = 0\) 时 \(a^p \equiv p\) 成立(后文省略了\((mod \quad p)\))
使用数学归纳法,要证明 \(a \in N\) 时成立,仅需证明 \((a + 1) ^ p \equiv a + 1\) 成立即可
- 二项式定理展开
- 进一步展开组合数
-
由于组合数的性质,分子一定能整除分母,又因为 \(p\) 是素数且不存在有组合数的分母中含 \(p\) ,所以组合数的结果因数中一定含 \(p\) ,
而在模 \(p\) 意义下,这些组合数就会变成 0,所以可以进一步化简
- 故,得证
因此对于任意的 \(a \in N\) 都满足 \(a ^ p \equiv a\)
扩展欧几里得定理
-
扩展欧几里得定理
(exgcd)本质是对裴蜀定理的求解即给定整数 \(a, b\) ,求一组整数 \(x, y\) 满足 \(ax + by = gcd(a, b)\)
前置知识:欧几里得定理(辗转相除)
实现过程
- 根据欧几里得定理 \(gcd(a,b)=gcd(b,a \; mod \; b)\) 可得
- 又因为 $a ; mod ; b = a - \left \lfloor \frac{a}{b} \right \rfloor \times b $ , 所以
- 展开整理
- 所以得到
然后不断递归即可
模逆元
定义
- 对于任意非零实数 \(a\) 其乘法逆元定义为 \(a^{-1}\)
- 模逆元定义为在模意义下的乘法逆元,即对于任意非零实数 \(a\) ,满足 \(ax \equiv 1\) 的 \(x\) 即为 \(a\) 的模逆元
请注意区分模逆元与乘法逆元,乘法逆元包含模逆元
应用
模逆元在OI最常用的即是对含有除法的式子进行取模运算
例如对于式子 \(a \times b \;/ \;c\) ,假设 \(a, b, c\) 都很大,那么我们在运算过程中就需要不断取模,但对于除法而言,我们显然不能直接对除数取模,所以我们要将除法替换
我们知道 \(b\; / \; c\) 可以看为 \(b \times c^{-1}\) ,而 \(c^{-1}\) 的逆元为 \(c\) ,我们只需要再求出 \(c\) 的逆元 \(x\) ,就可以用 \(x\) 代替 \(c^{-1}\) 进行计算。
因为在模 \(p\) 意义下 \(c^{-1}c \equiv 1\) 且 \(cx \equiv 1\) ,所以 \(c^{-1} \equiv x\)
求解
对于任意非零实数 \(a\)
-
若模数 \(p\) 为素数,根据费马小定理可得 \(a^{p - 1} \equiv 1\) ,所以\(a \times a^{p - 2} \equiv 1\)
所以 \(a\) 的模逆元即为 \(a^{p - 2}\) ,然后用快速幂即可求出
-
若 \(p\) 为非素数,我们可以将式子 \(ax \equiv 1 \; (mod \; p)\) 转化为 \(ax + bp = 1\) ,随后用扩展欧几里得定理即可求出 \(x\)
中国剩余定理
中国剩余定理 (CRT) 可认为是求解如下一种一元线性同元方程组的工具
公式
- \(x = \sum_{1}^{k}a_im_im_i^{-1}\) (保证在模 \(M\) 意义下有唯一解)
其中 \(M = a_1 \times a_2 \times...\times a_k\) , \(m_i = \frac{M}{n_i}\) , \(m_i^{-1}\) 为 \(m_i\) 在模 \(n_i\) 意义下的逆元
证明
将公式展开可得
注意到当对于对于任意的 \(i\) ,因为 \(m_i = \frac{M}{n_i} = \frac{n_1n_2...n_k}{n_i}\) ,所以对于其他的 \(j \ne i\) ,\(m_i\) 一定包含因数 \(n_i\) ,所以在模 \(n_i\) 意义下时,除了第 \(i\) 项外其余项均为 \(0\) ,所以此时 \(x \equiv a_im_im_i^{-1}\) ,又因为 \(m_im_i^{-1} = 1\) ,所以 \(x \equiv a_i \;(mod\;n_i)\) ,所以得证
埃氏筛
埃氏筛是一种常见的素数筛法
实现过程及原理
我们要在 \(1...n\) 种找到所有质数,可以通过排除所有合数来解决
对于任意合数,其一定含有质因数因子
所以我们可以根据以筛出来的质数去不断提升倍数去排除其它合数
时间复杂度为 \(O(n \,logn\,logn)\)
示例代码
vector<int> prime;
bool vis[N];
void is_prime(int n) {
vis[0] = vis[1] = false;
for (int i = 2; i <= n; i++)vis[i] = true;
for (int i = 2; i <= n; i++) {
if (vis[i]) {
prime.push_back(i);
if (i * i > n) continue;
for (int j = i * i; j <= n; j += i)
vis[j] = false;
}
}
}

浙公网安备 33010602011771号