欧拉函数模板

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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值