ó
~9­\c           @  sg   d  d l  m Z m Z d  d l m Z d  d l m Z m Z d „  Z d „  Z	 d „  Z
 e d „ Z d S(	   iÿÿÿÿ(   t   print_functiont   division(   t   defaultdict(   t   ranget   as_intc         C  s”   t  |  ƒ }  i d d |  f 6d |  d f 6} d } x[ t d |  d d ƒ D]B } | |  | d | } | | | |  | f <| |  | | f <qJ W| S(   sÒ  Return a dictionary containing pairs :math:`{(k1,k2) : C_kn}` where
    :math:`C_kn` are binomial coefficients and :math:`n=k1+k2`.

    Examples
    ========

    >>> from sympy.ntheory import binomial_coefficients
    >>> binomial_coefficients(9)
    {(0, 9): 1, (1, 8): 9, (2, 7): 36, (3, 6): 84,
     (4, 5): 126, (5, 4): 126, (6, 3): 84, (7, 2): 36, (8, 1): 9, (9, 0): 1}

    See Also
    ========

    binomial_coefficients_list, multinomial_coefficients
    i   i    i   (   R   R   (   t   nt   dt   at   k(    (    s8   lib/python2.7/site-packages/sympy/ntheory/multinomial.pyt   binomial_coefficients   s     *c         C  su   t  |  ƒ }  d g |  d } d } xK t d |  d d ƒ D]2 } | |  | d | } | | | <| |  | <q; W| S(   sL   Return a list of binomial coefficients as rows of the Pascal's
    triangle.

    Examples
    ========

    >>> from sympy.ntheory import binomial_coefficients_list
    >>> binomial_coefficients_list(9)
    [1, 9, 36, 84, 126, 126, 84, 36, 9, 1]

    See Also
    ========

    binomial_coefficients, multinomial_coefficients
    i   i   (   R   R   (   R   R   R   R   (    (    s8   lib/python2.7/site-packages/sympy/ntheory/multinomial.pyt   binomial_coefficients_list!   s    c   	      C  sî  t  |  ƒ }  t  | ƒ } |  s3 | r( i  Si d d 6S|  d k rI t | ƒ S|  d | k rx | d k rx t t |  | ƒ ƒ S| g d g |  d } i d t | ƒ 6} | r² d } n |  } x/| |  d k  ré| | } | rò d | | <| | d <n  | d k r'| | d c d 7<d } d } d } n4 | d 7} | d } | t | ƒ } | | c d 7<xX t | |  ƒ D]G } | | rk| | c d 8<| | t | ƒ 7} | | c d 7<qkqkW| d c d 8<| | | | d | t | ƒ <q» W| S(   sø  Return a dictionary containing pairs ``{(k1,k2,..,km) : C_kn}``
    where ``C_kn`` are multinomial coefficients such that
    ``n=k1+k2+..+km``.

    Examples
    ========

    >>> from sympy.ntheory import multinomial_coefficients
    >>> multinomial_coefficients(2, 5) # indirect doctest
    {(0, 5): 1, (1, 4): 5, (2, 3): 10, (3, 2): 10, (4, 1): 5, (5, 0): 1}

    Notes
    =====

    The algorithm is based on the following result:

    .. math::
        \binom{n}{k_1, \ldots, k_m} =
        \frac{k_1 + 1}{n - k_1} \sum_{i=2}^m \binom{n}{k_1 + 1, \ldots, k_i - 1, \ldots}

    Code contributed to Sage by Yann Laigle-Chapuy, copied with permission
    of the author.

    See Also
    ========

    binomial_coefficients_list, binomial_coefficients
    i   i   i    (    (   R   R	   t   dictt!   multinomial_coefficients_iteratort   tupleR   (	   t   mR   t   tt   rt   jt   tjt   startt   vR   (    (    s8   lib/python2.7/site-packages/sympy/ntheory/multinomial.pyt   multinomial_coefficients:   sJ    
	

	


$c         c  sá  t  |  ƒ }  t  | ƒ } |  d | k  s4 | d k rn t |  | ƒ } x—| j ƒ  D] \ } } | | f VqP Wnot | | ƒ } i  } x3 | j ƒ  D]% \ } } | | | t d | ƒ ƒ <q W| } | g d g |  d } | | ƒ } | t d | ƒ ƒ }	 | | |	 f V| rd }
 n |  }
 x¾ |
 |  d k  rÜ| |
 } |
 rVd | |
 <| | d <n  | d k r| |
 d c d 7<d }
 n |
 d 7}
 | |
 c d 7<| d c d 8<| | ƒ } | t d | ƒ ƒ }	 | | |	 f VqWd S(   sq  multinomial coefficient iterator

    This routine has been optimized for `m` large with respect to `n` by taking
    advantage of the fact that when the monomial tuples `t` are stripped of
    zeros, their coefficient is the same as that of the monomial tuples from
    ``multinomial_coefficients(n, n)``. Therefore, the latter coefficients are
    precomputed to save memory and time.

    >>> from sympy.ntheory.multinomial import multinomial_coefficients
    >>> m53, m33 = multinomial_coefficients(5,3), multinomial_coefficients(3,3)
    >>> m53[(0,0,0,1,2)] == m53[(0,0,1,0,2)] == m53[(1,0,2,0,0)] == m33[(0,1,2)]
    True

    Examples
    ========

    >>> from sympy.ntheory.multinomial import multinomial_coefficients_iterator
    >>> it = multinomial_coefficients_iterator(20,3)
    >>> next(it)
    ((3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), 1)
    i   i   i    N(   R   R   t   itemst   filtert   None(   R   R   t   _tuplet   mcR   R   t   mc1R   t   t1t   bR   R   (    (    s8   lib/python2.7/site-packages/sympy/ntheory/multinomial.pyR   „   s@    	

	
N(   t
   __future__R    R   t   collectionsR   t   sympy.core.compatibilityR   R   R	   R
   R   R   R   (    (    (    s8   lib/python2.7/site-packages/sympy/ntheory/multinomial.pyt   <module>   s   			J