Euler Function
欧拉函数的定义¶
欧拉函数(Euler's totient function),即
比如说
当 n 是质数的时候,显然有
欧拉函数的一些性质¶
-
欧拉函数是积性函数。
积性是什么意思呢?如果有
\gcd(a, b) = 1 \varphi(a \times b) = \varphi(a) \times \varphi(b) 特别地,当
n \varphi(2n) = \varphi(n) -
n = \sum_{d \mid n}{\varphi(d)} 利用 莫比乌斯反演 相关知识可以得出。
也可以这样考虑:如果
\gcd(k, n) = d \gcd(\dfrac{k}{d},\dfrac{n}{d}) = 1, ( k < n ) 如果我们设
f(x) \gcd(k, n) = x n = \sum_{i = 1}^n{f(i)} 根据上面的证明,我们发现,
f(x) = \varphi(\dfrac{n}{x}) n = \sum_{d \mid n}\varphi(\dfrac{n}{d}) d \dfrac{n}{d} n = \sum_{d \mid n}\varphi(d) -
若
n = p^k p \varphi(n) = p^k - p^{k - 1} -
由唯一分解定理,设
n = \prod_{i=1}^{n}p_i^{k_i} p_i \varphi(n) = n \times \prod_{i = 1}^s{\dfrac{p_i - 1}{p_i}} 证明:
-
引理:设
p \varphi(p^k)=p^{k-1}\times(p-1) 证明:显然对于从 1 到
p^k p^{k-1} p p^k \varphi(p^k)=p^k-p^{k-1}=p^{k-1}\times(p-1)
接下来我们证明
\varphi(n) = n \times \prod_{i = 1}^s{\dfrac{p_i - 1}{p_i}} \varphi(x) -
如何求欧拉函数值¶
如果只要求一个数的欧拉函数值,那么直接根据定义质因数分解的同时求就好了。这个过程可以用 Pollard Rho 算法优化。
int euler_phi(int n) {
int m = int(sqrt(n + 0.5));
int ans = n;
for (int i = 2; i <= m; i++)
if (n % i == 0) {
ans = ans / i * (i - 1);
while (n % i == 0) n /= i;
}
if (n > 1) ans = ans / n * (n - 1);
return ans;
}
注:如果将上面的程序改成如下形式,会提升一点效率:
int euler_phi(int n) {
int ans = n;
for (int i = 2; i * i <= n; i++)
if (n % i == 0) {
ans = ans / i * (i - 1);
while (n % i == 0) n /= i;
}
if (n > 1) ans = ans / n * (n - 1);
return ans;
}
如果是多个数的欧拉函数值,可以利用后面会提到的线性筛法来求得。 详见:筛法求欧拉函数
欧拉定理¶
与欧拉函数紧密相关的一个定理就是欧拉定理。其描述如下:
若
扩展欧拉定理¶
当然也有扩展欧拉定理
证明和 习题 详见 欧拉定理
buildLast update and/or translate time of this article,Check the history
editFound smelly bugs? Translation outdated? Wanna contribute with us? Edit this Page on Github
peopleContributor of this article OI-wiki
translateTranslator of this article Visit the original article!
copyrightThe article is available under CC BY-SA 4.0 & SATA ; additional terms may apply.