6.9 欧拉函数
参考文献:
AC M-ICPC程序设计系列数论及其应用
扩展阅读:
http://www.cnblogs.com/DreamUp/archive/2010/07/24/1784116.html
编写:陈禹校核:曹振海
欧拉函数用希腊字母φ表示,φ(N)表示N的欧拉函数.
对φ(N)的值,我们可以通俗地理解为小于N且与N互质的数的个数(包含1)
6.9.1 基本原理
欧拉函数phi()是指不超过n且与n互素的正整数的个数
φ函数的值 通式:φ(x)=x(1-1/p1)(1-1/p2)(1-1/p3)(1-1/p4)…..(1-1/pn),其中p1, p2……pn为x的所有质因数
设p是素数a是一个正整数phi(p^a)=p^a-p^a-1;
m与n互素phi(mn)=phi(m)phi(n);
phi(n)=n*sum(1-1/pi)/*pi是与n的质因子
n为奇数时phi(2n)=phi(n);
欧拉定理:对任何俩个互质的正整数a,m(m>=2) a^phi(m)=1(modm);
费马小定理:当m是质数是 a^m-1=1(modm);
以上,照本宣科,反正我自己是没心思慢慢看,嘿嘿,所以整理如下:
欧拉函数的一些性质:
1.对于素数p, φ(p)=p-1,对于对两个素数p,q φ(pq)=pq-1
即φ(mn)=φ(n)*φ(m)只在(n,m)=1时成立.
2.对于一个正整数N的素数幂分解N=P1^q1*P2^q2*...*Pn^qn.
φ(N)=N*(1-1/P1)*(1-1/P2)*...*(1-1/Pn).
3.除了N=2,φ(N)都是偶数.
4.设N为正整数,∑φ(d)=N (d|N).
#include<stdio.h>
#include<iostream>
#include<string.h>
using namespace std;
const int N=50005;
int phi[N];
int main()
{
int maxn=0;
scanf("%d",&maxn);//确认区间
for(int i=1;i<=maxn;i++)//初始化
{
phi[i]=i;
}
for(int i=2;i<=maxn;i+=2)//筛去2的倍数,因为 /i*(i-1)在i=2时等价于/2
{
phi[i]=phi[i]/2;
}
for(int i=3;i<=maxn;i+=2)//筛3,5,7....但是并没有9,15,等等因为如下
{
if(phi[i]==i)
{
for(int j=i;j<=maxn;j+=i)//筛3的时候,6,9,15....等等都被修改了
{
phi[j]=phi[j]/i*(i-1);//按公式修改
}
}
}
for(int i=1;i<=maxn;i++)
printf("%d的欧拉值是:%d\n",i,phi[i]);
printf("\n");
for(int i=1;i<=maxn;i++)
{
if(phi[i]==i-1)
printf("%d为质数\n",i);
}
return 0;
}