数论合集

注:本文讨论都在正整数范围内。

质数

定义

我们把只能被 \(1\) 和它本身整除的数称为质数。

质数的判定

试除法

\(\sqrt{n}\) 以内的数一个个试除,来判定是否是质数。

时间复杂度:\(O(\sqrt{n})\)

埃氏筛

\(2\) 开始,如果当前数没有被筛去,那么用这个数筛掉 \(2 \times n\)\(3 \times n \dots\) 的数,没有被筛去的即为质数。

时间复杂度:\(O(n \log n)\)

埃氏筛的优化

不难发现我们可以直接从 \(n \times n\) 开始筛。

因为对于一个 \(i \times n(2 \le i < n)\),它一定被 \(i\) 的最小质因子筛掉过,所以这样可以避免大部分的重复筛。

for(int i=2;i<=n;i++){
	if(!st[i]){
		prime[++cnt]=i;
	}
	for(int j=1;j<=cnt&&i*prime[j]<=n;j++){
		st[i*prime[j]]=1;
	}
}

时间复杂度:\(O(n \log \log n)\)

线性筛

我们要求每个合数只被它的最小质因子筛掉。

我们令 \(f_x\)\(x\) 的最小质因子,那么一个合数 \(n\) 仅会在 \(i=\dfrac{n}{f_n}\) 时筛去。

for(int i=2;i<=n;i++){
	if(!st[i]){
		prime[++cnt]=i;
	}
	for(int j=1;j<=cnt&&i*prime[j]<=n;j++){
		st[i*prime[j]]=1;
		if(i%prime[j]==0) break;
	}
}

欧拉函数

定义

欧拉函数 \(\varphi(n)\) 代表 \(1 - n\) 中与 \(n\) 互质的数的个数。

性质

  1. 对于一个质数,\(\varphi(n)=n-1\)

  2. 对于两个互质的数 \(a,b\),满足 \(\varphi(a)\varphi(b)=\varphi(ab)\)。满足这个条件的函数称为积性函数,例如 \(f(x)=114514x\) 也是积性函数。

  3. \(\sum\limits_{d | n} \varphi(n)=n\)

  4. \(p\) 为质数,则 \(\varphi(p^a)=p^a - p^{a-1}\)

计算

法1 试除法

考虑一个数 \(p^k\) 的欧拉函数。若一个数与 \(p^k\) 不互质,那么这个数一定是 \(p\) 的倍数。每 \(p\) 个数中就会有一个 \(p\) 的倍数,那么 \(1 - p^k\) 中就有 \(\dfrac{p^k}{p}\) 个数与 \(p^k\) 不互质。那么 \(\varphi(p^k) = p^k - \dfrac{p^k}{p}=p^k(1-\dfrac{1}{p})\)。所以我们将一个数 \(n\) 分解质因数 \(p_1^{k_1} \times p_2^{k_2} \times p_3^{k_3} \times \dots \times p_m^{k_m}\)。根据欧拉函数积性函数的性质,\(\varphi(n)=n(1-\dfrac{1}{p_1})(1-\dfrac{1}{p_2})(1-\dfrac{1}{p_3}) \dots (1-\dfrac{1}{p_m})\)。这个方法是 \(O(\sqrt{n})\) 的。

法2 线性筛

我们可以利用欧拉函数积性函数的性质,若我们知道 \(\varphi(a)\)\(\varphi(b)\),就可以推出 \(\varphi(ab)\)。做这件事的之前,我们要把 \(1 - n\) 的质数筛出来用于递推。

在线性筛时,我们干:

  1. \(i\) 为质数,则 \(\varphi(i)=i-1\)

  2. \(i=p^k\)\(p\) 为质数),则有 \(\varphi(i)=p^{k-i}\varphi(p)\)

  3. \(i=p_1p_2\),则 \(\varphi(i)=\varphi(p_1p_2)\)

void getphi(int n){
	phi[1]=1;
	for(int i=2;i<=n;i++){
		if(!st[i]){
			prime[cnt++]=i;
			phi[i]=i-1;
		}
		for(int j=0;prime[j]<=n/i;j++){
			int t=prime[j]*i;
			st[t]=1;
			if(i%prime[j]==0){
				phi[t]=phi[i]*prime[j];
				break;
			}
			phi[t]=phi[i]*(prime[j]-1);
		}
	}
} 

模运算

定义

我们令 \(a \bmod b\)\(a \div b\) 的余数。

\(a \bmod m = b \mod m\),则我们记为 \(a \equiv b \pmod{m}\)

