Ë
    7^(h™  ã                  ó|  — d dl mZ d dlmZ d dlmZmZmZmZ d dl	m
Z
 d dlmZmZmZ d dlmZ d dlmZmZmZ d dlmZ d d	lmZ d d
lmZ d dlmZ d dlmZ d dl m!Z"m#Z#m$Z%  G d„ de«      Z& G d„ de&«      Z! G d„ de&«      Z' G d„ de&«      Z( G d„ de&«      Z) G d„ de&«      Z* G d„ de&«      Z+e*Z,e+Z- G d„ de&«      Z.y)é    )Úannotations)Úreduce)ÚSÚsympifyÚDummyÚMod)Úcacheit)ÚDefinedFunctionÚArgumentIndexErrorÚ	PoleError)Ú	fuzzy_and)ÚIntegerÚpiÚI)ÚEq)Úgmpy)Úsieve)Úbinomial_mod)ÚPoly)Ú	factorialÚprodÚsqrtc                  ó   — e Zd ZdZd„ Zy)ÚCombinatorialFunctionz(Base class for combinatorial functions. c                ó^   — ddl m}  || «      }|d   } ||«      |d    || «      z  k  r|S | S )Nr   )ÚcombsimpÚmeasureÚratio)Úsympy.simplify.combsimpr   )ÚselfÚkwargsr   Úexprr   s        úf/var/www/skyplay_api_hub/venv/lib/python3.12/site-packages/sympy/functions/combinatorial/factorials.pyÚ_eval_simplifyz$CombinatorialFunction._eval_simplify   s=   € Ý4ñ ˜‹~ˆØ˜Ñ#ˆÙ�4‹=˜F 7™O©G°D«MÑ9Ò9ØˆKØˆó    N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r$   © r%   r#   r   r      s
   „ Ù2ór%   r   c                  óž   — e Zd ZU dZdd„Zg d¢Zg Zded<   ed„ «       Z	ed„ «       Z
ed„ «       Zd	„ Zd
„ Zdd„Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zy)r   a£  Implementation of factorial function over nonnegative integers.
       By convention (consistent with the gamma function and the binomial
       coefficients), factorial of a negative integer is complex infinity.

       The factorial is very important in combinatorics where it gives
       the number of ways in which `n` objects can be permuted. It also
       arises in calculus, probability, number theory, etc.

       There is strict relation of factorial with gamma function. In
       fact `n! = gamma(n+1)` for nonnegative integers. Rewrite of this
       kind is very useful in case of combinatorial simplification.

       Computation of the factorial is done using two algorithms. For
       small arguments a precomputed look up table is used. However for bigger
       input algorithm Prime-Swing is used. It is the fastest algorithm
       known and computes `n!` via prime factorization of special class
       of numbers, called here the 'Swing Numbers'.

       Examples
       ========

       >>> from sympy import Symbol, factorial, S
       >>> n = Symbol('n', integer=True)

       >>> factorial(0)
       1

       >>> factorial(7)
       5040

       >>> factorial(-2)
       zoo

       >>> factorial(n)
       factorial(n)

       >>> factorial(2*n)
       factorial(2*n)

       >>> factorial(S(1)/2)
       factorial(1/2)

       See Also
       ========

       factorial2, RisingFactorial, FallingFactorial
    c                ó˜   — ddl m}m} |dk(  r2 || j                  d   dz   «       |d| j                  d   dz   «      z  S t	        | |«      ‚)Nr   )ÚgammaÚ	polygammaé   )Ú'sympy.functions.special.gamma_functionsr-   r.   Úargsr   )r    Úargindexr-   r.   s       r#   Úfdiffzfactorial.fdiffU   sJ   € ßNØ�qŠ=Ù˜Ÿ™ 1™¨Ñ)Ó*©9°Q¸¿	¹	À!¹ÀqÑ8HÓ+IÑIÐIä$ T¨8Ó4Ð4r%   )!r/   r/   r/   é   r4   é   é   é#   r7   i;  é?   iµ  éç   i»  i­  é#  r:   iS« i{/  i!† im´  iñÌ isX iUò iÇP
 ioãikÖ iI�i/„L iSùªi}î“ é#áér;   z	list[int]Ú_small_factorialsc                óð  — |dk  r| j                   |   S t        t        |«      «      g }}t        j                  d|dz   «      D ]8  }d|}}	 ||z  }|dkD  r|dz  dk(  r||z  }nnŒ|dkD  sŒ(|j                  |«       Œ: t        j                  |dz   |dz  dz   «      D ]  }||z  dz  dk(  sŒ|j                  |«       Œ! t        t        j                  |dz  dz   |dz   «      «      }t        |«      }||z  S )Né!   r4   r/   r   é   )Ú_small_swingÚintÚ_sqrtr   Ú
primerangeÚappendr   )	ÚclsÚnÚNÚprimesÚprimeÚpÚqÚ	L_productÚ	R_products	            r#   Ú_swingzfactorial._swingd   s  € àˆrŠ6Ø×#Ñ# AÑ&Ð&äœE !›H› rˆvˆAä×)Ñ)¨!¨Q°©UÓ3ò %�Ø˜!�1�àØ˜%‘K�Aà˜1’uØ˜q™5 Aš:Ø ™J™Aàð ð �q“5Ø—M‘M !Õ$ð%ô ×)Ñ)¨!¨a©%°°A±¸±Ó:ò )�Ø˜‘J !Ñ# qÓ(Ø—M‘M %Õ(ð)ô œU×-Ñ-¨a°©d°Q©h¸¸A¹Ó>Ó?ˆIÜ˜V›ˆIà˜YÑ&Ð&r%   c                ó`   — |dk  ry| j                  |dz  «      dz  | j                  |«      z  S )Nr?   r/   )Ú
_recursiverN   )rE   rF   s     r#   rP   zfactorial._recursiveƒ   s1   € àˆqŠ5Øà—N‘N 1 a¡4Ó(¨!Ñ+¨S¯Z©Z¸«]Ñ:Ð:r%   c                ó¦  — t        |«      }|j                  �r9|j                  rt        j                  S |t        j
                  u rt        j
                  S |j                  rî|j                  rt        j                  S |j                  }|dk  r\| j                  s3d}t        dd«      D ]"  }||z  }| j                  j                  |«       Œ$ | j                  |dz
     }t%        |«      S t        � t        j                  |«      }t%        |«      S t        |«      j!                  d«      }| j#                  |«      d||z
  z  z  }t%        |«      S y y )Né   r/   Ú1r?   )r   Ú	is_NumberÚis_zeror   ÚOneÚInfinityÚ
