在这个素数算法的总和中:
令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.
它不会导致任何索引异常吗?
感谢。 *我是一个蟒蛇新手
答案 0 :(得分:2)
S
是一个字典,正在使用密钥访问,使用与list-index访问类似的语法。 “关键”差异在于:
如果失败则返回KeyError(在本例中,p不是S中的键)
一个特定的值已经保存在S中以表示p - 注意构造函数中的冒号{i:i *(i + 1)// 2-1 for i in V}。键设置为V中的列表项,链接值设置为后面的数学操作的结果。
花括号{}表示正在构造一个Dictionary,冒号将键赋值与赋值分开。