简单数论
25.10.08
学数论是真累,可能并不会写第二篇笔记了qaq。
本文适用于向我一样或多或少地接触了一点点 OI 的数学部分但自认为了解得还不够详细的人哦。
算数基本定理 (唯一分解定理)
任意正整数 \(a\) 均有:\(a=p_1^{\alpha_1}p_2^{\alpha_2}p_3^{\alpha_3}p_4^{\alpha_4}\dots p_n^{\alpha_n}\) 其中 \(\alpha_i\in \mathbb{N},p_i \in\mathbb{P},p_1<p_2<p_3<\dots<p_n\).
同余运算的性质
同余是一种 等价关系,具有自反性、对称性、传递性。
且支持线性运算:若 \(a\equiv b\pmod m, c\equiv d\pmod m\),则 \(a+b\equiv c+d\pmod m, a\times b\equiv c\times d\pmod m\).
特别注意模意义下的除法
若 \(ac\equiv bc\pmod m\), 则 \(a\equiv b\pmod{\frac{m}{\gcd(m,c)}}\).
非常基础,非常重要。
二元不定方程 / 线性同余方程 (组) 的求解
裴蜀定理
若 \(a,b\) 是不全为 \(0\) 的整数,则 \(\forall x,y\in\mathbb{Z}\) 都有 \(\gcd(a,b)\mid ax+by\), 且 \(\exist x,y\in\mathbb{Z}\) 使得 \(ax+by=\gcd(a,b)\).
定理的第一步是显然的,记 \(d=\gcd(a,b)\), 则 \(\exist u,v\in \mathbb{Z}\) 使得 \(a=ud,b=vd\), 则 \(ax+by=d(ux+vy)\), 且 \(ux+vy\in\mathbb{Z}\). 第一步得证。
接着,如果 \(ab=0\), 不妨令 \(b=0\), 则 \(\gcd(a,b)=a\), 则 \(x=1,y=0\) 是一个解。
接着不妨令 \(a,b\) 均为正数,考虑辗转相除法算 \(\gcd(a,b)\) 的过程:
我们知道当 \(b=0\) 时,\(ax+by=\gcd(a,b)\) 有解。
进行代换,得 \(bx+(a\%b)y=\gcd(b,a\%b)\) 当 \(b\mid a\) 时有解。
记 \(k=\lfloor\frac{a}{b}\rfloor\), 则 \(a\%b=a-k\times b\).
原条件等价于 \(bx+(a-k\times b)y= \gcd (a,b)\) 有解,即 \(ay+b(x-ky)=\gcd(a,b)\).
从而若 \((x_1,y_1)\) 是方程 \(bx+(a\%b)y=\gcd(b,a\%b)=\gcd(a,b)\) 的一个解,则 \((y_1,x_1-\lfloor\frac{a}{b}\rfloor\times y_1)\) 是方程 \(ax+by=\gcd(a,b)\) 的一个解。
结合欧几里得定理,类似数学归纳法一路辗转回去,原命题得证。
这种构造 \(ax+by=0\) 的一组可行解的方法就是 扩展欧几里得算法 (exgcd)。
求解一元线性同余方程
解方程:\(ax\equiv b\pmod m\).
由同余的定义,即 \(\exist y\in\mathbb{Z}, ax+my=b\).
由裴蜀定理,这个方程有解当且仅当 \(\gcd(a,m)\mid b\).
不妨记 \((x_0,y_0)\) 为 \(ax+my=\gcd(a,m)\) 的一组解,记 \(d\times\gcd(a,m)=b\), 则 \((x_1=dx_0,y_1=dy_0)\) 是 \(ax+my=b\) 的一组解。
我们还要得到通解。因为 \(ax_1+my_1=b\), 所以 \(a(x_1+\frac{\operatorname{lcm}(a,m)}{a})+m(y_1-\frac{\operatorname{lcm}(a,m)}{m})=b\), 即原方程的通解为 \(x=x_1+k\times\frac{m}{\gcd(a,m)}\).
模逆元 (模意义下的乘法逆元)
定义 \(a\) 在模 \(m\) 意义下的乘法逆元为 \(a^{-1}\),需要满足 \(a\times a^{-1}\equiv 1\pmod m\).
即若非零整数 \(a,b\) 满足 \(ab\equiv 1\pmod m\), 则称 \(b\) 为 \(a\) 模 \(m\) 意义下的乘法逆元。
也就是说 \(b\) 是线性同余方程 \(ax\equiv 1\pmod m\) 的一个解。
由裴蜀定理,这个方程不一定有解,有解的充要条件是 \(a,m\) 互质。
请一定注意:乘法逆元不一定存在,只有与模数互质的数才存在乘法逆元!!!
乘法逆元的其他求解方法会在后文提到。
求解一元线性同余方程组 (CRT / exCRT)
中国剩余定理 (CRT)
给定 \(n\) 组非负整数 \(a_i, b_i\),求解关于 \(x\) 的方程组的最小非负整数解。\(\begin{cases}x\equiv b_1\pmod{a_1}\\x\equiv b_2\pmod{a_2}\\\dots\\x\equiv b_n\pmod{a_n}\end{cases}\) 保证 \(a_1,a_2,\dots,a_n\) 两两互质。
CRT 中有一个非常重要的基底思想使得 Ta 在数学竞赛也有重要地位。
记 \(m=\prod a_i\).
我们定义模 \(m\) 意义下的一个基底 \(p_i=\operatorname{inv}(\prod_{j\neq i}a_j,a_i)\times (\prod_{j\neq i}a_j)\),则该基底 \(p_i\) 有下列性质:
- \(\forall j\neq i, p_i\equiv 0\pmod{a_j}\)
- \(p_i\equiv 1\pmod{a_i}\)
注:\(\operatorname{inv}(x,m)\) 表示在模 \(m\) 意义下 \(x\) 的逆元。
这个性质很好证明,显然模 \(a_i\) 意义下互为逆元的两个数乘起来为 \(1\), 而在模 \(a_j\) 意义下因为 \(\prod_{j\neq i}a_j\) 这一项模 \(a_j\) 结果为 \(0\),且那一坨逆元是个整数,所以最后结果为 \(0\).
得到 \(n\) 个基底 \(p_i\) 后,只需要把它们按照系数累加起来就得到最终答案了,即 \(x\equiv\sum b_ip_i\pmod m\),正确性显然。且 \(a_i\) 两两互质保证了逆元总是存在。
CRT 的应用
当我们要求解一个问题在模非质数意义下的解,且不得不使用乘法逆元等基于模数是质数的工具,绝望中我们发现模数不含平方因子(唯一分解指数均为 \(1\)),于是聪明的你立刻想到可以将模数质因数分解,得到模每个质因子意义下的答案,再用 CRT 合并起来。恭喜你 A 掉了 [SDOI2010] 古代猪文。
扩展中国剩余定理 (exCRT)
当模数不再两两互质,逆元可能不存在,就不能用 CRT。
其实跟 CRT 没啥太大关系呢,exCRT 的核心思想是合并方程。
设 \(x\equiv a\pmod b\), \(x\equiv c\pmod d\), \(M=\operatorname{lcm}(b,d)\).
化为不定方程,\(x=a+pb=c+qd\).
考虑求解 \(p,q\),原方程转化为 \(pb-qd=c-a\),即 \(b\times p+(-d)\times q=c-a\).
由裴蜀定理,当且仅当 \(\gcd(b,d)\mid c-a\) 时有解,此时解得的一组可行解 \((p,q)\) 记为 \((p_0,q_0)\).
此时合并后的方程为 \(x\equiv a+p_0b\equiv c+q_0d\pmod M\), 任取一个就好了。
前置芝士:同余类和剩余系
对于一个模数 \(m\), 我们把所有正整数按照模 \(m\) 的结果分到 \(m\) 个集合里,则这 \(m\) 个集合都是模 \(m\) 的同余类。
我们用 \(r\operatorname{mod} m\) 表示含有 \(r\) 元素的这个同余类 (或剩余类), 即 \(\{r+k\times m:k\in\mathbb{Z}\}\)。其实就是所有模 \(m\) 值为 \(r\) 的数集。
由抽屉原理,任取 \(m+1\) 个数必定存在两个数属于同一个同余类(模 \(m\) 同余),且存在 \(m\) 个两两不同余的整数。
(完全) 剩余系:对于任意整数 \(x\), 有且只有一个 \(a\in S\) 使得 \(x\equiv a\pmod m\),则称 \(S\) 为模 \(m\) 的 (完全) 剩余系。\(|S|=m\).
既约同余类:对于同余类 \(r\operatorname{mod} m\), 若 \(r,m\) 互质,则称该同余类为既约同余类 / 既约剩余类。容易发现 \(m\) 有 \(\varphi(m)\) 个既约同余类。
既约剩余系:对于任意与 \(m\) 互质的整数 \(x\),有且仅有一个数 \(a\in S\) 满足 \(a\equiv x\pmod m\),则称 \(S\) 为模 \(m\) 的既约剩余系。\(|S|=\varphi(m)\).
性质
完全剩余系具有可加性和可乘性,具体地,
- 若 \(S\) 是模 \(m\) 的完全剩余系,则 \(\{x+a:x\in S,a\in\mathbb{Z}\}\) 也是模 \(m\) 的完全剩余系。
- 若 \(S\) 是模 \(m\) 的完全剩余系,则 \(\{kx:x\in S,k\in\mathbb{Z},\gcd(k,m)=1\}\),也是模 \(m\) 的完全剩余系。
这里证明一下性质 2,考虑反证法。
若新的集合不是完全剩余系,说明存在 \(x_1,x_2\) 使得 \(kx_1\not\equiv kx_2\pmod m\),由同余除法法则知 \(x_1\not\equiv x_2\pmod m\),与 \(S\) 是完全剩余系矛盾。
既约剩余系不具有可加性,但仍具有可乘性,证明与上文类似。
完全剩余系的复合
若 \(m=\prod m_i\), 令 \(Z_{m_i}\) 为模 \(m_i\) 意义下的完全剩余系。
你或许可以解 \(m\) 个一元线性同余方程组找到这个合成的完全剩余系。然而 oi-wiki 相关部分的讲解我也没看懂,所以就按下不表了。
既约剩余系的复合
约定:
- \(A+B=\{a+b:a\in A,b\in B\}\).
- \(k\times A=\{k\times a:a\in A\}\).
若 \(m=\prod m_i\), 且 \(m_i\) 两两互质,令 \(Z_{m_i}^ \star\) 为模 \(m_i\) 意义下的既约剩余系。
因为模数两两互质,可以使用 CRT。但直接把 CRT 的柿子端上来太麻烦了,所以我们借用“基底思想”。
\(Z_{m_i}^ \star\) 的一个基底是 \((\prod_{j\neq i}m_j)\times Z_{m_i}^ \star\), 它在其他模数意义下相当于 \(\{0\}\),在模 \(m_i\) 意义下则为 \(Z_{m_i}^ \times\).
故复合后的既约剩余系 \(Z_{m}^ \star =\sum(\prod_{j\neq i}m_j)\times Z_{m_i}^ \star\).
常见数论函数及与之相关的常用定理
数论函数
数论函数(也称算数函数)指定义域为正整数的函数。数论函数也可以视作一个数列。
(完全) 积性函数
若数论函数 \(f(n)\) 满足对于 \(\forall x,y\in\mathbb{N^ \times },\gcd(x,y)=1\) 有 \(f(xy)=f(x)f(y)\),则称 \(f(n)\) 为积性函数。若 \(x,y\) 不互质时该柿仍成立,则称 \(f(n)\) 为完全积性函数。
(完全) 加性函数
类比 (完全) 积性函数的定义,若数论函数 \(f(n)\) 满足对于 \(\forall x,y\in\mathbb{N^ \star },\gcd(x,y)=1\) 有 \(f(xy)=f(x)+f(y)\),则称 \(f(n)\) 为加性函数。若 \(x,y\) 不互质时该柿仍成立,则称 \(f(n)\) 为完全加性函数。
欧拉函数
欧拉函数即 \(\varphi(n)\),表示 \(\le n\) 且与 \(n\) 互质的数的个数。
可以使用容斥原理进行求解,以 \(\varphi(15)\) 的求解为例,易有:\(\varphi(15)=15-\frac{15}{3}-\frac{15}{5}+\frac{15}{3\times 5}=8\) 推而广之,得到:\(\varphi(n)=n\times\prod_{p\in\mathbb{P},p\mid n}(1-\frac{1}{p})\) 欧拉函数是积性函数,由上面这个柿子显然得到。
对 \(\varphi(n)\) 的乘积式的推导
我们首先将 \(n\) 唯一分解得到 \(n=p_1^{a_1}p_2^{a_2}p_3^{a_3}p_4^{a_4}\dots p_m^{a_m}\)。
根据容斥原理,假设我们本次选定了 \(k\) 个质数 \(p_{b_1},p_{b_2},\dots,p_{b_k}\) 则本次选择对 \(\varphi(n)\) 的贡献为 \(\frac{(-1)^k\times n}{\prod_i p_{b_i}}=n\times\prod_i-\frac{1}{p_{b_i}}\).
用类似于看二项式定理的思维来看这玩意,如果我们把所有选择的方案的贡献累加起来,最后的结果就是上面的这个乘积式。
线性筛求解积性 / 加性函数的一般思路
欲求解 \(f(n)\), 考虑 \(f\) 的唯一分解,再利用 \(f\) 的积性合并各个质因子的幂次函数值。这可以方便地在线性筛中实现。
我们只需要做一件事:求解 \(f(p^k)\), 其中 \(p\) 为质数。
积性函数的求解 (以欧拉函数为例)
这里以欧拉函数为例,由定义易知 \(\varphi(p^k)=p^k-p^{k-1}=(p-1)\times p^{k-1}\),可轻松线性筛求解。
往下翻一翻有示例代码。
补充:约数个数、约数和的线性筛法
约数个数函数 \(c(n)=\sum_{d\mid n}1\).
约数个数定理:若 \(x\) 的唯一分解为 \(x=p_1^{\alpha_1}p_2^{\alpha_2}p_3^{\alpha_3}p_4^{\alpha_4}\dots p_n^{\alpha_n}\), 则 \(x\) 的约数个数为 \(\prod(\alpha_i+1)\). 由乘法原理易证。
则 "约数个数" 的函数 \(c(x)\) 是积性函数,且 \(c(p^k)=k+1\).
代码和欧拉函数求解代码略有不同但思路一致,此处略去。
除数函数 \(\sigma(n)=\sum_{d\mid n}d\).
除数函数的积性证明:
考虑:\(\sigma(mn)=\sum_{d\mid mn}d\) 由于 \(m,n\) 互质,每个因数 \(d\) 都可以唯一表示为 \(d=d_1d_2\), 其中 \(d_1\mid m,d_2\mid n\).
则:\(\sigma(mn)=(\sum_{d_1\mid m}d_1)\times(\sum_{d_2\mid n}d_2)=\sigma(m)\sigma(n)\) 证毕!
又因为 \(\sigma(p^k)=\sum_{i=1}^{k}p^i\),可以如法炮制线性筛求解。
这里给出同时求解 \(\varphi(n),c(n),\sigma(n)\) 的示例代码。
typedef long long ll;
const int N=2e5+5;
bool flag[N];
int phi[N],cnt[N];
ll c[N],s[N],sum[N];//c: 约数个数, s: 约数和
vector<int> pri;
void init(int n){
flag[0]=flag[1]=true,phi[1]=c[1]=s[1]=sum[1]=cnt[1]=1;
for(int i=2;i<=n;i++){
if(!flag[i]){
pri.emplace_back(i);
phi[i]=i-1,c[i]=2,s[i]=i+1,cnt[i]=1,sum[i]=i+1;
}
for(int j=0;j<pri.size()&&1ll*i*pri[j]<=n;j++){
flag[i*pri[j]]=true;
if(i%pri[j]!=0){//这是当前质因子第一次出现, 使用积性算法
phi[i*pri[j]]=phi[i]*phi[pri[j]];
c[i*pri[j]]=c[i]*c[pri[j]];
s[i*pri[j]]=s[i]*s[pri[j]];
cnt[i*pri[j]]=1,sum[i*pri[j]]=pri[j]+1;//cnt 表示最小质因子的次数, sum[i] 表示含幂次的最小质因子的除数函数值
} else {//当前质因子不是第一次出现, 使用 f(p^k) 算法. 注意此时线性筛要执行 break 操作.
phi[i*pri[j]]=phi[i]*pri[j];//phi 比较特殊, 可以直接乘上去
// 思路:否决 f(p^{k-1}) 的贡献, 添上 f(p^k) 的贡献
cnt[i*pri[j]]=cnt[i]+1;
sum[i*pri[j]]=sum[i]*pri[j]+1;
c[i*pri[j]]=c[i]/(cnt[i]+1)*(cnt[i*pri[j]]+1);
s[i*pri[j]]=s[i]/sum[i]*sum[i*pri[j]];
break;//来自线性筛的 break
}
}
}
}
抱歉!约数个数貌似用 \(d(n)\) 表示,但是我用起来不太习惯,见谅 orz。
加性函数的求解 (以质因子个数之和 / 质因子之和为例)
记质因子之和为 \(f\), 质因子个数之和为 \(g\).
显然 \(f,g\) 是加性函数,且 \(f(p^k)=p,g(p^k)=1\).
然后和积性函数求解比较类似,但好像代码实现要麻烦一点。
反正加性函数用得不多,这里就略去了。
费马小定理
设 \(p\) 是素数,则对于任意整数 \(a,p\nmid a\), 有:\(a^{p-1}\equiv 1\pmod p\)
因为 OI 中模数常为质数,所以费马小定理是求解逆元的最常用算法。
由费马小定理:\(a^{p-2}\times a\equiv 1\pmod p\) 则 \(a^{p-2}\) 就是 \(a\) 在模 \(p\) 意义下的乘法逆元。
欧拉定理
对于整数 \(m>0\) 和与 \(m\) 互质的的整数 \(a\), 有:\(a^{\varphi(m)}\equiv1\pmod m\) 因为当 \(m\) 为质数时 \(\varphi(m)=m-1\),且质数与不是它倍数的任何数互质,从而欧拉定理是费马小定理的推广。
欧拉定理的证明 (也是对费马小定理的证明)
鸣谢 William_Y1 老师的 这篇 文章,该部分几乎是抄过来的受到这篇文章的极大启发。
考虑模 \(m\) 的一个既约剩余系 \(A\),它里面有 \(\varphi(m)\) 个元素。
因为底数 \(a\) 与 \(m\) 互质,所以 \(B=\{ax:x\in A\}\) 也是模 \(m\) 的一个既约剩余系。
我们将 \(A\) 和 \(B\) 中的元素分别乘起来,即得 \(M_A=\prod_{x\in A}x\),\(M_B=\prod_{x\in A}ax=a^{\varphi(m)}M_A\).
由于 \(A\) 和 \(B\) 同为模 \(M\) 的既约剩余系,有:\(M_A\equiv a^{\varphi(m)}M_A\pmod m\) 又因为 \(A\) 中的元素都与 \(m\) 互质,\(M_A\) 当然也与 \(m\) 互质,所以两边可以除去 \(M_A\),即得到:\(a^{\varphi(m)}\equiv 1\pmod m\) 欧拉定理得证。取 \(m\) 为质数,费马小定理得证。
扩展欧拉定理
在欧拉定理的基础上,另有:
欧拉定理和扩展欧拉定理共同说明了下面几件事情:
- \(\varphi(m)\) 是 \(a^k\) 在模 \(m\) 意义下值的序列的一个最终周期。
- 该序列的第 \(\varphi(m)\) 项在最终周期循环之内。
- 当 \(a\) 和 \(m\) 互质时,预周期长度为 \(0\)。
最终周期
一个序列 \(a\) 被称为“最终周期的”,当且仅当存在两个正整数 \(N\) 和 \(p\) 使得 \(\forall n\ge N\) 都有 \(a_{n+p}=a_n\).
也就是说序列从第 \(N\) 项开始进入了一个周期为 \(p\) 的循环状态。
而序列前面的非周期部分被称为“预周期”。
扩展欧拉定理的非严格证明
我们定义“最简同余式”为同余号两侧都与模数互质的同余式。考虑对 \(f(k)\equiv a^k\pmod m\) 化简,得到:
也就是在“最简同余式”看来,每乘上一个 \(a\) 都“消耗”了部分模数,所以必定存在正整数 \(k_0\) 使得模数与 \(a\) 的共有部分被消耗殆尽,即 \(m'=\frac{m}{\gcd(a^{k_0},m)}\) 与 \(a\) 互质。
进而对于 \(k\ge k_0\),有 \(a^k\equiv a^{k_0}\times a^{k-k_0}\pmod m\).
从而:
应用同余式的除法法则,两面同时除以 \(G=\gcd(a^{k_0},m)\):
因为 \(a\) 与 \(m'\) 互质,可以应用欧拉定理,得到:
为了将模数重新变成 \(m\),考虑先化为不定方程的形式,再两边乘上 \(G\).
即:
这样我们就证得 \(a^k\) 是以 \(k_0\) 为循环起始项,\(\varphi(m')\) 为一个最终周期的序列。
显然 \(G\mid a^{k_0}\) 与 \(m'\) 互质,所以 \(\varphi(m)=\varphi(m')\varphi(G)\),故 \(\varphi(m)\) 肯定也是一个最终周期。
现在距离完整证明扩展欧拉定理只差证明 \(k_0\le\varphi(m)\) 了。
考虑 \(m\) 和 \(a\) 的唯一分解,即证明对于 \(\gcd(a,m)\) 的每一个素因子 \(p_i\),都有它在 \(m\) 的幂次 \(b_i\) 小于它在 \(\gcd(a,m)\) 的幂次 \(c_i\) 与 \(\varphi(m)\) 的乘积。
这东西读出来我都想笑,一般情况下 \(b_i\) 的级别是 \(\log_{p_i}m\),而即使考虑 \(c_i=1\),也有 \(\varphi(m)\approx0.6m> \log _{p_i}m\),好像也就 \(m=p_i=2\) 的时候这俩玩意才能刚刚好相等。
综上,你发现扩展欧拉定理的周期和起始点都非常松弛,你在大多数情况下完全可以找到更紧的周期和更紧的起始点,但通常情况下没有必要。
闲话
笔记 2 就要从阶和原根开始记了。
学了好几天,码了一万多字累死我了。
不要脸地求赞!还有如果有什么写错的地方还请私信我,我一定第一时间修改!

浙公网安备 33010602011771号