选自《洛谷深入浅出进阶篇》——欧拉函数+欧拉定理+扩展欧拉定理

news2024/11/17 15:56:15

欧拉函数:

  1. 欧拉函数定义:\psi \left ( n \right ) = 1~n中与n互质的数的个数。 比如 \psi \left ( 12 \right ) = 4    
  2. 欧拉函数是积性函数:(也就是)当 n与m互质的时候: \psi \left ( nm \right ) = \psi \left (n \right ) \psi \left(m \right )
  3. 由算术基本定理,我们可以设n=\prod_{i=1}^{m} p_{i}^{k_{i}},那么我们只要计算出\psi \left(p_{i}^{k_{i}} \right )的取值就能求出\psi \left(n \right )的取值。 下面给出证明

\psi \left(p_{i}^{k_{i}} \right )的取值怎么求? 也就是求1~p_{i}^{k_{i}}中与p_{i}^{k_{i}}互质的数的个数

我们可以求与p_{i}^{k_{i}}不互质的数的个数,由于p是质数,所以与p_{i}^{k_{i}}不互质的数一定是p的倍数

那么1~p_{i}^{k_{i}}中,p的倍数就是 \frac{p_{i}^{k_{i}}}{p}=p_{i}^{k_{i}-1}, 那么我们就知道与p_{i}^{k_{i}}不互质的数的个数 就是p_{i}^{k_{i}}-p_{i}^{k_{i}-1 }。也就是 p_{i}^{k_{i}}\left(1-\frac{1}{p} \right )

由于p_{i}^{k_{i}}之间互质,且欧拉函数是一个积性函数,那么有

\psi \left(n\right) = \prod_{i=1}^{m} \psi \left( p_{i}^{k_{i}} \right ) =\left(\prod_{i=1}^{m} p_{i}^{k_{i}} \right)\cdot \left(\prod_{i}^{m}\left(1-\frac{1}{p}\right)\right)=n\cdot \prod_{i}^{m}\left(1-\frac{1}{p} \right)

所以我们只需要求出n的所有质因子p,然后求出 1-\frac{1}{p} 的乘积即可 

phi = n;
for(int i=2 ; i*i<=n ; i++ )
    if( n%i == 0 ){
    phi = phi/i * (i-1 )   // 1- 1/p == (p-1)/p 为了防止爆int,故意不写成phi*(i-1)/i
    while ( n%i==0 ) n/=i ;
   }
if(n!=1) phi =phi/n *(n-1);  //防止n有一个大于 sqrt(n)的质因子的情况

以上就是试除法求欧拉函数的板子,请牢牢记住,后面回经常用到。

下面介绍筛法求欧拉函数,可以以O(n)的时间来求2~n的欧拉函数。

const int N = 1e6 + 7;
int pri[N], phi[N], flag[N];
int tot;
int main() {
    phi[1]=1;
	for (int i = 2; i <= N; i++) {
		if (flag[i] == 0) {
			pri[tot++] = i;
			phi[i] = i - 1;
		}
		for (int j = 0; j < tot and pri[j] * i <= N; j++) {
			if (i % pri[j] == 0) {
				phi[i * pri[j]] = pri[j] * phi[i];
				flag[i * pri[j]] = 1;
				break;
			}
			else {
				flag[i * pri[j]] = 1;
				phi[i * pri[j]] = (pri[j] - 1) * pri[i];
			}
		}
	}
}

下面逐步分析这个板子:

首先我们需要写出一个线性筛的板子,然后根据欧拉函数的定义填充即可:

if (flag[i] == 0) {
			pri[tot++] = i;
			phi[i] = i - 1;
		}

这里很简单,当i是质数的时候,我们将i假如质数表,并且写上i的欧拉函数为i-1,phi[i]=i-1

for (int j = 0; j < tot and pri[j] * i <= N; j++) {
			if (i % pri[j] == 0) {
				phi[i * pri[j]] = pri[j] * phi[i];
				flag[i * pri[j]] = 1;
				break;
			}
			else {
				flag[i * pri[j]] = 1;
				phi[i * pri[j]] = (pri[j] - 1) * pri[i];
			}
		}

这里依旧是欧拉筛的板子,对于任意一个合数,例如 i*pri【j】,

如果i和pri【j】互质的话,其欧拉函数为: phi【i*pri【j】】=phi【pri【j】】 * phi【i】;

但是如果i和pri【j】不互质的话,我们就用上面写的表达式:

\psi \left(n\right) = \prod_{i=1}^{m} \psi \left( p_{i}^{k_{i}} \right ) =\left(\prod_{i=1}^{m} p_{i}^{k_{i}} \right)\cdot \left(\prod_{i}^{m}\left(1-\frac{1}{p}\right)\right)=n\cdot \prod_{i}^{m}\left(1-\frac{1}{p} \right)

