//篩法加速
接上一節, 篩某個素數的倍數的時候只需篩掉奇數倍數, 這樣計算量可
可減少一般, 再進一步優化, 不篩3的倍數, 只篩6k+1, 6k+5 之類素數,
計算量只有原來2/3.
static void crossoutfactormod6(uchar bitarray, const uint64 start,
const int leng, int factor)
else if (start <= factor)
//篩除3的倍數
const int bits = leng >> 1;
if (factor <= 3)
return ;
}const int mrid6 = ((start + s1) / factor) % 6;
s1 >>= 1;
int s2 = s1;
if (mrid6 == 1) else if (mrid6 == 3) else
+ 1, 6k + 5 number will be corssed out
for (factor *= 3; s2 <= bits;)
if (s1 <= bits)
}//比上面的模6進一步, 採用模30的篩法, 計算量再減小1/5.(1/3 ----> 8/30)
static void crossoutfactormod30(uchar bitarray, const uint64 start,
const int leng, int factor)
else if (start <= factor)
//篩除3,5的倍數
const int bits = leng >> 1;
if (factor <= 5)
return ;
}int rid30 = (offset + start) / factor % 30;
//找到第乙個數為30k + 1的數offset
while (rid30 < 31 & offset < leng)
//按模30餘1,7,11,13,1,19,23,29的篩
offset >>= 1;
while (offset + 15 * factor <= bits)
//篩除剩下幾個.
uint m = 0x13212123;//模30餘數, 4bit壓縮
while (offset <= bits)
}測試表明這兩個函式實現比原來奇數版本快近1/3, 基本符合預期.
在迴圈裡面每次篩的更多,減小迴圈也提高效能(相當於收到迴圈展開)
素數篩法系列之5 完整實現
include include include include define st 7 define move 4 define blocksize 30030 17 2 2 3 5 7 11 13 17 510510 define maxm blocksize move 1 define set ...
素數之篩法
本文主要介紹總結一下判定素數過程中使用的兩種篩選方法 eratosthenes篩法 sieve of eratosthenes 和eular篩法 sieve of euler 對,我是來騙訪問量的!o o 素數的倍數一定不是素數 i23 4567 891011 1213 1415 1617 1819...
演算法之素數篩法
1 方法一 判斷是否是乙個素數 int isprime int a 計算列舉上界,為防止double值帶來的精度損失,所以採用根號值取整後再加1,即寧願多列舉乙個,也不願少列舉乙個數 2 方法二 判斷是否是乙個素數 mark 標記陣列 index 素數個數 int prime else return...