Beispiel #1
0
def multinomial(n, k):
    """
    Returns the multinomial coefficient.

    Input:
        n: A positive integer
        k: A list or tuple of positive integers
    Returns:
        This returns the multinomial coefficient (n, k1, k2, ..., km) defined by
        n! / (k1! * k2! * ... * km!), where k1 + k2 + ... + km == n. If sum(k)
        != n, then the other elements of k are all assumed to be 1.

    Examples:
        >>> multinomial(6, [3, 3])
        20
        >>> multinomial(6, [2, 2, 2])
        90
    """
    if sum(k) > n:
        raise ValueError('Too many ks')
    elif len(k) == 0:
        raise ValueError('Not enough ks')

    num = factorial(n)
    den = 1
    for e in k:
        den *= factorial(e)
    return num / den
Beispiel #2
0
    def test_factorial(self):
        self.assertRaisesRegexp(ValueError, "factorial: Must have n >= 0.", factorial, -1)

        values = [
            1, 2, 6, 24, 120, 720, 5040, 40320, 362880, 3628800, 39916800, 479001600, 6227020800, 87178291200,
            1307674368000, 20922789888000, 355687428096000, 6402373705728000, 121645100408832000, 2432902008176640000,
            51090942171709440000, 1124000727777607680000, 25852016738884976640000, 620448401733239439360000,
            15511210043330985984000000, 403291461126605635584000000, 10888869450418352160768000000,
            304888344611713860501504000000, 8841761993739701954543616000000, 265252859812191058636308480000000,
            8222838654177922817725562880000000, 263130836933693530167218012160000000,
            8683317618811886495518194401280000000, 295232799039604140847618609643520000000,
            10333147966386144929666651337523200000000, 371993326789901217467999448150835200000000,
            13763753091226345046315979581580902400000000, 523022617466601111760007224100074291200000000,
            20397882081197443358640281739902897356800000000, 815915283247897734345611269596115894272000000000,
            33452526613163807108170062053440751665152000000000, 1405006117752879898543142606244511569936384000000000,
            60415263063373835637355132068513997507264512000000000,
            2658271574788448768043625811014615890319638528000000000,
            119622220865480194561963161495657715064383733760000000000,
            5502622159812088949850305428800254892961651752960000000000,
            258623241511168180642964355153611979969197632389120000000000,
            12413915592536072670862289047373375038521486354677760000000000,
            608281864034267560872252163321295376887552831379210240000000000,
            30414093201713378043612608166064768844377641568960512000000000000
        ]

        computed = [factorial(k) for k in xrange(1, 51)]

        self.assertEqual(values, computed)
Beispiel #3
0
    def test_factorial(self):
        self.assertRaisesRegexp(ValueError, "factorial: Must have n >= 0.", factorial, -1)

        values = [
            1, 2, 6, 24, 120, 720, 5040, 40320, 362880, 3628800, 39916800, 479001600, 6227020800, 87178291200,
            1307674368000, 20922789888000, 355687428096000, 6402373705728000, 121645100408832000, 2432902008176640000,
            51090942171709440000, 1124000727777607680000, 25852016738884976640000, 620448401733239439360000,
            15511210043330985984000000, 403291461126605635584000000, 10888869450418352160768000000,
            304888344611713860501504000000, 8841761993739701954543616000000, 265252859812191058636308480000000,
            8222838654177922817725562880000000, 263130836933693530167218012160000000,
            8683317618811886495518194401280000000, 295232799039604140847618609643520000000,
            10333147966386144929666651337523200000000, 371993326789901217467999448150835200000000,
            13763753091226345046315979581580902400000000, 523022617466601111760007224100074291200000000,
            20397882081197443358640281739902897356800000000, 815915283247897734345611269596115894272000000000,
            33452526613163807108170062053440751665152000000000, 1405006117752879898543142606244511569936384000000000,
            60415263063373835637355132068513997507264512000000000,
            2658271574788448768043625811014615890319638528000000000,
            119622220865480194561963161495657715064383733760000000000,
            5502622159812088949850305428800254892961651752960000000000,
            258623241511168180642964355153611979969197632389120000000000,
            12413915592536072670862289047373375038521486354677760000000000,
            608281864034267560872252163321295376887552831379210240000000000,
            30414093201713378043612608166064768844377641568960512000000000000
        ]

        computed = [factorial(k) for k in xrange(1, 51)]

        self.assertEqual(values, computed)