Este post fue probado por especialistas así aseguramos la exactitud de este ensayo.
Solución:
Esta pregunta es antigua, pero como ocupa un lugar destacado en los resultados de búsqueda, señalaré que scipy
tiene dos funciones para calcular los coeficientes binomiales:
scipy.special.binom()
-
scipy.special.comb()
import scipy.special # the two give the same results scipy.special.binom(10, 5) # 252.0 scipy.special.comb(10, 5) # 252.0 scipy.special.binom(300, 150) # 9.375970277281882e+88 scipy.special.comb(300, 150) # 9.375970277281882e+88 # ...but with `exact == True` scipy.special.comb(10, 5, exact=True) # 252 scipy.special.comb(300, 150, exact=True) # 393759702772827452793193754439064084879232655700081358920472352712975170021839591675861424
Tenga en cuenta que scipy.special.comb(exact=True)
usa números enteros de Python y, por lo tanto, puede manejar resultados arbitrariamente grandes.
En cuanto a la velocidad, las tres versiones dan resultados algo diferentes:
num = 300
%timeit [[scipy.special.binom(n, k) for k in range(n + 1)] for n in range(num)]
# 52.9 ms ± 107 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
%timeit [[scipy.special.comb(n, k) for k in range(n + 1)] for n in range(num)]
# 183 ms ± 814 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)each)
%timeit [[scipy.special.comb(n, k, exact=True) for k in range(n + 1)] for n in range(num)]
# 180 ms ± 649 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
(y para n = 300
los coeficientes binomiales son demasiado grandes para ser representados correctamente usando float64
números, como se muestra arriba).
Tenga en cuenta que a partir Python 3.8
la biblioteca estándar proporciona la math.comb
función para calcular el coeficiente binomial:
matemáticas.comb(n, k)
¿Cuál es el número de formas de elegir k elementos de n elementos sin repetición? n! / (k! (n - k)!)
:
import math
math.comb(10, 5) # 252
math.comb(10, 10) # 1
Aquí hay una versión que realmente usa la fórmula correcta. 🙂
#! /usr/bin/env python
''' Calculate binomial coefficient xCy = x! / (y! (x-y)!)
'''
from math import factorial as fac
def binomial(x, y):
try:
return fac(x) // fac(y) // fac(x - y)
except ValueError:
return 0
#Print Pascal's triangle to test binomial()
def pascal(m):
for x in range(m + 1):
print([binomial(x, y) for y in range(x + 1)])
def main():
#input = raw_input
x = int(input("Enter a value for x: "))
y = int(input("Enter a value for y: "))
print(binomial(x, y))
if __name__ == '__main__':
#pascal(8)
main()
…
Aquí hay una versión alternativa de binomial()
Escribí hace varios años que no usa math.factorial()
, que no existía en versiones anteriores de Python. Sin embargo, devuelve 1 si r no está en el rango (0, n+1).
def binomial(n, r):
''' Binomial coefficient, nCr, aka the "choose" function
n! / (r! * (n - r)!)
'''
p = 1
for i in range(1, min(r, n - r) + 1):
p *= n
p //= i
n -= 1
return p
Reseñas y puntuaciones del tutorial
Agradecemos que desees auxiliar nuestra ocupación ejecutando un comentario o puntuándolo te damos la bienvenida.