第二十六章 数论——欧拉函数(详解与证明)

news2024/12/26 23:05:27

第二十六章 数论——欧拉函数(详解与证明)

欧拉函数

1、互质

如果 g c d ( a , b ) = 1 gcd(a,b)=1 gcd(a,b)=1,则说明两个数互质。即如果两个数最大公约数是1,那么这两个数就是互质的。
比如14和15

14的约数:1,2,7,14
15的约数:1,3,5,15

二者的最大公约数是1,即 g c d ( 14 , 15 ) = 1 gcd(14,15)=1 gcd(14,15)=1,所以14和15互质。

2、欧拉函数的定义

对于一个数 n n n,从 1 1 1 n n n中,与 n n n互质的个数记作 Φ ( n ) \Phi (n) Φ(n),那么这个 Φ ( n ) \Phi (n) Φ(n)就i被称作欧拉函数。

比如:
Φ ( 6 ) = 2 \Phi (6)=2 Φ(6)=2

因为,

1,2,3,4,5,6中与6互质的是1和5。

3、欧拉函数的公式

根据算数基本定理,该合数可以写成有限个质数的乘积,即:

n = p 1 k ∗ p 2 m ∗ p 3 x . . . p n w n=p_1^k*p_2^m*p_3^x...p_n^w n=p1kp2mp3x...pnw

那么 Φ ( n ) = n ∗ ( p 1 − 1 p 1 ) ∗ ( p 2 − 1 p 2 ) ∗ . . . ∗ ( p n − 1 p n ) \Phi (n)=n*(\frac{p_1-1}{p_1})*(\frac{p_2-1}{p2})*...*(\frac{p_n-1}{p_n}) Φ(n)=n(p1p11)(p2p21)...(pnpn1)

这就是著名的欧拉函数。

我们可以验证一下:

6 = 2 ∗ 3 6=2*3 6=23

Φ ( 6 ) = 6 ∗ 2 − 1 2 ∗ 3 − 1 3 = 2 \Phi (6)=6*\frac{2-1}{2}*\frac{3-1}{3}=2 Φ(6)=6221331=2

特殊地,

如果一个数是质数,我假设这个质数是 p p p,质数的算数基本定理的表达式就是本身,所以

Φ ( p ) = p ∗ ( p − 1 p ) = p − 1 \Phi (p)=p*(\frac{p-1}{p})=p-1 Φ(p)=p(pp1)=p1

所以,如果一个数是质数,那么这个数 p p p:
Φ ( p ) = p − 1 \Phi (p)=p-1 Φ(p)=p1

那么这个函数怎么证明呢?

我们继续向下看:

4、欧拉函数的证明

请添加图片描述

请添加图片描述

5、欧拉函数的使用

(1)问题一:

在这里插入图片描述

思路

现在问题的关键其实就是质因数的分解,而质因数的分解,作者在前面的文章详细讲解过分解方式:

传送门:质因数的分解

代码

#include<iostream>
using namespace std;

long long phi(int a)
{
    long long ans=a;
    for(int i=2;i<=a/i;i++)
    {
        if(a%i==0)ans=ans*(i-1)/i;
        while(a%i==0)a/=i;
    }
    if(a>1)ans=ans*(a-1)/a;
    return ans;
}

int main()
{
    int n;
    cin>>n;
    for(int i=0;i<n;i++)
    {
        int a;
        scanf("%d",&a);
        cout<<phi(a)<<endl;
    }
	return 0;
}

(2)问题二:

在这里插入图片描述

思路

这道题的关键在于求出1到n之间的每个数字的欧拉函数之和,那么我们可以将1到n之间的数字分成三类:

c a s e 1 case1 case1

Φ ( 1 ) = 1 \Phi (1)=1 Φ(1)=1

c a s e 2 case2 case2

Φ ( 质数 ) = 质数 − 1 \Phi(质数)=质数-1 Φ(质数)=质数1

c a s e 3 case3 case3

合数的话,则需要分解质因数计算求解。
Φ ( n ) = n ∗ ( p 1 − 1 p 1 ) ∗ ( p 2 − 1 p 2 ) ∗ . . . ∗ ( p n − 1 p n ) \Phi (n)=n*(\frac{p_1-1}{p_1})*(\frac{p_2-1}{p2})*...*(\frac{p_n-1}{p_n}) Φ(n)=n(p1p11)(p2p21)...(pnpn1)

