数论知识(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 }

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

原文地址:https://www.cnblogs.com/tom987690183/p/3242668.html