【自学笔记】基础数论(费马小定理、素数、欧拉函数、欧拉定理)
数论基础
费马小定理
若\(p\)为质数,\(\gcd(a,p)=1\),则\(a^{p-1}\equiv1(\mod p)\)
另一形式:对于任意整数\(a\),都有\(a^p\equiv a(\mod p)\)
证明
构造一个序列\(A=\{0,1,2,3,……,p-1\}\),已知\(A\)为\(p\)的完全剩余系
取一个不为\(p\)倍数的数\(a\),则\(a\)与序列\(A\)中的数一一相乘得到的序列\(B\)也是\(p\)的完全剩余系
解释:反证法,假设序列\(B\)不是\(p\)的完全剩余系,即存在\(A_ia\equiv A_ja(\mod p)(A_i>A_j)\)
\(\therefore (A_i-A_j)a\equiv0(\mod p)\Rightarrow p|(A_i-A_j)a\)
\(\because \gcd(a,p)=1,A_i-A_j\in[1,p-1]\)
故不存在\(p|(A_i-A_j)a\)
综上,每个\(A_ia(\mod p)\)都对应一个\(A_j(\mod p)\),\(p\)个元素组成了完全剩余系
显然\(0·a\)对应\(0\)
设\(f=(p-1)!\),则\(a^{p-1}f\equiv f(\mod p)\Rightarrow a^{p-1}\equiv 1(\mod p)\)
得证
关于另一形式:
对于不是\(p\)的倍数\(a\),可由\(a^{p-1}\equiv 1(\mod p)\),得到\(a^p\equiv a(\mod p)\)
对于是\(p\)的倍数\(a\),\(a\mod p=0,a^p\mod p=0\Rightarrow a^p\equiv a(\mod p)\)
故另一形式对任意整数\(a\)都通用
素数
素数计数函数:\(\pi(x)_{\lim x\rightarrow \infty}=\frac{x}{\ln(x)}\)
素数筛
//埃氏筛 时间复杂度O(n)
void prime(int n){
p[1]=1;
for(int i=2;i*i<=n;i++){
if(p[i]) continue;
for(int j=i*i;j<=n;j+=i) p[j]=1;
}
}
//欧拉筛 时间复杂度O(n) 比埃氏筛快
void prime(int n){
for(int i=2;i<=n;i++){
if(!v[i]) p[cut++]=i;
for(int j=0;p[j]<=n/i;j++){
v[p[j]*i]=1;
if(i%p[j]==0) break;
}
}
}
素数判断
//时间复杂度O(n)
bool isPrime(int num) {
if(num==1) return 0;
if(num==2||num==3) return 1;
if(num%6!=1&&num%6!=5) return 0 ;
int tmp=sqrt(num);
for(int i=5;i<=tmp;i+=6)
if(num%i==0||num%(i+2)==0)
return 0;
return 1;
}
解释:所有大于3的素数都可以表示为\(6n\pm1\)的形式
素性判断
//时间复杂度O(klog3(n))
ll qpow(ll a,ll b,ll c) {
ll ans=1;
while(b){
if(b&1) ans=(ans*a)% c;
a=(a*a)%c;
b>>=1;
}
return ans;
}
bool millerRabin(ll n){
if (n<3||n%2==0) return n==2;
ll a=n-1,b=0;
while(a%2==0) a/=2,++b;
for(int i=1,j;i<=10;++i) {
ll x=rand()%(n-2)+2,v=qpow(x,a,n);
if(v==1) continue;
for(j=0;j<b;++j) {
if(v==n-1) break;
v=v*v%n;
}
if(j>=b) return 0;
}
return 1;
}
解释:
实质还是依赖费马小定理逆推做素数判断测试(事实上逆推是不成立的,所以只是概率性测试)
比起费马测试,将\(a^{n-1}\equiv1(\mod n)\)的\(n-1\)开方进行了优化
优化依据:对于素数\(\forall p(p\neq2)\),如果\(a^2\equiv 1(\mod n)\),则\(a=1\)或者\(a=n-1\)(二次剩余)
欧拉函数
\(\phi(n)\)表示在\([1,n]\)的范围内与\(n\)互质的数有几个
基础公式
- \(\phi(1)=1\)
- 如果\(n\)为质数,则\(\phi(n)=n-1\)
- 如果\(n\)为某质数的次方,则\(\phi(p^k)=p^k-p^{k-1}\)
- 对于任意\(n\),\(\phi(n)=n\prod^s_{i=1}(1-\frac{1}{p_i})\),\(s\)为\(n\)的质因子个数
关于最后一项证明:
设\(n=pm\),\(p\)为数
则\(1\)到\(n\)可以被分成\(p\)份,\([1,m],[m+1,2m],……,[(p-1)m+1,pm]\)
由欧几里得公式\(\gcd(a,b)=\gcd(a\%b,b)\)倒推,得\(\gcd(a,b)=\gcd(a+xb,b)\)
故每份之中,与\(m\)互质数量相同
设\(\gcd(b,m)=1\)
当\(p|m\)时,\(\gcd(b,p)=1\),故\(\phi(n)=p\phi(m)\)
当\(p\nmid m\)时,\(\gcd(b,p)\)不一定为1,则\(\phi(n)=p\phi(m)-\{与m互质,与p不互质的数的个数\}\)
已知与\(p\)不互质的数有,\(p,2p,3p,……,mp\)
参照费马小定理的证明过程,已知这些数构成\(m\)的完全剩余系,相当于之前\(p\)份中的一份,其中与\(m\)互质的数有\(\phi(m)\)个
故\(\phi(n)=\phi(m)(p-1)\)
递推得\(\phi(n)=\prod^s_{i=1}(p_i^k-p_i^{k-1})=n\prod^s_{i=1}(1-\frac{1}{p_i})\)
函数性质
- 欧拉函数为积性函数,\(\gcd(a,b)=1\Rightarrow\phi(ab)=\phi(a)\phi(b)\),由于\(\phi(2)=1\),当\(n\)为奇数时,有\(\phi(2n)=\phi(n)\)
由公式可推导出,故不再证明
- \(n=\sum_{d|n}\phi(d)\)
证明:
\(n=\sum_{i=1}^nf(i)\),\(f(i)\)表示\(\gcd(k,n)=i(k\in[1,n])\)的\(k\)的个数
显然\(i\)只会是\(n\)的因数,故\(n=\sum_{d|n}f(d)\)
\(\because\gcd(k,n)=d\Rightarrow \gcd(\frac{k}{d},\frac{n}{d})=1\)
\(\therefore f(d)=\phi(\frac{n}{d})\)
根据约数性质:当\(d\)遍历\(n\)的全体约数时,\(\frac{n}{d}\)也遍历\(n\)的全体约数
故\(n=\sum_{d|n}\phi(\frac{n}{d})=\sum_{d|n}\phi(d)\)
- 当\(\gcd(a,b)=d\)时,\(\phi(ab)=\frac{\phi(a)\phi(b)d}{\phi(d)}\)
证明:
设\(d=p_i^{k_i}p_{i+1}^{k_{i+1}}…p_j^{k_j}\)
\(a=p_i^{m_i}p_{i+1}^{m_{i+1}}…p_j^{m_j}*A\)
\(b=p_i^{n_i}p_{i+1}^{n_{i+1}}…p_j^{n_j}*B\)
【注:\(\gcd(a,b)=d\Rightarrow k_i=min(m_i,n_i)\)】
\(ab=p_i^{m_i}p_i^{n_i}p_{i+1}^{m_{i+1}}p_{i+1}^{n_{i+1}}…p_j^{m_j}p_j^{n_j}*A*B\)
\(A,B\)为去掉与\(d\)相同的素因子后剩下的素因子次方
\(\phi(d)=p_i^{k_i}p_{i+1}^{k_{i+1}}…p_j^{k_j}(1-p_i^{-1})(1-p_{i+1}^{-1})…(1-p_j^{-1})\)
\(\phi(a)=p_i^{m_i}p_{i+1}^{m_{i+1}}…p_j^{m_j}(1-p_i^{-1})(1-p_{i+1}^{-1})…(1-p_j^{-1})*\phi(A)\)
\(\phi(b)=p_i^{n_i}p_{i+1}^{n_{i+1}}…p_j^{n_j}(1-p_i^{-1})(1-p_{i+1}^{-1})…(1-p_j^{-1})*\phi(B)\)
\(\phi(ab)=p_i^{m_i}p_i^{n_i}p_{i+1}^{m_{i+1}}p_{i+1}^{n_{i+1}}…p_j^{m_j}p_j^{n_j}(1-p_i^{-1})(1-p_{i+1}^{-1})…(1-p_j^{-1})*\phi(A)*\phi(B)\)
\(\therefore(1-p_i^{-1})(1-p_{i+1}^{-1})…(1-p_j^{-1})=\frac{\phi(d)}{d}\)
故\(\phi(ab)=\frac{\phi(a)\phi(b)d}{\phi(d)}\)
- 在int范围内,\(\phi_{max}=1600\)
代码
//欧拉函数
int phi(int n) {
int ans = n;
for (int i = 2; i * i <= n; i++)
if (n % i == 0) {
ans = ans / i * (i - 1);
while (n % i == 0) n /= i;
}
if (n > 1) ans = ans / n * (n - 1);
return ans;
}
//欧拉打表
void phi(int n){
for(int i=1;i<=n;i++) p[i]=i;
for(int i=2;i<=n;i++)
{
if(p[i]==i){
for(int j=i;j<=n;j+=i)
{
p[j]=p[j]/i*(i-1);
}
}
}
}
欧拉定理
若\(\gcd(a,m)=1\),则\(a^{\phi(m)}\equiv1(\mod m)\)
简单证明:
设\(r_1,r_2…r_{\phi(m)}\)为模\(m\)的既约剩余系(即余数与\(m\)互质的一批余数互不相同的数的集合)
\(\gcd(r_i,m)=1,\gcd(a,m)=1 \Rightarrow \gcd(ar_i,m)=1\)
故\(ar_1,ar_2…ar_{\phi(m)}\)也为模\(m\)的既约剩余系
剩余证明与费马小定理的证明相似
可以看出费马小定理是欧拉定理的特殊情况,当\(m\)为质数时,\(\phi(m)=m-1\)
扩展欧拉定理
第三项证明:
设\(m=sp^r,gcd(s,p)=1\)
\(p^{\phi(s)}\equiv 1(\mod s)\)
\(\because\phi(m)=\phi(s)\phi(p^r)\Rightarrow \phi(s)|\phi(m)\)
\(\therefore p^{\phi(m)}\equiv 1(\mod s)\)
根据同余性质 \(p^{\phi(m)}p^r\equiv p^r(\mod sp^r)\Rightarrow p^{\phi(m)+r}\equiv p^r(\mod m)\)
则\(p^c\equiv p^{c-r+r}\equiv p^{\phi(m)+c}(\mod m),c\geqslant r\)
显然\(r\leqslant\phi(m)\) (因为\(\phi(m)=\prod^s_{i=1}(p_i^{r_i}-p_i^{r_{i}-1})\),\(r\)线性增长时,\(p^r-p^{r-1}\)级数增长)
故当\(c\geqslant\phi(m)\)时,\(p^c\equiv p^{\phi(m)+c}(\mod m)\)也成立
再由于\(p^{\phi(m)}\equiv p^{\phi(m)+r-r}\equiv p^{r-r}\equiv 1(\mod m)\)
所以\(p^c\equiv p^{c\mod \phi(m)+\phi(m)}(\mod m)\)
质数幂次类同,\((p^k)^c\equiv (p^k)^{c\mod \phi(m)+\phi(m)}(\mod m)\)
根据算法基本定理\(a=\prod p_i^{k_i}\),故\(a^b\equiv a^{(b\mod \phi(m))+\phi(m)}(\mod m)\)
得证

浙公网安备 33010602011771号