涉及到数的筛选问题:

我们可以联想到之前所学的两种筛法:埃氏筛法和欧拉筛法

不了解这两个筛法的同学建议先去看一下作者之前的讲解:

埃氏筛法和欧拉筛法

我们这里采用欧拉筛法

那么欧拉筛和欧拉函数怎么结合求呢?

首先我们根据欧拉函数公式:

Φ ( n ) = n ∗ ( p 1 − 1 p 1 ) ∗ ( p 2 − 1 p 2 ) ∗ . . . ∗ ( p n − 1 p n ) \Phi (n)=n*(\frac{p_1-1}{p_1})*(\frac{p_2-1}{p2})*...*(\frac{p_n-1}{p_n}) Φ(n)=n(p1p11)(p2p21)...(pnpn1)

可以知道,结果只和质数本身有关,和他的指数是无关的

另外,我们的欧拉筛是用来筛质数的,质数的欧拉函数也是很好求的,那么我们思考一下:

能否用质数的欧拉函数结果去求解合数的欧拉函数?

p r i m e s [ j ] primes[j] primes[j]是质数,所以我们的 Φ ( p r i m e s [ j ] ) = p r i m e s [ j ] − 1 \Phi(primes[j])=primes[j]-1 Φ(primes[j])=primes[j]1

我们欧拉筛的第二层循环中,我们存在这样一个判断 i   m o d   p r i m e s [ j ] 是否等于 0 i\ mod\ primes[j]是否等于0 i mod primes[j]是否等于0


第一种情况: i   m o d   p r i m e s [ j ] = = 0 第一种情况:i\ mod\ primes[j]==0 第一种情况:i mod primes[j]==0

这个判断说明, p r i m e s [ j ] primes[j] primes[j] i i i的一个质因数。

也就是说, Φ ( i ) \Phi(i) Φ(i)中存在一项 ( 1 − 1 p r i m e s [ j ] ) (1-\frac{1}{primes[j]}) (1primes[j]1)

而我们假设 k = i ∗ p r i m e s [ j ] k=i*primes[j] k=iprimes[j],那么 k k k的算数基本定理的表达式当中只是比 i i i的表达式中, p r i m e s [ j ] primes[j] primes[j]的这一项所对的指数加了1而已。

也就是说,

i ∗ p r i m e s [ j ] i*primes[j] iprimes[j] i i i所含的质因数种类是相同的

所以二者的欧拉函数中,后面的多项式乘积都是一样的,只是前面的系数 n n n不同,因此我们可以得到下面的结论。

Φ ( i ∗ p r i m e s [ j ] ) = p r i m e s [ j ] ∗ Φ ( i ) \Phi(i*primes[j])=primes[j]*\Phi(i) Φ(iprimes[j])=primes[j]Φ(i)


第二种情况: i   m o d   p r i m e s [ j ] ! = 0 第二种情况:i\ mod\ primes[j]!=0 第二种情况:i mod primes[j]!=0

因为, 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]却是 p r i m e s [ j ] ∗ i primes[j]*i primes[j]i的质因数。

此时就说明, p r i m e s [ j ] ∗ i primes[j]*i primes[j]i的算术基本定理的表达式中比 i i i的算数基本定理中多了一项 p r i m e s [ j ] primes[j] primes[j]

所以,此时 Φ ( i ∗ p r i m e s [ j ] ) \Phi(i*primes[j]) Φ(iprimes[j]) Φ ( i ) \Phi(i) Φ(i)不仅系数多了一个 p r i m e s [ j ] primes[j] primes[j],同时,由于前者的质因数多了一个,所以还多了一项 ( 1 − 1 p r i m e s [ j ] ) (1-\frac{1}{primes[j]}) (1primes[j]1)

所以:

Φ ( i ∗ p r i m e s [ j ] ) = p r i m e s [ j ] ∗ Φ ( i ) ∗ ( 1 − 1 p r i m e s [ j ] ) = ( p r i m e s [ j ] − 1 ) ∗ Φ ( i ) \Phi(i*primes[j])=primes[j]*\Phi(i)*(1-\frac{1}{primes[j]})=(primes[j]-1)*\Phi(i) Φ(iprimes[j])=primes[j]Φ(i)(1primes[j]1)=(primes[j]1)Φ(i)


