欧拉函数与筛法求欧拉函数

news2024/9/30 11:33:52

目录

  • 欧拉函数
    • 欧拉函数的定义
    • 欧拉函数的公式
    • 欧拉函数的公式推导
    • 欧拉定理
    • 典型例题
    • 代码实现
  • 筛法求欧拉函数
    • 思路分析
    • 经典例题
    • 代码实现


欧拉函数

欧拉函数的定义

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

例如:

  • φ ( 1 ) = 1 φ(1) = 1 φ(1)=1,因为 1 1 1 只与 1 1 1 互质。
  • φ ( 6 ) = 2 φ(6) = 2 φ(6)=2,因为与6互质的数有 1 1 1 和 $5,共 2 2 2 个。
  • φ ( 10 ) = 4 φ(10) = 4 φ(10)=4,因为与10互质的数有 1 、 3 、 7 1、3、7 137 9 9 9,共 4 4 4 个。

欧拉函数的公式

对于任意正整数 n n n φ ( n ) = n ∗ ( 1 − 1 P 1 ) ∗ ( 1 − 1 P 2 ) ∗ . . . ∗ ( 1 − 1 P k ) φ(n) = n * (1 - \frac{1}{P_1}) * (1 - \frac{1}{P_2}) * ... * (1 - \frac{1}{P_k}) φ(n)=n(1P11)(1P21)...(1Pk1),其中, P 1 , P 2 , . . . , P k P_1, P_2, ..., P_k P1,P2,...,Pk n n n 的不同的质因数。

欧拉函数公式,只与因子相关,与指数无关。

例如:
φ ( 10 ) = 10 ∗ ( 1 − 1 2 ) ∗ ( 1 − 1 5 ) = 4 φ(10) = 10 * (1 - \frac{1}{2}) * (1 - \frac{1}{5}) = 4 φ(10)=10(121)(151)=4
φ ( 15 ) = 15 ∗ ( 1 − 1 3 ) ∗ ( 1 − 1 5 ) = 8 φ(15) = 15 * (1 - \frac{1}{3}) * (1 - \frac{1}{5}) = 8 φ(15)=15(131)(151)=8


欧拉函数的公式推导

利用容斥原理的推导过程:

对数字N进行质因数分解,可得
N = P 1 r 1 ∗ P 2 r 2 ∗ P 3 r 3 ∗ . . . ∗ P k r k N=P_1^{r_1}*P_2^{r_2}*P_3^{r_3}*...*P_k^{r_k} N=P1r1P2r2P3r3...Pkrk

由于不能与 N N N 不互质,所以 1 1 1 ~ N N N 不可包含 P 1 , P 2 , . . . , P k P_1,P_2,...,P_k P1,P2,...,Pk 这些质因子。

P 1 , P 2 , . . . , P k P_1,P_2,...,P_k P1,P2,...,Pk 的倍数都减去,分别减去 N P 1 , N P 2 , . . . , N P k \frac{N}{P_1},\frac{N}{P_2},...,\frac{N}{P_k} P1N,P2N,...,PkN 个。

如图所示:
在这里插入图片描述

但是由于 P 1 , P 2 , . . . , P k P_1,P_2,...,P_k P1,P2,...,Pk 不同质因子的倍数可能会出现重复,有些数重叠的数会被多次减去。如图中重叠部分会被多次相减,因此要补上重叠的数。比如某个数,是 P 2 P_2 P2 的倍数,也是 P 3 P_3 P3 的倍数,就减了两回,还需要再加回来 P 2 ∗ P 3 P_2∗P_3 P2P3 的倍数,换做是其他的组合就是 N P 1 ∗ P 2 , N P 1 ∗ P P 3 , . . . , N P 1 ∗ P k , . . \frac{N}{P_1*P_2},\frac{N}{P_1*P_P3},...,\frac{N}{P_1*P_k},.. P1P2N,P1PP3N,...,P1PkN,..

但是更多质因子重叠的部分又会弥补至减去之前的状态,得继续减去。如 P 1 ∗ P 2 ∗ P 3 P_1*P_2*P_3 P1P2P3这样的更多质因子重叠的部分,而后就像之前一样一减一加最终推出结果。

