§
    OŠtj™  ã                  ó®  — 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.dS )é    )Ú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dS )Ú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/html/CA-Chatbot/venv/lib/python3.11/site-packages/sympy/functions/combinatorial/factorials.pyÚ_eval_simplifyz$CombinatorialFunction._eval_simplify   s[   € Ø4Ð4Ð4Ð4Ð4Ð4ð ˆx˜‰~Œ~ˆØ˜Ô#ˆØˆ7�4‰=Œ=˜F 7œO¨G¨G°D©M¬MÑ9Ò9Ð9ØˆKØˆó    N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r$   © r%   r#   r   r      s)   € € € € € Ø2Ð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dS )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    r4 || j        d         dz   ¦  «         |d| j        d         dz   ¦  «        z  S t	          | |¦  «        ‚)Nr   )ÚgammaÚ	polygammar,   )Ú'sympy.functions.special.gamma_functionsr.   r/   Úargsr   )r    Úargindexr.   r/   s       r#   Úfdiffzfactorial.fdiffU   sj   € ØNÐNÐNÐNÐNÐNÐNÐNØ�qŠ=ˆ=Ø�5˜œ 1œ¨Ñ)Ñ*Ô*¨9¨9°Q¸¼	À!¼ÀqÑ8HÑ+IÔ+IÑIÐIå$ T¨8Ñ4Ô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 ]>}d|}}	 ||z  }|dk    r|dz  dk    r||z  }nnŒ|dk    r|                     |¦  «         Œ?t          j        |dz   |dz  dz   ¦  «        D ]#}||z  dz  dk    r|                     |¦  «         Œ$t          t          j        |dz  dz   |dz   ¦  «        ¦  «        }t          |¦  «        }||z  S )Né!   r4   r,   Tr   é   )Ú_small_swingÚintÚ_sqrtr   Ú
primerangeÚappendr   )	ÚclsÚnÚNÚprimesÚprimeÚpÚqÚ	L_productÚ	R_products	            r#   Ú_swingzfactorial._swingd   s6  € àˆrŠ6ˆ6ØÔ# AÔ&Ð&å�E !™HœH™œ rˆvˆAåÔ)¨!¨Q°©UÑ3Ô3ð %ð %�Ø˜!�1�ðØ˜%‘K�Aà˜1’u�uØ˜q™5 Aš:˜:Ø ™J˜Aøàðð �q’5�5Ø—M’M !Ñ$Ô$Ð$øåÔ)¨!¨a©%°°A±¸±Ñ:Ô:ð )ð )�Ø˜‘J !Ñ# qÒ(Ð(Ø—M’M %Ñ(Ô(Ð(øå�UÔ-¨a°©d°Q©h¸¸A¹Ñ>Ô>Ñ?Ô?ˆIÝ˜V™œˆIà˜YÑ&Ð&r%   c                ót   — |dk     rdS |                       |dz  ¦  «        dz  |                      |¦  «        z  S )Nr?   r,   )Ú
_recursiverN   )rE   rF   s     r#   rP   zfactorial._recursiveƒ   s:   € àˆqŠ5ˆ5Ø�1à—N’N 1 a¡4Ñ(Ô(¨!Ñ+¨S¯ZªZ¸©]¬]Ñ:Ð:r%   c                óN  — t          |¦  «        }|j        �r|j        rt          j        S |t          j        u rt          j        S |j        rÙ|j        rt          j        S |j	        }|dk     rL| j
        s4d}t          dd¦  «        D ]!}||z  }| j
                             |¦  «         Œ"| j
        |dz
           }n\t          �t          j        |¦  «        }n@t          |¦  «                             d¦  «        }|                      |¦  «        d||z
  z  z  }t%          |¦  «        S d S d S )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Š   s7  € å�A‰JŒJˆàŒ;ñ #	+ØŒyð "+Ý”u�Ø•a”j��Ý”zÐ!Ø”ð +Ø”=ð +ÝÔ,Ð,àœ�Aà˜2’v�vØ"Ô4ð EØ%&˜FÝ%*¨1¨b¡\¤\ð Eð E Ø &¨!¡ Ø #Ô 5× <Ò <¸VÑ DÔ DÐ DÐ DØ!$Ô!6°q¸±sÔ!;˜˜õ Ð*Ý!&¤¨1¡¤˜˜õ  # 1™vœvŸ|š|¨CÑ0Ô0˜Ø!$§¢°Ñ!2Ô!2°1°q¸4±x±=Ñ!@˜å" 6™?œ?Ð*ðG#	+ð #	+ð
+ð +r%   c                ó   — dt          t          |¦  «        ¦  «        }}dg|z  }d}t          j        d|dz   ¦  «        D ]L}|dk    rd||z  }}|r||z  }||z  }|°||k     r||         |z  |z  ||<   Œ5|t	          |||¦  «        z  |z  }ŒMt          |¦  «        D ]2\  }	}
|	dk    s|
dk    rŒ|
dk    r dS |t	          |
|	|¦  «        z  |z  }Œ3|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”MˆQˆð ˆS�‰UˆàˆÝÔ% a¨¨Q©Ñ/Ô/ð 		/ð 		/ˆEØ�1ŠuˆuØ˜!˜u™*�1�Øð  Ø˜‘F�AØ˜%‘K�Að ð  ð �1ŠuˆuØ˜1œ˜e™ a™��1‘�à�#˜e Q¨Ñ*Ô*Ñ*¨QÑ.��å ‘m”mð 	)ð 	)‰FˆB�Ø�QŠwˆw˜" š'˜'ØØ�QŠwˆwØ�q�qØ•c˜"˜b !‘n”nÑ$ qÑ(ˆCˆCàˆ
r%   c                ó  — | 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 d S d S |j        r…|j        r€t          t          |||f¦  «        \  }}}|r?|dz
  |k     r6|                      |dz
  |¦  «        }t          ||dz
  |¦  «        }|dz  r| }n|                      ||¦  «        }||z  S d S d S d S d S d S )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Ñ   so  € ØŒI�aŒLˆØŒ<ð 	"˜AÔ,ð 	"°´ð 	"Ý�Q‘”ˆBØ�Q‘ˆAØÔð "Ý”v�àœ+�Ø˜’6�6ð
 ð &Ø! A™v˜Ø  EÐ)Ð)¨r°A©vÔ.EÐ)Ý œv˜ð *Ð)Ð)Ð)à”\ð 
" a¤lð 
"Ý"¥3¨¨A¨r¨
Ñ3Ô3‘H�A�q˜"Øð 1 A¨¡E¨A¢I IØ!Ÿ\š\¨!¨a©%°Ñ4Ô4˜Ý   R¨!¡V¨RÑ0Ô0˜Ø˜Q™3ð %Ø"$ ˜Bøà!Ÿ\š\¨!¨RÑ0Ô0˜à ™6�Mð5	"ð 	"ð 	"ð 	"ð 	"ð 	"ð 
"ð 
"ð 
"ð 
"r%   Tc                ó*   — 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ÐAÐAÐAÐAÐAØˆu�Q˜‘U‰|Œ|Ðr%   c                ór   — ddl m} |j        r'|j        r"t	          dd¬¦  «        } |||d|f¦  «        S d S d S )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ó   sf   € Ø3Ð3Ð3Ð3Ð3Ð3ØÔð 	) ¤ð 	)Ý�c 4Ð(Ñ(Ô(ˆAØ�7˜1˜q ! Q˜iÑ(Ô(Ð(ð	)ð 	)ð 	)ð 	)r%   c                óV   — | j         d         j        r| j         d         j        rdS d S d S ©Nr   T©r1   rq   rr   ©r    s    r#   Ú_eval_is_integerzfactorial._eval_is_integerù   ó<   € ØŒ9�QŒ<Ô"ð 	 t¤y°¤|Ô'Bð 	Ø�4ð	ð 	ð 	ð 	r%   c                óV   — | j         d         j        r| j         d         j        rdS d S d S r‰   rŠ   r‹   s    r#   Ú_eval_is_positivezfactorial._eval_is_positiveý   r�   r%   c                óT   — | j         d         }|j        r|j        r|dz
  j        S d S d S )Nr   r?   rŠ   ©r    Úxs     r#   Ú_eval_is_evenzfactorial._eval_is_even  óB   € ØŒI�aŒLˆØŒ<ð 	*˜AÔ,ð 	*Ø˜‘EÔ)Ð)ð	*ð 	*ð 	*ð 	*r%   c                óT   — | j         d         }|j        r|j        r|dz
  j        S d S d S )Nr   r4   rŠ   r‘   s     r#   Ú_eval_is_compositezfactorial._eval_is_composite  r”   r%   c                ó@   — | j         d         }|j        s|j        rdS d S r‰   )r1   rr   Úis_nonintegerr‘   s     r#   Ú_eval_is_realzfactorial._eval_is_real  s0   € ØŒI�aŒLˆØÔð 	˜qœð 	Ø�4ð	ð 	r%   c                óð   — | j         d                              |¦  «        }|                     |d¦  «        }|j        rt          j        S |j        s|                      |¦  «        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  sl   € ØŒi˜Œl×*Ò*¨1Ñ-Ô-ˆØ�xŠx˜˜1‰~Œ~ˆØŒ<ð 	"Ý”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   $   sE  € € € € € € ð.ð .ð`5ð 5ð 5ð 5ðð ð €Lð $&ÐÐ%Ð%Ð%Ñ%àð'ð 'ñ „[ð'ð< ð;ð ;ñ „[ð;ð ð&+ð &+ñ „[ð&+ðPð ð ð<"ð "ð "ð<ð ð ð ð)ð )ð )ðð ð ðð ð ð*ð *ð *ð
*ð *ð *ð
ð ð ð
>ð >ð >ð >ð >r%   r   c                  ó   — e Zd ZdS )ÚMultiFactorialN)r&   r'   r(   r*   r%   r#   r©   r©     s   € € € € € Ø€Dr%   r©   c                  óz   — 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dS )Ú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  sd   € ð ð 	Ý”5ˆLØ�!ŠVˆVÝ”6ˆMà‰FˆB�Ý˜1˜a !™e‘_”_ð /ð /�Ø˜a !™e b¨2¡gÑ.�B��ØˆIr%   c                óÆ   — |j         rW|j        r|j        r|                      |¦  «        S |t          j        u rt          j        S |t          j        u rt          j        S d S d S ©N)rT   rX   rr   r¯   r   ÚNaNrW   )rE   r¡   s     r#   rc   zsubfactorial.evalT  si   € àŒ=ð 	"ØŒ~ð " #Ô"4ð "Ø—y’y ‘~”~Ð%Ø�œ��Ý”u�Ø�œ
Ð"Ð"Ý”zÐ!ð	"ð 	"ð
 #Ð"r%   c                óV   — | j         d         j        r| j         d         j        rdS d S d S r‰   )r1   Úis_oddrr   r‹   s    r#   r“   zsubfactorial._eval_is_even^  s<   € ØŒ9�QŒ<Ôð 	 4¤9¨Q¤<Ô#>ð 	Ø�4ð	ð 	ð 	ð 	r%   c                óV   — | j         d         j        r| j         d         j        rdS d S d S 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  sY   € Ø7Ð7Ð7Ð7Ð7Ð7Ý�#‰JŒJˆÝŒM˜1Ñ�y¨™|œ|Ñ+ˆÝ˜‰~Œ~ 	 	¨!¨a°°C¨[Ñ 9Ô 9Ñ9Ð9r%   Tc                óÒ   — 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ÐOÐOÐOÐOÐOÐOÐOÝ”  a¡Ñ(¨¨­a¨Rµ©U°3©Y©¬Ñ7¸
¸
À3ÈÁ7ÈBÑ8OÔ8OÑOØ�%˜˜a™‘.”.ñ!Ø"% # b¡'¤'ñ*ð 	*r%   c                óF   — 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  s1   € ØFÐFÐFÐFÐFÐFØˆz˜# ™' 2Ñ&Ô&¥q¤vÑ-Ð-r%   c                óV   — | j         d         j        r| j         d         j        rdS d S d S r‰   rŠ   r‹   s    r#   Ú_eval_is_nonnegativez!subfactorial._eval_is_nonnegativev  r�   r%   c                óV   — | j         d         j        r| j         d         j        rdS d S d S r‰   )r1   Úis_evenrr   r‹   s    r#   Ú_eval_is_oddzsubfactorial._eval_is_oddz  s<   € ØŒ9�QŒ<Ôð 	 D¤I¨a¤LÔ$?ð 	Ø�4ð	ð 	ð 	ð 	r%   Nr¥   )r&   r'   r(   r)   r§   r	   r¯   rc   r“   rŒ   r»   r‚   rÃ   rÅ   rÈ   r*   r%   r#   r«   r«     sÍ   € € € € € ð'ð 'ðR Øð	ð 	ñ „Wñ „[ð	ð ð"ð "ñ „[ð"ðð ð ðð ð ð:ð :ð :ð*ð *ð *ð *ð.ð .ð .ðð ð ðð ð ð ð r%   r«   c                  óH   — e Zd ZdZed„ ¦   «         Zd„ Zd„ Zd„ Zd„ Z	d
d„Z
d	S )Ú
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                óR  — |j         rŸ|j        st          d¦  «        ‚|j        rC|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¦  «        ‚d S )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ð MØ�AœM¨a°#©g°q©[Ñ9Ñ9½JÈÀtÑ<LÔ<LÑLÐLÝð :ñ ;ô ;ð ;ð!	;ð 	;r%   c                óz   — | j         d         }|j        r"|j        rdS |j        r|j        rdS |j        rdS d S d S d S )Nr   FT)r1   rq   r´   rÇ   Úis_positiverU   ©r    rF   s     r#   r“   zfactorial2._eval_is_even½  sl   € àŒI�aŒLˆØŒ<ð 	!ØŒxð Ø�uØŒyð !Ø”=ð  Ø˜4Ø”9ð !Ø ˜5ð	!ð 	!ð!ð !ð!ð !r%   c                ól   — | j         d         }|j        r|dz   j        rdS |j        r|dz   j        S d S d S )Nr   r,   Tr4   )r1   rq   rr   r´   rÐ   s     r#   rŒ   zfactorial2._eval_is_integerÉ  sX   € ð ŒI�aŒLˆØŒ<ð 	.Ø�A‘Ô%ð Ø�tØŒxð .Ø˜A™Ô-Ð-ð		.ð 	.ð.ð .r%   c                óx   — | j         d         }|j        r
|dz   j        S |j        r|j        rdS |j        rdS d S d S )Nr   r4   FT)r1   r´   rr   rÇ   rÏ   rU   rÐ   s     r#   rÈ   zfactorial2._eval_is_oddÓ  sb   € ð ŒI�aŒLˆØŒ8ð 	*Ø˜‘EÔ)Ð)ØŒ9ð 	ØŒ}ð Ø�uØŒyð Ø�tð		ð 	ðð r%   c                ór   — | j         d         }|j        r |dz   j        rdS |j        r|dz   dz  j        S d S d S )Nr   r,   Tr?   )r1   rq   rr   r´   rÇ   rÐ   s     r#   r�   zfactorial2._eval_is_positiveß  s\   € ð ŒI�aŒLˆØŒ<ð 	-Ø�A‘Ô%ð Ø�tØŒxð -Ø˜Q™ !™Ô,Ð,ð		-ð 	-ð-ð -r%   Tc                ó  — 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ê  s¯   € ØAÐAÐAÐAÐAÐAØBÐBÐBÐBÐBÐBØAÐAÐAÐAÐAÐAØ�1�Q‘3‰x˜˜˜a ™c A™g™œÑ&¨¨°Aµr½#¸aÀ¹)¼)ÀQÑ7GÔ7GÐ3HØ��a�‘d‘”�R¥ A q¡	¤	¨1Ñ-Ô-Ð.ñ*0ô *0ñ 0ð 	0r%   Nr¥   )r&   r'   r(   r)   r§   rc   r“   rŒ   rÈ   r�   r‚   r*   r%   r#   rÊ   rÊ     sŠ   € € € € € ð#ð #ðJ ð;ð ;ñ „[ð;ð.
!ð 
!ð 
!ð.ð .ð .ð
ð 
ð 
ð	-ð 	-ð 	-ð0ð 0ð 0ð 0ð 0ð 0r%   rÊ   c                  óP   — e Zd ZdZed„ ¦   «         Zdd„Zd„ Zd„ Zd„ Z	dd	„Z
d
„ ZdS )Ú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          ¦  «        rW‰j        }t          |¦  «        dk    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          ¦  «        rk‰j        }t          |¦  «        dk    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 d S d S d S )Nr,   ú0rf only defined for polynomials on one generatorc                ó4   •— | ‰                      |¦  «        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                ó6   •— | ‰                      | ¦  «        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ŒJˆÝ�A‰JŒJˆà•”ˆ:ˆ:˜�aœe˜˜Ý”5ˆLØ•!”%ˆZˆZÝ˜Q‘<”<ÐØŒ\ñ ,	JØŒyð +JÝ”u�à”=ð (JØ�AœJ��Ý œzÐ)Ø�aÔ0Ð0Ð0Øœ8ð .Ý#$Ô#5Ð5å#$¤:Ð-å% a­Ñ.Ô.ð <Ø#$¤6˜DÝ" 4™yœy¨1š}˜}Ý&0ð 2Kñ 'Lô 'Lð !Lõ (.ð /=ð /=ð /=ð /=å.3µC¸±F´F©m¬m¸Qñ(@ô (@ð !@õ $*Ð*@Ð*@Ð*@Ð*@Ý*/µ°A±´©-¬-¸ñ$<ô $<ð <ð �AœJ��Ý œzÐ)Ø�aÔ0Ð0Ð0Ý œzÐ)å% a­Ñ.Ô.ð JØ#$¤6˜DÝ" 4™yœy¨1š}˜}Ý&0ð 2Kñ 'Lô 'Lð !Lð ()­ð 1@ð 1@ð 1@ð 1@å05°a½½SÀ¹V¼V¹¼Àq¹Ñ0IÔ0IÈ1ñ*Nô *Nñ (Nð !Nð $%¥Vð -6ð -6ð -6ð -6å,1°!µS½¸Q¹¼±[´[À1±_Ñ,EÔ,EÀqñ&Jô &Jñ $Jð Jð Œ<˜5Ò Ð ØŒ|ð  ¤ð Ý”v�ð !Ð ðð ð ð r%   Tc                ó~  — ddl m} ddlm} |sU|dk    dk    r1t          j        |z   |d|z
  ¦  «        z   || |z
  dz   ¦  «        z  S  |||z   ¦  «         ||¦  «        z  S  | |||z   ¦  «         ||¦  «        z  |dk    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ÐBÐBÐBÐBÐBØAÐAÐAÐAÐAÐAØð 	+Ø�Q’˜4ÒÐÝ”} aÑ'¨¨¨a°!©e©¬Ñ4°u°u¸a¸RÀ!¹VÀa¹ZÑ7HÔ7HÑHÐHØ�5˜˜Q™‘<”< % %¨¡(¤(Ñ*Ð*ØˆyØˆU�1�q‘5‰\Œ\˜E˜E !™HœHÑ$ a¨!¢eÐ,ÝŒ]˜AÑ˜e˜e A¨¡E™lœlÑ*¨U¨U°A°2¸±6¸A±:Ñ->Ô->Ñ>ÀÐEñGô 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        rs|j        rn |t          ||z   dz
  ¦  «        t          |dz
  ¦  «        z  |dk    ft          j        |z  t          | ¦  «        z  t          | |z
  ¦  «        z  df¦  «        S d S d S ©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ÐBÐBÐBÐBÐBØŒ<ð 	J˜AœLð 	JØ�9Ý˜1˜q™5 1™9Ñ%Ô%¥i°°A±Ñ&6Ô&6Ñ6¸¸AºÐ>Ý” Ñ!¥)¨Q¨B¡-¤-Ñ/µ	¸1¸"¸q¹&Ñ0AÔ0AÑAÀ4ÐHñJô Jð Jð	Jð 	Jð 	Jð 	Jr%   c                ó`   — |j         r&t          |¦  «        t          ||z   dz
  |¦  «        z  S d S rñ   ©rq   r   Úbinomialró   s       r#   Ú_eval_rewrite_as_binomialz)RisingFactorial._eval_rewrite_as_binomial…  s9   € ØŒ<ð 	9Ý˜Q‘<”<¥(¨1¨q©5°1©9°aÑ"8Ô"8Ñ8Ð8ð	9ð 	9r%   Nc                óÈ  — ddl m} |r±|                     |t          j        ¦  «        }|t          j        u r/ |||z   ¦  «                             dd¬¦  «         ||¦  «        z  S |t          j        u rFt          j        |z   |d|z
  ¦  «        z   || |z
  dz   ¦  «                             dd¬¦  «        z  S |                      |¦  «                             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ÐAÐAÐAÐAÐAØð 	kØ—F’F˜8¥Q¤ZÑ0Ô0ˆEØ�œ
Ð"Ð"Ø˜˜a !™e™œ×,Ò,¨[¸tÐ,ÑDÔDÀuÀuÈQÁxÄxÑOÐPØ�!Ô,Ð,Ð,Ýœ qÑ(¨¨¨q°1©u©¬Ñ5¸¸¸q¸bÀ1¹fÀq¹jÑ8IÔ8I×8QÒ8QÐR]ÐdhÐ8QÑ8iÔ8iÑiÐjØ�|Š|˜EÑ"Ô"×*Ò*¨;¸TÐ*ÑBÔ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“  ó;   € Ý˜$œ) Aœ,Ô1°4´9¸Q´<Ô3JØœ) Aœ,Ô5ð7ñ 8ô 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ñ „[ð8ðt	Gð 	Gð 	Gð 	Gð.ð .ð .ðJð Jð Jð9ð 9ð 9ðCð Cð Cð Cð8ð 8ð 8ð 8ð 8r%   rÚ   c                  óP   — e Zd ZdZed„ ¦   «         Zdd„Zd„ Zd„ Zd„ Z	dd	„Z
d
„ ZdS )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          ¦  «        rW‰j        }t          |¦  «        dk    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          ¦  «        rk‰j        }t          |¦  «        dk    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 d S )Nr,   z0ff only defined for polynomials on one generatorc                ó6   •— | ‰                      | ¦  «        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                ó4   •— | ‰                      |¦  «        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ŒJˆÝ�A‰JŒJˆà•”ˆ:ˆ:˜�aœe˜˜Ý”5ˆLØŒ\ð ,	J˜a 1šf˜fÝ˜Q‘<”<ÐØŒ\ñ *	JØŒyð )JÝ”u�à”=ð &JØ�AœJ��Ý œzÐ)Ø�aÔ0Ð0Ð0Øœ8ð .Ý#$Ô#5Ð5å#$¤:Ð-å% a­Ñ.Ô.ð <Ø#$¤6˜DÝ" 4™yœy¨1š}˜}Ý&0ð 2Kñ 'Lô 'Lð !Lõ (.ð />ð />ð />ð />å.3µC¸±F´F©m¬m¸Qñ(@ô (@ð !@õ $*Ð*@Ð*@Ð*@Ð*@Ý*/µ°A±´©-¬-¸ñ$<ô $<ð <ð �AœJ��Ý œzÐ)Ø�aÔ0Ð0Ð0Ý œzÐ)å% a­Ñ.Ô.ð JØ#$¤6˜DÝ" 4™yœy¨1š}˜}Ý&0ð 2Kñ 'Lô 'Lð !Lð ()­ð 1?ð 1?ð 1?ð 1?å05°a½½SÀ¹V¼V¹¼Àq¹Ñ0IÔ0IÈ1ñ*Nô *Nñ (Nð !Nð $%¥VÐ,BÐ,BÐ,BÐ,BÝ,1°!µS½¸Q¹¼±[´[À1±_Ñ,EÔ,EÀqñ&Jô &Jñ $Jð JðS*	Jð *	Jr%   Tc                ó~  — ddl m} ddlm} |sU|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ÐBÐBÐBÐBÐBØAÐAÐAÐAÐAÐAØð 	3Ø�A’˜$ŠˆÝ”} aÑ'¨¨¨a°!©e©¬Ñ4°u°u¸a¸R±y´yÑ@Ð@Ø�5˜˜Q™‘<”< % %¨¨A©°©	Ñ"2Ô"2Ñ2Ð2ØˆyØˆU�1�q‘5‰\Œ\˜E˜E ! a¡%¨!¡)Ñ,Ô,Ñ,¨a°1ªfÐ5ÝŒ]˜AÑ˜e˜e A¨¡E™lœlÑ*¨U¨U°A°2©Y¬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                óT   — |j         r t          |¦  «        t          ||¦  «        z  S d S r±   rú   ró   s       r#   rü   z*FallingFactorial._eval_rewrite_as_binomial  s/   € ØŒ<ð 	1Ý˜Q‘<”<¥(¨1¨a¡.¤.Ñ0Ð0ð	1ð 	1r%   c                ó
  — ddl m} |j        rs|j        rn |t          |¦  «        t          | |z   ¦  «        z  |dk    ft          j        |z  t          ||z
  dz
  ¦  «        z  t          | dz
  ¦  «        z  df¦  «        S d S d S rö   r÷   rø   s        r#   r»   z+FallingFactorial._eval_rewrite_as_factorial  s´   € ØBÐBÐBÐBÐBÐBØŒ<ð 	Q˜AœLð 	QØ�9Ý˜1‘”�i¨¨¨Q©Ñ/Ô/Ñ/°°a²Ð8Ý” Ñ!¥)¨A°©E°A©IÑ"6Ô"6Ñ6µyÀ!ÀÀaÁÑ7HÔ7HÑHÈ$ÐOñQô Qð Qð	Qð 	Qð 	Qð 	Qr%   Nc                óÈ  — ddl m} |r±|                     |t          j        ¦  «        }|t          j        u r@t          j        |z   |||z
  ¦  «                             dd¬¦  «        z   || ¦  «        z  S |t          j        u r5 ||dz   ¦  «         |||z
  dz   ¦  «                             dd¬¦  «        z  S |                      |¦  «                             dd¬¦  «        S rþ   )r0   r.   rœ   r   rW   r¹   r  rç   r  s          r#   r  z+FallingFactorial._eval_rewrite_as_tractable%  sö   € ØAÐAÐAÐAÐAÐAØð 	YØ—F’F˜8¥Q¤ZÑ0Ô0ˆEØ�œ
Ð"Ð"Ýœ qÑ(¨¨¨q°1©u©¬×)=Ò)=¸kÐPTÐ)=Ñ)UÔ)UÑUÐX]ÐX]Ð_`Ð^`ÑXaÔXaÑaÐbØ�!Ô,Ð,Ð,Ø˜˜a !™e™œ u u¨Q°©U°Q©YÑ'7Ô'7×'?Ò'?ÀÐRVÐ'?Ñ'WÔ'WÑWÐXØ�|Š|˜EÑ"Ô"×*Ò*¨;¸TÐ*ÑBÔ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ñ „[ð2Jðh	?ð 	?ð 	?ð 	?ð ð  ð  ð1ð 1ð 1ðQð Qð QðCð Cð Cð Cð8ð 8ð 8ð 8ð 8r%   rò   c                  ó€   — 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dS )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
    r,   c                ó:  — ddl m} |dk    r=| j        \  }}t          ||¦  «         |d|dz   ¦  «         |d||z
  dz   ¦  «        z
  z  S |dk    r=| 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ÐEÐEÐEÐEÐEØ�qŠ=ˆ=à”9‰DˆAˆqÝ˜A˜q‘>”> 9 9¨Q°°A±Ñ#6Ô#6Ø�	˜!˜Q ™U Q™YÑ'Ô'ñ$(ñ )ð )à˜Š]ˆ]à”9‰DˆAˆqÝ˜A˜q‘>”> 9 9¨Q°°A±¸±	Ñ#:Ô#:Ø�	˜!˜Q ™UÑ#Ô#ñ$$ñ %ð %õ % T¨8Ñ4Ô4Ð4r%   c                óà  — |j         ræ|j         r¦|dk    r t          |¦  «        t          |¦  «        }}||k    rt          j        S ||dz  k    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 d S )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”v�s 1™vœv�1�à�q’5�5Ýœ6�MØ˜˜a™’Z�ZØ˜A™�Aõ
 Ð$Ý"¥5¤=°°AÑ#6Ô#6Ñ7Ô7Ð7à ™E 1�6�Ý˜q ! a¡%™œð -ð -�AØ˜‘F�AØ# a™Z¨1™_�F�FÝ˜v‘”Ð&à ™E 1�6�Ý˜q ! a¡%™œð  ð  �AØ˜‘F�AØ˜a‘K�F�FØ¥
¨1¡¤Ñ-Ð-ð3	.ð 	.r%   c                ó0  — 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        rW|j        s|r|r|j        rt
          j        S |j	        r0|  
                    ||¦  «        }|r|                     d¬¦  «        n|S d S |du r|rt
          j        S |j	        r5ddlm}  ||dz   ¦  «         ||dz   ¦  «         |||z
  dz   ¦  «        z  z  S d S )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�'ˆØŒ9ð 	˜(ð 	 g°Ð&6Ð&6Ø”Ið '7å”5ˆLØ�‰EŒ?ð 	 ð 	¨G°uÐ,<Ð,<Ø˜‘U”Oð -=àˆHØŒ<ð 	@ØŒ}ð > ð >¨gð >¸!¼-ð >Ý”v�Ø”ð >Ø—i’i  1‘o”o�Ø14Ð=�s—z’z¨�zÑ-Ô-Ð-¸#Ð=ð>ð >ð ˜ÐÐ 7ÐåÔ$Ð$ØŒ[ð 	@ØEÐEÐEÐEÐEÐEØ�5˜˜Q™‘<”<   q¨1¡u¡¤¨e¨e°A¸±E¸A±IÑ.>Ô.>Ñ!>Ñ?Ð?ð	@ð 	@r%   c                ód  — | 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}||k    rt          j        S |j	        }t          |¦  «        }|rÕ||k     r4||}}|s|r*|t          ||z  ||z  ¦  «        z  |z  }||z  ||z  }}|°(|°*�n’||z
  }	||	k    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k    rt          |||¦  «        }nÌt          t          |¦  «        ¦  «        }t          j        d|dz   ¦  «        D ]—}|||z
  k    r	||z  |z  }Œ||dz  k    rŒ||k    r||z  ||z  k     r||z  |z  }Œ9||}}dx}}|dk    r1t          ||z  ||z  |z   k     ¦  «        }||z  ||z  }}||z  }|dk    °1|dk    r|t          |||¦  «        z  }||z  }Œ˜t          ||z  ¦  «        S d S )Nc              3  ó(   K  — | ]}|j         d u V — ŒdS )FN)rq   ©Ú.0r’   s     r#   ú	<genexpr>z%binomial._eval_Mod.<locals>.<genexpr>ã  s)   è è € Ð8Ð8¨ˆqŒ|˜uÐ$Ð8Ð8Ð8Ð8Ð8Ð8r%   z"Integers expected for binomial Modc              3  ó$   K  — | ]}|j         V — Œd S r±   )rX   r%  s     r#   r'  z%binomial._eval_Mod.<locals>.<genexpr>æ  s$   è è € Ð/Ð/ ˆqŒ|Ð/Ð/Ð/Ð/Ð/Ð/r%   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‰ˆˆ1åÐ8Ð8¨q°!°Q¨iÐ8Ñ8Ô8Ñ8Ô8ð 	CÝÐAÑBÔBÐBåÐ/Ð/ a¨¨A YÐ/Ñ/Ô/Ñ/Ô/ñ K	Ý•s˜Q ˜FÑ#Ô#‰DˆAˆqÝ˜!‘f”f˜a�ˆBð �1ŠuˆuÝ”v�Ø�1ŠuˆuØ�B˜‘F˜Q‘J�Ø˜a™CÐ&�b�b Q�ð �1ŠuˆuÝ”v�à”kˆGÝ�R‘”ˆBØð 8&Ø˜’6�6à˜a�q�AØð 0˜qð 0Ø!¥(¨1¨r©6°1°r±6Ñ":Ô":Ñ:¸RÑ?˜Ø  B™w¨¨R©˜1˜ð ð 0˜qð 0ùð ˜A™�AØ˜1’u�uØ  !˜1˜Ø�BÝ" 1 a¨!¡e™_œ_ð 'ð '˜Ø ™T B™Y˜˜Ø�BÝ" 1 q¡5¨!¨a©%Ñ0Ô0ð 'ð '˜Ø ™T B™Y˜˜Ø˜2‘I�CÝ" 1 q¡5¨!¨a©%Ñ0Ô0ð )ð )˜Ø! !™e b™j˜˜à�3˜r "™u r™z¨2°©6°2Ñ6Ô6Ñ6�CØ˜2‘I�C�Cå�q‘”˜A’� ! q¢& &Ý" 1 a¨Ñ+Ô+��õ �˜a™œ‘M”M�Ý"Ô-¨a°°Q±Ñ7Ô7ð &ð &�EØ˜q 1™u’}�}Ø! %™i¨"™n˜˜Ø  a¡š˜Ø Ø š˜Ø˜u™9 q¨5¡yÒ0Ð0Ø"% e¡)¨b¡.˜Cøà  !˜1˜Ø"#˜˜˜aà !še˜eÝ # Q¨¡Y°1°u±9¸q±=Ò$AÑ BÔ B˜AØ#$¨¡:¨q°E©z˜q˜AØ 1™H˜Cð   !še˜eð
  š7˜7Ø¥3 u¨c°2Ñ#6Ô#6Ñ6˜CØ 2™I˜Cøå�S˜1‘W‘:”:ÐðWK	ð K	r%   c                óx  — | j         d         }|j        rt          | j         Ž S | j         d         }||z
  j        r||z
  }|j        rh|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�aŒLˆØŒ;ð 	(Ý˜TœYÐ'Ð'àŒI�aŒLˆØˆa‰CÔð 	Ø�A‘ˆAàŒ<ð 	(ØŒyð .Ý”u�Ø”ð .Ý”v�à œI aœL¨!�6�Ý˜q ! a¡%™œð (ð (�AØ˜a !™e a™iÑ'�F�FØ¥
¨1¡¤Ñ-Ð-å˜TœYÐ'Ð'r%   c                óf   — 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%   Tc                ól   — 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  sN   € ØAÐAÐAÐAÐAÐAØˆu�Q˜‘U‰|Œ|˜U˜U 1 q¡5™\œ\¨%¨%°°A±¸±	Ñ*:Ô*:Ñ:Ñ;Ð;r%   Nc                óT   — |                       ||¦  «                             d¦  «        S )Nrÿ   )r‚   r  )r    rF   rÍ   r  r!   s        r#   r  z#binomial._eval_rewrite_as_tractableU  s&   € Ø×*Ò*¨1¨aÑ0Ô0×8Ò8¸ÑEÔEÐEr%   c                óT   — |j         r t          ||¦  «        t          |¦  «        z  S d S r±   )rq   Úffr   r4  s       r#   rô   z*binomial._eval_rewrite_as_FallingFactorialX  s/   € ØŒ<ð 	+Ý�a˜‘8”8�i¨™lœlÑ*Ð*ð	+ð 	+r%   c                óP   — | j         \  }}|j        r	|j        rdS |j        du rdS d S ©NTF)r1   rq   ©r    rF   rÍ   s      r#   rŒ   zbinomial._eval_is_integer\  s?   € ØŒy‰ˆˆ1ØŒ<ð 	˜AœLð 	Ø�4ØŒ\˜UÐ"Ð"Ø�5ð #Ð"r%   c                ó‚   — | j         \  }}|j        r)|j        r$|j        s|j        s|j        rdS |j        du rdS d S d S d S r:  )r1   rq   rr   rY   rÇ   r;  s      r#   rÅ   zbinomial._eval_is_nonnegativec  sp   € ØŒy‰ˆˆ1ØŒ<ð 	˜AœLð 	ØÔð  1¤=ð °A´Ið Ø�tØ”˜eÐ#Ð#Ø˜ð		ð 	ð 	ð 	ð $Ð#r%   c                ód   — ddl m} |                      |¦  «                             |||¬¦  «        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ÐAÐAÐAÐAÐAØ�|Š|˜EÑ"Ô"×8Ò8¸ÀÈDÐ8ÑQÔ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û   <  s  € € € € € ð[ð [ðz5ð 5ð 5ð 5ð ð.ð .ñ „[ð.ð< ð@ð @ñ „[ð@ð.Qð Qð Qðf(ð (ð (ð6<ð <ð <ð<ð <ð <ð <ðFð Fð Fð Fð+ð +ð +ðð ð ðð ð ðRð Rð Rð Rð 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Ð NÐ NÐ NÐ NÐ NÐ NÐ NÐ NØ &Ð &Ð &Ð &Ð &Ð &Ø -Ð -Ð -Ð -Ð -Ð -Ð -Ð -Ð -Ð -Ø $Ð $Ð $Ð $Ð $Ð $Ø -Ð -Ð -Ð -Ð -Ð -Ø Ð Ð Ð Ð Ð Ø 6Ð 6Ð 6Ð 6Ð 6Ð 6Ø &Ð &Ð &Ð &Ð &Ð &à =Ð =Ð =Ð =Ð =Ð =Ð =Ð =Ð =Ð =ðð ð ð ð ˜Oñ ô ð ð&s>ð s>ð s>ð s>ð s>Ð%ñ s>ô s>ð s>ðj	ð 	ð 	ð 	ð 	Ð*ñ 	ô 	ð 	ð_ð _ð _ð _ð _Ð(ñ _ô _ð _ðDp0ð p0ð p0ð p0ð p0Ð&ñ p0ô p0ð p0ðp^8ð ^8ð ^8ð ^8ð ^8Ð+ñ ^8ô ^8ð ^8ðBY8ð Y8ð Y8ð Y8ð Y8Ð,ñ Y8ô Y8ð Y8ðx €Ø€ðqRð qRð qRð qRð qRÐ$ñ qRô qRð qRð qRð qRr%   