求素数和的算法:很神奇,求大神解释一下代码.

来源:互联网 发布:新理念网络测试答案 编辑:程序博客网 时间:2024/06/05 05:34
# coding=utf-8from time import clockstart=clock()def P10(n):    r = int(n**0.5)    assert r*r <= n and (r+1)**2 > n    V = [n//i for i in range(1,r+1)]    V += list(range(V[-1]-1,0,-1))    S = {i:i*(i+1)//2-1 for i in V}    for p in range(2,r+1):        if S[p] > S[p-1]:  # p is prime            sp = S[p-1]  # sum of primes smaller than p            p2 = p*p            for v in V:                if v < p2: break                S[v] -= p*(S[v//p] - sp)    return S[n]print ("sum of primes under 10^9:",P10(10**9))finish=clock()print (finish-start,"seconds")
输出:('sum of primes under 10^9:', 24739512092254535L)(0.7917837753276741, 'seconds')

0.8秒求出了10亿内的素数和,答案是正确的,求解释!

0 0
原创粉丝点击