数论之欧拉函数

Dec 12, 2020


概念

在数论中,对于正整数n,欧拉函数是小于或等于n的正整数中与n互质的数的个数(所以会得出一个结论φ(1)=1),又例如φ(8)=4,因为在1~8的正整数中,唯有1,3,5,7均和8是互为质子数的,数目只有4个。

内容

欧拉函数的通式:2(其中p1,p2,……pn为x的所有质因数,x是不为0的整数)

定义如下

φ(1)=1,因为在小于等于1的范围里面,和1互质的只有1本身。

通式的例子

φ(10)=10×(1-1/2)×(1-1/5)=4, ——–10的质因数有2,5

φ(30)=30×(1-1/2)×(1-1/3)×(1-1/5)=8,——–30的质因数有2,3,5

φ(49)=49×(1-1/7)=42;——–49的质因数只有7

Attention!每种质因数只有一个

结论1:若n是质数p的k次幂,则,3,因为除了P的倍数外,其他数都是跟n互质的

例如:12=2 * 2 * 3那么4

欧拉函数是积性函数——若m,n互质,φ(mn)=φ(m)φ(n)

特殊性质:当n为奇质数时,φ(2n)=φ(n), 证明与上述类似。

若n为质数则φ(n)=n-1

补充

☞ 12=2 * 2 * 3,这里的2、2、3都是12的因数,而2和3都是质数,因此把2、3、3叫做12的质因数。假如12=2 * 6,这里的2、6都是12的因素,但是2是质数,而6是合数。因此2可以称作12的质因数,但是6就不能。

同余定理

如果 a mod b = c 则有(a+kb) mod b =c(k为非0整数)

如果 a mod b = c 则有(ka) mod b =kc (k为正整数)

(a+b) mod c =((a mod c)+(b mod c )) mod c;

(a * b) mod c=((a mod c) * (b mod c)) mod c


代码实现

例1:直接求小于或等于n,且与n互质的个数(只要求一个数的欧拉函数值,那么直接根据定义质因数分解的同时求就好了)

int Euler(int n)
{    
    int ans=n;
    for(int i=2;i<=sqrt(n);i++)
    {       
        if(n%i==0)       
        {           
            ans=ans/i*(i-1);//先进行除法防止溢出(ans=ans*(1-1/pi))           
            while(n%i==0)
            {               
                n/=i;
            }    
        } 
    }    
    if(n>1)
    {
         ans=ans/n*(n-1);
     }
     return ans;
}

筛选模板:求[1,n]之间每个数的质因数的个数

#define size 1000001
int euler[size];
void Init()
{    
    memset(euler,0,sizeof(euler));    
    euler[1]=1;    
    for(int i=2;i < size;i++)
          
        if(!euler[i])
                   
            for(int j=i;j < size;j+=i)          
            {              
                 if(!euler[j])
                                
                     euler[j]=j;        
                     euler[j]=euler[j]/i*(i-1);//先进行除法是为了防止中间数据的溢出
                          
            }
       
    
}