2013-11-02 63 views
-1

我碰到這個算法測試素性通過審判庭我完全理解這種算法請解釋審判庭如何工作的素性測試

static boolean isPrime(int N) { 
    if (N < 2) 
     return false; 
    for (int i = 2; i <= Math.sqrt(N); i++) 
     if (N % i == 0) 
      return false; 
    return true; 
} 

它工作得很好。但後來我發現了另一個效果很好的另一個,但我並不完全理解它背後的邏輯。

static boolean isPrime(int N) { 
    if (N < 2) 
     return false; 
    for (int i = 2; i * i<N; i++) 
     if (N % i == 0) 
      return false; 
    return true; 
} 

好像i *i < N行爲就像i <= Math.sqrt(N)。如果是這樣,爲什麼?

+5

'i <= sqrt(N)'<=>'i²<= N'因爲函數sqrt在其域定義上嚴格增加。 –

+2

「如果是這樣,爲什麼?」對'i <= Math.sqrt(N)'方程的兩邊進行平方。 – user2864740

+1

'我*我

回答

1

是的,你是對的,那些是相同的,如果你把第一個方程的兩個部分平方,明顯的方程式i <= Math.sqrt(N)可以被整數改寫爲i * i <= N
, ,即a < b等於a * a < b * b,對於正a,b;

+0

kiruwka非常感謝你的幫助,我不敢相信我錯過了 –

1

順便說一句,你可以用一些調整,加快你的代碼,如果你覺得實在是太慢了:

static boolean isPrime(int N) { 
    if (N <= 1) 
     return false; 
    if (N % 2 == 0) 
     return N == 2; 
    for (int i = 3; i <= Math.sqrt(N); i += 2) 
     if (N % i == 0) 
      return false; 
    return true; 
} 

這個版本確實爲陰性和可分2特殊測試,然後只能通過劃分從那時起的奇數:3,5,7,...(注意「+ = 2」)。

+1

想象一下,如果N是4,你提出的調整將在測試中失敗 –

+0

@mister_dani哎呀!感謝您的更正。我編輯了我的代碼。 – rossum