to liangbch:
由于我们的代码实际上都没有输出素数,tprime的也一样,所以我修改了一下你的代码,否则没有可比性
统计素数的个数而不输出素数表,而我的代码里有2种方式,一种是仅筛法和统计每分段的素数,另一种是保留所有的bit位数组,且统计所有素数个数,程序最后可以检验0-N任何一个数是否为素数,不过计算2-2^30两者相差仅0.2秒而已。
你的代码比我的稍快,不过最快的应该还是GxQcn的。
改进后,仅统计个数
sift prime from 2 to n
n=?(n=0 will exit)1073741824
Total 54400028 in 1073741824
It take 1656 ms
sift prime from 2 to n
n=?(n=0 will exit)2147483648
Total 105097565 in 2147483648
It take 3500 ms- unsigned char bitcount_index_table[] =
- {
- 8, 7, 7, 6, 7, 6, 6, 5, 7, 6, 6, 5, 6, 5, 5, 4,
- 7, 6, 6, 5, 6, 5, 5, 4, 6, 5, 5, 4, 5, 4, 4, 3,
- 7, 6, 6, 5, 6, 5, 5, 4, 6, 5, 5, 4, 5, 4, 4, 3,
- 6, 5, 5, 4, 5, 4, 4, 3, 5, 4, 4, 3, 4, 3, 3, 2,
- 7, 6, 6, 5, 6, 5, 5, 4, 6, 5, 5, 4, 5, 4, 4, 3,
- 6, 5, 5, 4, 5, 4, 4, 3, 5, 4, 4, 3, 4, 3, 3, 2,
- 6, 5, 5, 4, 5, 4, 4, 3, 5, 4, 4, 3, 4, 3, 3, 2,
- 5, 4, 4, 3, 4, 3, 3, 2, 4, 3, 3, 2, 3, 2, 2, 1,
- 7, 6, 6, 5, 6, 5, 5, 4, 6, 5, 5, 4, 5, 4, 4, 3,
- 6, 5, 5, 4, 5, 4, 4, 3, 5, 4, 4, 3, 4, 3, 3, 2,
- 6, 5, 5, 4, 5, 4, 4, 3, 5, 4, 4, 3, 4, 3, 3, 2,
- 5, 4, 4, 3, 4, 3, 3, 2, 4, 3, 3, 2, 3, 2, 2, 1,
- 6, 5, 5, 4, 5, 4, 4, 3, 5, 4, 4, 3, 4, 3, 3, 2,
- 5, 4, 4, 3, 4, 3, 3, 2, 4, 3, 3, 2, 3, 2, 2, 1,
- 5, 4, 4, 3, 4, 3, 3, 2, 4, 3, 3, 2, 3, 2, 2, 1,
- 4, 3, 3, 2, 3, 2, 2, 1, 3, 2, 2, 1, 2, 1, 1, 0
- };
-
- // 由于统计个数和你的是反的,要处理一下
- for (i=0;i<256;i++)
- bitcount_index_table[i] = 8 - bitcount_index_table[i];
-
- static UINT64 GetPrimeFromSiftBuff2(const BYTE *siftBuff,UINT64 begin, UINT64 end,
- UINT64 currCount, int mode)
- {
- assert(begin % 30==0);
- DWORD endIdx;
-
- DWORD i,j;
- UINT64 pr=currCount;
- const BYTE maskArray[]={1,2,4,8,16,32,64,128};
- const BYTE remArray[]={1,7,11,13,17,19,23,29};
-
- endIdx=(DWORD)((end-begin)/30-1);
- if (mode==4)
- {
- for (i=0;i<=endIdx;i++)
- {
- BYTE keyBYTE;
- keyBYTE = siftBuff[i];
- pr += bitcount_index_table[keyBYTE];
- }
-
- i=endIdx+1;
- for (j=0;j<8;j++)
- {
- DWORD tmp=MUL30(i)+(DWORD)begin + remArray[j];
- if (tmp>end)
- break;
- if ( siftBuff[i] & maskArray[j] )
- {
- pr++;
- }
- }
- }
- else if (mode==8)
- {
- for (i=0;i<=endIdx;i++)
- {
- BYTE keyBYTE;
- keyBYTE = siftBuff[i];
- pr += bitcount_index_table[keyBYTE];
- }
-
- i=endIdx+1;
- for (j=0;j<8;j++)
- {
- UINT64 tmp=(UINT64)i *30I64+ begin + (UINT64)remArray[j];
- if (tmp>end)
- break;
- if ( siftBuff[i] & maskArray[j] )
- {
- pr++;
- }
- }
- }
- return pr;
- }
复制代码 |