数论合集
注:本文讨论都在正整数范围内。
质数
定义
我们把只能被 \(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\) 互质的数的个数。
性质
-
对于一个质数,\(\varphi(n)=n-1\)。
-
对于两个互质的数 \(a,b\),满足 \(\varphi(a)\varphi(b)=\varphi(ab)\)。满足这个条件的函数称为积性函数,例如 \(f(x)=114514x\) 也是积性函数。
-
\(\sum\limits_{d | n} \varphi(n)=n\)。
-
若 \(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\) 的质数筛出来用于递推。
在线性筛时,我们干:
-
若 \(i\) 为质数,则 \(\varphi(i)=i-1\)。
-
若 \(i=p^k\)(\(p\) 为质数),则有 \(\varphi(i)=p^{k-i}\varphi(p)\)。
-
若 \(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}\)。
性质
-
\(0 \le a \bmod b \le b-1\)。
-
\((a+b) \bmod m = (a \bmod m + b \bmod m) \bmod m\)。
-
\((a-b) \bmod m =(a \bmod m - b \bmod m + m) \bmod m\)。
-
\((a \times b) \bmod m =(a \bmod m \times b \bmod m) \bmod m\)。
-
\(a^b \bmod m = (a \bmod m)^b \bmod m\)
-
\(a \equiv b \pmod m \Leftrightarrow b \equiv a \pmod m\)。
-
\(a \equiv b \pmod m,b \equiv c \pmod m \Rightarrow a \equiv c \pmod m\)。
-
\(a \equiv b \pmod m \Rightarrow (a \pm c) \equiv (b \pm c) \pmod m\)。
-
\(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)\).
性质
-
在 \(\bmod m\) 意义下,$ \div a$ 等价于 $ \times a^{-1} \pmod m$。
-
\(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 求解即可。
中国剩余定理
给出一个一元线性同余方程组:
中国剩余定理可以判定该方程组是否有解以及解的具体形式。
具体咋做还没学。