定义
记小于等于
x
中与
计算方法
ϕ(x)=xΠki=1(1−1pi)
代码
线性筛求欧拉函数 O(n)
int tot_prime, prime[maxn], phi[maxn];
bool vist[maxn];
void get_prime(){
phi[1] = 1;
for(int i = 2; i <= n; ++i){
if(!vist[i]) prime[++tot_prime] = i, phi[i] = i - 1;
for(int j = 1; i * prime[j] <= n && j <= tot_prime; ++j){
vist[i*prime[j]] = true;
if(i % prime[j] == 0){
phi[i*prime[j]] = phi[i] * prime[j];
break;
}
else phi[i*prime[j]] = phi[i] * prime[j];
}
}
分解质因数求解大数的欧拉函数 O(logn)
int phi(int x){
int rtn = 1, cpy_x = x;
for(int i = 1; prime[i] * prime[i] <= cpy_x && i <= tot_prime; ++i){
int temp = 1;
while(x % prime[i] == 0){
x /= prime[i];
temp *= prime[i];
}
if(temp > 1) rtn *= temp - temp / prime[i];
}
if(x > 1) rtn *= (x - 1); // 还剩下一个很大的质数
return rtn;
}
一些性质
- ϕ(p)=p−1
- ϕ(pk)=pk−pk−1=(p−1)pk−1
- ϕ(xy)=ϕ(x)ϕ(y) < gcd(x,y)=1 >
- [欧拉定理] aϕ(x)=1 mod x
- [费马小定理]
ap−1=1 mod p =>inv(a)=ap−2 mod p Σnd|nϕ(d)=n
参考
[欧拉函数]http://www.cnblogs.com/handsomecui/p/4755455.html
[积性函数、线性筛、莫比乌斯反演和一堆乱七八糟的题目]http://jcvb.is-programmer.com/posts/41846.html