求质数表两方法之比较

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

第一种方法是对指定范围内 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 个。

猜你喜欢

转载自blog.csdn.net/qq_37183108/article/details/80833325