欧拉函数

欢迎各位读者指出不足,谢谢~

首先我们要知道欧拉函数是个什么东东?

废话不多说~欧拉函数就是指:对于一个正整数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语言欧拉函数,【基础数论】十分钟学会计算欧拉函数相关推荐

  1. #转载:杨辉三角形实现过程详解-c语言基础

    杨辉三角形实现过程详解-C语言基础 十一一个人 2018-12-26 06:45:45 6465 收藏 28 最后发布:2018-12-26 06:45:45首发:2018-12-26 06:45:4 ...

  2. 详解c语言main函数、printf函数、scanf函数与va家族

    C语言入门与提升(1)--详解c语言main函数.printf函数与scanf函数,与va家族 前言: 为什么要学习C语言呢?C语言作为最古老的语言之一,走过了半个多世纪的风风雨雨,至今仍然长盛不衰, ...

  3. c语言malloc用法 数组,详解C语言用malloc函数申请二维动态数组的实例

    详解C语言用malloc函数申请二维动态数组的实例 C语言在程序运行中动态的申请及释放内存十分方便,一维数组的申请及释放比较简单. Sample one #include int main() { c ...

  4. 你是真的“C”——详解C语言函数模块知识(上篇)

    详解C语言函数模块知识(上篇)

  5. c语言 字符串 strncpy,详解c语言中的 strcpy和strncpy字符串函数使用

    详解c语言中的 strcpy和strncpy字符串函数使用 strcpy 和strcnpy函数--字符串复制函数. 1.strcpy函数 函数原型:char *strcpy(char *dst,cha ...

  6. 《Java和Android开发实战详解》——1.2节Java基础知识

    本节书摘来自异步社区<Java和Android开发实战详解>一书中的第1章,第1.2节Java基础知识,作者 陈会安,更多章节内容可以访问云栖社区"异步社区"公众号查看 ...

  7. php 微信 公众 平台,微信公众平台代码详解-php语言(一)

    2.这里把它粘贴出来,以注释的形式进行讲解. 3.首先我们要知道一些基础的知识: (1)要有自己的网站--公网环境,其中一个php页面处理微信消息: (2)微信公众平台和网站服务器之间是通过XML数据 ...

  8. 【JavaScript详解】一文掌握JavaScript基础知识(上)

    JavaScript基础 前言 一.什么是JavaScript 1.JavaScript概述 2.javaScript有什么作用 二.JavaScript快速入门 1.引入JavaScript 2.基 ...

  9. DBus glib 各数据类型接收与发送详解—C语言(3)

    DBus glib 各数据类型接收与发送详解-C语言(3) 动机 前置知识 正文 Python 测试服务 使用 C 实现复杂数据类型的传递 DICT_DICT ObjectPath_Dict_Stru ...

最新文章

  1. web 监听器 过滤器等组件
  2. syslog-ng+loganalyzer log system install guide
  3. Ubuntu12.04安装jdk1.6.0
  4. Mysql:kill命令之mysql杀死指定的进程(批操作)
  5. nio2 java_java nio2
  6. 003.linux开发环境配置及linux极速入门
  7. laravel 5 : Class 'input' not found
  8. springboot中得注解_SpringBoot 中的基本注解
  9. Mac OS端如何使用fastboot工具
  10. 如何评估开发费 (From 程序匠人)
  11. 期刊论文发表有哪些方法
  12. oracle查找用户名和密码忘记了,Oracle忘记用户名和密码的解决方案
  13. 流体力学基础——粘性
  14. esp8266保存html文件,八,ESP8266 文件保存数据
  15. UTC时间与北京时间相互转换
  16. 使用dns服务器信息的方法,保护DNS服务器十大最有效方法
  17. Feign报错Method Not Allowed 405 5种解决方案
  18. android 微信抢红包软件
  19. 向爱康家园投稿:将“女排精神”发扬到工作中去
  20. html5岗位需求,HTML5培训分享H5的优势和岗位要求

热门文章

  1. python实现骰子猜大小游戏
  2. linux运维排查常用命令(开发专享)
  3. vscode 登陆leetcode 报错:Accessing non-existent property ‘padLevels‘ of module
  4. 滑铁卢大学开发了一套AI工具,教泥瓦匠初学者搬砖诀窍
  5. 【MATLAB强化学习工具箱】学习笔记--actor网络和critic网络的结果放在哪里?
  6. cdn连接失败是什么意思_CDN经常连接失败的原因有哪些?
  7. Linux 系统时间EST改CTS
  8. 共轭复数,共轭根式,共轭矩阵,共轭方向,共轭方向法,共轭梯度法,共轭分布,共轭函数,傅里叶变换的共轭对称
  9. python 气泡图 聚类_R可视化 | 气泡图
  10. Excel表格中的三维气泡图,你会做吗?