带入i*pri[j]可得:

\psi\left(i*pri[j] \right )=i*pri[j]\prod_{i=1}^{n}\left( 1-\frac{1}{p}\right)=pri[j]*\psi(i)

至此,筛法求欧拉函数就结束了

欧拉定理:对于正整数a,n,若a\perpn,则a^{\psi\left(n\right)}\equiv 1 \left(mod \ n \right )

扩展欧拉定理:

对于正整数a,n,始终有 a^{\psi \left(n \right )}\equiv a^{k\psi \left(n \right )}\left(mod\ n \right ),k\epsilon N_{+}

那么对于任意的正整数a,k,n ,当k大于 \psi\left(n \right )时,

a^{k} \equiv a^{k\ mod \ \psi\left(n \right )+\psi\left(n \right )}\left(mod\ n \right )

对于这些定理,此处不加以证明,背过即可。

下面给出一些例题,用来了解一些欧拉函数在算法竞赛中的应用

(缓慢更新中)

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

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

相关文章

【后端学前端学习记录】学习计划

1、个人背景 写了足够久的后端了&#xff0c;常用的语言基本上都接触过&#xff0c;没有在工作中写过前端 一直想做一些前端的工作&#xff0c;但是前端技能不足加上自己审美不行&#xff0c;写出的界面总是很丑 所以一直对前端做不好&#xff0c;也没有真正下手。 2、动机 种…

C# Solidworks二次开发:选择管理器相关的API介绍

今天在讲述主要内容之前&#xff0c;先说一个不太相关的问题。 我之前在其他文章中看到有一些朋友在问为什么获取到的点位数据需要乘以1000进行单位转换&#xff0c;其实原因是这样的&#xff0c;在所有使用的API中如果没有特殊说明&#xff0c;所有的长度单位都是米&#xff…

Langchain-Chatchat大语言模型本地知识库的踩坑、部署、使用

Langchain-Chatchat的部署 Langchain-Chatchat概述实现原理 开发环境准备软件要求硬件要求 部署拉取仓库创建虚拟环境安装全部依赖初始化配置文件初始化知识库模型下载启动项目启动API服务启动Web UI服务使用对话功能知识库管理文件对话搜索引擎问答 异常集合异常1异常2异常3 L…

Linux——web网站服务(一)

一、安装httpd服务器Apache网站服务 1、准备工作 为了避免发送端口冲突&#xff0c;程序冲突等现象&#xff0c;卸载使用rpm方式安装的httpd #使用命令检查是否下载了httpd [rootserver ~]# rpm -qa httpd #如果有则使用 [rootserver ~]# rpm -e httpd --nodeps Apache的配置…

AGI 时代,小红书邀您一起复盘年度 100 件值得学习的好案例

2023 年&#xff0c;由 ChatGPT 引爆新一轮人工智能热潮&#xff0c;开启了由大模型驱动的 AGI 时代。随着 AIGC 的快速崛起&#xff0c;传统的研发模式是否会被 AI 颠覆也成为了巨大的未知数。面对不同规模团队与不同业务场景&#xff0c;企业想要找到可靠、可行、可落地的转型…

temu日本站在哪里入驻

在跨境电商领域中&#xff0c;Temu是拼多多推出的一款备受瞩目的平台。如今&#xff0c;越来越多的商家希望将自己的业务扩展到日本市场&#xff0c;而在Temu日本站上入驻就成为了一个不可忽视的机遇。本文将为您介绍如何在Temu日本站上入驻&#xff0c;并提供一些有用的技巧和…

Swing程序设计(9)复选框,下拉框

文章目录 前言一、复选框二、下拉框总结 前言 该篇文章简单介绍了Java中Swing组件里的复选框组件、列表框组件、下拉框组件&#xff0c;这些在系统中都是常用的组件。 一、复选框 复选框&#xff08;JCheckBox&#xff09;在Swing组件中的使用也非常广泛&#xff0c;一个方形方…

【MATLAB源码-第98期】基于matlab的能量谷优化算法(EVO)无人机三维路径规划,输出做短路径图和适应度曲线。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 能量谷优化算法&#xff08;Energy Valley Optimization, EVO&#xff09;是一种启发式优化算法&#xff0c;灵感来源于物理学中的“能量谷”概念。它试图模拟能量在不同能量谷中的转移过程&#xff0c;以寻找最优解。 在EVO…

Spring boot各种Date时间相差8小时出现的问题及其解决方法!