所以根据上面三种情况,我们可以将其融合到我们的欧拉筛中。

代码

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

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

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

相关文章

2022/12/17 MySQL索引失效的底层原理

1 复合索引-最左前缀原理 where子句中使用最频繁的一列放在最左边&#xff1b;我们在&#xff08;a,b,c&#xff09;字段上建了一个联合索引&#xff0c;所以这个索引是先按a 再按b 再按c进行排列的&#xff0c;所以&#xff1a;以下的查询方式都可以用到索引 select * from …

emacs下安装eaf

emacs下安装eaf插件 原因 eaf插件一开始还有点排斥&#xff0c;觉得emacs终端下操作多好多流畅。想要浏览器&#xff0c;终端和pdf再快速切换就可以了&#xff0c;毕竟我用i3wm/yabai窗口管理器。 但是想到当初也是vim用的多学得多&#xff0c;emacs就不愿意去接触学习&#…

Linux系统下的压缩和解压指令

Linux系统下的压缩和解压指令 gzip/gunzip指令 gzip&#xff1a;用于压缩文件&#xff1b;gunzip&#xff1a;用于解压的 语法&#xff1a;gzip file 以及 gunzip file.gz (压缩文件&#xff0c;只能将文件压缩为*.gz文件) gzip /home/hello.txt: gzip压缩&#xff0c;将/home下…

Android设计模式详解之观察者模式

前言 观察者常用于订阅-发布系统&#xff0c;能够将观察者和被观察者进行解耦&#xff0c;降低两者之间的依赖&#xff1b; 定义&#xff1a;定义对象间一种一对多的依赖关系&#xff0c;使得每当一个对象改变状态时&#xff0c;则所有依赖于它的对象都会得到通知并被自动更新…

湖南人与江西人,关系有多密切?回顾四省填湘的历史

现在的湖南人&#xff0c;可能90%都是四省填湘的移民后代&#xff0c;这种说法可信吗&#xff1f;而湖南人又与江西人的关系有多密切呢&#xff1f;我们来回顾一下四省填湘的历史吧。 四省填湘的背景 在历史上&#xff0c;湖南属于广义上的荆楚之地&#xff0c;是春秋战国时…

图解深度学习-神经网络

深度学习 深度学习是一种统计学习方法&#xff0c;可以在大量数据中自动提取关键特征信息。 深度学习的分类 深度学习的起源有感知器和基于图模型的玻尔兹曼机。在这两个的基础上引入多层结构形成了现在的深度学习。 神经网络的历史 M-P模型和感知器模型 M-P模型是首个通过…

中断和中断系统

目录 中断的引入 中断的概念 中断源&#xff08;2018年&#xff09;背会 中断系统的功能 1&#xff1a;实现中断及返回 2&#xff1a;实现优先权排队&#xff08;中断判优&#xff09; 3&#xff1a;高级中断源能中断低级的中断处理 CPU对外部可屏蔽中断的响应以及中断过…

AtCoder Grand Contest 060 A - No Majority

比赛名称&#xff1a;AtCoder Grand Contest 060 比赛链接&#xff1a;AtCoder Grand Contest 060 A - No Majority 题意&#xff1a; 一个由小写英文字母组成的字符串x被认为是好的&#xff0c;当且仅当以下条件得到满足。 x的每一个长度为2或更大的&#xff08;连续的&am…

springmvc源码之DispatcherServlet前端控制器

系列文章目录 springmvc源码之Web上下文初始化 springmvc源码之DispatcherServlet前端控制器 文章目录系列文章目录DispatcherServlet前端控制器配置serlvet3.0扩展静态资源请求问题源码分析初始化配置刷新WebApplicationContextonRefresh介绍各个组件处理请求getHandlerha.ha…

与时代共命运:数智时代的到来意味着什么?

在数字经济时代背景下&#xff0c;各行各业都在全面推动新技术与商业的加速融合&#xff0c;全力驱动商业模式创新。 当下科技迅速发展&#xff0c;而数智化的发展体现的是社会与经济向新范式的根本转变。而这种转变为企业带来的是产业组织模式、现代基础设施体系、科技人才培…

