【提高级】数论

发布时间 2023-08-29 23:39:04作者: Scorilon

前言

前段时间在补提高大纲,补完之后这篇博客用来记录梳理复盘提高大纲里数论的一些知识点,有错误欢迎批判捏。

欧拉函数

定义

\(\varphi(n)\) 表示小于等于 \(n\) 中与 \(n\) 互质的数的个数,即 \(\varphi(n)= \sum ^n _{d=1} [\gcd(d,n)=1]\).

性质

1. 积性函数

根据这一条性质,我们可以用线性筛法来筛出欧拉函数。

2. 若 \(n=p^k\),其中 \(p\) 为一个质数,则 \(\varphi(n)=p^k-p^{k-1}\).

证明

根据定义可知,更详细一点说,若存在一个数 \(x\) 满足 \(\gcd(x,n)\not=1\),那么一定有 \(p|x\),因此我们可以稍微用一点容斥的思想,\(p^k\) 即是全集,而 \(p^{k-1}\) 则是不符合 \(\gcd(x,n)=1\)\(x\) 的数量,相减即可得出答案。

3. 由唯一分解定理可得,\(n=\prod_{i=1}^s p_i^{k_i}\),其中 \(p\) 为素数,那么可得 \(\varphi(n)=n \times \prod^s_{i=1}\frac{p_i-1}{p_i}\).

证明

由性质一、性质二可得:

\[\begin{aligned} \varphi(n)&=\prod_{i=1}^s \varphi(p_i^{k_i})\\ &=\prod_{i=1}^s(p_i-1) \times p_i^{k_i-1}\\ &=\prod_{i=1}^s p_i^{k_i} \times (1- \frac{1}{p_i})\\ &=n \times \prod_{i=1}^s (1-\frac{1}{p_i})\\ &=n \times \prod_{i=1}^s \frac{p_i-1}{p_i}\\ \end{aligned}\]

根据这一条,我们可以单点求欧拉函数,在推柿子的时候也经常用到,算是比较重要的一条性质。

ll phi(ll x) {
	ll res=x;
	for(ll i=2;i*i<=x;i++) {
		if(!(x%i)) {
			res=res/i*(i-1);
			while(!(x%i)) x/=i;
		}
	}
	if(x>1) res=res/x*(x-1);
	return res;
}

4. \(n=\sum_{d|n} \varphi(d)\)

证明

\(\gcd(k,n)=d\),那么可以得到 \(\gcd(\frac{k}{d},\frac{n}{d})=1\),我们把这个结论称为结论一。

\(f(x)\) 表示 \(\gcd(k,n)=x\) 的数的个数,那么 \(n=\sum^n_{i=1}f(i)\).

由结论一可得 \(n=\sum^n_{i=1}\varphi(\frac{n}{i})\)\(n=\sum_{d|n}\varphi(\frac{n}{d})\).

因为 \(d\)\(\frac{n}{d}\) 具有对称性,所以 \(n=\sum_{d|n} \varphi(d)\).

这一条目前没遇到什么应用,不过了解一下也是好的。

