在数论中,欧拉函数(Euler's Totient Function)是一个非常重要的概念。它用于计算小于或等于某个正整数 n 且与 n 互质的正整数的个数。这个函数在密码学、算法竞赛以及数学研究中都有广泛应用。
本教程将带你从零开始,用C语言实现欧拉函数,即使你是编程小白,也能轻松理解并掌握!
欧拉函数通常记作 φ(n),表示的是:对于一个正整数 n,φ(n) 是满足 1 ≤ k ≤ n 且 gcd(k, n) = 1 的整数 k 的个数。其中 gcd 表示最大公约数。
举个例子:
欧拉函数有几个重要性质,可以帮助我们高效计算:
基于这些性质,我们可以利用质因数分解来快速计算 φ(n)。
下面我们提供两种实现方式:一种是基础暴力法(适合理解),另一种是基于质因数分解的高效算法。
思路:遍历 1 到 n,对每个数计算 gcd(i, n),若为 1 则计数加一。
#include <stdio.h>// 计算最大公约数(欧几里得算法)int gcd(int a, int b) { while (b != 0) { int temp = b; b = a % b; a = temp; } return a;}// 暴力法计算欧拉函数int euler_phi_brute(int n) { if (n == 1) return 1; int count = 0; for (int i = 1; i <= n; i++) { if (gcd(i, n) == 1) { count++; } } return count;}int main() { int n = 9; printf("φ(%d) = %d\n", n, euler_phi_brute(n)); return 0;} 这种方法时间复杂度为 O(n log n),当 n 很大时效率较低,但逻辑清晰,适合学习理解。
利用公式:
φ(n) = n × ∏(1 - 1/p),其中 p 是 n 的所有不同质因数。
例如:n = 12 = 2² × 3
φ(12) = 12 × (1 - 1/2) × (1 - 1/3) = 12 × 1/2 × 2/3 = 4
#include <stdio.h>// 高效计算欧拉函数int euler_phi(int n) { int result = n; // 初始化为 n // 从 2 开始尝试所有可能的质因数 for (int p = 2; p * p <= n; p++) { // 如果 p 是 n 的质因数 if (n % p == 0) { // 去除所有 p 因子 while (n % p == 0) { n /= p; } // 应用公式:result = result * (1 - 1/p) result -= result / p; } } // 如果 n 还大于 1,说明它本身是一个质数 if (n > 1) { result -= result / n; } return result;}int main() { int n = 12; printf("φ(%d) = %d\n", n, euler_phi(n)); return 0;} 这种方法的时间复杂度为 O(√n),效率高得多,是实际应用中的推荐做法。
通过本教程,你已经学会了:
无论你是准备算法竞赛,还是学习密码学基础,掌握欧拉函数都是必不可少的一步。希望这篇编程入门教程能帮助你打下坚实的基础!
提示:你可以尝试修改代码,输入不同的 n 值,观察输出结果是否符合预期。
本文由主机测评网于2025-12-12发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://www.vpshk.cn/2025126657.html