

欧拉函数:求小于等于n且与n互质的数的个数
source link: https://segmentfault.com/a/1190000041410741
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

求小于等于n且与n互质的数的个数
互质穷举法
- 互质:两个数互质代表两者最大公约数为1
- 最大公约数求法:辗转相除法,最小公倍数:较大值除以最大公约数乘以较小值
辗转相除法:
- 较大的数a取模较小的数b,得取模值c
- 若取模值等于0 则最大公约数为取模值,否则继续下一步
a与c再次取模,回到第二步
//求最大公约数gcd以及最大公倍数lcm // 36 24 36/24 // 24 12 24/12 // 0 结束最大公约数为12 // 求最小公倍数 // lcm(a, b) = (a * b)/gcd(a, b) public static int gcd(int a, int b){ //a>=b //辗转相除法 if (b==0){ return a; } return gcd(b,a%b); }
- 穷举到n,一一判断该数与n的最大公约数是否为1,即是否为互质
结论:可以实现,但时间复杂度太高
采取欧拉函数进行求取
在数论,对正整数n,欧拉函数是小于等于n的正整数中与n互质的数的数目.
n为正整数n,p1、p2 ……pn 为正整数n的质因数
n的质因数:既是n的因数,又是质数的数
计算方法:
ϕ(n)=n×(p1−1p1)×(p2−1p2)⋯×(pn−1pn) \phi (n) = n \times (\frac{p_1-1}{p_1})\times (\frac{p_2-1}{p_2})\cdots\times (\frac{p_n-1}{p_n}) ϕ(n)=n×(p1p1−1)×(p2p2−1)⋯×(pnpn−1)
ϕ(10)=10×12×45=4 \phi (10) = 10 \times \frac{1}{2}\times \frac{4}{5} = 4 ϕ(10)=10×21×54=4
质数的求法:因数只有1和其本身
单个质数n的判断
依次判断2到
的数被n取模的值是否等于零,存在任意一个即不为质数
当p大于
时,代表数p一定可以得到一个小于
的数和一个大于
的成对因数,不为质数
从2到n的质数的判断
非穷举,穷举时间复杂度为O(n),使用素数筛法为O(
)
为保证效率,质数为false,合数为true
- 标记2到n的数都为质数,为false,布尔数组默认值为false,无需再一一标记
- 从2开始标记数,找到第一个为false的数p
标记数p的倍数为合数,即为true,倍数标记从p
p 开始,直至数p等于
,结束标记
p的倍数的因数必有p,不符合质数条件,每次从 p
p 开始标记是由于p-1的部分已经进行了标记,不再重复标记,
4) 使得下一个数p 为未被标记为合数的数,即数值仍为333333false的数,重复第三步
5) 将标记为false 的,即为质数的全部输出
- 采取素数筛法求取质数时,可将倍数标记的操作修改为乘以(1-1/p),使得每一个数都能乘以其质因数
依次存入数组中,最后统一依次输出结果。
public static int f1(int n){ int res = n; for (int i = 2;i*i<=n;i++){ if (n % i==0){ res = res / i*(i-1);//res/i while (n % i == 0){ n/=i; } } } if (n>1){ res = res/n*(n-1); } return res; } //区间内欧拉函数取值 public static int[] f2(int n){ int[] count = new int[n+1]; for (int i = 1;i <= n;i++){ count[i]=i; } for (int i =2 ;i <= n;i++){ if (count[i] == i){ for (int j = i;j <= n;j+=i){ count[j] = count[j]/i*(i-1); } } } return count; }
- 最大公约数、最小公倍数
- 单一质数判断
- 质数筛法:埃氏筛法
Recommend
-
40
市场上繁杂的电子烟品类,如何区分、如何监管?电子烟究竟是有害还是无害?是否有确切证据表明其比卷烟更健康?以上种种问题,都亟待讨论和厘清。原标题:电子烟危害小于卷烟?世卫组织这么说…吕绍刚胡苇杭王楠7月22日,国家卫生健康委员会表示,正会同有
-
29
问题一:BigInteger你了解不? 看一下下面的代码,最终将打印什么呢? public static void main(String[] args) { BigInteger fiveThousand = new BigInteger("5000"); BigInteger f...
-
18
前言 迟到的Fastjson反序列化漏洞分析,按照国际惯例这次依旧没有放poc。道理还是那个道理,但利用方式多种多样。除了之前放出来用于文件读写的利用方式以外其实还可以用于SSRF。 一、漏洞概述 在之前其他...
-
9
← 13个快餐龙头的小知识[日本]对2021年的预测:犯罪、奥运会以及数据窃取 →majer @ 2021.01...
-
13
论文推荐 | ECCV 2020 最佳论文、小于 0.1mm 微型四脚机器人; 4个月前...
-
3
微软透露正开发C端 HoloLens 3,新设备将小于90克、使用功率为2W_VR陀螺 微软透露正开发C端 HoloLens 3,新设备将小于90克、使用功率为2W 发布时间:2021-05-17 10:14 | 标签:
-
7
在互联网高速发展的今天,提起“弹窗”相信大家都不陌生:新注册一个刚下载的 APP、在 618 打开一个电商网站、在小程序上完成一次心理测试……很多场景下,我们的这些点击行为,都会直接触发弹窗,弹窗作为与用户建立交互关系的关键方式之一,其重要性与意义不言而...
-
8
贰猹の小窝欧拉函数算法笔记发表于 2021-05-11|更新于 2021-07-15|C++ 学习笔记 字数总计:1.2k...
-
8
欧拉函数原理 一、欧拉函数的引入 请思考以下问题: 任意给定正整数n,请问在小于等于n的正整数...
-
4
leetcode 315. 计算右侧小于当前元素的个数 发...
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK