也许更好的阅读体验
欧拉函数
-
定义
欧拉函数是 小于等于 x的数中与x 互质 的数的 数目
符号 φ(x)
互质 两个互质的数的最大公因数等于1,1与任何数互质
-
通式
φ(x)=x∏i=1n(1−pi1)
其中 pi为 x的质因子, n为 x的因子个数
欧拉函数常用性质
-
若 n为质数,显然 φ(n)=n−1
-
欧拉函数是积性函数
积性函数: 对于任意 互质 的整数 a和 b有性质 f(ab)=f(a)⋅f(b)的数论函数。
若 m,n互质, φ(mn)=φ(m)⋅φ(n)
-
如果 x=2n( n为奇数), φ(x)=φ(n) 即 φ(2n)=φ(n)( n为奇数)
n为奇数时,n与2互质, φ(2)=1
-
若 p为质数,则 φ(pk)=pk−pk−1
因为与 pk不互质的只有 p的倍数,而 pk中 p的倍数有 pk−1个
-
当 x>2时, φ(x)为偶数
这一点需要了解更相减损术 即 gcd(n,x)=gcd(n,n−x)
由该公式我们可以知道,所有与 n互质的数都是成对出现的
-
小于n的数中,与n互质的数的总和为 φ(n)∗n/2 (n>1)
由上面的证明(更相减损术)我们知道,每一对与 n互质的数的和为 n,共有 φ(n)/2对
-
n=∑d∣nφ(d)即 n的因数 (包括 1和它自己 )的欧拉函数之和等于 n
这条性质的运用又叫 欧拉反演
定义函数
f(n)=d∣n∑φ(d)
- f(n)为积性函数
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
n=p1k1⋅p2k2⋅⋯⋅pmkm
f(n)=f(p1k1)⋅f(p2k2)⋅⋯⋅f(pmkm)=p1k1⋅p2k2⋅⋯⋅pmkm=n
欧拉定理
若 a,m互质, aφ(m)≡1(mod m)
-
证明
- 剩余系 指对于某一个特定的正整数 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的缩系
- 若 a,m互质,则 m的一个缩系为
{x1,x2,x3...xφ(m)}
{ax1%m,ax2%m,ax3%m...axφ(m)%m}也是 mod m的缩系
于是可以得到
∑i=1φ(m)axi≡∑i=1φ(m)xi (mod m)
aφ(m)∑i=1φ(m)xi≡∑i=1φ(m)xi (mod m)
aφ(m)≡1 (mod m) - 而当 m为质数时, φ(m)=m−1
a(m−1)≡1(mod m)
这就是我们熟知的 费马小定理
-
变式 a,m互质 ab≡ab%φ(m)(mod m)
扩展欧拉定理
若 b>φ(m) 即使 a,m不互质, ab≡ab%φ(m)+φ(m)(mod m)
- 证明
从 m中提一个质因子 p出来 令 m=pk⋅s
有 gcd(pk,s)=1,即 pk,s互质
根据欧拉定理,我们知道 pφ(s)≡1(mod s)
根据欧拉函数是积性函数,我们知道 φ(s)∣φ(m)所以有 pφ(m)≡pφ(s)(mod s)
设 pφ(s)=xs+1
那么 pφ(s)+k=xm+pk
所以 pφ(s)+k≡pk(mod m),也有 pφ(m)+k≡pk(mod m)
当 b>=k时, pb≡pb−k⋅pk≡pb−k⋅pφ(s)+k≡pb+φ(m)(mod m)
又因为 k<=φ(pk)<=φ(m),所以当 b>=2φ(m)时,满足 pb≡pb−φ(m)(mod m)
注意是 2φ(m)!
所以可以得到 pb≡pb%φ(m)+φ(m)(mod m)
因此我们可以得到对任意质数 p都有 b>=2φ(m),pb≡pb%φ(m)+φ(m)(mod m)
非 m质因子的 p,有欧拉定理
将 a因式分解,可以得到
ab≡ab%φ(m)+φ(m)(mod m) - 注意 b<φ(m)时,公式不一定成立
线性筛法
类似与筛素数,我们在这里利用欧拉函数是积性函数这个性质来筛 φ
Code
int cnt;
int prime[maxn],phi[maxn];
bool vis[maxn];
void Euler_sieve (int n)
{
phi[1]=1;
for (int i=2;i<=n;++i){
if (!vis[i]) prime[++cnt]=i,phi[i]=i-1;
for (int j=1;j<=cnt&&i*prime[j]<=n;++j){
vis[i*prime[j]]=true;
if (i%prime[j]==0){ phi[i*prime[j]]=phi[i]*prime[j];break;}
phi[i*prime[j]]=phi[i]*phi[prime[j]];
}
}
}
欧拉反演
利用欧拉函数的一条性质
n=d∣n∑φ(d)
(上面有证明)
我们试着把 n换成其他东西试试
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)
如有哪里讲得不是很明白或是有错误,欢迎指正
如您喜欢的话不妨点个赞收藏一下吧
如能得到推荐博主就更开心了
您的鼓励是博主的动力