欧拉函数学习笔记及例题

前言

数学可是信息学竞赛的精髓,导致了我们在做题的过程中经常碰到大大小小的关于数学的问题。欧拉函数便是其中之一,不知道欧拉函数很吃亏,不知道欧拉函数意味着你会找不出来一道找规律题的规律。

欧拉函数

定义:欧拉函数表示1-N中与N互质的数的个数;

欧拉函数用希腊字母φ表示,φ(N)表示N的欧拉函数.

举个栗子:

φ(3): ∵在1到3中,有1,2,3三个数,1与除零以外的任何数互质,2与3的最大公因数为1,也可以根据2与3为两个不相同的质数来判断他们互质。3与其本身最大公因数为自身;

                ∴φ(3)=2;

φ(12): ∵在1到12中,与12互质的数有1,5,7,11;

                  ∴φ(12)=4;

好了,弄清楚了欧拉函数的定义,再来看几条欧拉函数的简单性质;

欧拉函数的简单性质:1.欧拉函数是积性函数(非完全);

积性函数:对于任意互质的整数a和b有性质f(ab)=f(a)f(b)的数论函数

完全积性函数:对于任意整数a和b有性质f(ab)=f(a)f(b)的数论函数

像我们信息竞赛涉及的函数

φ(n) -欧拉函数

μ(n) -莫比乌斯函数,关于非平方数的质因子数目

gcd(n,k) -最大公因子,当k固定的情况

这些等都是积性函数。

所以说φ(mn)=φ(m)*φ(n)只有在(m,n)=1时成立(通俗来说就是m,n互质啦);

2.除了N=2,φ(N)都是偶数;

3.当N为奇数时,φ(2*N)=φ(N);

4.若N是质数p的k次幂,φ(N)=p^k-p^(k-1)=(p-1)p^(k-1) 因为除了p的倍数之外,其他数都与N互质;

5.当N是质数时,φ(N)=N-1;

积性函数有一个性质:

算术基本定理可表述为:任何一个大于1的自然数 N,如果N不为质数,那么N可以唯一分解成有限个质数的乘积N=P1a1P2a2P3a3......Pnan,这里P1<P2<P3......<Pn均为质数,其中指数ai是正整数。这样的分解称为 的标准分解式。最早证明是由欧几里得给出的,现代是由陈述证明。此定理可推广至更一般的交换代数代数数论

若将N表示成质因子分解式



所以我们有6.φ(N)=N*(1-1/P1)*(1-1/P2)*...*(1-1/Pn).

int euler(int n){
     int res=n,a=n;  
     for(int i=2;i*i<=a;i++){  
         if(a%i==0){  
             res=res/i*(i-1);  
             while(a%i==0) a/=i;  
         }  
     }  
     if(a>1) res=res/a*(a-1);  
     return res;  
}  

————————————————————————————————————————摘自Lur的方法

我们还可以在筛素数的时候同时求欧拉函数:

举个栗子:

φ(9)=9*(1-1/3)=6;

φ(14)=14*(1-1/2)*(1-1/7)=6;

所以根据这一性质,我们先筛出N以内的所有素数,再利用素数筛每个数的φ

举个栗子:

求12以内所有数的φ:

循环给一个数组phi[12],用循环给每个数赋初值;

初值就是每个的下标;

从2开始枚举1到12内的所有素数,把2的倍数的φ乘以(1-1/2)

现在phi[2]=1,phi[4]=2,phi[6]=3,phi[8]=4,phi[10]=5,phi[12]=6;

继续———————————————现在枚举到3了,3的倍数的φ值*(1-1/3)

phi[3]=2,phi[6]=4,phi[9]=6,phi[12]=8;

继续到5,

phi[5]=4,phi[10]=8;

继续到7,

phi[7]=6;

继续到11,

phi[11]=10;

这时候我们的φ表就出来了[1,1,2,2,4,3,6,4,6,8,10,8]

上代码:

void Init(){     
     euler[1]=1;    
     for(int i=2;i<Max;i++)    
       euler[i]=i;    
     for(int i=2;i<Max;i++)    
       	 if(euler[i]==i)    
          	 for(int j=i;j<Max;j+=i)    
           		euler[j]=euler[j]/i*(i-1);
} 

欧拉函数的应用:

[SDOI2008]仪仗队

题目描述

作为体育委员,C君负责这次运动会仪仗队的训练。仪仗队是由学生组成的N * N的方阵,为了保证队伍在行进中整齐划一,C君会跟在仪仗队的左后方,根据其视线所及的学生人数来判断队伍是否整齐(如下图)。  现在,C君希望你告诉他队伍整齐时能看到的学生人数。

输入输出格式

输入格式:共一个数N

输出格式:共一个数,即C君应看到的学生人数。

输入输出样例

输入样例#1: 
4
输出样例#1: 
9



首先我们找规律:

你在最右下角,你可以看到(1,0)(1,1)(0,1)三个点

从第三行开始,

第i行中当前直角三角形范围内能观察到的点数等于(i-1)的欧拉函数值

所以我们从3开始枚举n;

上代码:

#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
using namespace std;
const int Max=40005;
int n,ans,euler[Max];
void Init(){ //初始化求出φ表 
    euler[1]=1;    
    for(int i=2;i<Max;i++)    
       	euler[i]=i;    
    for(int i=2;i<Max;i++)    
        if(euler[i]==i)    
           	for(int j=i;j<Max;j+=i)    
              	euler[j]=euler[j]/i*(i-1);
}
int main(){
	Init();
	cin>>n;
	if(n==1){//特判 
		cout<<0;
		return 0;
	} 
	if(n==2){
		cout<<3;
		return 0;
	}
	for(int i=3;i<=n;i++){//这把答案加起来 
		ans+=euler[i-1];
	}
	cout<<ans*2+3;//因为这是直角三角形的,所以整个矩形ans*2,再加上已知的3个点答案。 
	return 0;
}

下一个题

能量采集:

这个题直接提供同校神犇Tmotfl的讲解

友链++:https://blog.csdn.net/nlt_xxy/article/details/79858699

阅读更多
文章标签: 欧拉函数 数论
想对作者说点什么? 我来说一句

初等数论中求欧拉函数值程序

2011年06月17日 882KB 下载

欧拉函数的计算

直接上代码

WT_cnyali WT_cnyali

2016-11-17 08:21:37

阅读数:1134

没有更多推荐了,返回首页

不良信息举报

欧拉函数学习笔记及例题

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