is_IntegerÚis_negativeÚComplexInfinityrJ   r<   ÚrangerD   Ú_gmpyÚfacÚbinÚcountrP   r   )rE   rF   ÚresultÚiÚbitss        r#   Úevalzfactorial.evalŠ   s)  € ä�A‹Jˆà�;‹;Ø�yŠyÜ—u‘u�Ø”a—j‘j‘Ü—z‘zÐ!Ø—’Ø—=’=Ü×,Ñ,Ð,àŸ™�Aà˜2’vØ"×4Ò4Ø%&˜FÜ%*¨1¨b£\ò E Ø &¨!¡ Ø #× 5Ñ 5× <Ñ <¸VÕ DðEð "%×!6Ñ!6°q¸±sÑ!;˜ô$ # 6›?Ð*ô Ð*Ü!&§¡¨1£˜ô # 6›?Ð*ô  # 1›vŸ|™|¨CÓ0˜Ø!$§¡°Ó!2°1°q¸4±x±=Ñ!@˜ä" 6›?Ð*ð= ð r%   c                ór  — dt        t        |«      «      }}dg|z  }d}t        j                  d|dz   «      D ]D  }|dkD  rd||z  }}|r||z  }||z  }|rŒ||k  r||   |z  |z  ||<   Œ2|t	        |||«      z  |z  }ŒF t        |«      D ]*  \  }	}
|	dk(  s|
dk(  rŒ|
dk(  r y|t	        |
|	|«      z  |z  }Œ, |S )Nr/   r?   r   )rA   rB   r   rC   ÚpowÚ	enumerate)r    rF   rK   ÚresrG   ÚpwÚmrI   ÚyÚexÚbss              r#   Ú_facmodzfactorial._facmod³   sú   € Ø”Cœ˜a›“MˆQˆð ˆS�‰UˆàˆÜ×%Ñ% a¨¨Q©Ó/ò 		/ˆEØ�1ŠuØ˜!˜u™*�1�ÙØ˜‘F�AØ˜%‘K�Aò ð �1ŠuØ˜1™˜e™ a™��1’àœ#˜e Q¨Ó*Ñ*¨QÑ.‘ð		/ô   “mò 	)‰FˆB�Ø�QŠw˜" š'ØØ�QŠwÙØ”c˜"˜b !“nÑ$ qÑ(‰Cð	)ð ˆ
r%   c                óJ  — | j                   d   }|j                  �r|j                  rú|j                  rít        |«      }||z
  }|j                  rt
        j                  S |j                  }|dk(  r,|rd|z  S |du r |dz
  j                  rt
        j                  S y y |j                  rw|j                  rjt        t        |||f«      \  }}}|r:|dz
  |k  r2| j                  |dz
  |«      }t        ||dz
  |«      }|dz  r| }||z  S | j                  ||«      }||z  S y y y y y )Nr   r/   éÿÿÿÿFé   r?   )r1   Ú
is_integerÚis_nonnegativeÚabsÚis_nonpositiver   ÚZeroÚis_primerX   ÚmaprA   rm   re   )r    rK   rF   ÚaqÚdÚisprimeÚfcs          r#   Ú	_eval_Modzfactorial._eval_ModÑ   s)  € Ø�I‰I�a‰LˆØ�<‹<˜A×,Ò,°·²Ü�Q“ˆBØ�Q‘ˆAØ×ÒÜ—v‘v�àŸ+™+�Ø˜’6ñ
 Ø! A™v˜Ø  EÑ)¨r°A©v×.EÒ.EÜ Ÿv™v˜ð /FÐ)à—\’\ a§l¢lÜ"¤3¨¨A¨r¨
Ó3‘H�A�q˜"Ù A¨¡E¨A¢IØ!Ÿ\™\¨!¨a©%°Ó4˜Ü   R¨!¡V¨RÓ0˜Ø˜Qš3Ø"$ ˜Bð  ™6�Mð "Ÿ\™\¨!¨RÓ0˜à ™6�Mð '3�\ð! 2>Ð,ˆ<r%   c                ó$   — ddl m}  ||dz   «      S ©Nr   ©r-   r/   ©r0   r-   )r    rF   Ú	piecewiser!   r-   s        r#   Ú_eval_rewrite_as_gammaz factorial._eval_rewrite_as_gammaï   s   € ÝAÙ�Q˜‘U‹|Ðr%   c                ót   — ddl m} |j                  r&|j                  rt	        dd¬«      } |||d|f«      S y y )Nr   )ÚProductra   T)Úintegerr/   )Úsympy.concrete.productsr„   rr   rq   r   )r    rF   r!   r„   ra   s        r#   Ú_eval_rewrite_as_Productz"factorial._eval_rewrite_as_Productó   s;   € Ý3Ø×Ò §¢Ü�c 4Ô(ˆAÙ˜1˜q ! Q˜iÓ(Ð(ð !-Ðr%   c                ól   — | j                   d   j                  r| j                   d   j                  ryy y ©Nr   T©r1   rq   rr   ©r    s    r#   Ú_eval_is_integerzfactorial._eval_is_integerù   ó/   € Ø�9‰9�Q‰<×"Ò" t§y¡y°¡|×'BÒ'BØð (CÐ"r%   c                ól   — | j                   d   j                  r| j                   d   j                  ryy y r‰   rŠ   r‹   s    r#   Ú_eval_is_positivezfactorial._eval_is_positiveý   r�   r%   c                ór   — | j                   d   }|j                  r|j                  r|dz
  j                  S y y )Nr   r?   rŠ   ©r    Úxs     r#   Ú_eval_is_evenzfactorial._eval_is_even  ó5   € Ø�I‰I�a‰LˆØ�<Š<˜A×,Ò,Ø˜‘E×)Ñ)Ð)ð -ˆ<r%   c                ór   — | j                   d   }|j                  r|j                  r|dz
  j                  S y y )Nr   r4   rŠ   r‘   s     r#   Ú_eval_is_compositezfactorial._eval_is_composite  r”   r%   c                óT   — | j                   d   }|j                  s|j                  ryy r‰   )r1   rr   Úis_nonintegerr‘   s     r#   Ú_eval_is_realzfactorial._eval_is_real  s&   € Ø�I‰I�a‰LˆØ×Ò˜qŸšØð  /r%   c                óð   — | j                   d   j                  |«      }|j                  |d«      }|j                  rt        j
                  S |j                  s| j                  |«      S t        d| z  «      ‚)Nr   zCannot expand %s around 0)	r1   Úas_leading_termÚsubsrU   r   rV   Úis_infiniteÚfuncr   )r    r’   ÚlogxÚcdirÚargÚarg0s         r#   Ú_eval_as_leading_termzfactorial._eval_as_leading_term  sa   € Ø�i‰i˜‰l×*Ñ*¨1Ó-ˆØ�x‰x˜˜1‹~ˆØ�<Š<Ü—5‘5ˆLØ×!Ò!Ø—9‘9˜S“>Ð!ÜÐ3°tÑ<Ó=Ð=r%   N©r/   ©T)r&   r'   r(   r)   r3   r@   r<   Ú__annotations__ÚclassmethodrN   rP   rc   rm   r|   r‚   r‡   rŒ   r�   r“   r–   r™   r£   r*   r%   r#   r   r   $   sŽ   … ñ.ó`5ò€Lð $&Ð�yÓ%àñ'ó ð'ð< ñ;ó ð;ð ñ&+ó ð&+òPò<"ó<ò)òòò*ò
*ò
ó
>r%   r   c                  ó   — e Zd Zy)ÚMultiFactorialN)r&   r'   r(   r*   r%   r#   r©   r©     s   „ Ør%   r©   c                  óf   — e Zd ZdZeed„ «       «       Zed„ «       Zd„ Zd„ Z	d„ Z
dd„Zd„ Zd	„ Zd
„ Zy)Úsubfactoriala¬  The subfactorial counts the derangements of $n$ items and is
    defined for non-negative integers as:

    .. math:: !n = \begin{cases} 1 & n = 0 \\ 0 & n = 1 \\
                    (n-1)(!(n-1) + !(n-2)) & n > 1 \end{cases}

    It can also be written as ``int(round(n!/exp(1)))`` but the
    recursive definition with caching is implemented for this function.

    An interesting analytic expression is the following [2]_

    .. math:: !x = \Gamma(x + 1, -1)/e

    which is valid for non-negative integers `x`. The above formula
    is not very useful in case of non-integers. `\Gamma(x + 1, -1)` is
    single-valued only for integral arguments `x`, elsewhere on the positive
    real axis it has an infinite number of branches none of which are real.

    References
    ==========

    .. [1] https://en.wikipedia.org/wiki/Subfactorial
    .. [2] https://mathworld.wolfram.com/Subfactorial.html

    Examples
    ========

    >>> from sympy import subfactorial
    >>> from sympy.abc import n
    >>> subfactorial(n + 1)
    subfactorial(n + 1)
    >>> subfactorial(5)
    44

    See Also
    ========

    factorial, uppergamma,
    sympy.utilities.iterables.generate_derangements
    c                ó    — |st         j                  S |dk(  rt         j                  S d\  }}t        d|dz   «      D ]  }||dz
  ||z   z  }}Œ |S )Nr/   )r/   r   r?   )r   rV   ru   r[   )r    rF   Úz1Úz2ra   s        r#   Ú_evalzsubfactorial._evalG  s]   € ñ Ü—5‘5ˆLØ�!ŠVÜ—6‘6ˆMà‰FˆB�Ü˜1˜a !™e“_ò /�Ø˜a !™e b¨2¡gÑ.�B‘ð/àˆIr%   c                óø   — |j                   rn|j                  r|j                  r| j                  |«      S |t        j
                  u rt        j
                  S |t        j                  u rt        j                  S y y ©N)rT   rX   rr   r¯   r   ÚNaNrW   )rE   r¡   s     r#   rc   zsubfactorial.evalT  sZ   € à�=Š=Ø�~Š~ #×"4Ò"4Ø—y‘y “~Ð%ØœŸ™‘Ü—u‘u�ØœŸ
™
Ñ"Ü—z‘zÐ!ð #ð r%   c                ól   — | j                   d   j                  r| j                   d   j                  ryy y r‰   )r1   Úis_oddrr   r‹   s    r#   r“   zsubfactorial._eval_is_even^  s.   € Ø�9‰9�Q‰<×Ò 4§9¡9¨Q¡<×#>Ò#>Øð $?Ðr%   c                ól   — | j                   d   j                  r| j                   d   j                  ryy y r‰   rŠ   r‹   s    r#   rŒ   zsubfactorial._eval_is_integerb  r�   r%   c                ó’   — ddl m} t        d«      }t        j                  |z  t        |«      z  }t        |«       |||d|f«      z  S )Nr   )Ú	summationra   )Úsympy.concrete.summationsr·   r   r   ÚNegativeOner   )r    r¡   r!   r·   ra   Úfs         r#   Ú_eval_rewrite_as_factorialz'subfactorial._eval_rewrite_as_factorialf  sA   € Ý7Ü�#‹JˆÜ�M‰M˜1Ñœy¨›|Ñ+ˆÜ˜‹~¡	¨!¨a°°C¨[Ó 9Ñ9Ð9r%   c                ó¾   — ddl m} ddlm}m} t
        j                  |dz   z   |t         t        z  |z  «      z   ||dz   d«      z   ||dz   «      z    |d«      z  S )Nr   )Úexp)r-   Ú
lowergammar/   ro   )	Ú&sympy.functions.elementary.exponentialr½   r0   r-   r¾   r   r¹   r   r   )r    r¡   r�   r!   r½   r-   r¾   s          r#   r‚   z#subfactorial._eval_rewrite_as_gammal  s\   € Ý>ßOÜ—‘  a¡Ñ(©¬a¨R´©U°3©Y«Ñ7¹
À3ÈÁ7ÈBÓ8OÑOÙ˜˜a™“.ñ!Ù"% b£'ñ*ð 	*r%   c                óH   — ddl m}  ||dz   d«      t        j                  z  S )Nr   )Ú
uppergammar/   ro   )r0   rÁ   r   ÚExp1)r    r¡   r!   rÁ   s       r#   Ú_eval_rewrite_as_uppergammaz(subfactorial._eval_rewrite_as_uppergammar  s   € ÝFÙ˜# ™' 2Ó&¤q§v¡vÑ-Ð-r%   c                ól   — | j                   d   j                  r| j                   d   j                  ryy y r‰   rŠ   r‹   s    r#   Ú_eval_is_nonnegativez!subfactorial._eval_is_nonnegativev  r�   r%   c                ól   — | j                   d   j                  r| j                   d   j                  ryy y r‰   )r1   Úis_evenrr   r‹   s    r#   Ú_eval_is_oddzsubfactorial._eval_is_oddz  s/   € Ø�9‰9�Q‰<×Ò D§I¡I¨a¡L×$?Ò$?Øð %@Ðr%   Nr¥   )r&   r'   r(   r)   r§   r	   r¯   rc   r“   rŒ   r»   r‚   rÃ   rÅ   rÈ   r*   r%   r#   r«   r«     s[   „ ñ'ðR Øñ	ó ó ð	ð ñ"ó ð"òòò:ó*ò.òór%   r«   c                  ó@   — e Zd ZdZed„ «       Zd„ Zd„ Zd„ Zd„ Z	d	d„Z
y)
Ú
factorial2aA  The double factorial `n!!`, not to be confused with `(n!)!`

    The double factorial is defined for nonnegative integers and for odd
    negative integers as:

    .. math:: n!! = \begin{cases} 1 & n = 0 \\
                    n(n-2)(n-4) \cdots 1 & n\ \text{positive odd} \\
                    n(n-2)(n-4) \cdots 2 & n\ \text{positive even} \\
                    (n+2)!!/(n+2) & n\ \text{negative odd} \end{cases}

    References
    ==========

    .. [1] https://en.wikipedia.org/wiki/Double_factorial

    Examples
    ========

    >>> from sympy import factorial2, var
    >>> n = var('n')
    >>> n
    n
    >>> factorial2(n + 1)
    factorial2(n + 1)
    >>> factorial2(5)
    15
    >>> factorial2(-1)
    1
    >>> factorial2(-5)
    1/3

    See Also
    ========

    factorial, RisingFactorial, FallingFactorial
    c                óZ  — |j                   rŸ|j                  st        d«      ‚|j                  r<|j                  r|dz  }d|z  t        |«      z  S t        |«      t        |dz
  «      z  S |j                  r)|t        j                  d|z
  dz  z  z  t        | «      z  S t        d«      ‚y )Nz<argument must be nonnegative integer or negative odd integerr?   r/   )
rT   rX   Ú
ValueErrorrr   rÇ   r   rÊ   r´   r   r¹   )rE   r¡   Úks      r#   rc   zfactorial2.eval¥  s²   € ð �=Š=Ø—>’>Ü ð ">ó ?ð ?ð
 ×!Ò!Ø—;’;Ø˜a™�AØ˜a™4¤)¨A£,Ñ.Ð.Ü  “~¬