φ ( N ) = N ∗ ( 1 − 1 P 1 ) ∗ ( 1 − 1 P 2 ) ∗ . . . ∗ ( 1 − 1 P k ) φ(N) = N * (1 - \frac{1}{P_1}) * (1 - \frac{1}{P_2}) * ... * (1 - \frac{1}{P_k}) φ(N)=N(1P11)(1P21)...(1Pk1)


欧拉定理

如果 a a a n n n 是正整数,且 a a a n n n 互质,则 a φ ( n ) ≡ 1 ( m o d    n ) a^{φ(n)} ≡ 1 (\mod n) aφ(n)1(modn)
如果 n n n 为质数,则 a n − 1 ≡ 1 ( m o d    n ) a^{n-1} ≡ 1 (\mod n) an11(modn)


典型例题

题目描述:
给定 n 个正整数 ai,请你求出每个数的欧拉函数。

输入格式:
第一行包含整数 n。

接下来 n 行,每行包含一个正整数 ai。

输出格式:
输出共 n 行,每行输出一个正整数 ai 的欧拉函数。

数据范围:
1 ≤ n ≤ 100 , 1 ≤ a i ≤ 2 × 1 0 9 1≤n≤100,1≤a_i≤2×10^9 1n100,1ai2×109

输入样例:

3
3
6
8

输出样例:

2
2
4

代码实现

res对不同的质数只需计算一次,不要将res的计算放到循环中。
res计算过程中要避免出现小数的情况,将除法提前与大数进行。

#define _CRT_NO_SECURE_WARNINGS
#include<iostream>

using namespace std;

int phi(int x)
{
	int res = x;
	for (int i = 2; i <= x / i; ++i)
	{
		if (x % i) continue;
		
		// res对不同的质数只需计算一次,不要将res的计算放到循环中
		res = res / i * (i - 1); // 注意避免出现小数情况

		while (x % i == 0) x /= i;
	}
	if (x > 1) res = res / x * (x - 1);
	return res;
}
int main()
{
	int n;
	cin >> n;
	while (n--)
	{
		int a;
		cin >> a;
		cout << phi(a) << endl;
	}
	return 0;
}

筛法求欧拉函数

