数学(数论)学习笔记
符号与约定
- 质数:只能被 \(1\) 和它本身整除的数。特别地,\(1\) 不是质数。
- 一个式子:当不保证模数为质数但是保证整除的时候,\(\frac{a}{b} \bmod m=\frac{a \bmod (bm)}{b}\)。
线性筛
用于筛出 \(1 \sim n\) 的所有质数,也可以做一些其他的事情。
过程:对于每个数 \(i\),枚举所有已经筛出的质数 \(p_j\),标记 \(i \times p_j\) 为合数。如果 \(p_j|i\),就跳出循环。
Proof:因为 \(i\) 是 \(p_j\) 的倍数,那么以后的 \(i \times p_k(k>j)\) 都有 \(p_j\) 这个质因子。\(p_j\) 是比 \(p_k\) 更小的质因子,所以能用 \(i \times p_k\) 标记的数肯定已经被 \(p_j\) 标记过了,因此后面的数都不需要再标记了。这样每个合数都只会被它的最小质因数标记,时间复杂度 \(\mathcal{O}(n)\)。
欧拉定理
若 \(\gcd(a,p)=1\),则 \(a^{\varphi(p)} \equiv 1 (\bmod p)\)
Proof:设 \(p\) 的简化剩余系为 \(A=\lbrace a_1,a_2,\dots,a_{\varphi(p)}\rbrace\)。
若 \(aa_i\equiv aa_j (\bmod p)\),则 \(a(a_i-a_j) \equiv 0(\bmod p)\)。又知道 \(a,p\) 互质,所以 \(a_i-a_j \equiv 0(\bmod p)\)。那也就是 \(a_i \equiv a_j(\bmod p)\)。
这句话就是说,若 \(a_i \neq a_j (\bmod p)\),那么 \(aa_i \neq aa_j(\bmod p)\)。
因为 \(A\) 中的数都与 \(p\) 互质,\(a\) 也与 \(p\) 互质,所以 \(aa_i\) 同样与 \(p\) 互质,那么 \(aa_i\) 也在 \(A\) 中。
基于上述两个结论,可以得到 $A=\lbrace a_1,a_2,\dots,a_{\varphi(p)}\rbrace =\lbrace aa_1\bmod p,aa_2 \bmod p,\dots,aa_{\varphi(p)} \bmod p\rbrace $。
这两个集合完全相同,那么它们的积也相等,也就是 \(a^{\varphi(p)}a_1a_2\dots a_{\varphi(p)}\equiv a_1a_2\dots a_{\varphi(p)}(\bmod p)\)。
简化剩余系中的数都与 \(p\) 互质,所以它们的积也与 \(p\) 互质,直接除掉,得到 \(a^{\varphi(p)} \equiv 1(\bmod p)\)。
基于此,当 \(a,p\) 互质时,可以得到一个小东西:
\(a^b \equiv a^{q \times \varphi(p) +r}\equiv (a^{\varphi(p)})^q \times a^r\equiv 1^q \times a^r(\bmod p)\)。
也就是 \(a^b \equiv a^{b \bmod \varphi(p)}(\bmod p)\)。
费马小定理
若 \(p\) 为质数,则 \(a^p \equiv a(\bmod\ p)\)。
Proof:当 \(a,p\) 不互质,也就是 \(a\) 不是 \(p\) 的的倍数时,则基于欧拉定理,\(a^{\varphi(p)}\equiv a^{p-1}\equiv 1(\bmod p)\)。两边乘 \(a\) 即可。
否则,\(p|a\),那么左右都是 \(0\)。
Expand Euler 定理
若 \(b \ge \varphi(p)\),则 \(a^b \equiv a ^{b \bmod\ \varphi(p)+\varphi(p)} (\bmod p)\)。
请注意,对于 \(b< \varphi(p)\),上述同余式并不成立。
Lucas 定理
若 \(p\) 为质数,则 \(\binom{n}{m} \equiv \binom{\lfloor \frac{n}{p}\rfloor }{\lfloor \frac{m}{p}\rfloor } \times \binom{n \bmod p}{m \bmod p} (\bmod p)\)。
Wilson 定理
\(p\) 为质数 为 \((p-1)! \equiv -1(\bmod p)\) 的充要条件。
Bezout 定理
不定方程 \(ax+by=c\) 有解的充要条件为 \(\gcd(a,b)|c\)。
可以推广,方程 \(\sum_{i=1}^n a_ix_i=c\) 有解的充要条件为 \(\gcd_{i=1}^n \lbrace a_i \rbrace | c\)
exgcd
用于求解形如 \(ax+by=\gcd(a,b)\) 的方程。
-
首先当 \(b=0\) 时,有一组解 \(x=1,y=0\)。
-
假设现在的方程为 \(ax+by=\gcd(a,b)\),设 \(a=q\times b+r\),则 \((q\times b+r)x+by=\gcd(a,b)\),也即 \(b(qx+y)+rx=\gcd(a,b)\)。
-
显然,这里的 \(q=\lfloor \frac{a}{b}\rfloor,r=a \bmod b\)。
-
这个过程与辗转相除法求
gcd
的流程是一样的,递归求解即可。
int exgcd(int a,int b,ll &x,ll &y){
if(b==0){
x=1,y=0;
return a;
}
int d=exgcd(b,a%b,y,x);
y-=(a/b)*x;
return d;
}
假设我们现在已经求出了一组 \(x_0,y_0\),使得 \(ax_0+by_0=\gcd(a,b)\)。
首先可以令 \(d=\gcd(a,b)\),那么有解的充要条件为 \(d|c\)。
然后,\(x_0 \times \frac{c}{d} \to x_1\),\(y_0 \times \frac{c}{d} \to y_1\)。
这样就有原方程的一组解了,接下来表示通解。
显然 \(a(x+qb)+b(y-qa)=c\),问题转化为求最小的正数 \(q\),使得 \(qa,qb \in \mathbb{Z}\)。
可以看出,令 \(q=\frac{1}{\gcd(a,b)}\) 是最好的。
令 \(X=\frac{b}{\gcd(a,b)},Y=\frac{a}{\gcd(a,b)}\),则方程的通解可表示为:
这个东西也能求解形如 \(ax \equiv b (\bmod\ p)\) 的方程,将其转化为 \(ax+yp=b\) 即可。
有个小东西,如果 \(a \neq b \neq 0\),则 \(|x| \le \frac{1}{2}|b|,|y| \le \frac{1}{2}|a|\)。
BSGS
用于求解形如 \(a^x \equiv b (\bmod p)\) 的方程。
使用条件:\(\gcd(a,p)=1\)。
因为 \(a,p\) 互质,所以 \(a\) 在模 \(p\) 意义下存在逆元。
令 \(t=\lceil \sqrt p \rceil\),设 \(x=i\times t-j,j \in [0,t-1]\),则原式可化为 \(a^{i \times t-j}\equiv b(\bmod p)\)。
移一下项,那就是 \((a^t)^i \equiv b \times a^j(\bmod p)\),枚举 \(j\in [0,t)\),把 \((b \times a^j )\bmod p\) 的结果放入一个哈希表中,然后枚举 \(i \in [1,t]\),查询 \((a^t)^i\) 是否存在即可。
map<ll,int>Hash;
inline int BSGS(int a,int b,int p){
a%=p,b%=p;
if(!a) return b==0?1:-1;
int t=ceil(sqrt(p));
ll w=1;
for(int i=0;i<t;i++,w=(w*a)%p)
Hash[(b*w)%p]=i;
ll x=w;
for(int i=1;i<=t;i++,x=(x*w)%p)
if(Hash.count(x)&&i*t-Hash[x]>=0) return i*t-Hash[x];
return -1;
}