用python多进程验证哥德巴赫猜想

本文通过遍历证明哥德巴赫强猜想,即任一大于2的偶数都可写成两个质数之和。

       具体哥德巴赫猜想的说明见百度百科

http://baike.baidu.com/link?url=UTeBqPjPHD9S5ydgNzTko7kcrF1mvc8SOssOBm04Vxcl1GlB9Hbs5p9LlVSwRy_alvzEeMbX4xJ7tFo9Z_WpHjVYXwlNQJXtgUU4NnptrQK2oIiBoKXJdjDfuBJ-Z5m0OvZ1cr-kvW4BtFZNwNsDIq

   下面是代码实现。通过分治的思想,把整个数据空间分段计算,因为是计算密集型任务,所以采取多进程。

import math
import time
from  multiprocessing import cpu_count
from multiprocessing import Pool


# 判断数字是否为质数
def isPrime(n):
    if n <= 1:
        return False
    for i in range(2, int(math.sqrt(n)) + 1):
        if n % i == 0:
            return False
    return True


# 验证大于2的偶数可以分解为两个质数之合
# T为元组,表示需要计算的数字区间
def GDBH(T):
    S = T[0]
    E = T[1]
    if S < 4:
        S = 4
    if S % 2 == 1:
        S += 1
    for i in range(S, E + 1, 2):
        isGDBH = False
        for j in range(i // 2 + 1): # 表示成两个质数的和,其中一个质数不大于1/2
            if isPrime(j):
                k = i - j
                if isPrime(k):
                    isGDBH = True
                    if i % 100000 == 0:  # 每隔10万个数打印一次
                        print('%d=%d+%d' % (i, j, k))
                    # print('%d=%d+%d' % (i, j, k))
                    break
        if not isGDBH:  # 打印这句话表示算法失败 或是猜想失败(怎么可能...)
            print('哥德巴赫猜想失败!!')
            break


# 对整个数字空间N进行 分段CPU_COUNT,每个进程分配一个CPU
def seprateNum(N, CPU_COUNT):
    list = [[i + 1, i + N // CPU_COUNT] for i in range(4, N, N // CPU_COUNT)]
    list[0][0] = 4
    if list[CPU_COUNT - 1][1] > N:
        list[CPU_COUNT - 1][1] = N
    return list


if __name__ == '__main__':
    N = 10 ** 6

    # 多进程
    time1 = time.clock()
    CPU_COUNT = cpu_count()  ##CPU内核数 本机为8
    pool = Pool(CPU_COUNT)
    sepList = seprateNum(N, CPU_COUNT)

    result = pool.map(GDBH, sepList)
    pool.close()
    pool.join()
    print('多线程耗时:%d s' % (time.clock() - time1))

    # 单线程
    time2 = time.clock()
    GDBH((4, N))
    print('单线程耗时:%d s' % (time.clock() - time2))

 结果展示:

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值