Python - 素数之和

时间:2015-12-24 16:34:27

标签: python primes

在这个素数算法的总和中:

  

令S(v,p)为剩余范围2到v的整数之和   用小于或等于p的所有素数进行筛分后。那就是S(v,p)   是v的整数之和,它是素数或者是乘积   素数大于p。

     如果p不是素数或者v小于p2,则S(v,p)等于S(v,p-1)。   否则(p prime,p2≤v)S(v,p)可以从S(v,p-1)计算得到   找到用p筛分时去除的整数之和。一个   如果它是p与另一个的乘积,则在此步骤中删除整数   没有小于p的除数的整数。这可以表示为

     

S(V,P)= S(V,P-1)-p(S(⌊v/p⌋,P-1)-S(P-1,P-1))

def P10(n):
    sqrt = int(n**0.5)
    V = [n//i for i in range(1,sqrt+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,sqrt+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]

我对这部分感到有点困惑:

if S[p] > S[p-1]:  # p is prime

是否意味着S按索引p访问了值? p的值范围从2到sqrt,而S得到它的指数来自V. 它不会导致任何索引异常吗?

感谢。 *我是一个蟒蛇新手

1 个答案:

答案 0 :(得分:2)

S是一个字典,正在使用密钥访问,使用与list-index访问类似的语法。 “关键”差异在于:

  1. 如果失败则返回KeyError(在本例中,p不是S中的键)

  2. 一个特定的值已经保存在S中以表示p - 注意构造函数中的冒号{i:i *(i + 1)// 2-1 for i in V}。键设置为V中的列表项,链接值设置为后面的数学操作的结果。

  3. 花括号{}表示正在构造一个Dictionary,冒号将键赋值与赋值分开。