关闭

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

标签: 埃拉托色尼筛选法素数优化算法
1666人阅读 评论(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
查看评论

埃拉托色尼筛选法

最近在复习算法,求素数是一个很常用的算法。不禁引发了我的一些思考。     想到大一的时候用暴力枚举法求素数了,埃式筛选法求素数是一个比较好的算法。     在网上看了一下,没有把这个算法讲的比较清晰的博客,于是我打算自己梳理一下。   ...
  • luoshengkim
  • luoshengkim
  • 2015-03-25 19:46
  • 2704

数组位运算求任意区间内素数的个数

  • 2013-08-17 16:33
  • 3KB
  • 下载

C语言求质数的算法

qianya 上次被出了一题质数的C语言求解题目,当时用了最粗暴的算法,回来仔细参考资料,其实答案有很多种: 1,小学生版本:判断 x 是否为质数,就从 2 一直算到 x-1。 static rt_uint32_t array1[ARRAY_LEN]; void func1(void) { ...
  • kyo34080800
  • kyo34080800
  • 2014-06-13 12:38
  • 7518

找质数算法之埃拉托色尼筛选法(Sieve of Eratosthenes算法)

一、算法原理 一个合数总是可以分解成若干个质数的乘积,那么如果把质数(最初只知道2是质数)的倍数都去掉,那么剩下的就是质数了。 二、步骤 (1)先把1删除(1既不是质数也不是合数) (2)读取队列中当前最小的数2,然后把2的倍数删去 (3)读取队列中当前最小的数3,然后把3的倍数删去 (...
  • xiaoquantouer
  • xiaoquantouer
  • 2016-07-03 23:51
  • 2889

埃拉托色尼筛选法python实现

埃拉托色尼筛选法求一定范围内自然数中的素数: 1、首先取得大于2的所有自然数的数列。 2、在数列中去掉所有大于2并且可以被2整除的数字,得到新数列。 3、在新数列中去掉所有比第一位大但是可以被第一位数整除的数字,得到新数列。 4、反复执行步骤3即可得到所有的素数。 #生成一个3开始的奇数数列 d...
  • streetballerym
  • streetballerym
  • 2015-10-09 00:04
  • 707

筛子法求质数

给你一个自然数N,求[6,N]之内的所有素数中,两两之和为偶数的那些偶数。 #include using namespace std; //筛子法求质数 可以参考亲和数 //6~N的质数,打印两两质数为偶数的所有这些偶数 //因为质数除开2以外都是奇数,那么大于6的偶数都是奇数,那么把6~N之...
  • pipi666661
  • pipi666661
  • 2013-12-27 18:31
  • 1567

素数筛选法之埃拉托色尼筛

埃拉托色尼筛选法 下面求1-100的所有素数 Codes 1: #include #include #define true 1 #define false 0 int main() { int i,j,prime[101]; for(i=0; i<=100; i++...
  • TTchengcheng
  • TTchengcheng
  • 2015-12-01 17:07
  • 451

Eratosthenes筛选法与欧拉筛选法(整理)

Eratosthenes筛选法与欧拉筛选法
  • u012102306
  • u012102306
  • 2017-05-08 15:43
  • 536

埃拉托色尼素数筛法

1.算法原理 埃拉托色尼素数筛法是有古希腊数学家发明的一种快速求解范围内所有的素数的算法 在我们讲解埃拉托色尼素数筛法之前,我们需要了解一下朴素的求素数的算法的工作原理 首先: 对于朴素的求素数的算法我们有过编程基础的人都会知道算法的原理很简单,首先从定义出发,一个数既然是素数那么就说明这个数除...
  • ltyqljhwcm
  • ltyqljhwcm
  • 2016-10-17 13:12
  • 1477

使用埃拉托色尼筛选法(Eratosthenes)得到素数

什么是埃拉托色尼筛选法(Eratosthenes) ? 解答:要用这种方法确定素数,就要列出所有小于等于N(大于1)的整数,然后除去所有小于等于N的平方根的素数的所有倍数。 例如:要确定小于100 的 素数,从 2 开始作为第一个素数,然后写出从 3 — 100 的奇数(不必写...
  • baidu_33725271
  • baidu_33725271
  • 2017-05-11 16:19
  • 250
    个人资料
    • 访问:214702次
    • 积分:1219
    • 等级:
    • 排名:千里之外
    • 原创:31篇
    • 转载:2篇
    • 译文:0篇
    • 评论:143条
    文章分类
    最新评论