求质数表两方法之比较

用了两种方法来求指定范围内的所有质数,其效率之差别令我瞠目结舌。

第一种方法是对指定范围内 3 以上所有奇数做判断,看它是否质数,是,则将它加入质数列表。

第二种方法则是先贤早就给出的“筛法”。

程序如下:

MAX = 100
for i in range(6):
    //方法一
    MAX *= 10
    print MAX
    primes = [2]
    from datetime import datetime
    now1 = datetime.now()
    import math
    for n in xrange(3, MAX, 2):
        end = math.sqrt(n)
        for p in primes:
            if p <= end:
                if n % p == 0:
                    break
            else:
                primes += [n]
                # print n
                break
        else:
            # print n
            primes += [n]
    now2 = datetime.now()
    print now2 - now1
    print len(primes)

    //方法二
    primes = [2]
    rng = range(3, MAX, 2)
    now1 = datetime.now()
    for n in xrange(3, int(math.sqrt(MAX)+1), 2):
        if n == 0:
            continue
        for p in xrange(n * n, MAX, n * 2):
            rng[(p - 3) / 2] = 0
    for r in rng:
        if r:
            primes += [r]
    now2 = datetime.now()
    print now2 - now1
    print len(primes)
    print
 
运行结果如下:

1000
0:00:00
168
0:00:00
168

10000
0:00:00.078000
1229
0:00:00.015000
1229

100000
0:00:01.217000
9592
0:00:00.172000
9592

1000000
0:00:21.950000
78498
0:00:02.168000
78498

10000000
0:07:29.920000
664579
0:00:25.210000
664579

100000000

当指定范围为 100000000 时,在我的平板电脑上运行了一个半小时没有结果,一来是我的设备配置低,二来是该算法效率低。

当指定范围为 10000000 时,第一种方法所用时间是第二种方法的 449.92/25.21 倍,求得的质数个数是 664579 个。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值