欧拉函数及其线性筛

news2024/11/25 11:08:41

一,定义

欧拉函数是对于n小于或者等于他的数中与n互质的数的个数。一般用φ(x)表示。

二,欧拉函数公式

\varphi (n)=n*\prod _{i=1}^{s}(1-\frac{1}{pi})

其中pi为n的所有质因数。

公式的理解方法可以是pi是与n互质的数,那么它(包括它的倍数)在1~n里面是均匀出现的,概率为1/pi,显然这1/pi的数都与n互质,先筛去,剩下n*(1-1/pi)的数,同理对于pj,剩下的数里面有1/pj的数是与n不互质,再筛去1/pj,剩下n*(1-1/pi)*(1-1/pj).......当我们把所有质因数的倍数筛去,剩下的就是与n互质的数。

三,欧拉函数的性质

  1. 若p为质数,φ(p)=p-1

    这个显然1~p-1都与p互质,除了p。
  2. 若p为质数,对于p^k,有φ(p^k)=p^k-p^(k-1)

    在范围内,与p^k不互质的数,显然与p^k的gcd是p,那么只要那个数可以*p并且不超过范围,这个*p后的数与n^p不互质,显然1~p^(k-1)都可以*p不超过范围,那么就有p^(k-1)个数与p^k不互质.
  3. 当n>2是,与n互质的数总是成对存在,如gcd(a,n)=1,则gcd(n-a,n)=1。

    我们假设gcd(n-a,n)=m(m!=1),则有n=p*m,n-a=q*m,那么有a=(p-q)*m,则有a与n有公约数m,与gcd(n,a)=1矛盾,得证。
  4. 因此,n>2时,φ(n)是偶数,而且小于等于n的数中,与n互质的数的总和为:φ(n) * n / 2 (n>1即可)。

    每一对和为n.
  5. n=\sum_{d\mid n }\varphi (d),即n的因数(包括1和它自己)的欧拉函数之和等于n。

    我们可以把n写为其分母形式的数有,1/n,2/n,3/n...n/n。将他们化简会发现,分母都是n的因数(包括1和它自己),而分子则是分母自己的欧拉函数中的数(小于等于分母且与分母互质的数),这些对,刚刚好就是n对,即所有n的因数的欧拉函数和就是n(个)。
  6. 欧拉函数是积性函数

    1. 首先积性函数定义:如果函数f:N->R,满足对于任意一对互质的正整数p,q,都有f(pq)=f(p)*f(q),则称f为积性函数。
    2. 证明欧拉函数是积性函数:gcd(n,m)=1,φ(n)=n*(1-1/p1)*(1-1/p2)....φ(m)=m*(1-1/q1)*(1-1/q2)....,φ(n)*φ(m)=n*m*(1-1/p1)*(1-1/q1).....(因为n与m互质,显然他们的质因子也都是互质的,那么p与q不重复),显然等于φ(n*m)。
    3. 特殊的,当n是奇数时,φ(2*n)=φ(n) 

四,求欧拉函数

1,求单个欧拉函数,根据定义即可,我们每次筛出其质因子,就*(1-1/pi)

int phi(int n)
{
	int ans=n;//初始取n,后面不断乘分式
	for(int i=2; i*i<=n; ++i)
		{
			if(n%i==0)
				{
					ans=ans/i*(i-1);
					while(n%i==0)n/=i;
				}
		}
	if(n>1)ans=ans/n*(n-1);
	return ans;
}

2,求1~n所有欧拉函数,我们可以利用积性函数的性质使用欧拉筛实现O(n)求出

const int N = 2e5 + 10;
bool vis[N];
int ou[N],phi[N];//ou[]为线性筛出的质数,phi为欧拉函数
void euler_phi(int n)
{
	vis[1]=1,phi[1]=1;
	for(int i=2; i<=n; ++i)
		{
			if(!vis[i])
				{
					ou[++ou[0]]=i;
					phi[i]=i-1;//质数的欧拉函数
				}
			for(int j=1; j<=ou[0]&&i*ou[j]<=n; ++j)
				{
					vis[ou[j]*i]=1;
					if(i%ou[j]==0)//如果ou[j]是i的最小质数,那么显然不互质了,不能用积性函数求欧拉函数。
						{
							//但是,我们还有定义,根据定义,我们phi[ou[j]*i]=ou[j]*i*(所有质因子那串),发现i包括了所有质因子,说明原式可以化为ou[j]*phi[i]
							phi[ou[j]*i]=phi[i]*ou[j];
							break;
						}
					phi[ou[j]*i]=phi[i]*phi[ou[j]];//i与ou[j]互质用积性函数性质求欧拉函数
				}
		}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/425870.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

分布式场景下,Apache YARN、Google Kubernetes 如何解决资源管理问题?

所有的资源管理系统都需要解决资源的有效利用、任务的有效响应、调度策略的灵活配置这三个最基本问题。那么在分布式的场景下&#xff0c;YARN和Kubernetes是怎么解决的呢&#xff1f;本篇进行介绍。 — Apache YARN — YARN全称为&#xff08;Yet Another Resource Negotiato…

OSPF开放式最短路径优先协议

目录标题OSPF协议OSPF的数据包---5种OSPF的状态机OSPF的工作过程OSPF的基本配置关于ospf协议从邻居建立成为邻接的条件ospf的接口网络类型OSPF协议 是是无类别链路状态型IGP协议&#xff1b;由于其基于拓扑进行更新收敛&#xff0c;故更新量会随着拓扑的变大而呈指数上升&…

处理CSV(python)

处理CSV&#xff08;python&#xff09;简介1. CSV和Python简介2. 文章内容简介一、用csv模块读取和写入CSV文件1. CSV模块2. 示例二、用pandas库读取和写入CSV文件1. pandas2. 示例三、处理CSV文件中的特殊情况1. 特殊情况及处理方法2. 示例简介 1. CSV和Python简介 CSV是一…

动态内存管理--从动态内存分配函数开始和你一起了解

目录前言1.为什么存在动态内存分配2.动态内存函数的介绍2.1malloc函数和free函数2.2calloc函数2.3realloc函数3.常见的动态内存错误3.1对NULL指针的解引用操作3.2对动态开辟空间的越界访问3.3对非动态内存开辟的内存使用free释放3.4使用free释放一块动态内存的一部分3.5对同一块…

【致敬未来的攻城狮计划】— 连续打卡第三天:欲速则不达,今天是对RA2E1 基础知识的补充学习。

系列文章目录 1.连续打卡第一天&#xff1a;提前对CPK_RA2E1是瑞萨RA系列开发板的初体验&#xff0c;了解一下 2.开发环境的选择和调试&#xff08;从零开始&#xff0c;加油&#xff09; 文章目录 目录 系列文章目录 文章目录 前言 一、RA是什么&#xff1f; 二、RA特点…

RHCE——shell脚本练习

一.实验要求 1、判断web服务是否运行&#xff08;1、查看进程的方式判断该程序是否运行&#xff0c;2、通过查看端口的方式判断该程序是否运行&#xff09;&#xff0c;如果没有运行&#xff0c;则启动该服务并配置防火墙规则。 ​2、使用curl命令访问第二题的web服务&#xff…

Kafka的历史版本对应SpringBoot版本

截至目前&#xff08;2023年&#xff09;&#xff0c;Kafka的最新版本是2.9.0&#xff0c;发布于2022年11月30日。Kafka的历史版本可以在Kafka官方网站的下载页面中找到。Kafka从0.8版本开始发布&#xff0c;经历了多个版本的迭代和升级。以下是一些比较重要的Kafka版本及其发布…

Python实现哈里斯鹰优化算法(HHO)优化Catboost回归模型(CatBoostRegressor算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 2019年Heidari等人提出哈里斯鹰优化算法(Harris Hawk Optimization, HHO)&#xff0c;该算法有较强的全…

【LeetCode】剑指 Offer 52. 两个链表的第一个公共节点 p253 -- Java Version

题目链接&#xff1a;https://leetcode.cn/problems/liang-ge-lian-biao-de-di-yi-ge-gong-gong-jie-dian-lcof/ 1. 题目介绍&#xff08;52. 两个链表的第一个公共节点&#xff09; 输入两个链表&#xff0c;找出它们的第一个公共节点。 如下面的两个链表&#xff1a; 在节点…

基于微信小程序开发的“校园帮”系统

基于微信小程序开发的“校园帮”系统【毕业论文&#xff0c;源码】 本系统使用了java和mysql结合的结构开发了微信小程序应用&#xff0c;系统中所有和数据库有关系的操作都通过一个通用类来实现&#xff0c;大大提高了代码的耦合性&#xff0c;当数据库类型等信息变化后直接修…

【剑指offer|6.寻找峰值】

0.寻找峰值 关键点: 返回任意一个峰值的下标即可nums[-1]nums[n]负无穷 输入&#xff1a;nums [1,2,3,1] 输出&#xff1a;2 解释&#xff1a;3 是峰值元素&#xff0c;你的函数应该返回其索引 2 1.傻瓜编程(纯属玩乐) class Solution { public:int findPeakElement(vector&l…

普通人在家就能用ChatGPT轻松月赚$5000美金的方法

太震撼了&#xff0c;这简直就是下个世纪才应该出现的产品&#xff0c;突然之间我感觉就像人类&#xff0c;刚刚发明了电灯一样&#xff0c;一切都要变了&#xff0c;而且变的速度太快&#xff0c;让我都觉得有点茫然了&#xff0c;绝对就是技术大爆炸。今天这篇文章我想通过ch…

React 的源码与原理解读(六):reconcileChildren 与 DIFF 算法

写在专栏开头&#xff08;叠甲&#xff09; 作者并不是前端技术专家&#xff0c;也只是一名喜欢学习新东西的前端技术小白&#xff0c;想要学习源码只是为了应付急转直下的前端行情和找工作的需要&#xff0c;这篇专栏是作者学习的过程中自己的思考和体会&#xff0c;也有很多参…

常年不卷,按时下班,工作能力强,同事求助知无不言,不扯皮,不拉帮结派,这样的职场清流竟然被裁掉了!...

在职场上&#xff0c;你永远想不到什么样的员工会被优化&#xff0c;比如下面这位&#xff1a;常年不卷&#xff0c;按时下班&#xff0c;工作很专业&#xff0c;同事问什么都回答&#xff0c;不扯皮&#xff0c;不拉帮结派&#xff0c;简直是职场清流。在上个月竟然被优化了&a…

一分钟腾讯云轻量应用服务器性能评测(慎入坑)

腾讯云轻量应用服务器性能评测&#xff0c;轻量服务器CPU主频、处理器型号、公网带宽、月流量、Ping值测速、磁盘IO读写及使用限制&#xff0c;轻量应用服务器CPU内存性能和标准型云服务器CVM处于同一水准&#xff0c;所以大家不要担心轻量应用服务器的性能&#xff0c;腾讯云百…

JavaEE企业级应用开发教程——第十章 初识Spring MVC框架(黑马程序员第二版)(SSM)

第十章 初识Spring MVC框架 JSP Model2架构模型是一种将页面显示、流程控制和业务逻辑分离的Web应用程序架构模型&#xff0c;采用JSP、Servlet和JavaBean技术实现。但是&#xff0c;它将通用逻辑以硬编码的方式实现&#xff0c;每次开发新的Web应用程序时都需要重新编写Servl…

MyBatis注解开发---实现增删查改和动态SQL

目录 1. 环境搭建 &#xff08;1&#xff09;创建持久层接口&#xff0c;并在接口方法上定义Sql语句 &#xff08;2&#xff09;测试方法 &#xff08;3&#xff09;运行结果 2. 注解实现增删查改 &#xff08;1&#xff09;增加用户 &#xff08;2&#xff09;删除用…

【4.17】贪心算法入门

什么是贪心&#xff1f; 贪心的本质是选择每一阶段的局部最优&#xff0c;从而达到全局最优。 刷题或者面试的时候&#xff0c;手动模拟一下感觉可以局部最优推出整体最优&#xff0c;而且想不到反例&#xff0c;那么就试一试贪心。 贪心的解题步骤&#xff1f; 贪心算法一…

《人体地图》笔记

《人体地图》 坂井建雄 著 孙浩 译 腹部通向大腿的隧道 腹部与大腿的分界点是大腿根部&#xff0c;即是腹股沟。 腹壁肌肉连结在腹股沟韧带上&#xff0c;腹壁肌肉包括三层&#xff0c;分别为腹外斜肌、腹内斜肌和腹横肌&#xff0c;每块肌肉都有一个张开的小孔&#xff0c;…

【靶场设计和渗透】

目录 一、前言 二、靶场设计 1、局域网 2、说明 三、渗透测试 1、信息收集 2、漏洞利用 四、后渗透利用 1、提权 2、权限维持 一、前言 为了深入贯彻学习网络安全法律法规&#xff0c;深入学习渗透测试知识&#xff0c;强化实战技能............ 编不出来了&#xff…