尤拉函式性質與求法 數論 尤拉函式

2022-06-03 07:42:11 字數 2788 閱讀 5945

n的尤拉函式值用符號φ(n)表示

尤拉函式的定義是,對於乙個正整數n,小於n且與n互質的數的數目(包括1,特殊地,φ(1)=1 )。

設p1,p2,p3,...,pr為n的全部r個質因數,則有φ(n)=n*(1-1/p1)*(1-1/p2)*(1-1/p3)*(1-1/p4)…..(1-1/pr)。

顯然,用這個方法來計算單個尤拉函式是可以求解的。

附上**:

1

int get_phi(intx)9

//仍有質因數?特判x=2及x=3的情況

10if(x^1) re/=x,re*=x-1;11

return

re;12 }

這個求法的時間複雜度是o(√n)d的。

但這個求法有弊端:

* 對於大量需要計算的尤拉函式值,逐一分解n的時間複雜度顯然是十分高的。

在使用求解尤拉函式之前,介紹尤拉函式的幾個性質:

(1) 尤拉函式是積性函式,當正整數m,n互質時,滿足φ(mn)=φ(m)φ(n)。

(2) 當n為奇數時,有φ(2n)=φ(n)。

(3) n=∑ d|n φ(d)    ( d|n )。

(4) 對於給定的乙個質數p,φ(p)=p -1。則對於正整數 n = p^k ,φ(n) = p^k - p^(k -1)。

(5) 若(n % a == 0 && (n / a) mod a == 0) 則有:φ(n)=φ(n / a) * a。

(6) 若(n % a == 0 && (n / a) mod a != 0)  則有:φ(n)=φ(n / a) * (a - 1)。 (a 為質數)

主要利用以上性質(4)(5)(6),我們可以用遞推的方法按以下步驟來打出尤拉函式表。

(1) 記φ(1)=1。這是遞推步驟嗎。

(2) 根據性質(4),對於質數i,可直接得φ(i)=i-1,把i放入質數表prime中。

(3) 對於i,從頭開始列舉質數(思考為什麼列舉質數),根據性質(5)(6),當(i mod primej) != 0時,φ(i*primej) = φ(i)*(primej -1)

當列舉到(i mod primej) == 0時,φ(i*primej) = φ(i)*(primej),並停止(思考為什麼要停止),列舉下乙個i。

由此我們得到了打出尤拉函式表的主要**(變數的定義不在這裡展示)

1     phi[1]=1;2

for(int i=2;i<=n;i++)

7for(int j=1;j<=cnt&&prime[j]*i<=n;j++)14}

15}

可以簡單地得知時間複雜度是線性的o(n)。

利用打好的尤拉函式表,我們可以驗證它的以上幾個性質。

性質(2)

1

for(int i=n/2*2;i>1;i-=2)2

if((i/2)&1

)3 printf("

phi[%d] = %d = phi[%d/2] = phi[%d] = %d\n

",i,phi[i],i,i/2,phi[i/2]);

example

phi[38] = 18 = phi[38/2] = phi[19] = 18

phi[34] = 16 = phi[34/2] = phi[17] = 16

phi[30] = 8 = phi[30/2] = phi[15] = 8

phi[26] = 12 = phi[26/2] = phi[13] = 12

phi[22] = 10 = phi[22/2] = phi[11] = 10

phi[18] = 6 = phi[18/2] = phi[9] = 6

phi[14] = 6 = phi[14/2] = phi[7] = 6

phi[10] = 4 = phi[10/2] = phi[5] = 4

phi[6] = 2 = phi[6/2] = phi[3] = 2

phi[2] = 1 = phi[2/2] = phi[1] = 1

性質(3)

1

for(int i=1;i<=n;i++)

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

12if(i%j==0

)16 printf("

=%d\n

",temp);

17 }

example

1 = phi[1]( =1 ) =1

2 = phi[1]( =1 ) + phi[2]( =1 ) =2

3 = phi[1]( =1 ) + phi[3]( =2 ) =3

4 = phi[1]( =1 ) + phi[2]( =1 ) + phi[4]( =2 ) =4

5 = phi[1]( =1 ) + phi[5]( =4 ) =5

6 = phi[1]( =1 ) + phi[2]( =1 ) + phi[3]( =2 ) + phi[6]( =2 ) =6

7 = phi[1]( =1 ) + phi[7]( =6 ) =7

8 = phi[1]( =1 ) + phi[2]( =1 ) + phi[4]( =2 ) + phi[8]( =4 ) =8

9 = phi[1]( =1 ) + phi[3]( =2 ) + phi[9]( =6 ) =9

10 = phi[1]( =1 ) + phi[2]( =1 ) + phi[5]( =4 ) + phi[10]( =4 ) =10

尤拉函式總結 數論 尤拉函式

尤拉函式的定義 euler k 1,n 1 中與n互質的整數個數 eg euler 8 4,因為1,3,5,7均和8互質。可以推出以下公式 euler k p1 1 p2 1 pi 1 p1 a1 1 p2 a2 1 pi ai 1 k p1 1 p2 1 pi 1 p1 p2 pi k 1 1 p...

尤拉函式求法

法一 根號n做法 int phi int n if n 1 ans ans n n 1 return ans 法二 線性篩做法 寫在前面 對於尤拉函式有如下三條性質 p為素數 1 phi p p 1 2 當p與i互質時有 phi p i phi p phi i 3 當i p 0時有 phi p i ...

數論 尤拉函式

尤拉函式,用 n 表示 尤拉函式是求小於等於n的數中與n互質的數的數目 求n的尤拉函式時我們可以減去它的所有素數因子以及它的倍數 12 12 2 2 3 素數因子有2 3所以我們減掉2,3的倍數 2的倍數 2,4,6,8,10,12 3的倍數 3,6,9,12 顯然2,3存在重複項6,12 根據容斥...