欧拉函数

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 两类讨论即可

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值