首页 > 其他分享 >浅谈欧拉函数

浅谈欧拉函数

时间:2024-09-01 16:38:17浏览次数:7  
标签:phi frac 浅谈 int cdots ans 欧拉 函数

欧拉函数

定义

对于任意的正整数 \(n\),欧拉函数 \(\phi(n)\) 表示小于等于 \(n\) 的所有数中与 \(n\) 互质的数的个数。

暴力实现

那么根据定义,不难直接打出一个时间复杂度 \(O(n)\) 的代码,枚举所有小等于 \(n\) 的数字 \(i\),若 \(\gcd(n,i)=1\) 则答案 \(+1\)。

代码:

#include<bits/stdc++.h>
using namespace std;
int n,ans;
int gcd(int x,int y)
{
	return !y?x:gcd(y,x%y);
}
int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
		if(gcd(i,n)==1)
			ans++;
	printf("%d\n",ans);
	return 0;
}

很显然,这段代码效率不够高。有没有什么可以优化的地方?

欧拉函数推导

先根据定义可知以下几点:

  • \(\phi(1)=1\)
  • 若 \(n\) 为质数,则 \(\phi(n)=n-1\),即除了 \(n\) 自己外全都算。
  • 若 \(n=p^k\),则 \(\phi(n)=p^k-p^{k-1}\)。因为只有一个数不含质数 \(p\),才可以与 \(n\) 互质。所以就要剪掉包含质数 \(p\) 的那 \(p^{k-1}\) 个数字。而 \(p^k-p^{k-1}=p^k(1-\frac{1}{p})=p^k\frac{p-1}{p}\)。
  • 若 \(n=ab\),其中 \(a,b\) 互质,则 \(\phi(n)=\phi(a)\times\phi(b)=(a-1)\times(b-1)\)。反过来也一样,\(\phi(ab)=\phi(a)\times\phi(b)\)。
  • 若 \(n=p_1^{k_1}p_2^{k_2}\cdots p_i^{k_i}\cdots p_m^{k_m}\),则根据第三点,可表示为 \(p_1^{k_1}\frac{p_1-1}{p_1}p_2^{k_2}\frac{p_2-1}{p_2}\cdots p_m^{k_m}\frac{p_m-1}{p_m}\)。

再把 \(p_1^{k_1}p_2^{k_2}\cdots p_m^{k_m}\) 拎出来,发现正好等于 \(n\),所以结果就变成了:

\[\phi(n)=n(\frac{p_1-1}{p_1})(\frac{p_2-1}{p_2})\cdots (\frac{p_m-1}{p_m}) \]

根据这个公式,我们就可以枚举 \(p_i\) 去求解 \(\phi(n)\)。代码:

#include<bits/stdc++.h>
using namespace std;
int n,ans;
int main(){
	scanf("%d",&n);
	ans=n;
	if(n==1)//特判
	{
		printf("1\n");
		return 0;
	}
	for(int i=2;i*i<=n;i++)
	{
		if(n%i==0)
		{
			ans=ans*(i-1)/i;//公式
			while(!(n%i))//能整除就一直除下去
				n/=i;
		}
	}
	if(n>1)//如果n还没有除尽
		ans=ans*(n-1)/n;
	printf("%d\n",ans);
	return 0;
}

标签:phi,frac,浅谈,int,cdots,ans,欧拉,函数
From: https://www.cnblogs.com/Atserckcn/p/18391405

相关文章

  • MySQL:基础巩固-函数
    目录一、字符串函数二、数值函数三、日期函数四、流程函数一、字符串函数函数功能CONCAT(S1,S2,…,Sn)字符串拼接LOWER(str)转小写UPPER(str)转大写LPAD(str,n,pad)左填充,用字符串pad对str左边进行填充,达到n个字符串的长度RPAD(str,n,pad)右填充,用字符串pad对str右......
  • 浅谈搜索
    迭代加深搜索定义迭代加深是一种每次限制搜索深度的深度优先搜索。解释迭代加深搜索的本质还是深度优先搜索,只不过在搜索的同时带上了一个深度\(d\),当\(d\)达到设定的深度时就返回,一般用于找最优解。如果一次搜索没有找到合法的解,就让设定的深度加一,重新从根开始。代码......
  • 探索函数式编程:纯函数 | 高阶函数 | 函数柯里化 | 组合函数
    函数式编程概述定义函数式编程(FP:Functionalprogramming)是一种范式,强调使用函数来构建程序,并且避免使用状态改变和可变数据(避免函数的执行存在副作用)→范式,用函数来"组合"以及"处理数据"(将运算过程抽象成函数)复用特点函数是第一等公民:在函数式编程语言中,函数......
  • 浅谈 Occupancy
    01研究意义OccupancyNetwork算法因为可以更好的克服感知任务中存在的长尾问题,以及更加准确表达物体的几何形状信息,而受到来自工业界和学术界越来越广泛的关注。OccupancyNetwork算法本质上是一个3D分割任务,通过将想要感知的3D空间划分成固定大小的体素网格,并让算法去预测每个......
  • C# 一分钟浅谈:第一个 C# 控制台应用程序
    引言C#是一种现代化的、面向对象的编程语言,广泛应用于各种领域,包括桌面应用程序、Web应用、游戏开发等。对于初学者而言,从创建一个简单的控制台应用程序开始学习C#是一个非常好的起点。本文将详细介绍如何创建第一个C#控制台应用程序,并探讨一些常见的问题及其解决方案。准......
  • C# 一分钟浅谈:变量与数据类型简介
    引言在C#编程中,了解和使用变量与数据类型是非常基础且重要的一步。正确的数据类型选择不仅能够提高程序的性能,还能避免许多潜在的问题。本文将详细介绍C#中常见的数据类型和变量的使用方法,并探讨一些常见的问题及其解决方法。常见数据类型C#中的数据类型主要分为两大类:值......
  • 【C】关于字符串与字符串函数de一些小练习
    关于字符串与字符串函数de小练习1.字符串中的最大数你需要找出十个数中最大的哪一个,但不幸的是因为一些故障,一些小写字母随机的插入了这是个数字。请忽视这十个字符串中无意义的小写字母,输出这十个数字中最大的那一个,以及它来自于哪一个字符串。输入:"a3a2dsa3f4fsa5dg......
  • shell(第四章数组和函数)
    变量里面有索引比如:name=dufeng调用echo${name:0:1}输出的是du数字形索引是数组123123文字形索引是关联数组qwupdufeng定义数组数组名=(数组数组数组)数组名=(`cat/etc/passwd`)#反`优先执行数组名=(`ls/home*`)#只要数组可以输出结果数组名=(数组"......
  • PHP函数
    创建PHP函数函数是通过调用函数来执行的。函数准则:函数的名称应该提示出它的功能函数名称以字母或下划线开头(不能以数字开头)函数-添加参数为了给函数添加更多的功能,我们可以添加参数,参数类似变量。参数就在函数名称后面的一个括号内指定。";}echo"Mynameis";wr......
  • # 泛型中的new关键字的约束的函数
    泛型中的new关键字的约束的函数一般用于泛型约束,在函数或者类的末尾,通过whereT:new()约束,确保T类型可以被实例化。应用场景在封装sqlsugar中我遇到了类似的用法,传给sqlsugar中的entity必须有一个公开的无参构造函数......