Saltar al contenido

Coeficiente binomial de Python

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:

  1. scipy.special.binom()
  2. 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 = 300los 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.8la 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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *