Python 计算素数对数的程序

Python 计算素数对数的程序,python,math,Python,Math,数学规则表明我的“程序”给出了错误的答案 如果您能检查这段代码并告诉我它的问题,我将非常感激。我知道问题出在第ll=[]行之后的某个地方。我只是不能确定确切的原因。但我知道所有小于n的素数的对数之和小于n。我的程序违反了这个规则 代码如下: from math import log lp = [] ## create a list for n in range(2,10000): for x in range(2,n): if n % x == 0:

数学规则表明我的“程序”给出了错误的答案

如果您能检查这段代码并告诉我它的问题,我将非常感激。我知道问题出在第
ll=[]
行之后的某个地方。我只是不能确定确切的原因。但我知道所有小于n的素数的对数之和小于n。我的程序违反了这个规则

代码如下:

from math import log
lp = [] ## create a list
for n in range(2,10000):
    for x in range(2,n):
        if n % x == 0:
            break
    else:
        lp.append(n) ## fill that list with the primes
##print lp[500] found the value of lp[500]
ll = [] ## create a second list
for i in range(2, lp[500]):
        if i < 3581: ## this is the number corresponding to lp[500]
            i = log(i, )
            ll.append(i) ## fill the second list with logs of primes
print sum (ll), 3581, sum(ll)/3581`
从数学导入日志
lp=[]##创建一个列表
对于范围内的n(210000):
对于范围(2,n)内的x:
如果n%x==0:
打破
其他:
lp.append(n)##用素数填充该列表
##打印lp[500]找到lp[500]的值
ll=[]##创建第二个列表
对于范围(2,lp[500])内的i:
如果i<3581:##这是对应于lp[500]的数字
i=对数(i,)
ll.append(i)##用素数日志填充第二个列表
打印sum(ll)、3581、sum(ll)/3581`
我认为
i=log(i,)
将使用自然对数(e),您可能会对
log10(i)
(以10为底的对数)。 参见第9.2.2节,内置文档说明:

>>> from math import log
>>> log?
Type:       builtin_function_or_method
Base Class: <type 'builtin_function_or_method'>
String Form:<built-in function log>
Namespace:  Interactive
Docstring:
log(x[, base])

Return the logarithm of x to the given base.
If the base not specified, returns the natural logarithm (base e) of x.
数学导入日志中的
>>
>>>日志?
类型:内置函数或方法
基类:
字符串形式:
名称空间:交互式
文档字符串:
对数(x[,基])
将x的对数返回给给定的基数。
如果未指定底,则返回x的自然对数(底e)。

您的第二个列表不仅包含素数的日志,还包含2到
lp[500]
之间所有整数的日志,这是错误的:

for i in range(2, lp[500]): ## Gives all numbers from 2 to lp[500]
    if i < 3581:
        i = log(i, ) ## this changes i which is your loop variable!
        ll.append(i)

计算10000以下的素数需要多长时间?只要换半行,我就可以在0.11秒内计算出它们。只需将范围(2,n)中x的
更改为lp中x的
。如果你想再快一个数量级,就停在n的平方根处。在实现它们之前,试着理解这两个小变化。同样的算法,只是稍微优化了一点:(第三个变化,步骤设置为2,没有增加太多)。
for i in range(501): ## from 0 to 500
  ll.append( log(lp[i],) )