相关内容:「算法笔记」基础数论 2。
一、整除
对于两个整数 (a,b),存在两个唯一的整数 (q,r),使得 (b=aq+r),其中 (0≤r<|a|)。
特别地,若 (r=0),则我们称 (a) 整除 (b),记作 (amid b)。
对于两个正整数 (a,b),若 (a mid b),则我们称 (a) 是 (b) 的约数。
我们称一个数是质数,当且仅当其质因子只有 (1) 以及其本身。特别地,(1) 不是质数。
二、几个结论
1. 素数有无穷多个。
证明:假设素数是有限的,并且数量为 (k),分别为 (p_1,p_2,...,p_k)。
考虑一个数 (X=p_1×p_2×...×p_k+1)。
易知 (X) 与 (p_1,p_2,...,p_k) 互质,则 (X) 必为素数,与素数只有有限的 (k) 个矛盾。
所以素数有无穷多个。
2. (limlimits_{x ightarrowinfty} frac{pi(n) ln n}{n}=1) (pi(n)):不大于 (n) 的质数个数。
3. (n) 和 (2n) 之间一定有质数。 4. (P_n sim Theta (nlog n))
5. (sumlimits_{1leq p leq n,p是质数} frac{1}{p} sim Theta(log log n)) 6. (sumlimits_{i=1}^n frac{1}{i} sim Theta (log n))
三、公约数以及公倍数
1. 定义
对于 (a,b),若 (dmid a) 且 (dmid b),则称 (d) 为 (a,b) 的公约数。
对于其中最大的 (d),我们称之为 (a, b) 的最大公约数,记作 (d = gcd(a, b)) 或 (d = (a, b))。
类似地,若 (amid d) 且 (bmid d),则称 (d) 为 (a, b) 的公倍数。
对于其中最大的 (d),我们称之为 (a, b) 的最小公倍数,记作 (d = ext{lcm}(a, b)) 或 (d = [a, b])。
2. 引理
若 (ageq b),则 (gcd(a,b)=gcd(a-b,b)=gcd(amod b,b))。
(gcd(a,b) ext{lcm}(a,b)=ab)。
证明:(a=p_1^{alpha_1} imes p_2^{alpha_2} imes ... imes p_k^{alpha_k}),(b=p_1^{eta_1} imes p_2^{eta_2} imes ... imes p_k^{eta_k})
则 (gcd(a,b)=p_1^{min(alpha_1,eta_1)} imes p_2^{min(alpha_2,eta_2)} imes ... imes p_k^{min(alpha_k,eta_k)}),( ext{lcm}=p_1^{max(alpha_1,eta_1)} imes p_2^{max(alpha_2,eta_2)} imes ... imes p_k^{max(alpha_k,eta_k)})
而 (max(alpha_i,eta_i)+min(alpha_i,eta_i)=alpha_i+eta_i)
(a imes b=p_1^{alpha_1+eta_1} imes p_2^{alpha_2+eta_2} imescdots imes p_k^{alpha_k+eta_k})
(=p_1^{min(alpha_1,eta_1)+max(alpha_1,eta_1)} imes cdots imes p_k^{min(alpha_k,eta_k)+max(alpha_k,eta_k)})
(=gcd(a,b) imes ext{lcm}(a,b))
故该命题成立。
3. 定理(裴蜀定理)
对于任意整数 (a, b, m),则存在整数 (x, y) 满足 (ax + by = m),当且仅当 (gcd(a, b) mid m)。
证明:若 (a, b) 之一为 (0),结论显然成立。
若否,考虑 (A = {xa+yb mid (x, y) in mathbb{Z}^2}) 中的最小正元素 (d_0 = x_0a+y_0b)(这一定存在)。考虑任意 (p = x_1a + y_1bin A),设 (p = qd_0 + r),其中 (0 ≤ r < d_0),则 (r = p-qd_0in A),故 (r = 0)。故 (d_0mid p),则 (d_0mid a, b)。
然后,考虑任意 (dmid a, b),若 (a = kd) 而 (b = ld),则 (d_0 = x_0a + y_0b = (x_0k + y_0l)d),故 (dmid d_0),故 (d_0 = gcd(a, b))。在方程中,若 (m = m_0d_0),则显然有无穷多组解。相反,若有解,则 (|m| in A), 故 (d_0mid |m|),即 (d_0mid m)。
4. 欧几里得算法
(amid b),(bmid c) 且 (gcd(a,b)=1),则 (abmid c)。
(forall a,bin mathbb{N}),(b eq 0),(gcd(a,b)=gcd(b,amod b))
int gcd(int x,int y){ if(!y) return x; return gcd(y,x%y); } //时间复杂度:O(log(x+y))
扩展欧几里得算法:求解方程 (ax+by=gcd(a,b))。
在欧几里得算法的最后一步,即 (b=0) 时,显然有一对整数 (x=1,y=0),使得 (a imes 1+0 imes 0=gcd(a,0))。
若 (b>0),则 (gcd(a,b)=gcd(b,a mod b))。假设存在一对整数 (x,y),满足 (b imes x+(a mod b) imes y=gcd(b,amod b)),因为 (bx+(a mod b)y=bx+(a-blfloor frac{a}{b} floor)y=ay+b(x-lfloor frac{a}{b} floor y)),所以令 (x'=y),(y'=x-lfloor frac{a}{b} floor y),就得到了 (ax'+by'=gcd(a,b))。
int exgcd(int a,int b,int &x,int &y){ //返回值为 a,b 的最大公约数 d if(!b) return x=1,y=0,a; int d=exgcd(b,a%b,x,y); int z=x; x=y,y=z-y*(a/b); return d; }
对于更为一般的方程 (ax+by=c),设 (d=gcd(a,b))。我们可以求出 (ax+by=d) 的一组特解 (x_0,y_0)。这所以 (frac{c}{d}) 也必须为整数,否则无解(所以该方程有解当且仅当 (dmid c))。我们令 (x_0,y_0) 同时乘上 (frac{c}{d}),得 (afrac{cx_0}{d}+bfrac{cy_0}{d}=c)。那么 (x=frac{c}{d}cdot x_0,y=frac{c}{d}cdot y_0) 即为一组解。
事实上,方程 (ax+by=c) 的通解可以表示为:
(displaystyle x=frac{c}{d}x_0+kfrac{b}{d},\,y=frac{c}{d}y_0-kfrac{a}{d}\,(kin mathbb{Z}))
那么若求得一个 (x),则该方程 (x) 的最小整数解就是 (x%(b/d)+b/d)%(b/d)
。
四、整除的性质
1. 定理
(amid bc) 且 (gcd(a, b) = 1),则 (amid c)。
(amid c),(bmid c) 且 (gcd(a, b) = 1),则 (abmid c)。
2. 引理 (欧几里得引理)
若质数 (pmid ab) ,则不是 (pmid a) ,就是 (pmid b)。
证明:若 (pmid a) 则证毕。若 (p
mid a) ,那么两者的最大公约数为 (1)。根据裴蜀定理,存在 ((m, n)) 使得 (ma + np = 1)。于是 (b = b(ma + np) = abm + bnp)。
由于 (pmid ab) ,上式右边两项都可以被 (p) 整除。所以 (pmid b) 。
五、算术基本定理
大于 (1) 的正整数 (n) 可以唯一分解成有限个质数的乘积。证明如下:
1. 存在性
假设存在大于 (1) 的自然数不能写成质数的乘积,并且最小的为 (n)。
首先,按照定义,(n) 大于 (1)。其次,因为质数 (p) 可以写成质数乘积:(p=p),与假设矛盾,所以 (n) 不是质数。则 (n) 只能是合数。而每个合数都可以分解成两个小于自身而大于 (1) 的自然数的积。
设其中 (a) 和 (b) 都是介于 (1) 和 (n) 之间的自然数,因此,按照 (n) 的定义,(a) 和 (b) 都可以写成质数的乘积。从而 (n) 也可以写成质数的乘积,与 (n) 的定义矛盾。因此大于 (1) 的自然数必可写成质数的乘积。
2. 唯一性
类似地,假设存在大于 (1) 的自然数可以用多于一种的方式写成多个质数的乘积,并且最小的为 (n)。
首先,(n) 不是质数。将 (n) 用两种方法写出:(n=p_1^{a_1}p_2^{a_2}...p_m^{a_m}=q_1^{b_1}q_2^{b_2}...q_n^{b_n})。
根据欧几里得引理,因为 (p_1 mid q_1^{b_1}q_2^{b_2}...q_n^{b_n}),所以 (q_1^{b_1},q_2^{b_2},...,q_n^{b_n}) 中有一个能被 (p_1) 整除,即 (q_1,q_2,...,q_n) 中有一个能被 (p_1) 整除。不妨设为 (q_1)。(q_1) 也是质数,因此 (q_1=p_1)。
假设 (a_1>b_1),则 (p_1^{a_1-b_1}p_2^{a_2}...p_m^{a_m}=q_2^{b_2}...q_n^{b_n})。
易得,(q_2,q_3,...,q_n) 有一个能被 (p_1) 整除,但 (p_1=q_1
eq q_i (i
eq 1))。所以不能有 (a_1>b_1),同理,也不能有 (a_1<b_1),因此 (a_1=b_1)。
两边相除得 (n_0=p_2^{a_2}...p_m^{a_m}=q_2^{b_2}...q_n^{b_n}),于是存在比 (n) 小的正整数,可以用多于一种的方式写成多个质数的乘积,与 (n) 的定义矛盾。因此唯一性得证。
六、同余
1. 定义
若 (m mid a-b),则我们称 (a) 和 (b) 在模 (m) 意义下同余,记作 (aequiv b pmod{m})。
2. 定理
(aequiv b pmod m) 且 (aequiv b pmod n) 意味着 (aequiv b pmod { ext{lcm}(n,m)})。
证明:因为 (aequiv b pmod m),所以 (m mid a-b)。同理可得 (n mid a-b)。所以 ( ext{lcm}(n,m) mid a-b),则 (aequiv b pmod { ext{lcm}(n,m)})。
若 (gcd(k,m)=d) 且 (kaequiv kb pmod m),则 (a equiv b pmod{frac{m}{d}})。
证明:因为 (kaequiv kb pmod m),所以 (m mid k(a-b))。设 (m_0=frac{m}{d}),(k_0=frac{k}{d}),则 (m_0dmid k_0d(a-b))。所以 (m_0mid k_0(a-b))。
因为 (gcd(k,m)=d),所以 (gcd(frac{k}{d},frac{m}{d})=1),即 (gcd(m_0,k_0)=1),因此 (m_0 mid a-b)。则 (a equiv b pmod {m_0}),即 (a equiv b pmod{frac{m}{d}})。
七、线性同余方程
给定整数 (a,b,m),求一个整数 (x) 满足 (axequiv b pmod m),或给出无解。因为未知数的指数为 (1),所以我们称之为一次同余方程,也称线性同余方程。
(axequiv b pmod m) 等价于 (m mid ax-b),即 (ax-b) 是 (m) 的倍数。不妨设为 (-y) 倍。于是,该方程可以改写为 (ax+my=b)。
1. 定义
对于非负整数 (a) 以及 (m),如果存在 (b) 使得 (abequiv 1 pmod m),则称 (b) 为 (a) 在模 (m) 意义下的逆元,记作 (a^{-1} pmod m)。
2. 定理
定理 1:(a^{-1} pmod m) 存在当且仅当 (gcd(a,m)=1)。
证明:存在 (a^{-1} pmod m),即存在 (x) 使得 (axequiv 1 pmod m),等价于存在 (ax+my=1)。根据裴蜀定理,存在整数 (x,y) 满足 (ax+my=1),当且仅当 (gcd(a,m)mid 1)。所以 (gcd(a,m)=1)。
定理 2:逆元如果存在,那么一定唯一。
证明:假如同时存在两个逆元。
(abequiv 1 pmod m),则 (mmid ab-1);(acequiv 1 pmod m),则 (mmid ac-1)。所以 (mmid a(b-c))。
逆元存在当且仅当 (gcd(a,m)=1),则 (mmid b-c),即 (b equiv c pmod m)。“唯一”指在 (mod m) 意义下唯一。因此唯一性得证。
八、简化剩余系
1. 定义
任何 (m) 个分别属于 (m) 个剩余类(每个余数是一个剩余类)的数组成剩余系。
所有满足 (0<n≤m),(gcd(n,m)=1) 的 (n) 构成了一个模 (m) 的简化剩余系,记这样的 (n) 的个数为欧拉函数 (varphi(m))。
换言之,对于正整数 (n) ,欧拉函数是小于或等于 (n) 的正整数中与 (n) 互质的数的数目。
2. 定理
若 (gcd(m,m')=1),(a) 取遍 (m) 的简化剩余系,(a') 取遍 (m') 的简化剩余系,那么 (am'+a'm) 取遍模 (mm') 的简化剩余系(用中国剩余定理证)。因此 (varphi(mm')=varphi(m) varphi(m'))。
而 (varphi(p^e)=p^e-p^{e-1}=(p-1)p^{e-1})。因此对于 (n=p_1^{e_1} p_2^{e_2} ... p_k^{e_k}),
(varphi(n)=varphi(p_1^{e_1}) varphi(p_2^{e_2})...varphi(p_k^{e_k}))
(=prodlimits_{i=1}^k varphi(p_i^{e_i})=prodlimits_{i=1}^k p_i^{e_i-1} (p_i-1))
(=prodlimits_{pmid n}p^{alpha_p-1}(p-1)=prodlimits_{pmid n} p^{alpha_p} frac{p-1}{p})
(=prodlimits_{pmid n} p^{alpha_p} prodlimits_{pmid n}frac{p-1}{p}=nprodlimits_{pmid n}(1-frac{1}{p}))
其中 (alpha_p) 表示 (p) 在 (n) 中的幂次。
欧拉定理:若 (gcd(a,m)=1),则 (a^{varphi(m)}equiv 1 pmod m)。
欧拉定理的推论:若 (gcd(a,m)=1),则 (a^bequiv a^{b mod varphi(m)} pmod m)。
费马小定理:若 (m) 为质数,且 (gcd(a,m)=1),则 (a^{m-1}equiv 1 pmod m)。
因为 (m) 为质数,所以满足 (pmid m) 的 (p) 只有一个。
则 (varphi(m)=mprodlimits_{pmid m}(1-frac{1}{p})=m imes frac{m-1}{m}=m-1)
根据欧拉定理可得,(a^{m-1}equiv 1 pmod m)。
九、求逆元
1. 如何求出 (a) 的逆元?
- (gcd(a,m)=1),求 (a^{-1}pmod m)。
欧拉定理:若 (gcd(a,m)=1),则 (a^{varphi(m)}equiv 1 pmod m)。
即 (a^{varphi(m)}equiv a^0 pmod m)。因此 (a^{varphi(m)-1}equiv a^{-1} pmod m)
2. 如何求出 (1) 到 (n-1) 在 (mod n) 意义下的逆元?
注意到 (n mod i=n−lfloor frac{n}{i} floor i),则 (n mod iequiv −lfloor frac{n}{i} floor ipmod n),所以 (i^{-1} imes (nmod i)equiv -lfloor frac{n}{i} floorpmod n)。故 (i^{-1}equiv -lfloor frac{n}{i} floor imes (nmod i)^{-1}pmod n)。
3. 如何求出 (a_1,a_2,···,a_n) 的逆元?
令 (f_i=prodlimits_{j=1}^i a_j mod p),(g_i=f_i^{-1}mod p),则只要算出 (f_n) 并求出 (g_n),然后推回去即可。
十、线性同余方程组
求解方程组 (xequiv a_i pmod {m_i}) 的方法?
中国剩余定理:令 (m=prodlimits_{i=1}^k m_i),则在 (m_i) 两两互质时,(xequiv sumlimits_{i=1}^k M_i N_i a_i pmod m),其中 (M_i=frac{m}{m_i}),而 (M_iN_iequiv 1pmod {m_i})。
//Luogu P1495 #include<bits/stdc++.h> #define int long long using namespace std; const int N=20; int n,p[N],a[N],m=1; int exgcd(int a,int b,int &x,int &y){ if(!b) return x=1,y=0,a; int d=exgcd(b,a%b,x,y); int z=x; x=y,y=z-y*(a/b); return d; } int inv(int n,int mod){ //求 n 在模 mod 下的逆元 int x,y; exgcd(n,mod,x,y); //gcd(M,p[i])=1 return (x%mod+mod)%mod; } int CRT(int m){ int ans=0; for(int i=1;i<=n;i++){ int M=m/p[i],t=inv(M,p[i]); //由于 p[i] 不一定是质数,所以不能用费马小定理,也就是这里不能用快速幂求逆元(即不能用 t=mul(M,p[i]-2,p[i]),其中 mul 是快速幂) ans=(ans+a[i]%m*M%m*t%m)%m; } return ans; } signed main(){ scanf("%lld",&n); for(int i=1;i<=n;i++) scanf("%lld%lld",&p[i],&a[i]),m*=p[i]; printf("%lld ",CRT(m)); return 0; }
十一、欧拉定理的应用
要求 (a^b mod m),只要求 (bmod varphi(m)) 即可。
扩展欧拉定理:当 (gcd(a,m) eq 1) 时,(a^b equiv a^c pmod m),其中 (c) 在 (b<varphi(m)) 时即为 (b),否则为 (b mod varphi(m)+varphi(m))。