欧拉函数定义
在数论,对正整数 n,欧拉函数是小于或等于 n 的正整数中与 n 互质的数的数目(因此 φ(1) = 1)。此函数以其首名研究者欧拉命名(Euler’s totient function),它又称为 Euler’s totient function、φ 函数、欧拉商数等。 例如 φ(8)=4,因为1, 3, 5, 7 均和 8 互质。 从欧拉函数引伸出来在环论方面的事实和拉格朗日定理构成了欧拉定理的证明。
欧拉函数通式
Π 表示 n 个数相乘。φ(n) = (1 - 1 / p1) * (1 - 1 / p2) * … * (1 - 1 / pn)。
(其中 p1, p2 … pn 为 x 的所有质因数,x 是不为 0 的整数)
注意:每种质因数只有一个。
eg: 12 = 2 * 2 * 3; φ(12) = 12 * (1 - 1 / 2) * (1 - 1 / 3) = 4(1、5、7、11,Δ:包括 1)。
欧拉函数性质
欧拉函数实现
直接求欧拉函数:
int Euler(int n)
{
int rea = n;.
for (int i = 2; i * i <= n; i++)
if (n % i == 0)
{
rea = rea - rea / i; // rea = rea * (1 - 1 / i)
while (n % i == 0)
{
n = n / i;
}
}
if (n > 1) // 处理特殊情况
rea = rea - rea / n;
return rea;
}
快筛欧拉函数
实际上就是套了个 [欧拉筛]
需加语句、头文件:
int prime[10010], phi[10010];
bool v[10010];
快速欧拉函数代码:
void quick_euler()
{
int cnt = 0;
for(int i = 2; i <= N; ++i)
{
if(!v[i])
// i 是质数,所以 φ(i) = i - 1
prime[++cnt] = i, phi[i] = i - 1;
for(int j = 1; i * prime[j] <= N && j <= cnt; ++j)
{
v[i * prime[j]] = 1;
if(i % prime[j] == 0)
{
// 性质一
phi[i * prime[j]] = phi[i] * prime[j];
break;
}
else
// 性质二
phi[i * prime[j]] = phi[i] * (prime[j] - 1);
}
}
}
// 哪闶歉錾当?
作者:Rotch
日期:2020-10-03
修改:2020-10-03