°3¸±7Ó(;Ñ;Ð;ð �zŠzØœAŸM™M¨a°#©g°q©[Ñ9Ñ9¼JÈÀtÓ<LÑLÐLÜð :ó ;ð ;ð! r%   c                ó¤   — | j                   d   }|j                  r5|j                  ry|j                  r|j                  ry|j
                  ryy y y )Nr   FT)r1   rq   r´   rÇ   Úis_positiverU   ©r    rF   s     r#   r“   zfactorial2._eval_is_even½  sJ   € à�I‰I�a‰LˆØ�<Š<Ø�xŠxØØ�yŠyØ—=’=ØØ—9’9Ø ð ð ð r%   c                ó’   — | j                   d   }|j                  r,|dz   j                  ry|j                  r|dz   j                  S y y )Nr   r/   Tr4   )r1   rq   rr   r´   rÐ   s     r#   rŒ   zfactorial2._eval_is_integerÉ  sI   € ð �I‰I�a‰LˆØ�<Š<Ø�A‘×%Ò%ØØ�xŠxØ˜A™×-Ñ-Ð-ð ð r%   c                ó¦   — | j                   d   }|j                  r|dz   j                  S |j                  r|j                  ry|j
                  ryy y )Nr   r4   FT)r1   r´   rr   rÇ   rÏ   rU   rÐ   s     r#   rÈ   zfactorial2._eval_is_oddÓ  sM   € ð �I‰I�a‰LˆØ�8Š8Ø˜‘E×)Ñ)Ð)Ø�9Š9Ø�}Š}ØØ�yŠyØð ð r%   c                ó˜   — | j                   d   }|j                  r/|dz   j                  ry|j                  r|dz   dz  j                  S y y )Nr   r/   Tr?   )r1   rq   rr   r´   rÇ   rÐ   s     r#   r�   zfactorial2._eval_is_positiveß  sM   € ð �I‰I�a‰LˆØ�<Š<Ø�A‘×%Ò%ØØ�xŠxØ˜Q™ !™×,Ñ,Ð,ð ð r%   c                óÚ   — ddl m} ddlm} ddlm} d|dz  z   ||dz  dz   «      z   |dt        t        |d«      d«      f |dt        z  «      t        t        |d«      d«      f«      z  S )Nr   )r   ©Ú	Piecewiser   r?   r/   )	Ú(sympy.functions.elementary.miscellaneousr   Ú$sympy.functions.elementary.piecewiserÖ   r0   r-   r   r   r   )r    rF   r�   r!   r   rÖ   r-   s          r#   r‚   z!factorial2._eval_rewrite_as_gammaê  si   € ÝAÝBÝAØ�1�Q‘3‰x™˜a ™c A™g›Ñ&©°A´r¼#¸aÀ»)ÀQÓ7GÐ3HÙ�aœ‘d“œR¤ A q£	¨1Ó-Ð.ó*0ñ 0ð 	0r%   Nr¥   )r&   r'   r(   r)   r§   rc   r“   rŒ   rÈ   r�   r‚   r*   r%   r#   rÊ   rÊ     s5   „ ñ#ðJ ñ;ó ð;ò.
!ò.ò
ò	-ô0r%   rÊ   c                  óH   — e Zd ZdZed„ «       Zd
d„Zd„ Zd„ Zd„ Z	dd„Z
d	„ Zy)ÚRisingFactorialap  
    Rising factorial (also called Pochhammer symbol [1]_) is a double valued
    function arising in concrete mathematics, hypergeometric functions
    and series expansions. It is defined by:

    .. math:: \texttt{rf(y, k)} = (x)^k = x \cdot (x+1) \cdots (x+k-1)

    where `x` can be arbitrary expression and `k` is an integer. For
    more information check "Concrete mathematics" by Graham, pp. 66
    or visit https://mathworld.wolfram.com/RisingFactorial.html page.

    When `x` is a `~.Poly` instance of degree $\ge 1$ with a single variable,
    `(x)^k = x(y) \cdot x(y+1) \cdots x(y+k-1)`, where `y` is the
    variable of `x`. This is as described in [2]_.

    Examples
    ========

    >>> from sympy import rf, Poly
    >>> from sympy.abc import x
    >>> rf(x, 0)
    1
    >>> rf(1, 5)
    120
    >>> rf(x, 5) == x*(1 + x)*(2 + x)*(3 + x)*(4 + x)
    True
    >>> rf(Poly(x**3, x), 2)
    Poly(x**6 + 3*x**5 + 3*x**4 + x**3, x, domain='ZZ')

    Rewriting is complicated unless the relationship between
    the arguments is known, but rising factorial can
    be rewritten in terms of gamma, factorial, binomial,
    and falling factorial.

    >>> from sympy import Symbol, factorial, ff, binomial, gamma
    >>> n = Symbol('n', integer=True, positive=True)
    >>> R = rf(n, n + 2)
    >>> for i in (rf, ff, factorial, binomial, gamma):
    ...  R.rewrite(i)
    ...
    RisingFactorial(n, n + 2)
    FallingFactorial(2*n + 1, n + 2)
    factorial(2*n + 1)/factorial(n - 1)
    binomial(2*n + 1, n + 2)*factorial(n + 2)
    gamma(2*n + 2)/gamma(n)

    See Also
    ========

    factorial, factorial2, FallingFactorial

    References
    ==========

    .. [1] https://en.wikipedia.org/wiki/Pochhammer_symbol
    .. [2] Peter Paule, "Greatest Factorial Factorization and Symbolic
           Summation", Journal of Symbolic Computation, vol. 20, pp. 235-268,
           1995.

    c                ó  ‡— t        ‰«      Št        |«      }‰t        j                  u s|t        j                  u rt        j                  S ‰t        j                  u rt	        |«      S |j
                  �rÞ|j                  rt        j                  S |j                  rÙ‰t        j                  u rt        j                  S ‰t        j                  u r,|j                  rt        j                  S t        j                  S t        ‰t        «      rG‰j                  }t        |«      dk7  rt        d«      ‚t!        ˆfd„t#        t%        |«      «      d«      S t!        ˆfd„t#        t%        |«      «      d«      S ‰t        j                  u rt        j                  S ‰t        j                  u rt        j                  S t        ‰t        «      rW‰j                  }t        |«      dk7  rt        d«      ‚dt!        ˆfd„t#        dt'        t%        |«      «      dz   «      d«      z  S dt!        ˆfd„t#        dt'        t%        |«      «      dz   «      d«      z  S |j(                  dk(  r*‰j(                  r‰j*                  rt        j,                  S y y y )Nr/   ú0rf only defined for polynomials on one generatorc                ó,   •— | ‰j                  |«      z  S r±   ©Úshift©Úrra   r’   s     €r#   ú<lambda>z&RisingFactorial.eval.<locals>.<lambda>Q  s   ø€ Ø./°·±¸³©nð r%   c                ó   •— | ‰|z   z  S r±   r*   rà   s     €r#   râ   z&RisingFactorial.eval.<locals>.<lambda>U  ó   ø€ °q¸!¸a¹%±y€ r%   c                ó.   •— | ‰j                  | «      z  S r±   rÞ   rà   s     €r#   râ   z&RisingFactorial.eval.<locals>.<lambda>d  s   ø€ Ø01°1·7±7¸A¸2³;±ð r%   c                ó   •— | ‰|z
  z  S r±   r*   rà   s     €r#   râ   z&RisingFactorial.eval.<locals>.<lambda>h  s   ø€ Ø,-¨q°1©u©Ið r%   F)r   r   r²   rV   r   rX   rU   rÏ   rW   ÚNegativeInfinityr´   Ú
