
    wg                     ,    d dl mZ d Zd Zd ZefdZy)    )as_intc                     t        |       } d| fd| dfdi}d}t        d| dz  dz         D ]$  }|| |z
  dz   z  |z  }|x||| |z
  f<   || |z
  |f<   & |S )a  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
    r         r   rangendaks       ^/home/mcse/projects/flask/flask-venv/lib/python3.12/site-packages/sympy/ntheory/multinomial.pybinomial_coefficientsr      s    " 	q	A
QQFAA	A1adQh &!a%!)_q $%%!QU(aAqk& H    c                     t        |       } dg| dz   z  }d}t        d| dz  dz         D ]  }|| |z
  dz   z  |z  }|x||<   || |z
  <    |S )aL   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
    r   r   r   r	   s       r   binomial_coefficients_listr      sr      	q	A	
q1uA	A1adQh !a%!)_q !qQx Hr   c                    t        |       } t        |      }| s|ri S ddiS | dk(  rt        |      S | d|z  k\  r|dkD  rt        t        | |            S |gdg| dz
  z  z   }t	        |      di}|rd}n| }|| dz
  k  r||   }|r
d||<   ||d<   |dkD  r||dz   xx   dz  cc<   d}d}d}n%|dz  }|dz   }|t	        |         }||xx   dz  cc<   t        ||       D ]3  }||   s	||xx   dz  cc<   ||t	        |         z  }||xx   dz  cc<   5 |dxx   dz  cc<   ||z  ||d   z
  z  |t	        |      <   || dz
  k  r|S )a  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
     r   r   r   )r   r   dict!multinomial_coefficients_iteratortupler   )	mr
   trjtjstartvr   s	            r   multinomial_coefficientsr   7   s   : 	q	Aq	AIAwAv$Q''AaCxAE5a;<<	
qcQUmA	q1A
a!e)qTAaDAaD6a!eHMHAEAFAEE%(AaDAID ua 	At!	QuQx[ !			
 	
!	2v1qt8,%(1 a!e)2 Hr   c           	   #     K   t        |       } t        |      }| d|z  k  s|dk(  r%t        | |      }|j                         E d{    yt        ||      }i }|j                         D ]  \  }}|| |t        d|            <    |}|gdg| dz
  z  z   } ||      } |t        d|            }	|||	   f |rd}
n| }
|
| dz
  k  ru||
   }|
r
d||
<   ||d<   |dkD  r||
dz   xx   dz  cc<   d}
n|
dz  }
||
xx   dz  cc<   |dxx   dz  cc<    ||      } |t        d|            }	|||	   f |
| dz
  k  rtyy7 w)aq  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)
    r   r   Nr   )r   r   itemsfilter)r   r
   _tuplemcmc1r   r   r   t1br   r   s               r   r   r      sx    , 	q	Aq	A1Q3w!q&%a+88:%a+HHJ 	-DAq+,CvdA'(	-C1#Q-AY6$#$2a5kAA!a%i1B!!Av!a%AQ!	aDAIDBvdB'(Ar!u+! !a%i# 	s   AD?D=C4D?;D?N)sympy.utilities.miscr   r   r   r   r   r   r   r   r   <module>r)      s#    '42GT 49 ;r   