§
    OŠtj{  ã                   óR   — d Z ddlmZmZmZ ddlmZmZmZ ddl	m
Z
 d
d„Zd„ Zd„ Zd	S )z1Gosper's algorithm for hypergeometric summation. é    )ÚSÚDummyÚsymbols)ÚPolyÚparallel_poly_from_exprÚfactor)Úis_sequenceTc                 óô  — t          | |f|dd¬¦  «        \  \  }}}|                     ¦   «         |                     ¦   «         }}|                     ¦   «         |                     ¦   «         }
}	|j        ||	z  }}t	          d¦  «        }t          ||z   |||j        ¬¦  «        }|                     |
                     |¦  «        ¦  «        }d„ | 	                    ¦   «          
                    ¦   «         D ¦   «         }t          |¦  «        D ]˜}|                     |
                     |
 ¦  «        ¦  «        }|                     |¦  «        }|
                     |                     | ¦  «        ¦  «        }
t          d|dz   ¦  «        D ]}||                     | ¦  «        z  }ŒŒ™|                     |¦  «        }|s<|                     ¦   «         }|
                     ¦   «         }
|                     ¦   «         }||
|fS )a`  
    Compute the Gosper's normal form of ``f`` and ``g``.

    Explanation
    ===========

    Given relatively prime univariate polynomials ``f`` and ``g``,
    rewrite their quotient to a normal form defined as follows:

    .. math::
        \frac{f(n)}{g(n)} = Z \cdot \frac{A(n) C(n+1)}{B(n) C(n)}

    where ``Z`` is an arbitrary constant and ``A``, ``B``, ``C`` are
    monic polynomials in ``n`` with the following properties:

    1. `\gcd(A(n), B(n+h)) = 1 \forall h \in \mathbb{N}`
    2. `\gcd(B(n), C(n+1)) = 1`
    3. `\gcd(A(n), C(n)) = 1`

    This normal form, or rational factorization in other words, is a
    crucial step in Gosper's algorithm and in solving of difference
    equations. It can be also used to decide if two hypergeometric
    terms are similar or not.

    This procedure will return a tuple containing elements of this
    factorization in the form ``(Z*A, B, C)``.

    Examples
    ========

    >>> from sympy.concrete.gosper import gosper_normal
    >>> from sympy.abc import n

    >>> gosper_normal(4*n+5, 2*(4*n+1)*(2*n+3), n, polys=False)
    (1/4, n + 3/2, n + 1/4)

    T)ÚfieldÚ	extensionÚh©Údomainc                 ó,   — h | ]}|j         ¯	|d k    ¯|’ŒS )r   )Ú
is_Integer)Ú.0Úrs     úS/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/sympy/concrete/gosper.pyú	<setcomp>z gosper_normal.<locals>.<setcomp>:   s$   € ÐKÐKÐK�1°1´<ÐKÀAÈÂFÀFˆQÀFÀFÀFó    é   )r   ÚLCÚmonicÚoner   r   r   Ú	resultantÚcomposeÚground_rootsÚkeysÚsortedÚgcdÚshiftÚquoÚrangeÚ
mul_groundÚas_expr)ÚfÚgÚnÚpolysÚpÚqÚoptÚaÚAÚbÚBÚCÚZr   ÚDÚRÚrootsÚiÚdÚjs                       r   Úgosper_normalr9      s½  € õL *Ø	
ˆAˆ�˜¨ð/ñ /ô /�K�F€QˆˆCð �4Š4‰6Œ6�1—7’7‘9”9€q€AØ�4Š4‰6Œ6�1—7’7‘9”9€q€AàŒ5�!�A‘#€q€AÝˆc‰
Œ
€AåˆQ�‰U�A�q ¤Ð,Ñ,Ô,€Aà	�Š�A—I’I˜a‘L”LÑ!Ô!€AØKÐK˜ŸšÑ(Ô(×-Ò-Ñ/Ô/ÐKÑKÔK€EÝ�E‰]Œ]ð ð ˆØ�EŠE�!—'’'˜1˜"‘+”+ÑÔˆà�EŠE�!‰HŒHˆØ�EŠE�!—'’'˜1˜"‘+”+ÑÔˆå�q˜!˜a™%‘”ð 	ð 	ˆAØ�—’˜!˜‘”ÑˆAˆAð	ð 	
�Š�Q‰Œ€Aàð Ø�IŠI‰KŒKˆØ�IŠI‰KŒKˆØ�IŠI‰KŒKˆàˆa�ˆ7€Nr   c                 ót  — ddl m}  || |¦  «        }|€dS |                     ¦   «         \  }}t          |||¦  «        \  }}}|                     d¦  «        }t          |                     ¦   «         ¦  «        }	t          |                     ¦   «         ¦  «        }
t          |                     ¦   «         ¦  «        }|	|
k    s*|                     ¦   «         |                     ¦   «         k    r|t          |	|
¦  «        z
  h}ne|	s||	z
  dz   t
          j	        h}nN||	z
  dz   | 
                    |	dz
  ¦  «        | 
                    |	dz
  ¦  «        z
  |                     ¦   «         z  h}t          |¦  «        D ]$}|j        r|dk     r|                     |¦  «         Œ%|sdS t          |¦  «        }t          d|dz   z  t          ¬¦  «        } |                     ¦   «         j        |Ž }t%          |||¬¦  «        }||                     d¦  «        z  ||z  z
  |z
  }dd	lm}  ||                     ¦   «         |¦  «        }|€dS |                     ¦   «                              |¦  «        }|D ]}||vr|                     |d¦  «        }Œ|j        rdS |                     ¦   «         |z  |                     ¦   «         z  S )
a&  
    Compute Gosper's hypergeometric term for ``f``.

    Explanation
    ===========

    Suppose ``f`` is a hypergeometric term such that:

    .. math::
        s_n = \sum_{k=0}^{n-1} f_k

    and `f_k` does not depend on `n`. Returns a hypergeometric
    term `g_n` such that `g_{n+1} - g_n = f_n`.

    Examples
    ========

    >>> from sympy.concrete.gosper import gosper_term
    >>> from sympy import factorial
    >>> from sympy.abc import n

    >>> gosper_term((4*n + 1)*factorial(n)/factorial(2*n + 1), n)
    (-n - 1/2)/(n + 1/4)

    r   )Ú	hypersimpNéÿÿÿÿr   zc:%s)Úclsr   )Úsolve)Úsympy.simplifyr;   Úas_numer_denomr9   r!   r   Údegreer   ÚmaxÚZeroÚnthÚsetr   Úremover   r   Ú
get_domainÚinjectr   Úsympy.solvers.solversr>   Úcoeffsr%   ÚsubsÚis_zero)r&   r(   r;   r   r*   r+   r.   r0   r1   ÚNÚMÚKr3   r7   rJ   r   ÚxÚHr>   ÚsolutionÚcoeffs                        r   Úgosper_termrT   N   sœ  € ð4 )Ð(Ð(Ð(Ð(Ð(Øˆ	�!�Q‰Œ€Aà€yØˆtà×ÒÑÔ�D€A€qå˜A˜q !Ñ$Ô$�G€A€qˆ!Ø	�Š�‰Œ€Aå	ˆ!�(Š(‰*Œ*‰Œ€AÝ	ˆ!�(Š(‰*Œ*‰Œ€AÝ	ˆ!�(Š(‰*Œ*‰Œ€Aà	ˆQŠˆ�A—D’D‘F”F˜aŸdšd™fœfÒ$Ð$Ø•�Q˜‘”‰]ˆOˆˆØð >Ø�‰U�Q‰Y�œÐˆˆà�‰U�Q‰Y˜Ÿš˜q 1™u™œ¨¯ª¨a°!©e©¬Ñ4°a·d²d±f´fÑ<Ð=ˆå�‰VŒVð ð ˆØŒ|ð 	˜q 1šu˜uØ�HŠH�Q‰KŒKˆKøàð ØˆtåˆA‰Œ€Aå�V˜q 1™uÑ%­5Ð1Ñ1Ô1€FØ"ˆQ�\Š\‰^Œ^Ô" FÐ+€FåˆV�Q˜vÐ&Ñ&Ô&€AØ	ˆ!�'Š'�!‰*Œ*‰�q˜‘sÑ˜QÑ€Aà+Ð+Ð+Ð+Ð+Ð+Øˆu�Q—X’X‘Z”Z Ñ(Ô(€HàÐØˆtà	�	Š	‰Œ×Ò˜Ñ"Ô"€Aàð !ð !ˆØ˜Ð Ð Ø—’�u˜aÑ Ô ˆAøà„yð )Øˆtà�yŠy‰{Œ{˜1‰}˜QŸYšY™[œ[Ñ(Ð(r   c                 ó¨  — d}t          |¦  «        r|\  }}}nd}t          | |¦  «        }|€dS |r| |z  }nŽ| |dz   z                       ||¦  «        | |z                       ||¦  «        z
  }|t          j        u rJ	 | |dz   z                       ||¦  «        | |z                       ||¦  «        z
  }n# t          $ r d}Y nw xY wt          |¦  «        S )aB  
    Gosper's hypergeometric summation algorithm.

    Explanation
    ===========

    Given a hypergeometric term ``f`` such that:

    .. math ::
        s_n = \sum_{k=0}^{n-1} f_k

    and `f(n)` does not depend on `n`, returns `g_{n} - g(0)` where
    `g_{n+1} - g_n = f_n`, or ``None`` if `s_n` cannot be expressed
    in closed form as a sum of hypergeometric terms.

    Examples
    ========

    >>> from sympy.concrete.gosper import gosper_sum
    >>> from sympy import factorial
    >>> from sympy.abc import n, k

    >>> f = (4*k + 1)*factorial(k)/factorial(2*k + 1)
    >>> gosper_sum(f, (k, 0, n))
    (-factorial(n) + 2*factorial(2*n + 1))/factorial(2*n + 1)
    >>> _.subs(n, 2) == sum(f.subs(k, i) for i in [0, 1, 2])
    True
    >>> gosper_sum(f, (k, 3, n))
    (-60*factorial(n) + factorial(2*n + 1))/(60*factorial(2*n + 1))
    >>> _.subs(n, 5) == sum(f.subs(k, i) for i in [3, 4, 5])
    True

    References
    ==========

    .. [1] Marko Petkovsek, Herbert S. Wilf, Doron Zeilberger, A = B,
           AK Peters, Ltd., Wellesley, MA, USA, 1997, pp. 73--100

    FTNr   )r	   rT   rK   r   ÚNaNÚlimitÚNotImplementedErrorr   )r&   ÚkÚ
indefiniter-   r/   r'   Úresults          r   Ú
gosper_sumr\   Ÿ   s  € ðP €Jå�1�~„~ð Ø‰ˆˆ1ˆaˆaàˆ
å�A�qÑÔ€Aà€yØˆtàð 	Ø�1‘ˆˆà�Q˜‘U‘)×!Ò! ! QÑ'Ô'¨1¨Q©3¯*ª*°Q¸Ñ*:Ô*:Ñ:ˆà•Q”Uˆ?ˆ?ðØ˜Q ™U™)×*Ò*¨1¨aÑ0Ô0°A°a±C·;²;¸qÀ!Ñ3DÔ3DÑD��øÝ&ð ð ð Ø���ðøøøõ �&‰>Œ>Ðs   Á<6B3 Â3CÃCN)T)Ú__doc__Ú
sympy.corer   r   r   Úsympy.polysr   r   r   Úsympy.utilities.iterablesr	   r9   rT   r\   © r   r   ú<module>rb      sž   ðØ 7Ð 7à (Ð (Ð (Ð (Ð (Ð (Ð (Ð (Ð (Ð (Ø =Ð =Ð =Ð =Ð =Ð =Ð =Ð =Ð =Ð =Ø 1Ð 1Ð 1Ð 1Ð 1Ð 1ðCð Cð Cð CðLN)ð N)ð N)ðb?ð ?ð ?ð ?ð ?r   