Iceberg-Trino 如何解决链上数据面临的挑战

1.链上数据处理面临的挑战 区块链数据公司&#xff0c;在索引以及处理链上数据时&#xff0c;可能会面临一些挑战&#xff0c;包括&#xff1a; 海量数据。随着区块链上数据量的增加&#xff0c;数据索引将需要扩大规模以处理增加的负载并提供对数据的有效访问。因此&#xff…

应用层概述(计算机网络-应用层)

目录 网络应用 网络应用程序体系结构 客户/服务器体系结构 P2P对等体系结构 网络应用程序体系结构 应用层协议 网络应用 网络应用是计算机网络体系结构的最上层&#xff0c;是设计和建立计算机网络的最终目的&#xff0c;也是计算机网络中发展最快的部分 我们以一些经典的…

如何选择一个合适的Web存储方案

Web客户端存储是一个现代Web应用必不可少的功能&#xff0c;常见的有Cookie、WebStorage和IndexedDB等&#xff0c;如何选择一个合适的Web存储方案呢&#xff1f; 一. Cookie 1. 为什么要有Cookie? HTTP协议是无状态的&#xff0c;即一次请求和响应就是一次完整地HTTP通信&…

Oracle监听报错相关问题汇总

监听服务报错问题汇总&#xff1a; 1.Windows 2008系统下oracle 11g监听异常死机&#xff0c;无法连接 **C:\Users\administrator>lsnrctl status LSNRCTL for 64-bit Windows: Version 11.2.0.1.0 - Production on 16-9月 -2020 10:09:26 Copyright (c) 1991, 2010, Orac…

(十六).net学习之SOA-WebService

SOA-WebService一、SOA的思想&#xff0c;分布式服务1.SOA2.优势3.数据总线二、建立webservice1.关于webservice2.具体实现三、WCF多宿主协议1、自托管宿主2、windows service宿主3、IIS宿主4、WAS宿主一、SOA的思想&#xff0c;分布式服务 1.SOA SOA:面向服务架构&#xff0…

一个umi4的项目适配到FireFox60.7.1esr版本上的从头到尾

项目场景&#xff1a; 一个使用umi4创建的大屏项目&#xff0c;用户的浏览器使用的是火狐60.7.1的稳定版。然后就报错了&#xff01;&#xff01;&#xff01; 为什么不让用户换谷歌嘞&#xff0c;咱也不知道。那咱就搞兼容吧~~ 贴个浏览器的版本图片&#xff1a; 问题历程 …

【springboot】从解决@valid失效问题 到根据判断放行的更灵活替代方案 再到优雅的打日志

文章目录前言valid失效问题替代方案前言 valid 可以帮助我们节省很多代码 比较方便 但操作失误时 可能会失效 达不到我们预期效果&#xff1b; valid会有个问题 因为注解过于方便 反而会导致拦截后 错误日志的收集会比较麻烦 &#xff0c;以及在面对有时需要拦截 有时不需要拦截…

机器学习中的模型选择和评估

机器学习中的模型选择和评估1. 介绍2. 模型拟合效果2.1欠拟合与过拟合表现方式2.2 避免欠拟合与过拟合的方法3.实例分析3.1鸢尾花数据集3.2 对鸢尾花数据进行聚类1. 介绍 在机器学习系统中&#xff0c;如何训练出更好的模型、如何判断模型的效果&#xff0c;以及模型是否过拟合…

【内存对齐】一篇文章带你看懂内存对齐(万字详细介绍+代码样例)

目录 为什么需要内存对齐 性能 范围 原子性 结论 数据模型 C 的内存对齐 具名要求 平凡类 标准布局类 平凡类与标准布局类总结 标准布局类的内存对齐 普通的标准布局类 带有位域的标准布局类 手动指定对齐大小的标准布局类 非标准布局类的内存对齐 GLSLang 的…

分布式事务(3):AT模式实战-Seata

1 介绍 Seata&#xff08;Simple Extensible Autonomous Transaction Architecture&#xff0c;简单可扩展自治事务框架&#xff09;是 2019 年 1 月份蚂蚁金服和阿里巴巴共同开源的分布式事务解决方案。Seata 开源半年左右&#xff0c;目前已经有接近一万 star&#xff0c;社…