码迷,mamicode.com
首页 > 其他好文 > 详细

欧拉函数

时间:2020-07-05 21:07:22      阅读:78      评论:0      收藏:0      [点我收藏+]

标签:lang   lin   code   ++   特殊   ++i   ==   sqrt   ret   

欧拉函数: 小于或等于n的正整数中与n互质的数的数目

通式:\(\phi(n) = n \Pi_{p_i}(1-\frac 1 {p_i})\) (\(p_i\)为小于或等于n的正整数中与n互质的数) , 特殊的,\(\phi(1)=1\)

由通式可得, $\phi(n)=(1-\frac 1 {p_1}) \cdot (1-\frac 1 {p_2}) \cdot \dots \cdot (1-\frac 1 {p_{i-1}}) \cdot (n-\frac n {p_i}) $

int phi(int n){
	int ans=n;
	for(int i=2;i*i<=n;++i)
		if(n%i==0) { // 第一次遇到的可整除的必定为质因子
			ans-=ans/i; //依次乘每项
			while(n%i==0)n/=i; // 除完所有质因子, 保证第4行正确性
		}
	if(n!=1)ans-=ans/n; // 大于sqrt(n)的最多只有一个质因子
	return ans;
}

对于倒数第三行, 小于\(\sqrt n\)的所有质因子相乘若小于\(\sqrt n\), 那么有且只有一个大于\(\sqrt n\)的质因子, 假设有两个, 相乘必定会大于\(n\).

欧拉函数

标签:lang   lin   code   ++   特殊   ++i   ==   sqrt   ret   

原文地址:https://www.cnblogs.com/youxam/p/euler-function.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!