首页 > 代码库 > 欧拉函数
欧拉函数
在数论,对正整数n,欧拉函数是小于n的正整数中与n互质的数的数目(φ(1)=1)。此函数以其首名研究者欧拉命名(Euler‘so totient function),它又称为Euler‘s totient function、φ函数、欧拉商数等。 例如φ(10)=5,因为1,3,5,7,9均和10互质。
公式如下:
下面我写下我理解的证明过程
①对于给定的一个素数P,它φ(P) = P – 1。则对于正整数n = P^k,φ(n) =P^k – P^k。
证明:
小于P^k的正整数有P^k – 1个,其中和P^k不互质的正整数有{P*1,P*2,......,P*(P^(k-1)-1)}共P^(k-1) – 1个。
所以φ(n) = p^k – 1 – (P^(k-1) – 1) = P^k – P(k-1)。
比如P = 7,k=2,与7^2 = 49 互质的有7*1、7*2、7*3、7*4、7*5、7*(7^1-1)这六个,即7(2-1) – 1个,所以φ(49) = 48 – 6 = 42个。
②假设q、p是互质的两个正整数,则q*p的欧拉函数是φ(q*p) = φ(q)*φ(p),gcd(q,p) = 1。
证明:
令n = q*p,gcd(q,p) = 1。根据孙子定理,Zn和ZqXZp之间存在一一映射,所以n的完全余数集合的元素个数等于ZqXZp集合元素的个数。
所以有φ(n) = φ(q)*φ(p)。
由于任意一个数都可以质因数分解,比如 1400 = 2^3*5*2*7。
所以任意一个数n =(X1^h1)*(X2^h2)*(X3^h3)···(Xn^hn)。
由此的φ(n) = (X1^h1-X1(h1-1))*(X2^h2-X2^(h2-1))*(X3^h3-X3^(h3-1))···(Xn^hn-Xn^(hn-1))
= X1^h1*X2^h2*X3^h3···Xn^hn*(1-1/X1)*(1-1/X2)*(1-1/X3)···(1-1/xn)
=n*(1-1/X1)*(1-1/x2)*(1-1/X3)···(1-1/Xn)
既得出结论:
下面是我写代码:
1 #include <iostream> 2 #include <cstdio> 3 #include <cmath> 4 using namespace std; 5 6 bool is_prime(int x){ 7 if(x <2) return false; 8 for(int i = 2; i <= sqrt(x); i++){ 9 if(x%i == 0){ 10 return false; 11 } 12 } 13 return true; 14 } 15 16 int main() { 17 int n; 18 cin >> n; 19 int ans = n; 20 if(n <= 2) cout << 1 << endl; 21 else if(is_prime(n)) cout << 2 << endl; 22 else{ 23 for(int i = 2; i <= n; i++){ 24 if(n%i == 0){ 25 ans = ans*(i-1)/i; 26 while(n%i == 0) n/=i; 27 } 28 } 29 cout << ans << endl; 30 } 31 return 0; 32 }
欧拉函数