性质

  1. \(0 \le a \bmod b \le b-1\)

  2. \((a+b) \bmod m = (a \bmod m + b \bmod m) \bmod m\)

  3. \((a-b) \bmod m =(a \bmod m - b \bmod m + m) \bmod m\)

  4. \((a \times b) \bmod m =(a \bmod m \times b \bmod m) \bmod m\)

  5. \(a^b \bmod m = (a \bmod m)^b \bmod m\)

  6. \(a \equiv b \pmod m \Leftrightarrow b \equiv a \pmod m\)

  7. \(a \equiv b \pmod m,b \equiv c \pmod m \Rightarrow a \equiv c \pmod m\)

  8. \(a \equiv b \pmod m \Rightarrow (a \pm c) \equiv (b \pm c) \pmod m\)

  9. \(a \equiv b \pmod m \Rightarrow (a \times c) \equiv (b \times c) \pmod m\)

应用

求 gcd(辗转相除法)

辗转相除法依赖于定理:\(\gcd(a,b)=\gcd(b,a \bmod b)\)

证明

\(m = a \mod b\),则 \(a\) 可以表示为 \(kb+m\),进一步有 \(m=a-kb\)

\(g\)\(a,b\) 的一个公因数,那么 \(g|a,g|b\)

\(\because m=a-kb,g|a,g|b\)

\(\therefore g|m\)

\(\therefore g\) 也是 \(b,a \bmod b\) 的公因数。

int gcd(int a,int b){
	return b?gcd(b,a%b):a;
}

裴蜀定理

\(g = \gcd(a,b)\),则 \(ax+by=k\) 有解当且仅当 \(g|k\)

扩展欧几里得算法

判定 \(ax+by=gcd(a,b)\) 有解后,我们需要来解这个方程。

先推一波式子:

$ax+by=\gcd(a,b) $

\(ax+by=\gcd(b,a \bmod b)\)

\(bx+(a \bmod b)y=\gcd(b,a \bmod b)\)

\(bx+(a - \left\lfloor \dfrac{a}{b} \right\rfloor)y=\gcd(b,a \bmod b)\)

\(ay+b(x - \left\lfloor \dfrac{a}{b} \right\rfloor y)=\gcd(b,a \bmod b)\)

容易发现此时 \(x\) 变成了 \(y\)\(y\) 变成了 \(x-\left\lfloor \dfrac{a}{b} \right\rfloor y\)

于是我们就可以递归求解了。

void Exgcd(int a,int b,int &x,int &y) {
	if(!b){
		x=1,y=0;
	}
	else{
		Exgcd(b,a%b,y,x);
		y-=a/b*x;
	}
}

乘法逆元

定义

\(ax \equiv 1 \pmod m\),则称 \(x\)\(a\)\(\bmod m\) 意义下的数论倒数(即乘法逆元),记为 \(a^{-1} \pmod m\)\(inv(a)\).

性质

  1. \(\bmod m\) 意义下,$ \div a$ 等价于 $ \times a^{-1} \pmod m$。

  2. \(a\)\(\bmod m\) 意义下有逆元,当且仅当 \(\gcd(a,m)=1\)
    证明:
    那么我们求逆元相当于解 \(ax \equiv 1 \pmod m\)
    \(ax \equiv 1 \pmod m\) 等价于 \(ax = 1-my\)
    变形得 \(ax+my=1\)
    根据裴蜀定理可得只有 \(\gcd(a,m)=1\) 时,原方程有解,即 \(a\)\(\bmod m\) 意义下有逆元。

求逆元

费马小定理求逆元

费马小定理:若 \(b\) 为质数,且 \(a,b\) 互质,则 \(a^{b-1} \equiv 1 \pmod b\)

给式子变形,得 \(a \times a^{b-2} \equiv 1 \pmod b\)

于是我们可以得出 \(a^{b-2}\)\(a\)\(\bmod b\) 意义下互为乘法逆元。

exgcd 求逆元

我们将 \(ax \equiv 1 \pmod m\) 转化为 \(ax+by=1\),用 exgcd 求解即可。

中国剩余定理

给出一个一元线性同余方程组:

\[\left\{ \begin{aligned} x \equiv a_1 \pmod {m_1} \\ x \equiv a_2 \pmod {m_2} \\ \dots \\ x \equiv a_n \pmod {m_n} \end{aligned} \right. \]

中国剩余定理可以判定该方程组是否有解以及解的具体形式。

具体咋做还没学。

posted @ 2023-05-12 15:59  luqyou  阅读(78)  评论(0编辑  收藏  举报