欧 拉 函 数 欧拉函数 欧拉函数
对正整数n,欧拉函数是小于或等于n的数中与n互质的数的数目
欧 拉 函 数 通 常 用 φ ( n ) 表 示 欧拉函数通常用\varphi (n) 表示 欧拉函数通常用φ(n)表示
∀ x ∈ Z + , 先 分 解 成 质 因 数 相 乘 的 格 式 \forall x \in Z _+ , 先分解成质因数相乘的格式 ∀x∈Z+,先分解成质因数相乘的格式
x = P _ 1 c 1 × P _ 2 c 2 × . . . × P n c n x = P\_1^{c1} \times P\_2^{c2} \times ... \times P_n^{cn} x=P_1c1×P_2c2×...×Pncn
则 有 φ ( x ) = x × ( 1 − 1 P 1 ) × ( 1 − 1 P 2 ) × . . . × ( 1 − 1 P n ) 则有\varphi (x) = x \times (1 - \frac{1}{P1}) \times (1 - \frac{1}{P2}) \times ... \times (1 - \frac{1}{Pn}) 则有φ(x)=x×(1−P11)×(1−P21)×...×(1−Pn1)
C o d e Code Code
void init()//质数筛
{
for (int i = 2; i < N; i ++ )
{
if (p[i])continue;
q[++tot] = i;
for (int j = 2; j <= N / i; j ++ )
p[i * j] = true;
}
}
int varphi(int n)
{
init();
int ans = n;
for (int i = 1; i <= tot; i ++ )//分解质因数
{
int cnt = 0;
while (n % q[i] == 0)
{
n /= q[i];
cnt ++ ;
}
if (cnt)ans -= ans / q[i];
}
return ans;
}
但 是 单 个 求 复 杂 度 太 高 , 每 个 都 需 要 O ( n l o g n ) 的 复 杂 度 , 求 1 ∼ n 的 欧 拉 函 数 之 和 就 要 O ( n 2 l o g n ) 但是单个求复杂度太高,每个都需要O(nlogn)的复杂度,求1 \sim n的欧拉函数之和就要O(n^2logn) 但是单个求复杂度太高,每个都需要O(nlogn)的复杂度,求1∼n的欧拉函数之和就要O(n2logn)
这 时 就 需 要 用 到 更 快 的 这时就需要用到更快的 这时就需要用到更快的 线 性 筛 法 线性筛法 线性筛法 , 并 根 据 线 性 筛 法 的 性 质 , 顺 带 求 出 所 有 数 的 欧 拉 函 数 值 ,并根据线性筛法的性质,顺带求出所有数的欧拉函数值 ,并根据线性筛法的性质,顺带求出所有数的欧拉函数值
C o d e Code Code
void init()//质数筛
{
for (int i = 2; i < N; i ++ )
{
if (p[i])continue;
q[++tot] = i;
for (int j = 2; j <= N / i; j ++ )
p[i * j] = true;
}
}
int varphi(int n)
{
init();
int ans = n;
for (int i = 1; i <= tot; i ++ )//分解质因数
{
int cnt = 0;
while (n % q[i] == 0)
{
n /= q[i];
cnt ++ ;
}
if (cnt)ans -= ans / q[i];
}
return ans;
}