您的位置:首页 > 其它

数论 —— 欧拉函数

2018-03-16 16:50 183 查看
欧拉函数,用φ(n)表示欧拉函数是求小于等于n的数中与n互质的数的数目

求n的欧拉函数时我们可以减去它的所有素数因子以及它的倍数
φ(12):12 == 2*2*3
素数因子有2 ,3所以我们减掉2,3的倍数
2的倍数:2,4,6,8,10,12
3的倍数:3,6,9,12
显然2,3存在重复项6,12
根据容斥定理我们可以得知
φ(12) = 12 - (12/2 + 12/3 )+12/(2*3)
容斥会很麻烦所以我们需要考虑简化版
φ(12)=12*(1-1/2)*(1-2/3) ==  12 - (12/2 + 12/3 )+12/(2*3)

phi(1)=1
代码实现:int phi(int x){
int ans = x;
for(int i = 2; i*i <= x; i++){//查找素数因子
if(x % i == 0){
ans = ans / i * (i-1);
while(x % i == 0) x /= i;
}
}
if(x > 1) ans = ans / x * (x-1);
return ans;
}单个查找时间复杂度为O(√n)
可以用埃筛的方法预处理数据#include<cstdio>
const int N = 100000 + 5;
int phi
;
void Euler(){
phi[1] = 1;
for(int i = 2; i < N; i ++){
if(!phi[i]){
for(int j = i; j < N; j += i){
if(!phi[j]) phi[j] = j;
phi[j] = phi[j] / i * (i-1);
}
}
}
}
int main(){
Euler();
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: