数论知识(2)-------------欧拉函数

欧拉函数:一个整数n,小于且和n互质的正整数的个数(包含1)的个数,用φ(n)表示。

完全余数集合:欧拉函数中与n互质的数字的集合.

~~~~~~~~~~~~~~

性质:

如果n是素数,则 φ(n)=n-1;

求一个数n的所有互素和  sum=φ(n)*n/2;   <==这个性质,很有用。

欧拉定理 :
对于互质的正整数 和 ,有 (n)  ≡ 1 mod n  。

费马定理 :
若正整数 与素数 互质,则有 ap - 1 ≡ 1 mod p 。
证明这个定理非常简单,由于 φ(p) = p -1,代入欧拉定理即可证明。

~~~~~~~~~~~~~~~~~~~~~~

补充欧拉公式:

1. pk 的欧拉函数

对于给定的一个素数 , φ(p) = p -1。则对于正整数 n = pk ,

φ(n) = pk - pk -1

2. p * q 的欧拉函数

假设 p, q是两个互质的正整数,则 p * q 的欧拉函数为

φ(p * q) = φ(p) * φ(q) , gcd(p, q) = 1 

3.任意正整数的欧拉函数

φ(n) =n*(1-1/k1)*(1-1/k2)*......*(1-1/km);

k1,k2...km是n的素数因子

________________________________________

欧拉单点求值

 1 int Euler(int n)

 2 {

 3     int temp=n,i;

 4     for(i=2;i*i<=n;i++)

 5     {

 6        if(n%i==0)

 7        {

 8            while(n%i==0)

 9            n=n/i;

10            temp=temp/i*(i-1);

11        }

12     }

13     if(n!=1) temp=temp/n*(n-1);

14     return temp;

15 }

 欧拉函数打表

 1 void Euler() //欧拉打表。

 2 {

 3     int i,j;

 4     for(i=2;i<=3000000;i++)

 5     opl[i]=i;

 6     opl[1]=0;

 7 

 8     for(i=2;i<=3000000;i++)

 9     if(s[i]==false)

10     {

11         for(j=i;j<=3000000;j=j+i)

12         {

13             opl[j]=opl[j]/i*(i-1);

14             s[j]=true;

15         }

16     }

17 }

还有一种是素数和欧拉表分开的,速度更快。在欧拉题目里有。

你可能感兴趣的:(函数)