phi(n) =表示小于或等于n的正整数中与n互质的数的个数(1也算)
公式:
phi(n)= n *(1- 1 / P1)*(1 - 1 / P2) * ... * (1 - 1 / Pn)
其中,Pi表示n的约数(Pi为质数)
证明:
1)当正整数n= P^k时
phi(n)= P^k - n/P = P^k - P^(k - 1) = n * (1 - 1/P)
2)当正整数n= P1^k1 * P2^k2 * … * Pn^kn时
phi(n)
= (P1^k1 - P1^k1/P1)*(P2^k2 - P2^k2/P2)*...*(Pn^kn – Pn^kn/Pn)
=P1^k * (1 – 1/P1) * P2^k * (1 – 1/P1) * … * Pn^k * (1 – 1/Pn)
=P1^k * P2^k * … * Pn^k * (1 – 1/P1) * … * (1 – 1/Pn)
=n * (1 – 1/P1) * … * (1 – 1/Pn)
程序:
#include<iostream>
#include<stdio.h>
#include<memory.h>
using namespace std;
int main()
{
int n;
scanf("%d", &n);
int phi = 1;
for(int i = 2; i * i <= n; i ++)
if(n % i == 0)
{
phi *= i - 1;
for(n /= i; n % i == 0; n /= i)
phi *= i;
}
if(n > 1)
phi *= n - 1;
printf("%d\n", phi);
return 0;
}
解释:
phi(n)
= (P1^k1 - n/P1) * ... *(Pn^kn - n/Pn)
=(P1^k1 - (P1 ^k1)/P1) * ... *(Pn^kn -(Pn ^ kn)/Pn)
=(P1^(k1 - 1) * (P1 - 1)) * ... *(Pn^(kn - 1) * (Pn - 1))
易知:
1)这个循环可以求出所有的质因子
2)i * i <= n可以提高效率
-->如果存在比 i 还大的质因子,那么i * i > n,不会退出
-->如果 i 是最大的质因子,设 n = i ^ k, 分 k = 1 与 k > 1 两类讨论即可