免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: prolj
打印 上一主题 下一主题

求10的10次方以内的素数,怎么能在几小时内算出来结果? [复制链接]

论坛徽章:
0
61 [报告]
发表于 2009-04-23 00:08 |只看该作者
原帖由 tyc611 于 2009-4-22 23:45 发表

几个0不重要,我只是觉得测试结果很有趣:
(1) long long vs int
(2) VC vs GCC
你再看看结果

误差?还是两个差距大?明示

论坛徽章:
0
62 [报告]
发表于 2009-04-23 01:52 |只看该作者
wonderful!!!!

令,为什么我不能下载附件啊,提示为”对不起,请不要从外部链接下载本论坛的附件。“

原帖由 lbaby 于 2009-4-22 22:59 发表
http://blog.csdn.net/lbaby/archive/2009/04/22/4101835.aspx

使用lbaby筛,求10亿之内的所有素数(Yet Another Algorithm)


1,第一步思考:

只有个位数是 1 ,3 ,7 , 9 的数才可能是素数 -- (结 ...

论坛徽章:
1
NBA常规赛纪念章
日期:2015-05-04 22:32:03
63 [报告]
发表于 2009-04-23 09:55 |只看该作者
原帖由 lbaby 于 2009-4-22 22:59 发表
http://blog.csdn.net/lbaby/archive/2009/04/22/4101835.aspx

使用lbaby筛,求10亿之内的所有素数(Yet Another Algorithm)


1,第一步思考:

只有个位数是 1 ,3 ,7 , 9 的数才可能是素数 -- (结 ...

lbaby ,试下

论坛徽章:
0
64 [报告]
发表于 2009-04-23 10:31 |只看该作者
原帖由 obkof 于 2009-4-23 01:52 发表
wonderful!!!!

令,为什么我不能下载附件啊,提示为”对不起,请不要从外部链接下载本论坛的附件。“


me too

论坛徽章:
0
65 [报告]
发表于 2009-04-23 10:38 |只看该作者
写了一个,测试了一下,算10^9耗时50+秒

这还是在比较高端的机器上跑的结果,真不知7秒是怎么出来的



  1. #include "stdafx.h"


  2. #define LEN (sizeof(char) * 8)
  3. #define GETBIT(buffer, offset, bit) ( buffer[offset] & ( 128 >> bit ) )
  4. #define SETBIT(buffer, n) ( buffer[n / LEN] |= ( 128 >> (n % LEN) ) )


  5. int GetPrime()
  6. {
  7.         size_t MAX_NUM = 1e1;
  8.         size_t BORDER = (size_t) sqrt( (double) MAX_NUM);
  9.         size_t count = 0;

  10.         //分配空间并置0,如果分配空间不成功则需加大虚拟内存
  11.         char *buffer = new char [MAX_NUM / LEN + 1];
  12.         if (buffer == NULL)
  13.         {
  14.                 cerr << "new faile!" << endl;
  15.                 return 1;
  16.         }
  17.         memset(buffer, 0, MAX_NUM / LEN + 1);
  18.         buffer[0] = (char) 128;  //1不是素数,也不是合数

  19.         size_t  bit = 2, offset = 0;

  20.         //筛法找素数
  21.         for (size_t i = 2; i <= MAX_NUM; i++, bit++)
  22.         {
  23.                 //每8位进一个单元格
  24.                 if ( bit == LEN )
  25.                 {
  26.                         offset++;
  27.                         bit = 0;
  28.                 }
  29.                
  30.                 //找到一个素数
  31.                 if (!GETBIT(buffer, offset, bit))
  32.                 {
  33.                         count++;
  34.                        
  35.                         //所有能整除该素数的数全是合数
  36.                         for (size_t j = 2 * i; j <= MAX_NUM; j += i)
  37.                         {
  38.                                 SETBIT(buffer, j);
  39.                         }

  40.                         DEBUG_COUT(cout << i << ", ");
  41.                 }
  42.         }

  43.         DEBUG_COUT(cout << "\b\b " << endl);

  44.         cout << "total prime " << count << endl;

  45.         //释放空间
  46.         delete []buffer;

  47.         return 0;
  48. };

  49. int main(int argc, char *argv[])
  50. {
  51.         RUNTIME(GetPrime, ());

  52.         return 0;
  53. }

复制代码

论坛徽章:
0
66 [报告]
发表于 2009-04-23 10:45 |只看该作者
$time prime

total prime 50847535
GetPrime() takes 53765106

real    0m54.53s
user    0m53.77s
sys     0m0.00s

论坛徽章:
0
67 [报告]
发表于 2009-04-23 12:19 |只看该作者

回复 #25 dxcnjupt 的帖子

"????没看明白..........
那10的2次方以内的素数,是不是只要在10的1次方以内找就可以了,11,13,17呢?? "

2*3*5*7=210 >100=10的2次方
所以 11/2  11/3 11/5 11/7 都没除开 所以是质数
    例如 57/2 没除开 57/3=19 所以是合数。

论坛徽章:
0
68 [报告]
发表于 2009-04-23 12:19 |只看该作者

回复 #26 cugb_cat 的帖子

是的.

论坛徽章:
0
69 [报告]
发表于 2009-04-23 12:32 |只看该作者
原帖由 ubuntuer 于 2009-4-23 10:31 发表

me too


木有登陆,

论坛徽章:
0
70 [报告]
发表于 2009-04-23 15:21 |只看该作者
原帖由 lbaby 于 2009-4-22 22:59 发表
http://blog.csdn.net/lbaby/archive/2009/04/22/4101835.aspx

使用lbaby筛,求10亿之内的所有素数(Yet Another Algorithm)


1,第一步思考:

只有个位数是 1 ,3 ,7 , 9 的数才可能是素数 -- (结 ...


B,只存储个位数是 1,3,7,9的整数
这个其实和去掉偶数的方法一样,前期干掉一堆数。比去偶数法再删一个 个位数为5的
去偶数后第二次筛可以全干掉个位为5的
剩下的是否 乘还是加法筛没有看出很大差别

还是我理解错误,请直接贴一下代码。学习并测试一下
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP