Ë
    7^(h{  ã                   óP   — 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y)
z1Gosper's algorithm for hypergeometric summation. é    )ÚSÚDummyÚsymbols)ÚPolyÚparallel_poly_from_exprÚfactor)Úis_sequencec                 óŽ  — t        | |f|dd¬«      \  \  }}}|j                  «       |j                  «       }}|j                  «       |j                  «       }
}	|j                  ||	z  }}t	        d«      }t        ||z   |||j                  ¬«      }|j                  |
j                  |«      «      }|j                  «       j                  «       D �ch c]  }|j                  sŒ|dk\  sŒ|’Œ }}t        |«      D ]~  }|j                  |
j                  |­«      «      }|j                  |«      }|
j                  |j                  | «      «      }
t!        d|dz   «      D ]  }||j                  | «      z  }Œ Œ€ |j#                  |«      }|s0|j%                  «       }|
j%                  «       }
|j%                  «       }||
|fS c c}w )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©Údomainr   é   )r   ÚLCÚmonicÚoner   r   r   Ú	resultantÚcomposeÚground_rootsÚkeysÚ
is_IntegerÚsortedÚgcdÚshiftÚquoÚrangeÚ
mul_groundÚas_expr)ÚfÚgÚnÚpolysÚpÚqÚoptÚaÚAÚbÚBÚCÚZr   ÚDÚRÚrÚrootsÚiÚdÚjs                        úS/var/www/skyplay_api_hub/venv/lib/python3.12/site-packages/sympy/concrete/gosper.pyÚgosper_normalr5      sˆ  € ôL *Ø	
ˆAˆ�˜¨ô/�K�F€QˆˆCð �4‰4‹6�1—7‘7“9€q€AØ�4‰4‹6�1—7‘7“9€q€Aà�5‰5�!�A‘#€q€AÜˆc‹
€AäˆQ�‰U�A�q §¡Ô,€Aà	�‰�A—I‘I˜a“LÓ!€AØŸ™Ó(×-Ñ-Ó/ÖK�1°1·<³<ÀAÈÃFŠQÐK€EÐKÜ�E‹]ò ˆØ�E‰E�!—'‘'˜1˜"“+Óˆà�E‰E�!‹HˆØ�E‰E�!—'‘'˜1˜"“+Óˆä�q˜!˜a™%“ò 	ˆAØ�—‘˜!˜“Ñ‰Añ	ðð 	
�‰�Q‹€AáØ�I‰I‹KˆØ�I‰I‹KˆØ�I‰I‹Kˆàˆa�ˆ7€Nùò# Ls   ÃGÃ"GÃ(Gc                 óª  — ddl m}  || |«      }|€y|j                  «       \  }}t        |||«      \  }}}|j	                  d«      }t        |j                  «       «      }	t        |j                  «       «      }
t        |j                  «       «      }|	|
k7  s!|j                  «       |j                  «       k7  r|t        |	|
«      z
  h}n]|	s||	z
  dz   t
        j                  h}nB||	z
  dz   |j                  |	dz
  «      |j                  |	dz
  «      z
  |j                  «       z  h}t        |«      D ]%  }|j                  r|dk  sŒ|j                  |«       Œ' |syt        |«      }t        d|dz   z  t        ¬«      } |j!                  «       j"                  |Ž }t%        |||¬«      }||j	                  d«      z  ||z  z
  |z
  }dd	lm}  ||j+                  «       |«      }|€y|j-                  «       j/                  |«      }|D ]  }||vsŒ|j/                  |d«      }Œ |j0                  ry|j-                  «       |z  |j-                  «       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.simplifyr7   Úas_numer_denomr5   r   r   Údegreer   ÚmaxÚZeroÚnthÚsetr   Úremover   r   Ú
get_domainÚinjectr   Úsympy.solvers.solversr:   Úcoeffsr   ÚsubsÚis_zero)r    r"   r7   r/   r$   r%   r(   r*   r+   ÚNÚMÚKr-   r2   rF   r   ÚxÚHr:   ÚsolutionÚcoeffs                        r4   Úgosper_termrP   N   s  € õ4 )Ù�!�Q‹€Aà€yØà×ÑÓ�D€A€qä˜A˜q !Ó$�G€A€qˆ!Ø	�‰�‹€Aä	ˆ!�(‰(‹*‹€AÜ	ˆ!�(‰(‹*‹€AÜ	ˆ!�(‰(‹*‹€Aà	ˆQŠ�A—D‘D“F˜aŸd™d›fÒ$Ø”�Q˜“‰]ˆO‰ÙØ�‰U�Q‰YœŸ™Ð‰à�‰U�Q‰Y˜Ÿ™˜q 1™u›¨¯©¨a°!©e«Ñ4°a·d±d³fÑ<Ð=ˆä�‹Vò ˆØ�|Š|˜q 1›uØ�H‰H�Q�Kðñ ØäˆA‹€Aä�V˜q 1™uÑ%¬5Ô1€FØ"ˆQ�\‰\‹^×"Ñ" FÐ+€FäˆV�Q˜vÔ&€AØ	ˆ!�'‰'�!‹*‰�q˜‘sÑ˜QÑ€Aå+Ù�Q—X‘X“Z Ó(€HàÐØà	�	‰	‹×Ñ˜Ó"€Aàò !ˆØ˜Ò Ø—‘�u˜aÓ ‰Að!ð 	‡y‚yØà�y‰y‹{˜1‰}˜QŸY™Y›[Ñ(Ð(ó    c                 ó°  — d}t        |«      r|\  }}}nd}t        | |«      }|€y|r| |z  }t        |«      S | |dz   z  j                  |«      | |z  j                  |«      z
  }|t        j                  u r:	 | |dz   z  j                  ||«      | |z  j                  ||«      z
  }t        |«      S t        |«      S # t        $ r d}Y t        |«      S w xY w)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	   rP   rG   r   ÚNaNÚlimitÚNotImplementedErrorr   )r    ÚkÚ
indefiniter'   r)   r!   Úresults          r4   Ú
gosper_sumrY   Ÿ   sð   € ðP €Jä�1„~Ø‰ˆˆ1‰aàˆ
ä�A�qÓ€Aà€yØáØ�1‘ˆô �&‹>Ðð �Q˜‘U‘)×!Ñ! ! QÓ'¨1¨Q©3¯*©*°Q¸Ó*:Ñ:ˆà”Q—U‘U‰?ðØ˜Q ™U™)×*Ñ*¨1¨aÓ0°A°a±C·;±;¸qÀ!Ó3DÑD�ô �&‹>ÐŒ6�&‹>Ðøô 'ò Ø‘ä�&‹>Ððús   Á9.B= Â=CÃCN)T)Ú__doc__Ú
sympy.corer   r   r   Úsympy.polysr   r   r   Úsympy.utilities.iterablesr	   r5   rP   rY   © rQ   r4   ú<module>r_      s*   ðÙ 7ç (Ñ (ß =Ñ =Ý 1óCòLN)ób?rQ   