一位大佬说可用于欧拉反演,但是我不会(逃,等会了再扩充。

欧拉定理

定义

\(\gcd(a,m)=1\),则 \(a^{\varphi(m)}\equiv 1\pmod{m}\).

证明

\(r_1,r_2 \dots r_{\varphi(m)}\) 为模 \(m\) 意义下的一个简化剩余系,则 \(ar_1,ar_2 \dots ar_{\varphi(m)}\) 也为模 \(m\) 意义下的一个简化剩余系,所以 \(r_1r_2 \dots r_{\varphi(m)} \equiv ar_1ar_2 \dots ar_{\varphi(m)} \equiv a^{\varphi(m)}r_1r_2 \dots r_{\varphi(m)} \pmod{m}\),约分就可得 \(a^{\varphi(m)}\equiv 1\pmod{m}\).

注:
剩余类:对于同一个整数 \(n\),其余整数模 \(n\) 后有 \(0 \sim n-1\)\(n\) 种情况,其中余数相同的称为同一剩余类。
简化剩余类(完全剩余系):在每一个剩余类中取一个数,构成的集合称为简化剩余类。
简化剩余系:从完全剩余系中取出 \(\varphi(n)\) 个与 \(n\) 互质的数所构成的集合。

费马小定理

定义

\(p\) 为素数,\(\gcd(a,p)=1\),则 \(a^{p-1} \equiv 1 \pmod{p}\).

证明:

因为 \(p\) 为素数,所以 \(\varphi(p)=p-1\),由欧拉定理可得 \(a^{\varphi(p)}\equiv 1\pmod{p}\),故 \(a^{p-1} \equiv 1 \pmod{p}\).

费马小定理在求乘法逆元时有用。

威尔逊定理

定义

对于素数 \(p\)\((p-1)! \equiv -1 \pmod{p}\).

证明

我们可以分为两种情况讨论:

  1. \(p=2\) 时,有 \((p-1)! = 1\),显然有 \(1 \equiv -1 \pmod{p}\),因此威尔逊定理在 \(p=2\) 时成立。

  2. \(p\) 为任意的奇素数时,\(1 \sim p-1\) 均存在逆元且唯一,对于每一个数 \(x\),若满足 \(x \not= x^{-1}\pmod{p}\),就可得 \(x \times x^{-1}=1\),因此 \((p-1)! \bmod p\) 就等于逆元等于其本身即满足 \(x = x^{-1}\pmod{p}\) 的数的乘积,因为 \(p\) 为素数,所以这样的数只有 \(1\)\(p-1\),而 \((p-1) \bmod p=-1\),威尔逊定理成立。

裴蜀定理(贝祖定理)

定义

\(a,b\in\mathbb{Z}\)\(a,b\) 不全为 \(0\),则 \(\exists x,y \in \mathbb{Z}\) 使 \(ax+by=\gcd(a,b)\).

证明

我们可以分为两种情况讨论。

  1. \(a=0\)\(b=0\),则 \(\gcd(a,b)=a\)\(b\),定理显然成立。

  2. \(a,b \not =0\),因为 \(\gcd(a,b)=\gcd(-a,b)=\gcd(-a,-b)=\gcd(a,-b)\),所以我们假设 \(a,b>0,a \geq b,\gcd(a,b)=d\).

    我们可以将等式两边同除 \(d\),可以得到 \(a_1x+b_1y=1\),其中 \(\gcd(a_1,b_1)=1\).
    令辗转相除法在除到互质时退出,则 \(r_n=1\),可得:

    \[r_{n-2}=x_nr_{n-1}+1 \]

    \[1=r_{n-2}-x_nr_{n-1} \]

    \(r_{n-1}=r_{n-3}-x_{n-1}r_{n-2}\)

    \[1=(1+x_nx_{n-1})r_{n-2}-x_nr_{n-3} \]

    我们不断这么带入可以逐渐消去 \(r_{n-2}\dots r_1\),可以证得 \(a_1x+b_1y=1\),所以定理成立。

扩展欧几里得算法(exgcd)

exgcd 一般用于求解线性同余方程,而逆元也是一类特殊的线性同余方程。

基本思路

假设我们要求解不定方程 \(ax+by=\gcd(a,b)\),其中 \(x,y\) 为未知数,那么我们可以在 \(a=\gcd(a,b),b=0\) 时得到一组解 \(x=1,y=0\),然后通过这一组特殊解来步步回溯求出原式的解。

其中不定方程 \(ax+by=m\) 有整数解的充要条件是 \(\gcd(a,b)|m\).

如何回溯

首先根据欧几里得算法可得:

\[\begin{aligned} ax+by & =\gcd(a,b)\\ & =\gcd(b,a \bmod b)\\ & =\gcd(b,a-\lfloor \frac{a}{b} \rfloor b)\\ & =bx_0+(a-\lfloor \frac{a}{b} \rfloor b)y_0 \end{aligned}\]

又因为 \(\gcd(b,a-\lfloor \frac{a}{b} \rfloor b)=bx_0+(a-\lfloor \frac{a}{b} \rfloor)y_0=bx_0+ay_0-\lfloor \frac{a}{b} \rfloor by_0\)

所以可以得到: \(ax+by=bx_0+ay_0-\lfloor \frac{a}{b} \rfloor by_0=ay_0+b(x_0-\lfloor \frac{a}{b} \rfloor y_0)\).

所以可以用 \(x=y_0,y=x_0-\lfloor \frac{a}{b} \rfloor y_0\) 来不断迭代更新回溯。

ll exgcd(ll a,ll b,ll &x,ll &y) {
	if(!b) {
		x=1,y=0;
		return a;
	}
	ll res=exgcd(b,a%b,x,y);
	ll t=x;x=y,y=t-a/b*y;
	return res;
}

解系扩展

\(x_0,y_0\) 为不定方程 \(ax+by=n\) 的一组解,那么该不定方程的任意解可以表示为:

\[\begin{cases} x=x_0+yk\\ y=y_0-ak \end{cases}\]

其中 \(k \in \mathbb{Z}\)

而一般题目会让我们求最小整数解,那么 \(x=(x \bmod t + t) \bmod t\),其中 \(t= \frac{b}{\gcd(a,b)}\).

模意义下的乘法逆元

定义

若一个线性同余方程 \(ax \equiv 1 \pmod{b}\),则 \(x\) 称为 \(a\bmod b\) 的逆元,记作 \(a^{-1}\).

exgcd 求解

很明显我们可以将该线性同余方程改写为 \(ax+by=1\),用 exgcd 求解即可。

费马小定理求解

因为 \(ax \equiv 1 \pmod{b}\),又因为由费马小定理可得 \(ax \equiv a^{b-1} \pmod{b}\),所以 \(x \equiv a^{b-2}\pmod{b}\),可以用快速幂求解。

线性求逆元

可以用来求解 \(1 \sim n\) 在模 \(p\) 意义下的逆元。

首先我们有 \(1^{-1} \equiv 1 \pmod{p}\) 恒成立,故 \(1\) 的逆元为 \(1\).

接下来我们要求解 \(i^{-1}\),我们令 \(k= \lfloor \frac{p}{i} \rfloor,j=p \bmod i\),因为 \(p=ki+j\),所以 \(ki+j \equiv 0 \pmod{p}\).

同余式两边同乘 \(i^{-1} \times j^{-1}\) 可得 \(kj^{-1}+i^{-1} \equiv 0 \pmod{p}\),移项得 \(i^{-1} \equiv -kj^{-1} \pmod{p}\),即 \(i^{-1} \equiv -\lfloor \frac{p}{i} \rfloor(p \bmod i)^{-1} \pmod{p}\).

综上:

\[i^{-1} \equiv \begin{cases} 1, & \text{if }i=1 \\ -\lfloor \frac{p}{i} \rfloor(p \bmod i)^{-1}, & \text{else } \end{cases} \pmod{p} \]

在代码实现时 \(-\lfloor \frac{p}{i} \rfloor\) 写作 \(p-\lfloor \frac{p}{i} \rfloor\),防止出现负数。

inv[1]=1;
for(ll i=2;i<=n;i++) inv[i]=(p-p/i)*(inv[p%i])%p; 

线性求任意 \(n\) 个数的逆元

先计算 \(n\) 个数的前缀积,记作 \(s_i\),然后计算 \(s_n\) 的逆元记作 \(sv_n\),很明显每次乘上 \(a_i\) 就可以得到 \(a_1 \sim a_i-1\) 的积逆元,即 \(sv_{i-1}=sv_i \times a_i\),所以 \(a_{i}^{-1}=s_{i-1}\times sv_i\),时间复杂度 \(\Theta(n+\log p)\).

线性同余方程

定义

形如 \(ax\equiv b \pmod{n}\) 的方程称为线性同余方程,其中 \(x\) 为未知数。

逆元求解

\(\gcd(a,n)=1\) 时,可以计算 \(a^{-1}\),然后方程两边同乘 \(a^{-1}\) 可得唯一解。

证明

\[x \equiv ba^{-1} \pmod{p} \]

\(\gcd(a,n)\not = 1\) 时,不一定有解。

\(d=\gcd(a,n)\),当 \(d \nmid b\) 时无解。

\(d \mid b\),则同除 \(d\) 可得 \(a'x\equiv b' \pmod{n'}\),此时 \(\gcd(a',n')=1\),可用逆元求解,而原方程有 \(d\) 个解,\(x_i \equiv x'+in' \pmod{n}(0 \leq i \leq d-1)\).

exgcd 求解

线性同余方程可以改写为 \(ax+ny=b\) 的形式。

中国剩余定理(CRT)

作用

可用于求解形如以下的一元线性同余方程组,其中 \(n_1,n_2,\dots,n_k\) 两两互质。

\[\begin{cases} x \equiv a_1 \pmod{n_1}\\ x \equiv a_2 \pmod{n_2}\\ \dots \\ x \equiv a_k \pmod{n_k} \end{cases} \]

基本思路

先计算所有模数的积记作 \(n\),对于第 \(i\) 个方程,计算 \(m_i=\frac{n}{n_i}\),然后再计算 \(m_i^{-1}\),计算 \(c_i=m_im_i^{-1}\),此时不要模 \(n_i\),方程组的唯一解为 \(x=\sum_{i=1}^k a_ic_i \pmod{n}\).

证明

\(i \not=j\) 时,有 \(m_j \equiv 0 \pmod{n_i}\),故 \(c_j \equiv m_j \equiv 0 \pmod{n_i}\),又因为 \(c_i \equiv m_i \times (m_i^{-1} \bmod n_i) \equiv 1 \pmod{n_i}\),所以:

\[\begin{aligned} x & \equiv \sum_{j=1}^k a_jc_j\\ & \equiv a_ic_i\\ & \equiv a_im_i(m_i^{-1} \bmod n_i)\\ & \equiv a_i\pmod{n_i}\\ \end{aligned} \]

所以该求法的正确性得证。

for(int i=1;i<=n;i++) {
		scanf("%lld%lld",&a[i],&b[i]);
		Mul*=a[i];
	}
	for(int i=1;i<=n;i++) {
		M[i]=Mul/a[i];
		ll x=0,y=0;
		exgcd(M[i],a[i],x,y);
		if(x<0) x+=a[i];
		ans+=(b[i]*M[i]*x);
	}