思路分析

  • 如果这个数是质数,那么对质数 i i i 的欧拉函数值是 p h i [ i ] = i − 1 phi[i]=i−1 phi[i]=i1
  • 如果 i i i % p r i m e s [ j ] = = 0 primes[j] == 0 primes[j]==0,那么 p h i [ i ∗ p r i m e s [ j ] ] = p h i [ i ] × p r i m e s [ j ] phi[i*primes[j]]=phi[i]×primes[j] phi[iprimes[j]]=phi[i]×primes[j]。(相当于 i i i 中的质因子包括了 p r i m e s [ j ] primes[j] primes[j]
  • 如果 i i i % p r i m e s [ j ] primes[j] primes[j] ! = 0 != 0 !=0,那么 p h i [ i ∗ p r i m e s [ j ] ] = p h i [ i ] × ( p r i m e s [ j ] − 1 ) phi[i*primes[j]]=phi[i]×(primes[j] - 1) phi[iprimes[j]]=phi[i]×(primes[j]1)。(通过公式变形得来)

经典例题

题目描述:
给定一个正整数 n n n,求 1 1 1 ~ n n n 中每个数的欧拉函数之和。

输入格式:
共一行,包含一个整数 n n n

输出格式:
共一行,包含一个整数,表示 1 1 1 ~ n n n 中每个数的欧拉函数之和。

数据范围:
1 < n < 1 0 6 1<n<10^6 1<n<106

输入样例:

6

输出样例:

12

代码实现

#define _CRT_NO_SECURE_WARNINGS
#include<iostream>

using namespace std;

const int N = 1e6 + 10;
int phi[N], primes[N], cnt;
bool st[N];
void get_eulers(int n)
{
	for (int i = 2; i <= n; ++i)
	{
		phi[1] = 1;
		if (!st[i])
		{
			phi[i] = i - 1;
			primes[cnt++] = i;
		}
		for (int j = 0; primes[j] <= n / i; ++j)
		{
			st[primes[j] * i] = true;
			if (i % primes[j] == 0)
			{
				phi[primes[j] * i] = phi[i] * primes[j];
				break;
			}
			phi[primes[j] * i] = phi[i] * (primes[j] - 1);
		}
	}
}
int main()
{
	int n, res = 0;
	cin >> n;
	get_eulers(n);
	for (int i = 1; i <= n; ++i) res += phi[i];
	cout << res << endl;
	return 0;
}

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

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

相关文章

企业网盘解析:高效的企业文件共享工具

伴随着信息技术的发展&#xff0c;越来越多的企业选择了基于云存储的企业网盘来进行企业数据存储。那么企业网盘是什么意思呢&#xff1f; 企业网盘是什么意思&#xff1f; 企业网盘&#xff0c;又称企业云盘&#xff0c;顾名思义是为企业提供的网盘服务。除了服务对象不同外&…

【maven】构建项目前clean和不clean的区别

其实很简单&#xff0c;但是百度搜了一下&#xff0c;还是没人能简单说明白。 搬用之前做C项目时总结结论&#xff1a; 所以自己在IDE里一遍遍测试程序能否跑通的时候&#xff0c;不需要clean&#xff0c;因为反正还要改嘛。 但是这个项目测试好了&#xff0c;你要打成jar包给…

全面升级:华为鸿蒙HarmonyOS4正式发布,玩趣个性化,小艺AI升级

8月4日新闻&#xff0c;今天下午&#xff0c;华为正式发布了最新版本的鸿蒙操作系统——HarmonyOS 4&#xff01; 在华为发布会上&#xff0c;鸿蒙HarmonyOS迎来了一系列令人激动的功能升级。其中包括个性化空间、多种生产力工具以及增强的手机AI助手"小艺"。这次更…

Docker入门及安装

文章目录 1.Docker概述:1.什么是docker2.为什么使用docker3.docker优点4.docker资源网址 2.Docker安装1.卸载旧版本dorcker(非必要)2.设置Docker仓库安装docker引擎4.启动验证docker卸载docker 3.Docker底层原理1.docker的结构和基本概念2.docker为什么比虚拟机快 1.Docker概述…

【新版系统架构补充】-传输介质、子网划分

传输介质 双绞线&#xff1a;无屏蔽双绞线UTP和屏蔽双绞线STP&#xff0c;传输距离在100m内 网线安装标准&#xff1a; 光纤&#xff1a;由纤芯和包层组成&#xff0c;分多模光纤MMF、单模光纤SMF 无线信道&#xff1a;分为无线电波和红外光波 通信方式和交换方式 单工…

简单易懂的生鲜蔬果小程序开发指南

随着人们对健康意识的提高&#xff0c;越来越多的人开始注重饮食健康&#xff0c;选择新鲜的果蔬产品。为了满足市场需求&#xff0c;制作一个果蔬配送小程序成为了一个不错的选择。本文将详细介绍如何快速制作一个果蔬配送小程序。 第一步&#xff1a;登录乔拓云网后台&#x…

InterProcessMutex 类的作用和使用

InterProcessMutex 类是Curator框架中的一个分布式锁的实现&#xff0c;用于在分布式环境下实现互斥锁。 InterProcessMutex 的使用步骤如下&#xff1a; 创建 CuratorFramework 客户端实例&#xff0c;并启动客户端连接到 ZooKeeper 服务器。使用 CuratorFramework 的 creat…

leetcode37. 解数独(java)

解数独 解数独题目描述回溯算法代码演示 回溯算法 解数独 难度 困难 leetcode37. 解数独 题目描述 编写一个程序&#xff0c;通过填充空格来解决数独问题。 数独的解法需 遵循如下规则&#xff1a; 1.数字 1-9 在每一行只能出现一次。 2.数字 1-9 在每一列只能出现一次。 3.数字…

2020-2023中国高等级自动驾驶产业发展趋势研究

1.1 概念界定 2020-2023中国高等级自动驾驶产业发展趋势研究Trends in China High-level Autonomous Driving from 2020 to 2023自动驾驶发展过程中&#xff0c;中国出现了诸多专注于研发L3级以上自动驾驶的公司&#xff0c;其在业界地位也越来越重要。本报告围绕“高等级自动…

如何搭建自动化测试框架?资深测试整理的PO模式,一套打通自动化...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 Po模型介绍 1、简…

MCU的类型和应用领域简介

MCU&#xff08;Microcontroller Unit&#xff09;根据存储器类型可分为无片内ROM型和带片内ROM型。无片内ROM型的芯片需要外接EPROM才能应用&#xff0c;而带片内ROM型则有不同的子类型&#xff0c;如片内EPROM型、MASK片内掩模ROM型和片内Flash型。 MCU还可以按照用途分为通…

JavaSE程序逻辑控制(三种基本结构(顺序、分支、循环)、输入输出、循环输入)

目录 一、顺序结构 二、分支结构 1、 if 语句 2、switch 语句 与C语言不同&#xff0c;不能作为switch参数的类型&#xff1a;float double long boolean 三、循环结构 1.while循环 2.for循环 四、输入输出 1.输出 - 将结果显示打印到屏幕上 2.输入 3.输入输出综合…

Java的方法怎么用?递归是什么?一篇文章带你醍醐灌顶

目录 1.方法定义 2.实参 形参 3.方法重载 4.递归 1.方法定义 // 方法定义 修饰符 返回值类型 方法名称([参数类型 形参 ...]){ 方法体代码; [return 返回值]; }public static 返回值 方法名(形式参数列表){} 实现一个函数&#xff0c;检测一个年份是否为闰年 public class M…

从零开始yolov5模型训练【绝对能学会】

与其说是学习目标检测任务&#xff0c;不如暂时说成是如何正确运行一个yolo小项目。 一、anaconda 安装&#xff1a; Anaconda安装以及如何创建新环境 安装好了之后打开Anaconda Prompt&#xff1a; anaconda的base环境下&#xff1a; 针对yolov5创建一个自己的环境&#xff…

Spring指定bean在哪个应用加载

1.背景 某项目,spring架构,有2个不同的WebAppApplication入口,大部分service类共用,小部分类有区别,只需要在一个应用中加载,不需要在另一个应用中加载. 2.实现代码 自定义限制注解 package mis.shared.annotation;import java.lang.annotation.ElementType; import java.lan…

【深度学习_TensorFlow】手写数字识别

写在前面 到这里为止&#xff0c;我们已经学习完张量的常用操作方法&#xff0c;已具备实现大部分神经网络技术的基础储备了。这一章节我们将开启神经网络的学习&#xff0c;然而并不需要像学习前面那样了解大量的张量操作&#xff0c;而是将重点转向理解概念知识&#xff0c;…

SQL92 SQL99 语法 Oracle 、SQL Server 、MySQL 多表连接、Natural 、USING

SQL92 VS SQL 99 语法 92语法 内连接 from table1&#xff0c; table2 where table1.col table2.col 外连接 放在 从表 左连接&#xff1a; from table1&#xff0c; table2 where table1.col table2.col() 右连接&#xff1a; from table1&#xff0c; table2 where table…

全网最全最细的jmeter接口测试教程以及接口测试流程详解

一、Jmeter简介 Jmeter是由Apache公司开发的一个纯Java的开源项目&#xff0c;即可以用于做接口测试也可以用于做性能测试。 Jmeter具备高移植性&#xff0c;可以实现跨平台运行。 Jmeter可以实现分布式负载。 Jmeter采用多线程&#xff0c;允许通过多个线程并发取样或通过…

UE4查看加密PAK里边的资源Android/iOS/PC方法

我们经常会需要把1个模型进行减面然后在移动端使用,有时候会出现移动端模型和PC端模型不一致的问题,这时候就需要将移动端的模型和PC端的模型进行对比,找到问题出现的原因,检查Mesh、Normal、UV0、UV1、MaterialId、碰撞等是否一致。 如何打包Pak文件,见这篇文章:UE4打包…

visio过段时间失效了再次破解

坑&#xff1a;一定要 右键在这个bat上面以管理员身份运行&#xff0c;不要直接运行否则会失败&#xff1b; 还有编码&#xff0c;ANSI编码&#xff01;&#xff01;&#xff01; 如图 参考&#xff1a;