预备知识
-
剩余系:指对于某一个特定的正整数n,一个整数集中的数mod n所得的余数域。
-
完全剩余系: 设m∈Z+,若r0,r1,...rm−1为m个整数,并且两两模m不同余,则r0,r1,...rm−1叫作模m的一个完全剩余系。
-
缩系:设A是mod n的剩余系,若任意A中两个元素相乘mod n后仍为A中的元素,则称A为mod n的缩系
好吧其实后面好像用不上,但总还是有用的。
欧拉函数
φ(n)为不超过n且与n互质的数的个数。
显然,若p为质数, φ(p)=p−1
φ(pk)=pk−pk−1 因为与 pk不互质的只有p的倍数,而p的倍数有 Pk−1个。
欧拉函数是积性函数。
证明:(需要中国剩余定理)
n=p1k1p2k2...pmkm
若x,n互质,则x%n, p1k1也互质
⎩⎪⎪⎪⎨⎪⎪⎪⎧x≡ a1 mod p1k1x≡ a2 mod p2k2...x≡ am mod pmkm
x,ai,pik1均互质
在一组方程中, ai 有多种取法,需满足gcd( a1,p1k1)=1
∴ φ(piki)=sizeof{ ai}
根据中国剩余定理,在1~n范围内有唯一x,又gcd(x,n)=1
则x有 φ(n)中取法
对于每一个x,与{ a1,a2,...,am}集合唯一对应
有 Na1∗Na2∗...∗Nam种方法
= φ(p1k1)∗φ(p2k2)∗...∗φ(pmkm)
分别对应一个唯一的x
∴ φ(p1k1)∗φ(p2k2)∗...∗φ(pmkm)=φ(n)
又 n=p1k1p2k2...pmkm
∴ φ为积性函数
若gcd(a,M)=1,则 aφ(M)≡ 1 (mod M)
证明:
设a,M互质,有M的一个缩系为{ a,2a,...,φ(M)a},缩系元素个数为 φ(M)个
φ(M)! ≡ ∏φ(M)ai (mod M)
φ(M)! ≡ aφ(M)φ(M)! (mod M)
aφ(M)≡ 1 (mod M)
当M为质数时,则有 φ(M)=M−1,即费马小定理
扩展欧拉定理
如果gcd(a,M)!=1,那么 ab≡ab mod φ(M)+φ(M) (mod M)(b>φ(M))
证明:
先考虑 M的一个质因子p , gcd(p,M)=p
把 M分解: M=s∗pk,gcd(s,p)=1
可得: px≡px mod φ(s) mod s (x>φ(s))
又 ∵ φ(s)∣φ(M)( φ是积性函数)
∴ px≡px mod φ(M) mod M
更有 px≡px mod φ(M)+φ(M) mod M
对于任意一个数 a,gcd(a,M)=b,b≠1
有 a=bk1∗r1,gcd(r1,M)=1
则 ax≡bk1x∗r1x mod M
ax≡bk1x mod φ(M)+φ(M)∗r1x mod φ(M)+φ(M) mod M
ax≡bk1∗r1x mod φ(M) mod M
即 ax≡ax mod φ(M)+φ(M) mod M (x>φ(M))
证毕
ok,继续之前的内容
当n= p1a1p2a2...pkak时
ϕ(n)=i=1∏kpiai−1(pi−1)=n∗i=1∏k(1−pi1)=n∗i=1∏kpipi−1
可以用此式子递推
递推证明
递推代码
#include<iostream>
#include<cstdio>
using namespace std;
const int maxn=1e6+10;
int n=1e6,prime[maxn],vis[maxn],tot,mn[maxn],e[maxn],phi[maxn],d[maxn],mu[maxn];
void euler_sieve()
{
mu[1]=1;phi[1]=1;
for(int i=2;i<=n;i++)
{
if(!vis[i]) { prime[++tot]=i;mn[i]=i;e[i]=1;phi[i]=i-1;d[i]=2;mu[i]=-1; }
for(int j=1;j<=tot and prime[j]*i<=n;j++)
{
vis[prime[j]*i]=1;
mn[prime[j]*i]=prime[j];
e[prime[j]*i]=1;
if(i%prime[j]==0)
{
phi[i*prime[j]]=phi[i]*prime[j];
e[prime[j]*i]=e[i]+1;
d[i*prime[j]]=d[i]/(e[i]+1)*(e[i]+2);
break;
}
else phi[i*prime[j]]=phi[i]*(prime[j]-1);
mu[i*prime[j]]=-mu[i];
d[i*prime[j]]<<=1;
}
}
}
int main()
{
}
欧拉反演
i=1∑ngcd(i,n)=d∣n∑dnφ(d)
证明:
首先有 n=d∣n∑φ(d)
即n的因数(包括1和它自己))的欧拉函数之和等于n
证明
设 f(n)=d∣n∑φ(d),有 f是积性函数。
f(n)⋅f(m)=i∣n∑φ(i)j∣m∑φ(j)=i∣n∑j∣m∑φ(i)⋅φ(j)=i∣n∑j∣m∑φ(i⋅j)=d∣nm∑φ(d)=f(nm)
f(pk)=φ(1)+φ(p)+φ(p2)+⋯+φ(pk)=1+(p−1)+(p2−p)+⋯+(pk−pk−1)=pk
f(n)=f(p1k1)⋅f(p2k2)⋅⋯⋅f(pmkm)=p1k1⋅p2k2⋅⋯⋅pmkm=n
把n=gcd(i,j)代入得
gcd(i,j)=d∣gcd(i,j)∑φ(d)=d∣i∑d∣j∑φ(d)
i=1∑ngcd(i,n)=i=1∑nd∣i∑d∣n∑φ(d)=d∣n∑i=1∑nd∣i∑φ(d)=d∣n∑dnφ(d)
即 i=1∑ngcd(i,n)=d∣n∑dnφ(d)