Euler:欧拉函数&素数筛

一、欧拉函数

欧拉函数是小于x的整数中与x互质的数的个数,一般用φ(x)表示。

通式:
 
其中p1, p2……pn为x的所有质因数,x是不为0的整数。
  • 比如x=12,拆成质因数为12=2*2*3,
  • 12以内有1/2的数是2的倍数,那么有1-1/2的数不是2的倍数(1,3,5,7,9,11),
  • 这6个数里又有1/3的数是3的倍数,
  • 只剩下(1 - 1/2 - 1/3)的数既不是2的倍数,也不是3的倍数(1,5,7,11)。
  • 这样剩下的12*(1 - 1/2 - 1/3)=4,即4个数与12互质,所以φ(12)=4。

证明:对于正整数x,

  • 如果x=1,则 φ(1) = 1。
    • 1与任何数(包括自身)都构成互质关系。
  • 如果x是质数,则 φ(x)=x-1 。
    • 质数与小于它的每一个数,都构成互质关系。比如5与1、2、3、4都构成互质关系。
  • 如果n只有一个质因数p,即x = p^k(p为质数,k>=1),则φ(pk)=pk(1-1/p)=pk-pk-1 。
    • 从1~x中,p的倍数共有x/p个,共占了1/p,则减去这些数后,还剩下x*(1-1/p)个。
    • 可以看出,上一种情况是 k=1 时的特例。
  • 如果n可以分解成两个互质的整数之积,即n = p1 * p2,φ(x) = φ(p* p2) = φ(p1) * φ(p2)。
    • φ(a)=m,φ(b)=n,φ(a*b) = a(1-p1)(1-p2)...*b(1-q1)(1-q2)... = m*n
    • 欧拉函数是积性函数(若当m与n互质时,f(m∗n)=f(m)∗f(n) f(m*n)=f(m)*f(n)f(m∗n)=f(m)∗f(n),那么f是积性函数。)
  • 任意一个大于1的正整数,都可以写成一系列质数的积。
  • 可以得到,φ(x) = φ(p1)*φ(p2)*...*φ(pn) = x(1-1/p1)*(1-1/p2)*...*(1-1/pn).

一些(目前不需要的)性质:

  • 当n>2时,φ(n)是偶数。
  • 小于n的数中,与n互质的数的总和为:φ(n) * n / 2 (n>1)。
  • n的因数(包括1和它自己)的欧拉函数之和等于n。
  • 若n为奇数时,φ(2n)=φ(n)。
  • 对于任何两个互质的正整数a,n(n>2)有:aφ(n)1(mod n)此公式即 欧拉定理。
  • 当n=p 且 a与素数p互质(即:gcd(a,p)=1)则上式有: an-11(mod n)公式即 费马小定理。


求欧拉函数:

1.埃拉托斯特尼筛

求1~n所有数的欧拉函数:每次找到一个质数,就把它的倍数更新掉。复杂度大概是O(nlognlogn)。

void euler(int n) {for (int i=1; i<=n; i++) phi[i]=i;for (int i=2; i<=n; i++)if (phi[i]==i)//i是质数for(int j=i; j<=n; j+=i)phi[j]=phi[j]/i*(i-1);
}

 

2.欧拉筛

求n的欧拉函数:每次找到一个最小的因数(一定为质因数),求出x*(1 - 1/p)。复杂度为O(n)。

 

int euler(int n) {int res=n,a=n;for(int i=2; i*i<=a; i++) {if(a%i==0) {res=res/i*(i-1);while(a%i==0) a/=i;}}if(a>1) res=res/a*(a-1); //有质数剩余 return res;
}

 

对于x = p1k1 * p2k2...,只需要求一次(1-p1)(1-p2)...就可以了,

为了保证每个质因数只被使用一次,通过以上的while循环把x中的p1除尽。

 

二、素数筛法

这里直接上欧拉算法了。关于埃氏和其他算法

int Prime(int N) {for(i=2; i<=N; i++) {if(!check[i])prime[cnt++]=i;for(j=0; j<cnt && prime[j]*i<=N; j++) { check[prime[j]*i]=1;if(i%prime[j]==0)break;}}
}

 每次遇到未标记的素数就记录,然后用当前的素数或合数与记录下的素数表依次相乘。

