Как оптимизировать мой код для суммирования чисел до бесконечности или очень больших чисел в определенной формуле ниже? - PullRequest
0 голосов
/ 17 мая 2018

Я пытаюсь закодировать формулу в python, чтобы определить испытания Бернулли с вероятностью успеха p.Формула выглядит следующим образом: https://imgur.com/gallery/IyqcYSr

Приведенный ниже код прекрасно работает для небольших чисел, например, если бы входное значение было outerSum(2,20,7,.25,.75), оно оценивалось бы примерно в 2,44 x 10 ^ -6 (что правильно, я проверил с помощью клена).

Однако моя проблема в том, что когда я запускаю его на больших числах (для которых я использую формулу), код не работает для него и выдает ошибку: ValueError: -inf + inf in fsum.

Myидеальный ввод будет outerSum(2,31290,1755,.25,.75), однако я получаю сообщение об ошибке сверху.Как оптимизировать мой код для суммирования чисел до бесконечности или очень больших чисел в определенной формуле ниже?Идеальный входной сценарий будет outerSum(2,31290,1755,.25,.75)

import math
from sympy import binomial
import numpy
def innerSum(k,n,x,y):
   #z = ((n - k * x - y) / k)

   f = []
   g = 0
   for j in range(0, int(math.floor(n - k * x - y / k))):
     b = math.pow(-1, j)
     c = binomial(y + 1, j)
     d = binomial(n - k * x - j * k, y)

     e = b * c * d
     f.append(e)
     g = math.fsum(f)

  return g

def outerSum(k,n,x,p,q):
  a = math.floor((n - k * x) / k)  # math.floor(((n-k*x)/k))
  a = int(a)
  b = (n - k * x)
  b = int(b)

  h = []

  for y in range(a, b + 1):
    c = math.pow(q, y)
    d = math.pow(p, n - y)
    e = binomial(y + x, x)

    f = innerSum(k, n, x, y)

    g = c*d*e*f
    h.append(g)
    i = math.fsum(h)
    #print(i)
  print(i)

outerSum(2,20,7,.25,.75)
...