欧拉函数学习笔记
Polaris_flame · · 个人记录
一.引入
任意给定正整数
计算这个值的函数叫欧拉函数,用
二.定义
在数论中,对于正整数
三.性质
1.欧拉函数是积性函数,但不是完全积性函数。
-
积性函数:对于任意互质的整数
a 和b 有性质f(ab)=f(a)f(b) 的数论函数。 -
完全积性函数:对于任意整数
a 和b 有性质f(ab)=f(a)f(b) 的数论函数。
对于素数
2.当
3.设
四.计算方法
通式:
1.埃氏筛
基本思想是对于每个
一个常数优化:对于一个质数
代码如下:
void get_euler(int n){
for(int i=1;i<=n;i++){
e[i]=i;
}
for(int i=2;i<=n;i++){
if(e[i]==i){
for(int j=i;j<=n;j+=i){
e[j]=e[j]/i*(i-1);
}
}
}
}
2.欧拉筛
也被称为线性筛 (因为复杂度是线性)。
考虑从另一个方向优化标记,也就是对所有数考虑乘一个质数得到的新数。
由唯一分解定理,每个
代码如下
void get_euler(int n){
e[1]=1;
for(int i=2;i<=n;i++){
if(!val[i]){
prime[++num]=i;
e[i]=i-1;
}
for(int j=1;j<=num&&prime[j]*i<=n;j++){
val[i*prime[j]]=1;
if(i%prime[j]==0){
e[i*prime[j]]=e[i]*prime[j];
break;
}
else e[i*prime[j]]=e[i]*e[prime[j]];
}
}
}