isinstancer   ÚgensÚlenrÌ   r   r[   rA   rs   rq   rY   ru   ©rE   r’   rÍ   ré   s    `  r#   rc   zRisingFactorial.eval5  s  ø€ ä�A‹JˆÜ�A‹Jˆà”—‘‰:˜œaŸe™e™Ü—5‘5ˆLØ”!—%‘%‰ZÜ˜Q“<ÐØ�\‹\Ø�yŠyÜ—u‘u�à—=’=ØœAŸJ™J‘Ü Ÿz™zÐ)Øœa×0Ñ0Ñ0ØŸ8š8Ü#$×#5Ñ#5Ð5ä#$§:¡:Ð-ä% a¬Ô.Ø#$§6¡6˜DÜ" 4›y¨1š}Ü&0ð 2Kó 'Lð !Lô (.ó /=ä.3´C¸³F«m¸Qó(@ð !@ô $*Ó*@Ü*/´°A³«-¸ó$<ð <ð œAŸJ™J‘Ü Ÿz™zÐ)Øœa×0Ñ0Ñ0Ü Ÿz™zÐ)ä% a¬Ô.Ø#$§6¡6˜DÜ" 4›y¨1š}Ü&0ð 2Kó 'Lð !Lð ()¬ó 1@ä05°a¼¼SÀ»V»Àq¹Ó0IÈ1ó*Nñ (Nð !Nð $%¤Vó -6ä,1°!´S¼¸Q»³[À1±_Ó,EÀqó&Jñ $Jð Jð �<‰<˜5Ò Ø�|Š| §¢Ü—v‘v�ð !.ˆ|ð !r%   c                óR  — ddl m} ddlm} |sK|dk  dk(  r/t        j
                  |z   |d|z
  «      z   || |z
  dz   «      z  S  |||z   «       ||«      z  S  | |||z   «       ||«      z  |dkD  ft        j
                  |z   |d|z
  «      z   || |z
  dz   «      z  df«      S ©Nr   rÕ   r   Tr/   ©rØ   rÖ   r0   r-   r   r¹   ©r    r’   rÍ   r�   r!   rÖ   r-   s          r#   r‚   z&RisingFactorial._eval_rewrite_as_gammap  s¼   € ÝBÝAÙØ�Q‘˜4ÒÜ—}‘} aÑ'©¨a°!©e«Ñ4±u¸a¸RÀ!¹VÀa¹ZÓ7HÑHÐHÙ˜˜Q™“<¡%¨£(Ñ*Ð*ÙÙ�1�q‘5‹\™E !›HÑ$ a¨!¡eÐ,Ü�]‰]˜AÑ™e A¨¡E›lÑ*©U°A°2¸±6¸A±:Ó->Ñ>ÀÐEóGð 	Gr%   c                ó&   — t        ||z   dz
  |«      S ©Nr/   )ÚFallingFactorial©r    r’   rÍ   r!   s       r#   Ú!_eval_rewrite_as_FallingFactorialz1RisingFactorial._eval_rewrite_as_FallingFactorial{  s   € Ü  A¡¨¡	¨1Ó-Ð-r%   c                óú   — ddl m} |j                  ri|j                  r\ |t        ||z   dz
  «      t        |dz
  «      z  |dkD  ft        j
                  |z  t        | «      z  t        | |z
  «      z  df«      S y y ©Nr   rÕ   r/   T©rØ   rÖ   rq   r   r   r¹   ©r    r’   rÍ   r!   rÖ   s        r#   r»   z*RisingFactorial._eval_rewrite_as_factorial~  s{   € ÝBØ�<Š<˜AŸLšLÙÜ˜1˜q™5 1™9Ó%¤i°°A±Ó&6Ñ6¸¸A¹Ð>Ü—‘ Ñ!¤)¨Q¨B£-Ñ/´	¸1¸"¸q¹&Ó0AÑAÀ4ÐHóJð Jð )ˆ<r%   c                óX   — |j                   rt        |«      t        ||z   dz
  |«      z  S y rñ   ©rq   r   Úbinomialró   s       r#   Ú_eval_rewrite_as_binomialz)RisingFactorial._eval_rewrite_as_binomial…  s,   € Ø�<Š<Ü˜Q“<¤(¨1¨q©5°1©9°aÓ"8Ñ8Ð8ð r%   Nc                ó¨  — ddl m} |r©|j                  |t        j                  «      }|t        j                  u r% |||z   «      j                  dd¬«       ||«      z  S |t        j                  u r@t        j                  |z   |d|z
  «      z   || |z
  dz   «      j                  dd¬«      z  S | j                  |«      j                  dd¬«      S ©Nr   r   Ú	tractableT)Údeepr/   )r0   r-   rœ   r   rW   Úrewriterç   r¹   ©r    r’   rÍ   Úlimitvarr!   r-   Úk_lims          r#   Ú_eval_rewrite_as_tractablez*RisingFactorial._eval_rewrite_as_tractable‰  s¾   € ÝAÙØ—F‘F˜8¤Q§Z¡ZÓ0ˆEØœŸ
™
Ñ"Ù˜a !™e›×,Ñ,¨[¸tÐ,ÓDÁuÈQÃxÑOÐPØœ!×,Ñ,Ñ,ÜŸ™ qÑ(©¨q°1©u«Ñ5¹¸q¸bÀ1¹fÀq¹jÓ8I×8QÑ8QÐR]ÐdhÐ8QÓ8iÑiÐjØ�|‰|˜EÓ"×*Ñ*¨;¸TÐ*ÓBÐBr%   c                ó¨   — t        | j                  d   j                  | j                  d   j                  | j                  d   j                  f«      S ©Nr   r/   ©r   r1   rq   rr   r‹   s    r#   rŒ   z RisingFactorial._eval_is_integer“  óE   € Ü˜$Ÿ)™) A™,×1Ñ1°4·9±9¸Q±<×3JÑ3JØŸ)™) A™,×5Ñ5ð7ó 8ð 	8r%   r¥   r±   )r&   r'   r(   r)   r§   rc   r‚   rô   r»   rü   r  rŒ   r*   r%   r#   rÚ   rÚ   ÷  s>   „ ñ;ðz ñ8ó ð8ót	Gò.òJò9óCó8r%   rÚ   c                  óH   — e Zd ZdZed„ «       Zd
d„Zd„ Zd„ Zd„ Z	dd„Z
d	„ Zy)rò   a0  
    Falling factorial (related to rising factorial) is a double valued
    function arising in concrete mathematics, hypergeometric functions
    and series expansions. It is defined by

    .. math:: \texttt{ff(x, k)} = (x)_k = x \cdot (x-1) \cdots (x-k+1)

    where `x` can be arbitrary expression and `k` is an integer. For
    more information check "Concrete mathematics" by Graham, pp. 66
    or [1]_.

    When `x` is a `~.Poly` instance of degree $\ge 1$ with single variable,
    `(x)_k = x(y) \cdot x(y-1) \cdots x(y-k+1)`, where `y` is the
    variable of `x`. This is as described in

    >>> from sympy import ff, Poly, Symbol
    >>> from sympy.abc import x
    >>> n = Symbol('n', integer=True)

    >>> ff(x, 0)
    1
    >>> ff(5, 5)
    120
    >>> ff(x, 5) == x*(x - 1)*(x - 2)*(x - 3)*(x - 4)
    True
    >>> ff(Poly(x**2, x), 2)
    Poly(x**4 - 2*x**3 + x**2, x, domain='ZZ')
    >>> ff(n, n)
    factorial(n)

    Rewriting is complicated unless the relationship between
    the arguments is known, but falling factorial can
    be rewritten in terms of gamma, factorial and binomial
    and rising factorial.

    >>> from sympy import factorial, rf, gamma, binomial, Symbol
    >>> n = Symbol('n', integer=True, positive=True)
    >>> F = ff(n, n - 2)
    >>> for i in (rf, ff, factorial, binomial, gamma):
    ...  F.rewrite(i)
    ...
    RisingFactorial(3, n - 2)
    FallingFactorial(n, n - 2)
    factorial(n)/2
    binomial(n, n - 2)*factorial(n - 2)
    gamma(n + 1)/2

    See Also
    ========

    factorial, factorial2, RisingFactorial

    References
    ==========

    .. [1] https://mathworld.wolfram.com/FallingFactorial.html
    .. [2] Peter Paule, "Greatest Factorial Factorization and Symbolic
           Summation", Journal of Symbolic Computation, vol. 20, pp. 235-268,
           1995.

    c                ó¨  ‡— t        ‰«      Št        |«      }‰t        j                  u s|t        j                  u rt        j                  S |j                  r‰|k(  rt	        ‰«      S |j
                  �rÞ|j                  rt        j                  S |j                  rÙ‰t        j                  u rt        j                  S ‰t        j                  u r,|j                  rt        j                  S t        j                  S t        ‰t        «      rG‰j                  }t        |«      dk7  rt!        d«      ‚t#        ˆfd„t%        t'        |«      «      d«      S t#        ˆfd„t%        t'        |«      «      d«      S ‰t        j                  u rt        j                  S ‰t        j                  u rt        j                  S t        ‰t        «      rW‰j                  }t        |«      dk7  rt!        d«      ‚dt#        ˆfd„t%        dt)        t'        |«      «      dz   «      d«      z  S dt#        ˆfd„t%        dt)        t'        |«      «      dz   «      d«      z  S y )Nr/   z0ff only defined for polynomials on one generatorc                ó.   •— | ‰j                  | «      z  S r±   rÞ   rà   s     €r#   râ   z'FallingFactorial.eval.<locals>.<lambda>ó  s   ø€ Ø./°·±¸!¸³©oð r%   c                ó   •— | ‰|z
  z  S r±   r*   rà   s     €r#   râ   z'FallingFactorial.eval.<locals>.<lambda>÷  rä   r%   rÜ   c                ó,   •— | ‰j                  |«      z  S r±   rÞ   rà   s     €r#   râ   z'FallingFactorial.eval.<locals>.<lambda>  s   ø€ Ø01°1·7±7¸1³:±ð r%   c                ó   •— | ‰|z   z  S r±   r*   rà   s     €r#   râ   z'FallingFactorial.eval.<locals>.<lambda>	  s   ø€ ¸¸AÀ¹E¹€ r%   )r   r   r²   rq   r   rX   rU   rV   rÏ   rW   rç   r´   rè   r   ré   rê   rÌ   r   r[   rA   rs   rë   s    `  r#   rc   zFallingFactorial.eval×  sï  ø€ ä�A‹JˆÜ�A‹Jˆà”—‘‰:˜œaŸe™e™Ü—5‘5ˆLØ�\Š\˜a 1šfÜ˜Q“<ÐØ�\‹\Ø�yŠyÜ—u‘u�à—=’=ØœAŸJ™J‘Ü Ÿz™zÐ)Øœa×0Ñ0Ñ0ØŸ8š8Ü#$×#5Ñ#5Ð5ä#$§:¡:Ð-ä% a¬Ô.Ø#$§6¡6˜DÜ" 4›y¨1š}Ü&0ð 2Kó 'Lð !Lô (.ó />ä.3´C¸³F«m¸Qó(@ð !@ô $*Ó*@Ü*/´°A³«-¸ó$<ð <ð œAŸJ™J‘Ü Ÿz™zÐ)Øœa×0Ñ0Ñ0Ü Ÿz™zÐ)ä% a¬Ô.Ø#$§6¡6˜DÜ" 4›y¨1š}Ü&0ð 2Kó 'Lð !Lð ()¬ó 1?ä05°a¼¼SÀ»V»Àq¹Ó0IÈ1ó*Nñ (Nð !Nð $%¤VÓ,BÜ,1°!´S¼¸Q»³[À1±_Ó,EÀqó&Jñ $Jð JðS r%   c                óR  — ddl m} ddlm} |sK|dk  dk(  r)t        j
                  |z   |||z
  «      z   || «      z  S  ||dz   «       |||z
  dz   «      z  S  | ||dz   «       |||z
  dz   «      z  |dk\  ft        j
                  |z   |||z
  «      z   || «      z  df«      S rí   rî   rï   s          r#   r‚   z'FallingFactorial._eval_rewrite_as_gamma  s¹   € ÝBÝAÙØ�A‘˜$ŠÜ—}‘} aÑ'©¨a°!©e«Ñ4±u¸a¸R³yÑ@Ð@Ù˜˜Q™“<¡%¨¨A©°©	Ó"2Ñ2Ð2ÙÙ�1�q‘5‹\™E ! a¡%¨!¡)Ó,Ñ,¨a°1©fÐ5Ü�]‰]˜AÑ™e A¨¡E›lÑ*©U°A°2«YÑ6¸Ð=ó?ð 	?r%   c                ó&   — t        ||z
  dz   |«      S rñ   )Úrfró   s       r#   Ú _eval_rewrite_as_RisingFactorialz1FallingFactorial._eval_rewrite_as_RisingFactorial  s   € Ü�!�a‘%˜!‘)˜QÓÐr%   c                óL   — |j                   rt        |«      t        ||«      z  S y r±   rú   ró   s       r#   rü   z*FallingFactorial._eval_rewrite_as_binomial  s#   € Ø�<Š<Ü˜Q“<¤(¨1¨a£.Ñ0Ð0ð r%   c                óú   — ddl m} |j                  ri|j                  r\ |t        |«      t        | |z   «      z  |dk\  ft        j
                  |z  t        ||z
  dz
  «      z  t        | dz
  «      z  df«      S y y rö   r÷   rø   s        r#   r»   z+FallingFactorial._eval_rewrite_as_factorial  s{   € ÝBØ�<Š<˜AŸLšLÙÜ˜1“œi¨¨¨Q©Ó/Ñ/°°a±Ð8Ü—‘ Ñ!¤)¨A°©E°A©IÓ"6Ñ6´yÀ!ÀÀaÁÓ7HÑHÈ$ÐOóQð Qð )ˆ<r%   Nc                ó¨  — ddl m} |r©|j                  |t        j                  «      }|t        j                  u r:t        j
                  |z   |||z
  «      j                  dd¬«      z   || «      z  S |t        j                  u r+ ||dz   «       |||z
  dz   «      j                  dd¬«      z  S | j                  |«      j                  dd¬«      S rþ   )r0   r-   rœ   r   rW   r¹   r  rç   r  s          r#   r  z+FallingFactorial._eval_rewrite_as_tractable%  sÂ   € ÝAÙØ—F‘F˜8¤Q§Z¡ZÓ0ˆEØœŸ