蓝色的这一句,保证了每个合数只被筛去一次(如下表),也是欧拉筛法优化的核心思想。

   例如12 = 4*3 = 6*2,

  将它拆分成 (2*2)*3 和 (2*3)*2,

  因为素数之积显然不是素数,所以在继续筛的过程中一定会遇到2*3,

  说明4=2*2所筛掉的合数2*2*prime[i](除了prime[0]=2本身),一定会在以后重复算一次。

  那么先保留2的一列,3只要遇到2的倍数一定可以在2的一列出现,5只要遇到2、3的倍数一定可以在前两列出现...

 

 

更新于19/2/11

在浙江集训刚好学了这个qwq其实这个线性筛素数是这样的,

因为当前枚举的合数是i*pj,且pj|i(即i%pj=0),那么下一个枚举的是i*pj+1,

因为i已经是pj的倍数了,那么i*任何正整数一定也是pj的倍数,

说明i*pj+1在后面一定会被更小的素数(pj)筛去。

 

转载于:https://www.cnblogs.com/mogeko/p/10134838.html

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

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

相关文章

大小端字节序

想起以前在汇编语言和数字逻辑的时候也有接触到一些这个概念&#xff0c;已经有点模糊了&#xff0c;搞不清楚哪个是低位在前哪个是高位在前。后来在Wiki和Google的帮助下也算摸清楚了一些Endianness的概念。 一、字节序的起源 在计算机中&#xff0c;字节序&#xff08;Endian…

docker 部署nginx 使用keepalived 部署高可用

一&#xff0e;体系架构 在Keepalived Nginx高可用负载均衡架构中&#xff0c;keepalived负责实现High-availability (HA) 功能控制前端机VIP&#xff08;虚拟网络地址&#xff09;&#xff0c;当有设备发生故障时&#xff0c;热备服务器可以瞬间将VIP自动切换过来&#xff0c…

虚拟字符设备驱动开发步骤

目录前言字符设备驱动简介内核驱动操作函数集合(file_operations结构体)字符设备驱动开发步骤.ko驱动模块的加载和卸载(module_init驱动入口、insmod驱动加载)字符设备注册与注销到内核register_chrdev(设备号、设备名) -- 很少用了实现设备的具体操作函数添加LICENSE 和作者信…

设计模式20——Mediator设计模式

2019独角兽企业重金招聘Python工程师标准>>> Mediator中介者设计模式是通过一个中介对象封装一系列关于对象交互行为. Mediator中介者设计模式中的角色如下&#xff1a; (1).中介者&#xff08;Mediator&#xff09;&#xff1a;抽象定义了“同事”&#xff08;co…

Linux LED驱动开发实验(直接操作寄存器 -- 实际开发很少这样做)

目录Linux 下LED 灯驱动原理地址映射(ioremap映射、iounmap释放)I/O 内存访问函数硬件原理图分析实验程序编写LED 灯驱动程序编写APP测试程序编写运行测试编译驱动程序和测试APP拷贝led.ko 和ledApp到指定目录加载led.ko 驱动模块到内核创建应用层“/dev/led”设备节点运行测试…

Strange Words 4

2019独角兽企业重金招聘Python工程师标准>>> abnormality 英[ˌbnɔːmləti] 美[ˌbnɔːrmləti] n.变态&#xff1b;反常&#xff1b;异常&#xff1b;畸形 tenor 英 [tenə(r)]  美 [tenər] n.大意&#xff1b;要旨&#xff1b;常规&#xff1b;男高音&…

新字符设备驱动实验(自动分配设备号、自动创建应用层设备节点、新字符设备注册到内核的结构体)

目录自动分配和释放设备号示例代码新的字符设备注册到内核方法字符设备结构体(前面的设备号也放进来)cdev_init结构体初始化函数cdev_add 添加到linux内核cdev_del内核注销函数自动创建应用层设备节点mdev 机制创建和删除类创建删除设备(生成/dev/xxx设备)参考示例(先删除设备再…

$Django importlib与dir知识,手写配置文件, 配置查找顺序 drf分页器drf版本控制

1 importlib与dir知识 # importlib简介动态导入字符串模块 # 常规导入 from ss.aa import b from ss import a print(b,type(b)) #<module ss.aa.b from F:\\python37\\pythonfiles\\ss\\aa\\b.py> #<class module># importlib动态导入py文件模块 import importli…

springMVC_07乱码及restful风格

乱码的解决 通过过滤器解决乱码问题:CharacterEncodingFilter 配置web.xml文件 <filter><filter-name>encoding</filter-name><filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class><init-param><para…

[转】HTTP请求流程(二)----Telnet模拟HTTP请求

转自&#xff1a; http://www.cnblogs.com/stg609/archive/2008/07/06/1237000.html 上一部分"流程简介"&#xff0c; 我们大致了解了下HTTP请求的流程&#xff0c;这一篇我向大家介绍下如何利用Telnet来模拟Http请求---访问百度。 我们直接开始吧&#xff01; …

设备树下的LED驱动实验

目录设备树LED驱动原理硬件原理图分析实验程序编写修改设备树文件(根节点下添加好区分)LED灯驱动程序编写编写测试APP运行测试编译驱动程序和测试APP运行测试上一章我们详细的讲解了设备树语法以及在驱动开发中常用的OF 函数&#xff0c;本章我们就开始第一个基于设备树的Linux…

《现代操作系统》精读与思考笔记 第七章 多媒体

第七章部分内容与前几章内容关联很大&#xff0c;比如进程调度、磁盘调度、文件系统&#xff0c;而且多为实现细节&#xff0c;这里不详述。 1.帧数与闪烁&#xff08;P476&#xff09; 画面动作的平滑性不是完全由每秒的帧数决定的&#xff0c;而是由每秒不同画面的数目决定的…

pinctrl和gpio子系统实验(芯片原厂做的,类似STM32的HAL库,我们只需调用API来直接操作GPIO)

目录pinctrl子系统pinctrl子系统简介(半导体厂商写的)I.MX6ULL的pinctrl子系统驱动分析0、通过compatbile属性查找对应驱动文件1、PIN配置信息详解(获取寄存器地址)2、PIN 驱动程序流程讲解(流程图&#xff0c;了解)设备树中添加pinctrl节点模板(半导体厂商瑞芯微、海思厂商写的…

成为你自己

2019独角兽企业重金招聘Python工程师标准>>> 一个看过许多国家、民族以及世界许多地方的旅行家&#xff0c;若有人问他&#xff0c;他在各处发现人们具有什么相同的特征&#xff0c;他或许会回答∶他们有懒惰的倾向。有些人会觉得&#xff0c;如 果他说他们全是怯懦…

网络知识梳理--OSI七层网络与TCP/IP五层网络架构及二层/三层网络

作为一个合格的运维人员&#xff0c;一定要熟悉掌握OSI七层网络和TCP/IP五层网络结构知识。 废话不多说&#xff01;下面就逐一展开对这两个网络架构知识的说明&#xff1a;一、OSI七层网络协议OSI是Open System Interconnect的缩写&#xff0c;意为开放式系统互联。 OSI参考模…

Linux蜂鸣器实验(使用上一节子系统思想,摈弃了自己配置寄存器的繁琐操作)

目录子系统思想的蜂鸣器驱动流程硬件原理图分析实验程序编写修改设备树文件蜂鸣器驱动程序编写编写测试APP运行测试编译驱动程序和测试APP运行测试上一章实验中我们借助pinctrl 和gpio 子系统编写了LED 灯驱动&#xff0c;I.MX6U-ALPHA 开发板上还有一个蜂鸣器&#xff0c;从软…

gitbash如何修改可恶的蓝色字体

1、问题 这完全看不清啊&#xff01;&#xff01; 2、环境 git version 2.19.0 3、解决 1&#xff09;编辑/etc/bash.bashrc # Uncomment to use the terminal colours set in DIR_COLORS eval "$(dircolors -b /etc/DIR_COLORS)" 2&#xff09;编辑/etc/DIR…

Oracle分析函数

2019独角兽企业重金招聘Python工程师标准>>> Oracle分析函数——函数列表 SUM &#xff1a;该函数计算组中表达式的累积和 MIN &#xff1a;在一个组中的数据窗口中查找表达式的最小值 MAX &#xff1a;在一个组中的数据窗口中查找表达式的…

Linux并发与竞争介绍(原子操作、自旋锁、信号量、互斥体)

目录并发与竞争并发与竞争简介保护内容是什么原子操作原子操作简介原子整形操作API函数(atomic_t 结构体)原子位操作API 函数自旋锁自旋锁简介自旋锁API函数线程与线程线程与中断(获取锁之前关闭中断)其他类型的锁(读写锁、顺序锁)自旋锁使用注意事项信号量信号量简介信号量API…

新后缀再开放,投资者应谨慎对待!

为什么80%的码农都做不了架构师&#xff1f;>>> 新后缀再开放&#xff0c;投资者应谨慎对待&#xff01;2014年伊始&#xff0c;一大批如BIKE&#xff0c;GURU&#xff0c;HOLDINGS等新域名后缀正式启用&#xff0c;是继CNNIC开放CN保留域名注册之后&#xff0c;投…