关闭

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

标签: 埃拉托色尼筛选法素数优化算法
1347人阅读 评论(0) 收藏 举报
分类:

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

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

空间占用上约为没有使用位运算的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;
}

**

如有不妥,欢迎指正

**

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:137460次
    • 积分:1020
    • 等级:
    • 排名:千里之外
    • 原创:31篇
    • 转载:2篇
    • 译文:0篇
    • 评论:121条
    文章分类
    最新评论