VBGood网站全文搜索 Google

搜索VBGood全站网页(全文搜索)

VB爱好者乐园(VBGood)

 找回密码
 立即注册
搜索
查看: 3783|回复: 3

Perl版筛法求素数(质数)

[复制链接]
 楼主| 发表于 2010-10-13 21:07:00 | 显示全部楼层 |阅读模式
筛法求素数很大程度是一种集合的减法操作,比如找出一个素数“3”,就得把后面所有是3的倍数的数删除。Perl中提供了 grep 操作为此提供了极大的便利,代码如下:
  1. #!/usr/bin/perl

  2. use 5.10.1;

  3. $n = <STDIN>;
  4. @buffer = 2 .. $n;

  5. while ($buffer[0] ** 2 <= $n) {
  6.         push @primes, shift @buffer;
  7.         @buffer = grep { $_ % $primes[$#primes] } @buffer;
  8. }

  9. say "@primes @buffer";
复制代码




在我的PC上,算10W数量级的还是很快的。
发表于 2010-10-14 11:16:32 | 显示全部楼层
有多快?

擂台上高手VB求素数的方法:10亿 400毫秒以内
回复 支持 反对

使用道具 举报

发表于 2010-10-14 11:18:17 | 显示全部楼层
MATLAB版, BASE-6筛法


  1. function p = prime6(n)
  2. %PRIME6 Generate list of prime numbers.
  3. %   PRIME6(N) is a row vector of the prime numbers less than or
  4. %   equal to N.
  5. if length(n)~=1, error('N must be a scalar'); end
  6. m=floor(n/3); m1=floor(sqrt(n)/3);
  7. g = 1:m;
  8. Q=5; T=2;
  9. for k = 1:m1
  10.    P=Q; Q=Q+T; T=6-T;
  11.    if g(k)
  12.       M=floor((P^2-1)/3);
  13.       W=floor((P*Q-1)/3);
  14.       g(M:2*P:m) = 0; g(W:2*P:m) = 0;
  15.    end
  16. end
  17. g=g(g>0); p=[2 3 4*g+1-floor(g/2)*2];
  18. p=p(p<=n);
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-10-14 18:54:06 | 显示全部楼层
2# Igawk
用脚本语言,快的是“开发效率”。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

文字版|手机版|小黑屋|VBGood  

GMT+8, 2023-3-22 04:33

VB爱好者乐园(VBGood)
快速回复 返回顶部 返回列表