2007年8月7日星期二

Big Prime number

HOHO~ 大数版本的 big_prime_judge ,使用了 Math::BigInt 模块。办公室的计算机 CPU 是 Celeron D 3G Hz ,计算超过 14 位的数就非常慢。文档中说使用  Math::BigInt::GMP 会快一些,但是我喜欢用标准库和纯 perl 的东西 ^^ ,何况如果需要计算更大的数值就要用 C++ 写了。

用 big_prime_judge 判断 100个 16位十进制数在 PIII 上耗时 9小时56分钟, 判断 100个 17位十进制数算了 20个小时,还没算出来的时候停电了 m( _ _ )m  下次没事的时候看看 java 的速度怎么样。

PIII 机器:
    Pentium III(Coppermine 864.793Hz   cache size: 256KB)
    RAM: 192 MB
    OS: Fedora Core 4 (kernel 2.6.11)


use Math::BigInt ;

sub big_prime_judge {
    my $n = $_[0];
    return 1 if ($n == 2);
    return 1 if ($n == 3);
    return 1 if ($n == 5);
    return 1 if ($n == 7);
    return 0 if ($n == 1);
    return 0 if ($n->copy->is_even());
    return 0 if ($n->copy->bmod(5) == 0 );
   
    my $factor = $n->copy->bsqrt() + 1;
    my $i = Math::BigInt->new(' 3');
    for (; $i<=$factor ; $i+=2)
    { return 0 if ($n->copy->bmod($i->copy()) == 0) }
    return 1;
}

没有评论: