素數篩法系列之3 減少篩次數

2021-05-24 15:42:00 字數 1308 閱讀 6861

//篩法加速

接上一節, 篩某個素數的倍數的時候只需篩掉奇數倍數, 這樣計算量可

可減少一般, 再進一步優化, 不篩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...