2011-11-14 2 views
3

수학 규칙은 "프로그램"이 잘못된 답을 제공함을 보여줍니다.프로그램 소수의 로그 계산

이 작은 코드를 확인하고 문제를 알려 주시면 매우 감사드립니다. 나는 문제가 라인 ll = [] 이후 어딘가에 있다는 것을 안다. 나는 그 정확한 원인을 정확하게 지적 할 수 없다. 그러나 나는 이 n보다 작은 모든 소수의 로그의 합이 n보다 작다는 것을 알고 있습니다. 내 프로그램이이 규칙을 위반합니다. 내가 i=log(i,) 당신이 (= 기본 10 로그) log10(i)에 관심이있을 수있는 자연 로그 (e)를 사용합니다 생각

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` 
+0

소수 10000까지 계산하는 데 얼마나 걸리나요? 하나의 하프 라인 변경으로 0.11 초로 계산할 수 있습니다. 그냥'for x in range (2, n) :'을'for x in lp :'로 변경하십시오. 다른 크기로 빨리 가고 싶다면 n의 제곱근에서 멈추십시오. 구현하기 전에이 두 가지 작은 변화를 이해하십시오. https://gist.github.com/1347515 (3 번째 변경, 2로 설정된 단계는 그다지 추가하지 않음)와 같이 조금 더 최적화 된 동일한 알고리즘입니다. – rplnt

답변

0

빌드는 말한다 참조 :

>>> 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. 
6

귀하의 두 번째 목록은 소수의 로그를 포함하지 않는, 그것은 2 lp[500] 사이의 모든 정수의 로그가 포함되어 있습니다.

1

이것은 잘못된 것입니다 :

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) 

은 다음과 같아야합니다

for i in range(501): ## from 0 to 500 
    ll.append(log(lp[i],)) 
1

귀하의 범위 발현

for i in range(2, lp[500]): 

lp의 500 요소에 2까지의 모든 수로 확장 (전용) . 올바른 결과를 얻을해야

for i in lp: 

를 사용

.

관련 문제