一種肥腸快的判斷素數方法
阿新 • • 發佈:2022-03-16
容易證明,大於6的素數一定都在6的兩側,即6i + 1 或 6i - 1,而6i + 2 到 6i + 4 一定不是素數。因為6i + 2 = 2 (3i + 1), 6i + 3 = 3(2i + 1), 6i + 4 = 2(3i + 2)。
那麼由這個結論,結合傳統的判斷素數方法(如下):
bool prime(int index) { for(int i=2;i<=sqrt(index);++i) if(index % i == 0) return false; return true; }
我們可以把i從每次增長1優化成每次增長6,並且大於6而不是6兩邊的數可以直接判斷為合數。
優化後的判斷素數程式碼如下:
bool prime(int index) { //忽略了1,有需要自己加個判斷 if(index <= 3) return true; if(index % 6 != 1 && index % 6 != 5) return false; //不是6兩邊的數不是素數 int size = sqrt(index); for(int i=5;i<=size;i += 6) //6兩邊的數也不一定是素數 if(index % i == 0 || index % (i+2) == 0) returnfalse; return true; }
優化後的效率是優化前的兩倍還高!