欧拉函数
作者:互联网
定义
欧拉函数是小于x的整数中与x互质的数的个数,一般用φ(x)表示。特殊的,φ(1)=1
计算通式
φ(x)=x\(\prod_{i=0}^n(1-\frac{1}{p_i})\)
φ(1)=1
其中\(p_1,p_2 \cdots p_n\)为x的所有质因数,x是正整数。
理解:对于x的一个质因数\(p_i\),因为x以内\(p_i\)的倍数是均匀分布的,所以x以内有\(\frac{1}{p_i}\)的数是\(p_i\)的倍数,那么有\(1-\frac{1}{p_i}\)的数不是\(p_i\)的倍数,则有\(\prod_{i=0}^n(1-\frac{1}{p_i})\)的数与x互质。
欧拉函数的性质
-
质数p, φ(p)=p-1
-
质数p, 若\(n=p^k\),则φ(p)=\(p^k-p^{k-1}\)
代入计算通式易得
- 欧拉函数是积性函数,但不是完全积性函数。
由互质,计算通式相乘可以证明。
- 小于n的数中,与n互质的数的总和为:φ(n) * n / 2 (n>1)
与n互质的数一个是m,那么还存在另一个数n-m也与n互质。所以与n互质的数的平均数是n/2,而个数又是φ(n),可以得到这些数的和就是φ(n)*n/2
- 当n>2时,φ(n)是偶数
- \(n=\sum_{d|n}φ(d)\) , 即n的因数(包括1和它自己)的欧拉函数之和等于n
求欧拉函数
以最坏时间复杂度 \(O(\sqrt{n})\) 内求得指定正整数的欧拉函数值。
int phi(int n)
{
int res = n;
for (int i = 2; i * i <= n; i++)
{
if (n % i == 0)
res = res / i * (i - 1); // 先除再乘防止溢出
while (n % i == 0) // 每个质因数只处理一次,可以把已经找到的质因数除干净
n /= i;
}
if (n > 1)
res = res / n * (n - 1); // 最后剩下的部分也是原来的n的质因数
return res;
}
在欧拉筛途中顺便求出
int cnt = 0;
bool vis[50004];
int prim[50004];
int phi[50004];
void sieve(int n)
{
vis[1] = 1;phi[1] = 1;
for(int i=2;i<=n;++i)
{
if(vis[i]==0){
prim[++cnt] = i;
phi[i] = i - 1;
}
for(int j=1;j<=cnt&&i*prim[j]<=n;++j)
{
vis[i*prim[j]] = 1;
if(i%prim[j]==0){
phi[i*prim[j]] = phi[i] * prim[j];
break;
}
else phi[i*prime[j]]=phi[i]*phi[prime[j]];
}
}
}
题目
积性函数
若当m与n互质时,$f ( m \times n ) = f ( m ) \times f ( n ) \(,那么f是积性函数。若对任意正整数,都有\)f(m\times n)=f(m)\times f(n)$成立,则f是完全积性函数。
标签:函数,int,times,积性,互质,欧拉 来源: https://www.cnblogs.com/beiy/p/16461389.html