欧拉函数公式及其证明

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

欧拉函数:

欧拉函数是数论中很重要的一个函数,欧拉函数是指:对于一个正整数n ,小于n 且和n 互质的正整数(包括1)的个数,记作φ(n) 。

完全余数集合:

定义小于n 且和n 互质的数构成的集合为Zn ,称呼这个集合为n 的完全余数集合。显然|Zn| =φ(n) 。

有关性质:

对于素数p ,φ(p) = p -1 。

对于两个不同素数p,q ,它们的乘积n = p * q 满足φ(n) = (p -1) * (q -1) 。

这是因为Zn = {1, 2, 3, ... , n - 1} - {p, 2p, ... , (q - 1) * p} - {q, 2q, ... , (p - 1) * q} ,则φ(n) = (n - 1) - (q - 1) - (p - 1) = (p -1) * (q -1) =φ(p) * φ(q) 。

欧拉定理:

对于互质的正整数a 和n ,有aφ(n)≡ 1 mod n。

证明:

( 1 ) 令Zn = {x1, x2, ..., xφ(n)} ,S= {a * x1mod n, a * x2mod n, ... , a * x

mod n} ,

φ(n)

则Zn = S 。

①因为a 与n 互质,x i (1 ≤ i ≤φ(n)) 与n 互质,所以a * x i与n 互质,所以a * x i mod n ∈ Zn 。

②若i ≠ j ,那么x i≠x j,且由a, n互质可得a * x i mod n ≠a * x j mod n (消去律)。

( 2 ) aφ(n) * x1 * x2 *... * xφ(n)mod n

≡ (a * x1) * (a * x2) * ... * (a * xφ(n)) mod n

≡ (a * x1mod n) * (a * x2 mod n) * ... * (a * xφ(n)mod n) mod n

≡x1 * x2 * ... * xφ(n) mod n

对比等式的左右两端,因为x i(1 ≤ i ≤φ(n)) 与n 互质,所以aφ(n)≡ 1 mod n (消去律)。

注:

消去律:如果gcd(c,p) = 1 ,则ac ≡ bc mod p ⇒ a ≡ b mod p 。

费马定理:

若正整数a 与素数p 互质,则有a p - 1≡ 1 mod p。

证明这个定理非常简单,由于φ(p) = p -1,代入欧拉定理即可证明。

****************************************************** ***********************

补充:欧拉函数公式

( 1 ) p k的欧拉函数

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

φ(n) = p k - p k -1

证明:

小于p k的正整数个数为p k- 1个,其中

和p k不互质的正整数有{p * 1,p * 2,...,p * (p k - 1-1)}共计p k - 1 - 1个所以φ(n) = p k- 1 - (p k - 1- 1) = p k- p k - 1。

( 2 ) p * q 的欧拉函数

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

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

证明:

令n = p * q ,gcd(p,q) = 1

根据中国余数定理,有

Zn 和Zp × Zq 之间存在一一映射

(我的想法是:a ∈ Zp , b ∈ Zq ⇔ b * p + a * q ∈ Zn 。)

所以n 的完全余数集合的元素个数等于集合Zp × Zq 的元素个数。而后者的元素个数为φ(p) * φ(q) ,所以有

φ(p * q) = φ(p) * φ(q) 。

( 3 ) 任意正整数的欧拉函数

任意一个整数n 都可以表示为其素因子的乘积为:

I

n = ∏ p i k i (I 为n 的素因子的个数)

i=1

根据前面两个结论,很容易得出它的欧拉函数为:

I I

Φ(n) = ∏ p i k i-1(p i-1) = n∏(1 - 1 / p i)

i=1 i=1

对于任意n > 2,2 | Φ(n) ,因为必存在p i -1 是偶数。

//直接求解欧拉函数

int euler(int n){ //返回euler(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;

}

//筛选法打欧拉函数表

#define Max 1000001

int euler[Max];

void Init(){

euler[1]=1;

for(int i=2;i

euler[i]=i;

for(int i=2;i

if(euler[i]==i)

for(int j=i;j

euler[j]=euler[j]/i*(i-1);//先进行除法是为了防止中间数据的溢出}

相关文档
最新文档