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?