Blackkitty 's Blog

我能吞下玻璃而不伤身体。

素数个数统计 使用位运算优化的 埃拉托色尼筛选法

素数个数统计 使用位运算优化的 埃拉托色尼筛选法

埃拉托色尼筛选法很常见,对于算法本身不做介绍了
注意,这里只是统计素数个数,省略了其他不必要的东西,不能直接用来判断素数

空间占用上约为没有使用位运算的1/8
时间上约为没有使用位运算的3/4

使用了为运算后,理论上时间复杂度高了,
但是在计算机上运行时,由于内存使用得到极大减少,
使得CPU Cache的命中率更高,所需要将内存加载到内部缓存的总次数减少(cpu读内存的速度要远慢于cpu读内部缓存以及位运算的速度),
从而节省了实际运行时间。

#include<stdio.h>
#include<time.h>

#define MAX 10000000
#define Mod_8 7
#define X (MAX/2+1)
#define BIT         //开启位模式

#ifdef BIT
#define _L (X/8)
#define _A (!(e[n >> 3] & z[n&Mod_8]))
#define _B (e[i >> 3] |= z[i&Mod_8])
char z[8] = { 1, 2, 4, 8, 16, 32, 64, 128 };
#else 
#define _L X
#define _A (!e[n])
#define _B (e[i] = 1)
#endif

char e[_L];
int n, m = 1, i, k;

int main(){
    clock_t t;

    printf("Waiting...\n");
    t = clock();

    for (n = 1; n < X; n++)
        if (_A && ++m)
            for (k = (n << 1) + 1, i = n + k; i < X; _B, i += k);

    printf("Count:%ld\nTime: %lf\n", m, (double)(clock() - t) / CLOCKS_PER_SEC);
    return 0;
}

**

如有不妥,欢迎指正

**

阅读更多
版权声明:本文为博主原创文章,转载请注明出处。 https://blog.csdn.net/c_duoduo/article/details/46779919
个人分类: 算法
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