Computações de log em Python

Estou procurando calcular algo como:

Ondef(i) é uma função que retorna um número real em[-1,1] para qualqueri no{1,2,...,5000}.

Obviamente, o resultado da soma está em algum lugar[-1,1], mas quando não consigo computar em Python usando codificação direta, como0.55000 torna-se0 ecomb(5000,2000) torna-seinf, que resultam na soma computada se transformando emNaN.

A solução necessária é usar o log nos dois lados.

Isso está usando a identidadea × b = 2log(a) + log(b), se eu pudesse calcularlog(a) elog(b) Eu poderia calcular a soma, mesmo quea é grande eb está quase0.

Acho que o que estou perguntando é se existe uma maneira fácil de calcular

log2(scipy.misc.comb(5000,2000))

Para que eu pudesse calcular minha soma simplesmente

sum([2**(log2comb(5000,i)-5000) * f(i) for i in range(1,5000) ])

A solução da @ abarnert, enquanto trabalha para a figura 5000, resolve o problema aumentando a precisão na qual o pente é calculado. Isso funciona para este exemplo, mas não é dimensionado, pois a memória necessária aumentaria significativamente se, em vez de 5000, tivéssemos 1e7, por exemplo.

Atualmente, estou usando uma solução alternativa feia, mas mantém baixo o consumo de memória:

log2(comb(5000,2000)) = sum([log2 (x) for x in 1:5000])-sum([log2 (x) for x in 1:2000])-sum([log2 (x) for x in 1:3000])

Existe uma maneira de fazer isso em uma expressão legível?

questionAnswers(3)

yourAnswerToTheQuestion