简单数论

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)\).

性质

完全剩余系具有可加性和可乘性,具体地,

  1. \(S\) 是模 \(m\) 的完全剩余系,则 \(\{x+a:x\in S,a\in\mathbb{Z}\}\) 也是模 \(m\) 的完全剩余系。
  2. \(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 相关部分的讲解我也没看懂,所以就按下不表了。

既约剩余系的复合

约定:

  1. \(A+B=\{a+b:a\in A,b\in B\}\).
  2. \(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\) 为质数,费马小定理得证。

扩展欧拉定理

在欧拉定理的基础上,另有:

\[a^k=\begin{cases} a^k, k<\varphi(m)\\ a^{k\operatorname{mod}\varphi(m)+\varphi(m)},k\ge\varphi(m) \end{cases}\pmod m\]

欧拉定理和扩展欧拉定理共同说明了下面几件事情:

  1. \(\varphi(m)\)\(a^k\) 在模 \(m\) 意义下值的序列的一个最终周期。
  2. 该序列的第 \(\varphi(m)\) 项在最终周期循环之内。
  3. \(a\)\(m\) 互质时,预周期长度为 \(0\)

最终周期

一个序列 \(a\) 被称为“最终周期的”,当且仅当存在两个正整数 \(N\)\(p\) 使得 \(\forall n\ge N\) 都有 \(a_{n+p}=a_n\).

也就是说序列从第 \(N\) 项开始进入了一个周期为 \(p\) 的循环状态。

而序列前面的非周期部分被称为“预周期”。

扩展欧拉定理的非严格证明

我们定义“最简同余式”为同余号两侧都与模数互质的同余式。考虑对 \(f(k)\equiv a^k\pmod m\) 化简,得到:

\[g(k)\equiv \frac{f(k)}{\gcd(a^k,m)}\equiv\frac{a^k}{\gcd(a^k,m)}\pmod{\frac{m}{\gcd(a^k,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\).

从而:

\[f(k)\equiv a^k\equiv f(k_0)\times a^{k-k_0}\pmod m \]

应用同余式的除法法则,两面同时除以 \(G=\gcd(a^{k_0},m)\)

\[g(k)\equiv g(k_0)\times a^{k-k_0}\pmod{m'} \]

因为 \(a\)\(m'\) 互质,可以应用欧拉定理,得到:

\[g(k)\equiv g(k_0)\times a^{(k-k_0)\operatorname{mod}\varphi(m')}\pmod{m'} \]

为了将模数重新变成 \(m\),考虑先化为不定方程的形式,再两边乘上 \(G\).

即:

\[g(k)=g(k_0)\times a^{(k-k_0)\operatorname{mod}\varphi(m')}+p\times m' \]

\[f(k)=f(k_0)\times a^{(k-k_0)\operatorname{mod}\varphi(m')}+p\times m \]

\[f(k)\equiv f(k_0)\times a^{(k-k_0)\operatorname{mod}\varphi(m')}\pmod m \]

这样我们就证得 \(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 就要从阶和原根开始记了。

学了好几天,码了一万多字累死我了。

不要脸地求赞!还有如果有什么写错的地方还请私信我,我一定第一时间修改!

posted @ 2025-11-26 19:42  xwxabc  阅读(1)  评论(0)    收藏  举报