欧拉函数——基本定理与基本方法
来源:互联网 发布:微信视频制作 知乎 编辑:程序博客网 时间:2024/05/27 00:45
(1)直接实现,这种实现一般会超时,仅作了解即可
int phi(int n){ int ans=n; for(int i=2;i<=n;i++) if(n%i==0) { ans=ans-ans/i; while(n%i==0) n/=i; } return ans;}下面是优化代码:
int phi(int n){ int ans=n; for(int i=2;i*i<=n;i++) if(n%i==0) { ans=ans-ans/i; while(n%i==0) n/=i; } if(n>1) ans=ans-ans/n; return ans;}
(2)素数表实现
先把50 000以内的素数用筛法选出来并保存,以方便欧拉函数的使用。
int prime[N],nprime;bool isprime[N];void make_prime(){ memset(isprime,1,sizeof(isprime)); nprime=0; isprime[1]=0; for(int i=2;i<=N;i++) { if(isprime[i]) { nprime++; prime[nprime]=i; for(int j=i*i;j<=N;j+=i) isprime[j]=0; } }}int phi(int n){ int ans=n; for(int i=1;i<=nprime;i++) { if(prime[i]*prime[i]>n) break; if(n%prime[i]==0) { ans=ans-ans/prime[i]; while(n%prime[i]==0) n/=prime[i]; } } if(n>1) ans=ans-ans/n; return ans;}
(3)递推求欧拉函数
如果频繁地要用欧拉函数的值,就需要预先打表,下面介绍递推求欧拉函数的方法
可以先置所有的数的欧拉函数值都为其本身。在遍历过程中如果遇到欧拉函数与自身相等的情况,那么说明该数为素数,把这个数的欧拉函数改变,同时也把能被该素因子整除的的数改变。(注意:是在遍历过程中,前面所做的运算已经改变了大部分的数,却没有改变它,说明这个数为素数)
for(i=1;i<=maxn;i++)///欧拉函数初始化为其自身 phi[i]=i;for(i=2;i<=maxn;i+=2)///偶数必有素因子2,n(1-1/2); phi[i]/=2;for(i=3;i<=maxn;i+=2)///从3这个素数开始,递推求解 if(phi[i]==i){ for(j=i;j<=maxn;j+=i)///所有为i(i为素数)的倍数的数均改变欧拉函数,乘以(1-1/i); phi[j]/i*(i-1);}
0 0
- 欧拉函数——基本定理与基本方法
- 欧拉定理与函数
- 欧拉函数与欧拉定理
- 欧拉函数与欧拉定理
- 欧拉函数与欧拉定理
- 欧拉函数与欧拉定理
- 欧拉函数与欧拉定理
- 欧拉函数与欧拉定理
- 欧拉函数的应用(2)——欧拉函数与欧拉定理的结合
- 【数论】【素数】素数相关基础——欧拉函数与欧拉定理
- RSA的数学基础——欧拉函数与欧拉定理
- 费马小定理与欧拉定理——学习笔记
- 欧拉phi函数与欧拉定理
- poj2407 Relatives 欧拉函数基本应用
- POJ2407_Relatives【欧拉phi函数】【基本】
- 欧拉函数及定理
- 欧拉函数&&欧拉定理
- 欧拉定理,欧拉函数
- Leetcode刷题(9)-tag(Array)
- AngularJS中获取点击元素在页面中的位置
- 利用pywinauto操作另一进程中treeview
- 通过<iframe>,实现图片(文件)的上传以及文件(附件)的下载
- jqueryfileupload使用难点
- 欧拉函数——基本定理与基本方法
- 收录给大学生建议的文章
- KMP模式匹配算法
- Java堆、栈和常量池以及相关String的详细讲解(经典中的经典)
- BJ模拟 Mr. Panda and Fantastic Beats(广义后缀自动机、trie树上后缀自动机)
- 将博客搬至CSDN
- unityShader学习笔记(一)
- 欢迎使用CSDN-markdown编辑器
- TCP三次握手详解及释放连接过程(三次握手四次挥手)