Python 2.5.4: как найти сумму значений логарифма

Я изучаю Python 2.5.4, и мне нужно решить следующую проблему:

«Напишите программу, которая вычисляет сумму логарифмов всех простых чисел от 2 до некоторого числа n, и выведите сумму логарифмов простых чисел, числа n и отношения этих двух величин. Проверьте это для разных значения п."

Это то, что у меня есть до сих пор:

from math import *
n = raw_input('This is a logarithm ratio tester. Which number do you want to test? ')
for x in range(2,n):                            #picks numbers to test
    for divisor in range(2, 1+int(sqrt(x+1))):
        if x%divisor == 0:                      #checks if x is prime
            log(x)                              #computes log of prime

К сожалению, я не уверен, как реализовать функцию суммирования всех журналов. Я бы предположил, что когда у меня это будет, мне просто нужно завершить программу:

print 'Sum of the logs of the primes is',logsum
print 'n =',n
print 'Ratio of sum to n is',logsum/n

Или какой-то вариант. Но что было бы хорошим способом получить то, что я назвал логарифмической суммой? Обратите внимание, я изучаю программирование не больше недели, очень мало операторов/функций знаю наизусть, и я не математик. Если сомневаешься, считай, что я идиот. Спасибо!


person devonjones    schedule 16.02.2014    source источник
comment
Небольшое замечание: если вам не нужно поддерживать устаревшую кодовую базу, работающую на Python 2.5 или что-то в этом роде, вам следует действительно перейти на версию 2.7 или 3.3/3.4.   -  person senshin    schedule 17.02.2014
comment
Я бы с удовольствием обновился, но курс, который я сейчас изучаю, — это программа MIT OpenCourseWare для введения в программирование, и пока это хороший курс, он был создан в 2008 году. Наборы задач предполагают, что я буду использовать IDLE для Python 2.5. Я планирую обновиться, как только закончу изучение этих основ. ;)   -  person devonjones    schedule 17.02.2014


Ответы (3)


Вы должны проверить, является ли число простым, прежде чем вычислять его журнал, а затем добавить значение log(x) к переменной logsum следующим образом:

from math import *
logsum = 0
n = raw_input('This is a logarithm ratio tester. Which number do you want to test? ')
for x in range(2,n):                            #picks numbers to test
    isprime = True
    for divisor in range(2, 1+int(sqrt(x+1))):
        if x%divisor == 0:                      #checks if x is prime
            isprime = False                                  #computes log of prime
            break
    if isprime:
        logsum += log(x)

Кроме того, поскольку вы проверяете множество значений, возможно, реализация решета Эратосфена будет хороший способ продолжить обучение.

EDIT: Используя предложение Юрия Робла, код можно упростить до:

from math import *
logsum = 0
n = raw_input('This is a logarithm ratio tester. Which number do you want to test? ')
for x in range(2,n):                            #picks numbers to test
    for divisor in range(2, 1+int(sqrt(x+1))):
        if x%divisor == 0:                      #checks if x is prime
            break
    else:
        logsum += log(x)
person Vlad Schnakovszki    schedule 16.02.2014
comment
Вы можете использовать конструкцию for...else вместо логического значения isprime. - person Juri Robl; 17.02.2014
comment
Я мало использую Python, поэтому не знал об этой конструкции. Спасибо, что рассказали мне об этом. Каждый день узнавать что-то новое :) - person Vlad Schnakovszki; 17.02.2014
comment
Это был очень полезный ответ, спасибо; он не ввел ничего, чего бы я еще не знал, но он заполнил пробел в логике, который у меня был для написания программы в целом. Однако теперь у меня есть одна новая проблема: когда я запускаю программу и ввожу число для n после того, как оно запрошено, я получаю следующую ошибку. for x in range(2,n): TypeError: range() integer end argument expected, got str. - person devonjones; 17.02.2014
comment
О, и я думал об использовании решета в этом, но до сих пор я пытался придерживаться математики, которую я ясно помню из средней школы. Я боюсь кодировать вещи, которые я концептуально не понимаю, лол - person devonjones; 17.02.2014
comment
Плевать на вышесказанное. Я понял, что функция raw_input должна быть вложена внутрь int(), чтобы избежать ошибки типа. Теперь все готово. Спасибо всем! - person devonjones; 18.02.2014

Я бы обернул часть вашего кода в функции и исправил ваше определение простого числа:

def isprime(x):
  for j in range(2,1 + int(sqrt(x - 1))):
    if x%j == 0:
      return False
  return True

def primes(n):
    return [j for j in range(2, n) if isprime(n)]

logsum = 0
for p in primes(n):
    logsum += log(p)
person colcarroll    schedule 16.02.2014
comment
Если вы сохраните явную сумму вместо использования sum(), вы сможете распечатать результаты для различных n без необходимости начинать все сначала. - person John La Rooy; 17.02.2014

Обратите внимание, что log(2) + log(3) +... + log(n) = log(2*3*...*n)

Затем вы можете просто использовать решето Эратосфена, чтобы получить список простых чисел, перемножить их вместе, а затем взять логарифм этого произведения.

import math
import operator

def filter_primes(alist, newlist):
    for x in alist[1:]:
        if x%alist[0] != 0:
            newlist.append(x)
    return newlist

n = int(raw_input('This is a logarithm ratio tester. Which number do you want to test?'))
alist = range(2, n)
sieve_list = []
primes = [2]

while alist[0] < math.sqrt(n):
    a = filter_primes(alist, sieve_list)
    primes.append(a[0])
    alist = sieve_list
    sieve_list = []
for j in alist[1:]: primes.append(j)

product = reduce(lambda x, y: x*y, primes)
ans = math.log(product)

print 'The sum of the logs is: %d \nn is: %d \nThe ratio of these two quantities is: %s' %   (ans, n, float(ans/n))
person gobrewers14    schedule 17.02.2014