™
Ñ"ÜŸ™ qÑ(©¨q°1©u«×)=Ñ)=¸kÐPTÐ)=Ó)UÑUÑX]Ð_`Ð^`ÓXaÑaÐbØœ!×,Ñ,Ñ,Ù˜a !™e›¡u¨Q°©U°Q©YÓ'7×'?Ñ'?ÀÐRVÐ'?Ó'WÑWÐXØ�|‰|˜EÓ"×*Ñ*¨;¸TÐ*ÓBÐBr%   c                ó¨   — t        | j                  d   j                  | j                  d   j                  | j                  d   j                  f«      S r  r  r‹   s    r#   rŒ   z!FallingFactorial._eval_is_integer/  r	  r%   r¥   r±   )r&   r'   r(   r)   r§   rc   r‚   r  rü   r»   r  rŒ   r*   r%   r#   rò   rò   ˜  s?   „ ñ<ð| ñ2Jó ð2Jóh	?ò ò1òQóCó8r%   rò   c                  ór   — e Zd ZdZdd„Zed„ «       Zed„ «       Zd„ Zd„ Z	d„ Z
dd„Zdd
„Zd„ Zd„ Zd„ Zd„ Zy	)rû   a  Implementation of the binomial coefficient. It can be defined
    in two ways depending on its desired interpretation:

    .. math:: \binom{n}{k} = \frac{n!}{k!(n-k)!}\ \text{or}\
                \binom{n}{k} = \frac{(n)_k}{k!}

    First, in a strict combinatorial sense it defines the
    number of ways we can choose `k` elements from a set of
    `n` elements. In this case both arguments are nonnegative
    integers and binomial is computed using an efficient
    algorithm based on prime factorization.

    The other definition is generalization for arbitrary `n`,
    however `k` must also be nonnegative. This case is very
    useful when evaluating summations.

    For the sake of convenience, for negative integer `k` this function
    will return zero no matter the other argument.

    To expand the binomial when `n` is a symbol, use either
    ``expand_func()`` or ``expand(func=True)``. The former will keep
    the polynomial in factored form while the latter will expand the
    polynomial itself. See examples for details.

    Examples
    ========

    >>> from sympy import Symbol, Rational, binomial, expand_func
    >>> n = Symbol('n', integer=True, positive=True)

    >>> binomial(15, 8)
    6435

    >>> binomial(n, -1)
    0

    Rows of Pascal's triangle can be generated with the binomial function:

    >>> for N in range(8):
    ...     print([binomial(N, i) for i in range(N + 1)])
    ...
    [1]
    [1, 1]
    [1, 2, 1]
    [1, 3, 3, 1]
    [1, 4, 6, 4, 1]
    [1, 5, 10, 10, 5, 1]
    [1, 6, 15, 20, 15, 6, 1]
    [1, 7, 21, 35, 35, 21, 7, 1]

    As can a given diagonal, e.g. the 4th diagonal:

    >>> N = -4
    >>> [binomial(N, i) for i in range(1 - N)]
    [1, -4, 10, -20, 35]

    >>> binomial(Rational(5, 4), 3)
    -5/128
    >>> binomial(Rational(-5, 4), 3)
    -195/128

    >>> binomial(n, 3)
    binomial(n, 3)

    >>> binomial(n, 3).expand(func=True)
    n**3/6 - n**2/2 + n/3

    >>> expand_func(binomial(n, 3))
    n*(n - 2)*(n - 1)/6

    In many cases, we can also compute binomial coefficients modulo a
    prime p quickly using Lucas' Theorem [2]_, though we need to include
    `evaluate=False` to postpone evaluation:

    >>> from sympy import Mod
    >>> Mod(binomial(156675, 4433, evaluate=False), 10**5 + 3)
    28625

    Using a generalisation of Lucas's Theorem given by Granville [3]_,
    we can extend this to arbitrary n:

    >>> Mod(binomial(10**18, 10**12, evaluate=False), (10**5 + 3)**2)
    3744312326

    References
    ==========

    .. [1] https://www.johndcook.com/blog/binomial_coefficients/
    .. [2] https://en.wikipedia.org/wiki/Lucas%27s_theorem
    .. [3] Binomial coefficients modulo prime powers, Andrew Granville,
        Available: https://web.archive.org/web/20170202003812/http://www.dms.umontreal.ca/~andrew/PDF/BinCoeff.pdf
    c                ó  — ddl m} |dk(  r8| j                  \  }}t        ||«       |d|dz   «       |d||z
  dz   «      z
  z  S |dk(  r8| j                  \  }}t        ||«       |d||z
  dz   «       |d|dz   «      z
  z  S t	        | |«      ‚)Nr   )r.   r/   r?   )r0   r.   r1   rû   r   )r    r2   r.   rF   rÍ   s        r#   r3   zbinomial.fdiffš  sª   € ÝEØ�qŠ=à—9‘9‰DˆAˆqÜ˜A˜q“>¡9¨Q°°A±Ó#6Ù˜!˜Q ™U Q™YÓ'ñ$(ñ )ð )à˜Š]à—9‘9‰DˆAˆqÜ˜A˜q“>¡9¨Q°°A±¸±	Ó#:Ù˜!˜Q ™UÓ#ñ$$ñ %ð %ô % T¨8Ó4Ð4r%   c                óÄ  — |j                   rÔ|j                   r•|dk\  r�t        |«      t        |«      }}||kD  rt        j                  S ||dz  kD  r||z
  }t        �t        t	        j                  ||«      «      S ||z
  d}}t        d|dz   «      D ]  }|dz  }||z  |z  }Œ t        |«      S ||z
  d}}t        d|dz   «      D ]  }|dz  }||z  }Œ |t        |«      z  S y )Nr   r?   r/   )	rX   rA   r   ru   r\   r   Úbincoefr[   Ú
_factorial)r    rF   rÍ   ry   r`   ra   s         r#   r¯   zbinomial._eval©  s  € ð �<Š<Ø�|Š|  Q¢Ü˜1“vœs 1›v�1�à�q’5ÜŸ6™6�MØ˜˜a™’ZØ˜A™�Aô
 Ð$Ü"¤5§=¡=°°AÓ#6Ó7Ð7à ™E 1�6�Ü˜q ! a¡%›ò -�AØ˜‘F�AØ# a™Z¨1™_‘Fð-ô ˜v“Ð&à ™E 1�6�Ü˜q ! a¡%›ò  �AØ˜‘F�AØ˜a‘K‘Fð ð ¤
¨1£Ñ-Ð-ð3 r%   c                ó†  — t        t        ||f«      \  }}||z
  }|j                  |j                  }}|j                  s|s|du r|j                  rt
        j                  S |dz
  j                  s|s|du r|dz
  j                  r|S |j                  ra|j                  s|r|r|j                  rt
        j                  S |j                  r(| j                  ||«      }|r|j                  d¬«      S |S y |du r|rt
        j                  S |j                  r,ddlm}  ||dz   «       ||dz   «       |||z
  dz   «      z  z  S y )NFr/   T)Úbasicr   r   )rw   r   rr   rq   rU   r   rV   rY   ru   Ú	is_numberr¯   ÚexpandrZ   r0   r-   )rE   rF   rÍ   ry   Ún_nonnegÚn_isintrg   r-   s           r#   rc   zbinomial.evalÈ  s  € ä”7˜Q ˜FÓ#‰ˆˆ1Ø�‰EˆØ×,Ñ,¨a¯l©l�'ˆØ�9Š9™( g°Ñ&6Ø—I’IÜ—5‘5ˆLØ�‰E�?Š?¡¨G°uÑ,<Ø˜‘U—O’OØˆHØ�<Š<Ø�}Š}¡©g¸!¿-º-Ü—v‘v�Ø—’Ø—i‘i  1“o�Ù14�s—z‘z¨�zÓ-Ð=¸#Ð=ð ð ˜Ñ¡7ä×$Ñ$Ð$Ø�[Š[ÝEÙ˜˜Q™“<¡ q¨1¡u£©e°A¸±E¸A±IÓ.>Ñ!>Ñ?Ð?ð r%   c                óè  — | j                   \  }}t        d„ |||fD «       «      rt        d«      ‚t        d„ |||fD «       «      �r-t	        t
        ||f«      \  }}t        |«      d}}|dk  rt        j                  S |dk  r| |z   dz
  }|dz  rdnd}||kD  rt        j                  S |j                  }t        |«      }|rÈ||k  r3||}}|s|�r•|t        ||z  ||z  «      z  |z  }||z  ||z  }}|rŒ%|rŒ(�nk||z
  }	||	kD  r|	|}	}d}
t        d|dz   «      D ]
  }|
|z  |z  }
Œ |
}t        |dz   |	dz   «      D ]
  }||z  |z  }Œ ||z  }t        |	dz   |dz   «      D ]
  }||z  |z  }Œ |t        |
|z  |z  |dz
  |«      z  }||z  }nÛt        |«      |k  r|dk7  rt        |||«      }nºt        t        |«      «      }t        j                   d|dz   «      D ]Š  }|||z
  kD  r	||z  |z  }Œ||dz  kD  rŒ||kD  r||z  ||z  k  sŒ.||z  |z  }Œ7||}}dx}}|dkD  r,t        ||z  ||z  |z   k  «      }||z  ||z  }}||z  }|dkD  rŒ,|dkD  sŒv|t        |||«      z  }||z  }ŒŒ t        ||z  «      S y )Nc              3  ó8   K  — | ]  }|j                   d u –— Œ y­w)FN)rq   ©Ú.0r’   s     r#   ú	<genexpr>z%binomial._eval_Mod.<locals>.<genexpr>ã  s   è ø€ Ò8¨ˆq�|‰|˜uÔ$Ñ8ùs   ‚z"Integers expected for binomial Modc              3  ó4   K  — | ]  }|j                   –— Œ y ­wr±   )rX   r%  s     r#   r'  z%binomial._eval_Mod.<locals>.<genexpr>æ  s   è ø€ Ò/ ˆq�|�|Ñ/ùs   ‚r/   r   r?   ro   )r1   ÚanyrÌ   Úallrw   rA   rs   r   ru   rv   rû   r[   re   rB   r   r   rC   )r    rK   rF   rÍ   rx   rg   rz   rG   ÚKry   Úkfra   ÚdfÚMrI   r½   Úas                    r#   r|   zbinomial._eval_Modà  s	  € Ø�y‰y‰ˆˆ1äÑ8¨q°!°Q¨iÔ8Ô8ÜÐAÓBÐBäÑ/ a¨¨A YÔ/Õ/Ü”s˜Q ˜FÓ#‰DˆAˆqÜ˜!“f˜a�ˆBð �1ŠuÜ—v‘v�Ø�1ŠuØ�B˜‘F˜Q‘J�Ø˜ašC‘b Q�ð �1ŠuÜ—v‘v�à—k‘kˆGÜ�R“ˆBÙØ˜’6à˜a�q�AÙšqØ!¤(¨1¨r©6°1°r±6Ó":Ñ:¸RÑ?˜Ø  B™w¨¨R©˜1˜ò œqð ˜A™�AØ˜1’uØ  !˜1˜Ø�BÜ" 1 a¨!¡e›_ò '˜Ø ™T B™Y™ð'à�BÜ" 1 q¡5¨!¨a©%Ó0ò '˜Ø ™T B™Y™ð'à˜2‘I�CÜ" 1 q¡5¨!¨a©%Ó0ò )˜Ø! !™e b™j™ð)ð œ3˜r "™u r™z¨2°©6°2Ó6Ñ6�CØ˜2‘I‘Cä�q“˜A’ ! q¢&Ü" 1 a¨Ó+‘ô œ˜a›“M�Ü"×-Ñ-¨a°°Q±Ó7ò &�EØ˜q 1™u’}Ø! %™i¨"™n™Ø  a¡šØ Ø šØ˜u™9 q¨5¡yÓ0Ø"% e¡)¨b¡.™Cà  !˜1˜Ø"#˜˜˜aà !šeÜ # Q¨¡Y°1°u±9¸q±=Ñ$AÓ B˜AØ#$¨¡:¨q°E©z˜q˜AØ 1™H˜Cð   !›eð
  ›7Ø¤3 u¨c°2Ó#6Ñ6˜CØ 2™I™Cð'&ô* �S˜1‘W“:ÐðW 0r%   c                óÊ  — | j                   d   }|j                  rt        | j                   Ž S | j                   d   }||z
  j                  r||z
  }|j                  rv|j                  rt
        j                  S |j                  rt
        j                  S | j                   d   d}}t        d|dz   «      D ]  }|||z
  |z   z  }Œ |t        |«      z  S t        | j                   Ž S )z§
        Function to expand binomial(n, k) when m is positive integer
        Also,
        n is self.args[0] and k is self.args[1] while using binomial(n, k)
        r   r/   )r1   rT   rû   rX   rU   r   rV   rY   ru   r[   r  )r    ÚhintsrF   rÍ   r`   ra   s         r#   Ú_eval_expand_funczbinomial._eval_expand_func3  sË   € ð �I‰I�a‰LˆØ�;Š;Ü˜TŸY™YÐ'Ð'à�I‰I�a‰LˆØˆa‰C×ÒØ�A‘ˆAà�<Š<Ø�yŠyÜ—u‘u�Ø—’Ü—v‘v�à ŸI™I a™L¨!�6�Ü˜q ! a¡%›ò (�AØ˜a !™e a™iÑ'‘Fð(à¤
¨1£Ñ-Ð-ä˜TŸY™YÐ'Ð'r%   c                óN   — t        |«      t        |«      t        ||z
  «      z  z  S r±   )r   ©r    rF   rÍ   r!   s       r#   r»   z#binomial._eval_rewrite_as_factorialN  s#   € Ü˜‹|œY q›\¬)°A¸±EÓ*:Ñ:Ñ;Ð;r%   c                óZ   — ddl m}  ||dz   «       ||dz   «       |||z
  dz   «      z  z  S r~   r€   )r    rF   rÍ   r�   r!   r-   s         r#   r‚   zbinomial._eval_rewrite_as_gammaQ  s2   € ÝAÙ�Q˜‘U‹|™U 1 q¡5›\©%°°A±¸±	Ó*:Ñ:Ñ;Ð;r%   Nc                óD   — | j                  ||«      j                  d«      S )Nrÿ   )r‚   r  )r    rF   rÍ   r  r!   s        r#   r  z#binomial._eval_rewrite_as_tractableU  s    € Ø×*Ñ*¨1¨aÓ0×8Ñ8¸ÓEÐEr%   c                óL   — |j                   rt        ||«      t        |«      z  S y r±   )rq   Úffr   r4  s       r#   rô   z*binomial._eval_rewrite_as_FallingFactorialX  s#   € Ø�<Š<Ü�a˜“8œi¨›lÑ*Ð*ð r%   c                ór   — | j                   \  }}|j                  r|j                  ry|j                  du ryy ©NTF)r1   rq   ©r    rF   rÍ   s      r#   rŒ   zbinomial._eval_is_integer\  s3   € Ø�y‰y‰ˆˆ1Ø�<Š<˜AŸLšLØØ�\‰\˜UÑ"Øð #r%   c                ó¾   — | j                   \  }}|j                  rB|j                  r5|j                  s|j                  s|j                  ry|j                  du ryy y y r:  )r1   rq   rr   rY   rÇ   r;  s      r#   rÅ   zbinomial._eval_is_nonnegativec  sO   € Ø�y‰y‰ˆˆ1Ø�<Š<˜AŸLšLØ×Ò 1§=¢=°A·I²IØØ—‘˜eÑ#Øð $ð )ˆ<r%   c                óT   — ddl m} | j                  |«      j                  |||¬«      S )Nr   r   )rŸ   r    )r0   r-   r  r£   )r    r’   rŸ   r    r-   s        r#   r£   zbinomial._eval_as_leading_termk  s&   € ÝAØ�|‰|˜EÓ"×8Ñ8¸ÀÈDÐ8ÓQÐQr%   r¤   r¥   r±   )r&   r'   r(   r)   r3   r§   r¯   rc   r|   r2  r»   r‚   r  rô   rŒ   rÅ   r£   r*   r%   r#   rû   rû   <  si   „ ñ[óz5ð ñ.ó ð.ð< ñ@ó ð@ò.Qòf(ò6<ó<óFò+òòóRr%   rû   N)/Ú
__future__r   Ú	functoolsr   Ú
sympy.corer   r   r   r   Úsympy.core.cacher	   Úsympy.core.functionr
   r   r   Úsympy.core.logicr   Úsympy.core.numbersr   r   r   Úsympy.core.relationalr   Úsympy.external.gmpyr   r\   Úsympy.ntheoryr   Úsympy.ntheory.residue_ntheoryr   Úsympy.polys.polytoolsr   Úmathr   r  r   r   rB   r   r©   r«   rÊ   rÚ   rò   r  r8  rû   r*   r%   r#   ú<module>rK     s¾   ðÝ "Ý ç -Ó -Ý $ß NÑ NÝ &ß -Ñ -Ý $Ý -Ý Ý 6Ý &ç =Ñ =ô˜Oô ô&s>Ð%ô s>ôj	Ð*ô 	ô_Ð(ô _ôDp0Ð&ô p0ôp^8Ð+ô ^8ôBY8Ð,ô Y8ðx €Ø€ôqRÐ$õ qRr%   