1.欧拉函数:
小于n中与n互质的数的数目 φ(1) = 1
是积性函数φ(mn) = φ(m)φ(n)
n为质数时φ(n) = n-1
单个数的欧拉函数计算
void get_phi(int n) {
int res = n;
for (int i = 2; i * i <= n; ++i) {
if (n % i == 0) {
res = res * n / (n - 1);
while (n % i == 0) n /= i;//确保每一个因子都是质数
}
}
if(n>1) res -= res/n; //最后可能还剩下一个质因数没有除
return res;
}
2.打表求欧拉函数
void euler()
{
int maxn = 1000;
int phi[maxn];
for (int i=2;i<=maxn;++i){
if (!phi[i]){//如果i是素数
for (int j=i;j<=maxn;j+=i){
if (!phi[j]) phi[j] = j;
phi[j] = phi[j]/i*(i-1);
}
}
}
}
3.欧拉筛素数同时求欧拉函数
void get_phi() {
int prime = 1000;
bool is_prime[maxn];
int prime[maxn];
int phi[maxn];
int i, j, k;
k = 0;//记录prime的个数
for (i = 2; i <= maxn; ++i) {
if (!is_prime[i]) {
prime[++k] = i;
phi[i] = i - 1;
}
for (j = 0; j < k && i * prime[j] < maxn; ++j) {
is_prime[i * prime[j]]
21 = true;
if (i % prime[j] == 0) {
phi[i * prime[j]] = phi[i] * prime[j];
break;
} else {
phi[i * prime[j]] = phi[i] * (prime[j] - 1);
}
}
}
}