数据库中存的是2019-07-22 22:00:00 但是页面展示2019-07-22 14:00:00 查看数据时区是08:00导致的,数据库是Oracle&#xff0c;生成数据库没办法改时区 一&#xff1a;Spring boot ResponseBody转换JSON 时 Date 时间相差8小时 一描述&#xff1a;当使用jackson时&#xff0c;…

什么是JVM的内存模型?详细阐述Java中局部变量、常量、类名等信息在JVM中的存储位置

导航&#xff1a; 【Java笔记踩坑汇总】Java基础JavaWebSSMSpringBootSpringCloud瑞吉外卖/黑马旅游/谷粒商城/学成在线设计模式面试题汇总性能调优/架构设计源码-CSDN博客 目录 一、JVM基本介绍 二、JVM内存模型 2.0 概述 2.1 类加载子系统 2.2 运行时数据区 2.2.0 基本…

使用静态HTTP提供动态内容

在Web开发中&#xff0c;静态HTTP和动态HTTP常被视作两种截然不同的技术。静态HTTP主要用于传输不变的内容&#xff0c;如HTML、CSS和JavaScript文件&#xff0c;而动态HTTP则能处理用户交互、实时数据等动态需求。但鲜为人知的是&#xff0c;我们其实可以通过一些技巧&#xf…

Python Appium Selenium 查杀进程的实用方法

一、前置说明 在自动化过程中&#xff0c;经常需要在命令行中执行一些操作&#xff0c;比如启动应用、查杀应用等&#xff0c;因此可以封装成一个CommandExecutor来专门处理这些事情。 二、操作步骤 # cmd_util.pyimport logging import os import platform import shutil i…

软件测试--selenium安装使用

安装selenium不少人使用pip命令来安装selenium&#xff0c;辛辛苦苦安装完之后&#xff0c;还是不能使用。所以我们可以是直接使用编译器&#xff0c;pycharm直接安装selenium扩展包。 file中点击settings 在Settings中点击Project Interpreter,点击加号就可以安装各种需要的扩…

SpringBoot 项目将jar 部署在服务器引用外部 配置文件

SpringBoot 官方给出了四种方式引用外部配置文件的方式 在jar包的同一目录下建一个config文件夹&#xff0c;然后把配置文件放到这个文件夹下(最常用)直接把配置文件放到jar包的同级目录在classpath下建一个config文件夹&#xff0c;然后把配置文件放进去在classpath下直接放配…

AI智能降重软件大全,免费最新AI智能降重软件

在当今信息爆炸的时代&#xff0c;内容创作者们面临着巨大的写作压力&#xff0c;如何在保持高质量的前提下提高效率成为摆在许多人面前的难题。AI智能降重软件因其独特的算法和功能逐渐成为提升文案质量的得力助手。本文将专心分享一些优秀的AI智能降重软件。 147SEO改写软件 …

unity 2d 入门 飞翔小鸟 柱子移动(十一)

c#脚本 using System.Collections; using System.Collections.Generic; using UnityEngine;public class PoleMove : MonoBehaviour {//移动上限制public float up;//移动下限public float below;//速度private float speed;// Start is called before the first frame update…

中断分类、中断过程、向量中断

中断过程&#xff1a; &#xff08;1&#xff09;中断请求 中断源以硬件信号形式通过中断控制线路向CPU提出中断请求。 中断源&#xff1a;引起中断事件的原因。 中断源可以是外部的硬件设备&#xff0c;如键盘、打印机等输入/输出设备和各种控制设备&#xff1b;也可以是软件…

C/C++ 实现动态资源文件释放

当我们开发Windows应用程序时&#xff0c;通常会涉及到使用资源&#xff08;Resource&#xff09;的情况。资源可以包括图标、位图、字符串等&#xff0c;它们以二进制形式嵌入到可执行文件中。在某些情况下&#xff0c;我们可能需要从可执行文件中提取自定义资源并保存为独立的…

CV计算机视觉每日开源代码Paper with code速览-2023.12.4

点击CV计算机视觉&#xff0c;关注更多CV干货 论文已打包&#xff0c;点击进入—>下载界面 点击加入—>CV计算机视觉交流群 1.【目标检测】TIDE: Test Time Few Shot Object Detection 论文地址&#xff1a;https://arxiv.org//pdf/2311.18358 开源代码&#xff1a;G…

《Spring Cloud Alibaba 从入门到实战》理论知识篇

基础知识篇 理论篇 俗话说&#xff0c;没有最好的架构&#xff0c;只有最合适的架构。 微服务架构也是随着信息产业的发展而出现的最有普遍适用性的一套架构模式。 通常来说&#xff0c;我们认为架构发展历史经历了这样一个过程&#xff1a;单体架构 -> SOA 面向服务架构 …