详解c语言欧拉函数,【基础数论】十分钟学会计算欧拉函数
欧拉函数
欢迎各位读者指出不足,谢谢~
首先我们要知道欧拉函数是个什么东东?
废话不多说~欧拉函数就是指:对于一个正整数n,小于n且和n互质的正整数(包括1)的个数,记作φ(n) 。
欧拉函数的通式:φ(n)=n*(1-1/p1)*(1-1/p2)*(1-1/p3)*(1-1/p4)…..(1-1/pn),其中p1, p2……pn为n的所有质因数,n是不为0的整数。φ(1)=1(唯一和1互质的数就是1本身)。
对于上述的通式一定要牢记在心,因为这是计算欧拉函数最重要的一步。 切记切记~~~~
好,最简单的,我们根据通式即可得 最简单的代码:
int euler(int n)
{
int ans=n;
for(int i=2;i*i<=n;i++){
if(n%i==0){
ans-=ans/i;
while(n%i==0){
n/=i;
}
}
}
if(n>1)ans-=ans/n;
return ans;
}
晦涩难懂一:代码中的 ans-=ans/i; 这一步就是对应欧拉函数的通式~还是应该比较容易看懂的吧?
晦涩难懂二:while(n%i==0) n/=i; 这一个语句是为了保证完全消除我们刚才得到的那个i因子。确保我们下一个得到的i是n的素因子。
晦涩难懂三:if(n>1)ans-=ans/n; 这个语句是为了保证我们已经除完了n的所有的素因子,有可能还会出现一个我们未除的因子,如果结尾出现n>1 ,说明我们还剩一个素因子木有除。
看懂上述代码的就可以去练练手了~ 推荐题目:HDOJ 1787 题解:点击打开链接
但是我们一般做的题当然不会这么简单啊~~来点稍微难一点点的。。。
如果我们要求的数比较多,如果一个一个求那么很容易就超时,所以我们自然而然就想到——打表。
如果我们依照上述思想,来个最朴素的打表。
void euler()
{
p[1]=1;
for(int i=2;i<=MAXN;i++){
int n=i;
p[i]=i;
for(int j=2;j*j<=n;j++){
if(n%j==0){
p[i]=p[i]/j*(j-1);
while(n%j==0) n=n/j;
}
}
if(n>1) p[i]=p[i]/n*(n-1);
}
for(int i=2;i
p[i]+=p[i-1];
}
这种打表方法并不是很理想。。。。
下面推荐 两种较快的打表方法:
ps:这种好像稍微快那么一点点~
void euler()
{
E[1]=1;
for(int i=2;i
E[i]=i;
for(int i=2;i
if(E[i]==i)
for(int j=i;j
E[j]=E[j]/i*(i-1);
}
}
}
第二种:
void euler()
{
for(int i=2;i
if(!E[i])
for(int j=i;j
if(!E[j])E[j]=j;
E[j]=E[j]/i*(i-1);
}
}
}
上述打表方法的思想和最初的是差不多的。但是它进行了优化,所以比较快。
我们逐步分析一下:
首先,在这里我们枚举的是素因子。因为素因子比较少,如果枚举素因子的话肯定会大大优化复杂度?
那么,我们如何保证我们得到的就一定是个素因子呢?这就是我们if语句的作用,例如在第一种方法中,我们在第二个for 循环中就是把所有数,除以素因子。这样得到的复杂度一定比枚举每个数,然后找素因子(最开始那个打表法)这种打表要优化的多。
推荐题目:HDOJ 2824 题解:点击打开链接
在平时,我们做题,一般不会直接或者只是考察一个数的欧拉函数值。而是一些变形,或者是欧拉函数的一些性质。
在这我总结了几个欧拉函数常用的性质,希望读者多多补充。
欧拉函数性质(持续更新):
①N>1,不大于N且和N互素的所有正整数的和是 1/2*M*eular(N)。 推荐题目:HDOJ 3501 题解:点击打开链接
②若(N%a==0 && (N/a)%a==0) 则有:E(N)=E(N/a)*a;
③若(N%a==0 && (N/a)%a!=0) 则有:E(N)=E(N/a)*(a-1);
详解c语言欧拉函数,【基础数论】十分钟学会计算欧拉函数相关推荐
- #转载:杨辉三角形实现过程详解-c语言基础
杨辉三角形实现过程详解-C语言基础 十一一个人 2018-12-26 06:45:45 6465 收藏 28 最后发布:2018-12-26 06:45:45首发:2018-12-26 06:45:4 ...
- 详解c语言main函数、printf函数、scanf函数与va家族
C语言入门与提升(1)--详解c语言main函数.printf函数与scanf函数,与va家族 前言: 为什么要学习C语言呢?C语言作为最古老的语言之一,走过了半个多世纪的风风雨雨,至今仍然长盛不衰, ...
- c语言malloc用法 数组,详解C语言用malloc函数申请二维动态数组的实例
详解C语言用malloc函数申请二维动态数组的实例 C语言在程序运行中动态的申请及释放内存十分方便,一维数组的申请及释放比较简单. Sample one #include int main() { c ...
- 你是真的“C”——详解C语言函数模块知识(上篇)
详解C语言函数模块知识(上篇)
- c语言 字符串 strncpy,详解c语言中的 strcpy和strncpy字符串函数使用
详解c语言中的 strcpy和strncpy字符串函数使用 strcpy 和strcnpy函数--字符串复制函数. 1.strcpy函数 函数原型:char *strcpy(char *dst,cha ...
- 《Java和Android开发实战详解》——1.2节Java基础知识
本节书摘来自异步社区<Java和Android开发实战详解>一书中的第1章,第1.2节Java基础知识,作者 陈会安,更多章节内容可以访问云栖社区"异步社区"公众号查看 ...
- php 微信 公众 平台,微信公众平台代码详解-php语言(一)
2.这里把它粘贴出来,以注释的形式进行讲解. 3.首先我们要知道一些基础的知识: (1)要有自己的网站--公网环境,其中一个php页面处理微信消息: (2)微信公众平台和网站服务器之间是通过XML数据 ...
- 【JavaScript详解】一文掌握JavaScript基础知识(上)
JavaScript基础 前言 一.什么是JavaScript 1.JavaScript概述 2.javaScript有什么作用 二.JavaScript快速入门 1.引入JavaScript 2.基 ...
- DBus glib 各数据类型接收与发送详解—C语言(3)
DBus glib 各数据类型接收与发送详解-C语言(3) 动机 前置知识 正文 Python 测试服务 使用 C 实现复杂数据类型的传递 DICT_DICT ObjectPath_Dict_Stru ...
最新文章
- web 监听器 过滤器等组件
- syslog-ng+loganalyzer log system install guide
- Ubuntu12.04安装jdk1.6.0
- Mysql:kill命令之mysql杀死指定的进程(批操作)
- nio2 java_java nio2
- 003.linux开发环境配置及linux极速入门
- laravel 5 : Class 'input' not found
- springboot中得注解_SpringBoot 中的基本注解
- Mac OS端如何使用fastboot工具
- 如何评估开发费 (From 程序匠人)
- 期刊论文发表有哪些方法
- oracle查找用户名和密码忘记了,Oracle忘记用户名和密码的解决方案
- 流体力学基础——粘性
- esp8266保存html文件,八,ESP8266 文件保存数据
- UTC时间与北京时间相互转换
- 使用dns服务器信息的方法,保护DNS服务器十大最有效方法
- Feign报错Method Not Allowed 405 5种解决方案
- android 微信抢红包软件
- 向爱康家园投稿:将“女排精神”发扬到工作中去
- html5岗位需求,HTML5培训分享H5的优势和岗位要求
热门文章
- python实现骰子猜大小游戏
- linux运维排查常用命令(开发专享)
- vscode 登陆leetcode 报错:Accessing non-existent property ‘padLevels‘ of module
- 滑铁卢大学开发了一套AI工具,教泥瓦匠初学者搬砖诀窍
- 【MATLAB强化学习工具箱】学习笔记--actor网络和critic网络的结果放在哪里?
- cdn连接失败是什么意思_CDN经常连接失败的原因有哪些?
- Linux 系统时间EST改CTS
- 共轭复数,共轭根式,共轭矩阵,共轭方向,共轭方向法,共轭梯度法,共轭分布,共轭函数,傅里叶变换的共轭对称
- python 气泡图 聚类_R可视化 | 气泡图
- Excel表格中的三维气泡图,你会做吗?