如何快速求出与n互素的数有多少个?
关注下方公众号,分享硬核知识
作者 | 小K
出品 | 公众号:小K算法 (ID:xiaok365)
01
故事起源
一个数n,在小于等于n的正整数[1,n]中,与n互素的数有多少个呢?
(注:x与n互素,说明x与n的最大公约数为1)
02
分析
最直观的方法当然就是直接枚举所有小于n的数,再通过求最大公约数判断即可。
但当n很大的时候,这个方法就不优了。可能有同学已经发现了,这个不就是欧拉函数的定义吗,所以今天我们从数学上来分析如何快速求解。
03
欧拉函数
欧拉函数定义如下:
欧拉函数具有几个优秀的性质,先介绍几个常用的数学符号,便于描述。
3.1
性质1
当n为素数时,很明显phi(n)=n-1,因为所有小于n的数都与n互素。
当n为某个素数p的幂次时,即n=p^k,则与n不互素的一定为p的倍数。
[1,n]中p的倍数一共有p^(k-1)个,所以互素的即为总数减去不互素的个数。
3.2
性质2
欧拉函数是一个积性函数,当整数m,n互素时,phi(mn)=phi(m)*phi(n)。
这个性质的证明需要用到同余和集合相关的定理,有点复杂,以后写同余相关的知识再专门分享如何证明,现在就先记住这个性质就行了。
04
计算
有了这2个性质就可以推导出欧拉乘积公式。
接下来就只需要考虑如何对n进行质因素分解。
最简单的方式可以直接枚举,先找到最小的质因子p1,然后除去所有p1因子,再对剩余的数继续分解。
05
代码实现
int euler_phi(int n) {int m = sqrt(n + 0.5);int ans = n;for (int i = 2; i <= m; ++i) {if (n == 1) break;if (n % i == 0) {ans = ans / i * (i - 1);while (n % i == 0) n /= i;}}if (n > 1) ans = ans / n * (n - 1);return ans;
}
06
总结
现在的算法复杂度主要取决于寻找第一个质因子,枚举并不是最快的方法,更快的方法是基于费马小定理,miller_rabin,pollard_rho等原理的随机化算法。
数论是一个大类,在很多地方都有重要的应用,而素数在密码学中应用也很广泛,今天分享的算是数论入门的一个介绍,后面还会分享更多有关数论的知识。
本文原创作者:小K,一个思维独特的写手。
文章首发平台:微信公众号【小K算法】。
如果喜欢小K的文章,请点个关注,分享给更多的人,小K将持续更新,谢谢啦!
关注下方公众号,分享硬核知识
关注我,涨知识
原创不易,感谢分享
转发,点赞,在看!
▼
往期精彩回顾
▼
硬币翻转
棋盘分割
喜欢三叶草的牛
分享给更多朋友,转发,点赞,在看
如何快速求出与n互素的数有多少个?相关推荐
- 快速求出淘汰赛中轮空场次-最简单的算法
如果快速求出N个人参加的淘汰赛中轮空的场次数. N可以使任意数,也就是任意人数参加的比赛. 例如:37个人参加淘汰赛,那么无论怎么安排比赛顺序,总是有4场比赛有运动员会轮空. 答案是:假如m个人参加比 ...
- 【小米校招笔试】假如已知有n个人和m对好友关系(存于数字r)。如果两个人是直接或间接的好友(好友的好友的好友...),则认为他们属于同一个朋友圈,请写程序求出这n个人里一共有多少个朋友圈。
2016年小米校招笔试第三题(西安站) 3 假如已知有n个人和m对好友关系(存于数字r).如果两个人是直接或间接的好友(好友的好友的好友...),则认为他们属于同一个朋友圈,请写程序求出这n个人里一共 ...
- 求出千位数上的数加百位数上的数等于十位数上的数加个位数上的数的个数cnt,再把所有满足条件的四位数依次存入数组b中,然后对数组b中的四位数按从大到小的顺序进行排序。
已知数据文件IN13.DAT中存有300个四位数,并已调用读函数readDat()把这些数存入数组a中,请编制一个函数jsValue(),其功能是:求出千位数上的数加百位数上的数等于十位数上的数加个位 ...
- 编制一个函数jsValue(),求出千位数上的数减百位数上的数减十位数上的数减个位数上的数大于零的个数cnt,再求出所有满足此条件的四位数的平均值pjz1,以及不满足此条件的四位数的平均值pzj2
已知数据文件IN15.DAT中存有300个四位数,并已调用读函数readDat()把这些数存入数组a中,请编制一个函数jsValue(),其功能是:求出千位数上的数减百位数上的数减十位数上的数减个位数 ...
- 求出1000以内所有完数(C语言)
编算法求出1000以内所有完数(C语言) 题目:编算法找出1000以内所有完数 完数:其因数之和=自身的数,且因数不含自身.如:28的因子为1.2.4.7,14,而28=1+2+4+7+14.因此28 ...
- 1和4互素吗_互素是什么意思?1~10中与10互素的数有多少个
1~10中与10互素的数有多少个? 2019年8月6日星期二 也许您看到这个题目,会和我一样认为十分简单,甚而至于您也会这样做: (1,10)=1 (2,10)=2 (3,10)=1 (4,10)=2 ...
- 平面内有N个点,如何快速求出距离最近的点对?
大家好,我们今天来看一道非常非常经典的算法题--最近点对问题. 这个问题经常在各种面试当中出现,难度不低,很少有人能答上来.说实话,我也被问过,因为毫无准备,所以也没有答上来.是的,这道题有点神奇,没 ...
- 求出数组中超过一半的数
Tango 是微软亚洲研究院的一个试验项目.研究院的员工和实习生们都很喜欢在 Tango上面交流灌水.传说,Tango 有一大"水王",他不但喜欢发贴,还会回复其他 ID 发的每个 ...
- python求出五位数的回文数_python之递归
#coding=utf-8 ''' #题目:打印出如下图案(菱形) nu = 1 # 开始值 k = 2 # 变量值 while nu >= 0: print(int((7 - nu) / ...
最新文章
- 淮阴工学院计算机期末考选择题题库,淮阴工学院计算机导论题库.doc
- Python相关系数矩阵热力图(二)
- 京东发力金融AI,欲再招50位金融AI顶级科学家 转载 2017年12月04日 00:00:00 42 12月1日,京东金融AI实验室在美国硅谷正式投入运营。亦在同一天,京东金融宣布,美国伊利诺伊大
- window下的host路径
- Python的Linux的入门,学习摘要。
- Package 'xxxx' is not installed, so not removed
- Spring3 RESTful Web服务
- Docker解析及轻量级PaaS平台演练(一)--Docker简介与安装
- 异步解耦_如何使用异步生成器解耦业务逻辑
- C++PrimerPlus学习——第四章编程练习
- java html转换xml文件,使用Java在HTML中转换XML + XSL
- java框架_这篇让你吃透Java集合框架!
- 关于 pip安装的可能错误的排除
- 东芝如何看待蓝牙在物联网热潮下的机遇
- notepad linux版本,Notepad++ Linux版
- ckplayer6.8修改logo
- 2563: 阿狸和桃子的游戏 贪心
- c4d安装完 只有语言英文的,为何我将显示语言设置成英文后开始菜单分类还依然显示为中文?...
- uniapp公共测试证书签名
- hadoop start journalnode小坑
热门文章
- 上海镇保城保四金比例
- github - You have exceeded a secondary rate limit.
- python实现位置定位_python定位位置
- UVA 10163 Storage Keepers (01背包DP + 二分)
- LabVIEW图表之双坐标轴
- QuartusⅡ开发alteraFPGA如何约束时钟(关于消除警告Timing requirements not met)
- 如何正确安装独立显卡?图文详解教会你安装独立显卡
- Apollo阿波罗配置中心基本概述
- 从Dijkstra谈帅才的洞察力(王选)
- 魔兽名字显示服务器,魔兽世界怀旧服服务器名称