
    \h{                     R    S r SSKJrJrJr  SSKJrJrJr  SSK	J
r
  S	S jrS rS rg)
z1Gosper's algorithm for hypergeometric summation.     )SDummysymbols)Polyparallel_poly_from_exprfactor)is_sequencec                    [        X4USSS9u  u  pEnUR                  5       UR                  5       pUR                  5       UR                  5       pUR                  Xy-  p[	        S5      n[        X--   X-UR                  S9nUR                  U
R                  U5      5      nUR                  5       R                  5        Vs1 s H   nUR                  (       d  M  US:  d  M  UiM"     nn[        U5       H  nUR                  U
R                  U75      5      nUR                  U5      nU
R                  UR                  U* 5      5      n
[!        SUS-   5       H  nUUR                  U* 5      -  nM     M     UR#                  U5      nU(       d0  UR%                  5       nU
R%                  5       n
UR%                  5       nXU4$ s  snf )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                        M/var/www/auris/envauris/lib/python3.13/site-packages/sympy/concrete/gosper.pygosper_normalr5      sq   L *	
/KFQC 4461779q4461779q55!#qc
AQUA,A	AIIaL!A(--/K/11<<QAFQ/EKE]EE!''1"+EE!HEE!''1"+q!a%A!A !  	
QAIIKIIKIIK7N# Ls   GG#Gc                    SSK Jn  U" X5      nUc  gUR                  5       u  pE[        XEU5      u  pgnUR	                  S5      n[        UR                  5       5      n	[        UR                  5       5      n
[        UR                  5       5      nX:w  d"  UR                  5       UR                  5       :w  a  U[        X5      -
  1nO`U	(       d  X-
  S-   [
        R                  1nOAX-
  S-   UR                  U	S-
  5      UR                  U	S-
  5      -
  UR                  5       -  1n[        U5       H-  nUR                  (       a  US:  d  M  UR                  U5        M/     U(       d  g[        U5      n[        SUS-   -  [        S9nUR!                  5       R"                  " U6 n[%        XUS9nUUR	                  S5      -  UU-  -
  U-
  nSS	KJn  U" UR+                  5       U5      nUc  gUR-                  5       R/                  U5      nU H  nUU;  d  M  UR/                  US5      nM     UR0                  (       a  gUR-                  5       U-  UR-                  5       -  $ )
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   )	hypersimpNr   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 )!AyDAA!$GA!	A	!((*A	!((*A	!((*A	ADDFaddf$Q]OUQYUQYq1ua!e4addf<=V||q1uHHQK  AAVq1u%51F\\^""F+FVv&A	!''!*qsQA+QXXZ(H			"A ua A  	yyyy{1}QYY[((    c                 z   Sn[        U5      (       a  Uu  pnOSn[        X5      nUc  gU(       a  X-  nOjXS-   -  R                  UW5      X-  R                  UW5      -
  nU[        R                  L a+   XS-   -  R                  X5      X-  R                  X5      -
  n[        U5      $ ! [         a    Sn Nf = f)a  
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~~a
AAyU)!!!Q'13**Q*::QUU?U)**10AC;;q3DD &> ' s   6*B+ +B:9B: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   