**於: ,
請思考以下問題:
任意給定正整數n,請問在小於等於n的正整數之中,有多少個與n構成互質關係?(比如,在1到8之中,有多少個數與8構成互質關係?)計算這個值的方法就叫做尤拉函式,以φ(n)表示。在1到8之中,與8形成互質關係的是1、3、5、7,所以 φ(n) = 4。
φ(n) 的計算方法並不複雜,但是為了得到最後那個公式,需要一步步討論。
第一種情況
如果n=1,則 φ(1) = 1 。因為1與任何數(包括自身)都構成互質關係。
第二種情況
如果n是質數,則 φ(n)=n-1 。因為質數與小於它的每乙個數,都構成互質關係。比如5與1、2、3、4都構成互質關係。
第三種情況
如果n是質數的某乙個次方,即 n = p^k (p為質數,k為大於等於1的整數),則
比如 φ(8) = φ(2^3) =2^3 - 2^2 = 8 -4 = 4。
這是因為只有當乙個數不包含質數p,才可能與n互質。而包含質數p的數一共有p^(k-1)個,即1×p、2×p、3×p、...、p^(k-1)×p,把它們去除,剩下的就是與n互質的數。
上面的式子還可以寫成下面的形式:
可以看出,上面的第二種情況是 k=1 時的特例。
第四種情況
如果n可以分解成兩個互質的整數之積,
n = p1 × p2則
φ(n) = φ(p1p2) = φ(p1)φ(p2)即積的尤拉函式等於各個因子的尤拉函式之積。比如,φ(56)=φ(8×7)=φ(8)×φ(7)=4×6=24。
對於素數p, φ(p)=p-1,對於對兩個素數p,q φ(pq)=pq-1
尤拉函式是積性函式,但不是完全積性函式.
函式的積性即:若m,n互質,則φ(mn)=φ(m)φ(n).由「m,n互質」可知m,n無公因數,所以φ(m)φ(n)=m(1-1/p1)(1-1/p2)(1-1/p3)…(1-1/pn)·n(1-1/p1')(1-1/p2')(1-1/p3')…(1-1/pn'),其中p1,p2,p3...pn為m的質因數,p1',p2',p3'...pn'為n的質因數,而m,n無公因數,所以p1,p2,p3...pn,p1',p2',p3'...pn'互不相同,所以p1,p2,p3...pn,p1',p2',p3'...pn'均為mn的質因數且為mn質因數的全集,所以φ(mn)=mn(1-1/p1)(1-1/p2)(1-1/p3)…(1-1/pn)(1-1/p1')(1-1/p2')(1-1/p3')…(1-1/pn'),所以φ(mn)=φ(m)φ(n).
?這一條的證明要用到"中國剩餘定理",這裡就不展開了,只簡單說一下思路:如果a與p1互質(a第五種情況
因為任意乙個大於1的正整數,都可以寫成一系列質數的積。
根據第4條的結論,得到
再根據第3條的結論,得到
也就等於
這就是尤拉函式的通用計算公式。比如,1323的尤拉函式,計算過程如下:
即φ(mn)=φ(n)*φ(m)只在(n,m)=1時成立.
對於乙個正整數n的素數冪分解n=p1^q1*p2^q2*...*pn^qn.
φ(n)=n*(1-1/p1)*(1-1/p2)*...*(1-1/pn).
除了n=2,φ(n)都是偶數.
設n為正整數,∑φ(d)=n (d|n).
根據性質2,我們可以在o(sqrt(n))的時間內求出乙個數的尤拉函式值.
如果我們要求1000000以內所有數的尤拉函式,怎麼辦.
上面的方法複雜度將高達o(n*sqrt(n)).
我們來看看線性篩法的程式:
[cpp] view plain
copy
//直接求解尤拉函式
int euler(int n)
} if(a>1) res=res/a*(a-1);
return res;
} 它在o(n)的時間內遍歷了所有的數,並且有很多的附加資訊,
那麼我們是不是能在篩素數的同時求出所有數的尤拉函式呢.
答案是可以.
φ(n)=n*(1-1/p1)(1-1/p2)....(1-1/pk),其中p1、p2…pk為n的所有素因子。
比如:φ(12)=12*(1-1/2)(1-1/3)=4。
利用這個就比較好求了,可以用類似求素數的篩法。
先篩出n以內的所有素數,再以素數篩每個數的φ值。
比如求10以內所有數的φ值:
設一陣列phi[11],賦初值phi[1]=1,phi[2]=2...phi[10]=10;
然後從2開始迴圈,把2的倍數的φ值*(1-1/2),則phi[2]=2*1/2=1,phi[4]=4*1/2=2,phi[6]=6*1/2=3....;
再是3,3的倍數的φ值*(1-1/3),則phi[3]=3*2/3=2,phi[6]=3*2/3=2,phi[9]=.....;
再5,再7...因為對每個素數都進行如此操作,因此任何乙個n都得到了φ(n)=n*(1-1/p1)(1-1/p2)....(1-1/pk)的運算
覺得這個「篩」還是比較好用的,以前求數的所有因子之和也是用的它。
我們知道,乙個數k能分解成p1^(q1)*p2^(q2)...
那麼,這個數的因子個數就是(1+q1)*(1+q2)*...*(1+qk)
**如下:
[cpp]view plain
copy
"font-size:18px;">"font-size:18px;">void init()
尤拉函式及其證明
請思考以下問題 任意給定正整數n,請問在小於等於n的正整數之中,有多少個與n構成互質關係?比如,在1到8之中,有多少個數與8構成互質關係?計算這個值的方法就叫做尤拉函式,以 n 表示。在1到8之中,與8形成互質關係的是1 3 5 7,所以 n 4。n 的計算方法並不複雜,但是為了得到最後那個公式,需...
尤拉函式及其證明
請思考以下問題 任意給定正整數n,請問在小於等於n的正整數之中,有多少個與n構成互質關係?比如,在1到8之中,有多少個數與8構成互質關係?計算這個值的方法就叫做尤拉函式,以 n 表示。在1到8之中,與8形成互質關係的是1 3 5 7,所以 n 4。n 的計算方法並不複雜,但是為了得到最後那個公式,需...
尤拉函式及其證明
請思考以下問題 任意給定正整數n,請問在小於等於n的正整數之中,有多少個與n構成互質關係?比如,在1到8之中,有多少個數與8構成互質關係?計算這個值的方法就叫做尤拉函式,以 n 表示。在1到8之中,與8形成互質關係的是1 3 5 7,所以 n 4。n 的計算方法並不複雜,但是為了得到最後那個公式,需...