尤拉函式phi(x)是指不大於正整數x的與x互質的正整數的個數。例如phi(1)=1,phi(2)=1,phi(3)=2,phi(4)=2,phi(5)=4,phi(6)=2等等。很顯然,對每乙個質數p,phi(p)=p-1。而對每乙個質數的冪phi(p^n)=(p-1)×p^(n-1)。尤拉函式是積性函式,如果m、n互質,那麼phi(m×n)=phi(m)×phi(n)。
尤拉函式的取值需要用到算術基本定理。將n寫成其質因子冪的連乘積的形式,n=p1^k1×p2^k2×…×pr^kr。那麼,phi(n)=n×(1-1/p1)×…×(1-1/pr)。利用這個公式可以寫出求尤拉函式的**。當然,首先要求質數。如果問題範圍是maxsize,那麼只需求出size=sqrt(maxsize)以內的質數即可。即保證任何乙個數的最小質因子一定在這其中。
int euler(int n)
if ( n != 1 ) ret -= ret / n; //假如n含有超過size的質因子
return ret;
}
利用尤拉函式的積性性質,可以將一定範圍內的尤拉函式值全部求出。任何乙個合數n都可以寫作n=k×p^r。其中p是乙個質數,通常就會取n的最小的質因子。此時可以保證k與p^r肯定是互質的。所以phi(n)=phi(k)×phi(p^r)=phi(k)×(p-1)×p^(r-1)。當r大於1的時候,該式可以寫作phi(n)=phi(k)×(p-1)×p^(r-2)×p=phi(k)×phi(p^(r-1))×p=phi(n/p)×p。而當r等於1的時候,明顯有phi(n)=phi(k)×(p-1)=phi(n/p)×(p-1)。因為是順序求值,所以在求n的尤拉函式值時,所有比n小的尤拉函式值均已求出。當然,這種方法同樣要求事先篩出質數。
int euler[size] = ;
void euler()
for(int j=0;j}
}
尤拉函式及其證明
請思考以下問題 任意給定正整數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 的計算方法並不複雜,但是為了得到最後那個公式,需...