§
    PŠtj-c  ã                   ó"  — d Z ddlmZ ddlmZ ddlmZ ddlmZ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 ddlmZmZ ddlm Z m!Z!m"Z"m#Z#m$Z$m%Z% ddl&m'Z'm(Z(m)Z)m*Z* ddl+m,Z,m-Z- ddl.m/Z/ dd„Z0d„ Z1d„ Z2dd„Z3dS )a1  
This module is intended for solving recurrences or, in other words,
difference equations. Currently supported are linear, inhomogeneous
equations with polynomial or rational coefficients.

The solutions are obtained among polynomials, rational functions,
hypergeometric terms, or combinations of hypergeometric term which
are pairwise dissimilar.

``rsolve_X`` functions were meant as a low level interface
for ``rsolve`` which would use Mathematica's syntax.

Given a recurrence relation:

    .. math:: a_{k}(n) y(n+k) + a_{k-1}(n) y(n+k-1) +
              ... + a_{0}(n) y(n) = f(n)

where `k > 0` and `a_{i}(n)` are polynomials in `n`. To use
``rsolve_X`` we need to put all coefficients in to a list ``L`` of
`k+1` elements the following way:

    ``L = [a_{0}(n), ..., a_{k-1}(n), a_{k}(n)]``

where ``L[i]``, for `i=0, \ldots, k`, maps to
`a_{i}(n) y(n+i)` (`y(n+i)` is implicit).

For example if we would like to compute `m`-th Bernoulli polynomial
up to a constant (example was taken from rsolve_poly docstring),
then we would use `b(n+1) - b(n) = m n^{m-1}` recurrence, which
has solution `b(n) = B_m + C`.

Then ``L = [-1, 1]`` and `f(n) = m n^(m-1)` and finally for `m=4`:

>>> from sympy import Symbol, bernoulli, rsolve_poly
>>> n = Symbol('n', integer=True)

>>> rsolve_poly([-1, 1], 4*n**3, n)
C0 + n**4 - 2*n**3 + n**2

>>> bernoulli(4, n)
n**4 - 2*n**3 + n**2 - 1/30

For the sake of completeness, `f(n)` can be:

    [1] a polynomial               -> rsolve_poly
    [2] a rational function        -> rsolve_ratio
    [3] a hypergeometric function  -> rsolve_hyper
é    )Údefaultdict)Úproduct)ÚS)ÚRationalÚI)ÚSymbolÚWildÚDummy)ÚEquality)ÚAdd)ÚMul)Údefault_sort_key)Úsympify)ÚsimplifyÚ	hypersimpÚhypersimilar)ÚsolveÚsolve_undetermined_coeffs)ÚPolyÚquoÚgcdÚlcmÚrootsÚ	resultant)ÚbinomialÚ	factorialÚFallingFactorialÚRisingFactorial)ÚMatrixÚ
casoratian)Únumbered_symbolsc           
      ó>  ‡‡‡(‡)‡*‡+‡,‡-‡.— t          |¦  «        }|                     ‰¦  «        sdS |j        }t          | ¦  «        dz
  }ˆfd„| D ¦   «         } t	          d‰¦  «        g|dz   z  }t
          j        t
          j        fg|dz   z  }t          |dz   ¦  «        D ]…}	t          |	|dz   ¦  «        D ]<}
||	xx         | |
         t          |
|	¦  «         
                    ‰¦  «        z  z  cc<   Œ=||	         j        s&||	                              ¦   «         \  \  }}||f||	<   Œ†|d         d         x}}t          d|dz   ¦  «        D ]H}	||	         d         |k    r||	         d         }||	         d         |	z
  |k    r||	         d         |	z
  }ŒIt          |¦  «        t          |¦  «        }}t          d¦  «        }t
          j        }t          |dz   ¦  «        D ]9}	||	         d         |	z
  |k    r"|||	         d         t          ||	¦  «        z  z  }Œ:t          t!          ||dd„ ¬¦  «                             ¦   «         ¦  «        }|rt%          |¦  «        g}ng }|r|| dz
  gz  }n3|| 
                    ‰¦  «                             ¦   «         |z
  | dz
  gz  }t          t%          |¦  «        ¦  «        }|dk     r4|r0|                     d	d
¦  «        rt
          j        g fS t
          j        S dS ||k    rög Š(t
          j        x}}t          |dz   ¦  «        D ]H}	‰(                     t-          dt/          |	‰z   ¦  «        z   ¦  «        ¦  «         |‰(|	         ‰|	z  z  z  }ŒIt          |dz   ¦  «        D ]9}	|| |	                              ¦   «         |                     ‰‰|	z   ¦  «        z  z  }Œ:t5          ||z
  ‰(‰¦  «        Š.‰.�'‰(}ˆ.fd„‰(D ¦   «         Š(|                     ‰.¦  «        }�nHdS |}||z   |z   dz   }t          t!          ||         dd„ ¬¦  «                             ¦   «         ¦  «        }|g k    rt%          |¦  «        dz   Š+nt
          j        Š+d„ }d„ }ˆ+ˆfd„Š*i }t          | |dz   ¦  «        D ]Ï}	 ||dz   ¦  «        }t          d|dz   ¦  «        D ]}||dz
           ||	z   |z
  dz   z  |z  ||<   Œ t
          j        ||	<   t          |dz   ¦  «        D ]j}
t          |dz   ¦  «        D ]U}t          ||	|
z   ¦  «        } ‰*||
                              ¦   «         |¦  «        }||	xx         ||         |z  |z  z  cc<   ŒVŒkŒÐt7          ||d„ ¦  «        } |rÖt          ||¦  «        D ]Ã}	 ||¦  «        }!t          d||z   dz   ¦  «        D ]_}|	|z
  dk     r nS|||z
                                ||	|z
  ¦  «        }t          |¦  «        D ] }
|!|
xx         || |	|z
  |
f         z  z  cc<   Œ!Œ`||                               ||	¦  «        }"t          |¦  «        D ]}
|!|
          |"z  | |	|
f<   ŒŒÄ�n ||¦  «        }#t          ||¦  «        D ]ø}	 ||¦  «        }!t
          j        Š,t          d||z   dz   ¦  «        D ]p}|	|z
  dk     r nd|||z
                                ||	|z
  ¦  «        }t          |¦  «        D ] }
|!|
xx         || |	|z
  |
f         z  z  cc<   Œ!‰,||#|	|z
           z  z  Š,Œq||                               ||	¦  «        }"t          |¦  «        D ]}
|!|
          |"z  | |	|
f<   Œ ‰*||	|z
  ¦  «        ‰,z
  |"z  |#|	<   Œù ||¦  «         ||¦  «        c}$Š)t          d|¦  «        D ]1}	|$|	dz
           ‰‰+z
  |	z
  dz   z  |	z                       ¦   «         |$|	<   Œ2t          |¦  «        D ]0}	t;          d„ t=          | dd…|	f         |$¦  «        D ¦   «         Ž ‰)|	<   Œ1|s!t;          d„ t=          |#|$¦  «        D ¦   «         Ž Š-ˆfd„t          |¦  «        D ¦   «         Š(ˆ(ˆ)ˆ*fd„Š,|r ˆ,fd„t          |dz   |¦  «        D ¦   «         }n!ˆ*ˆ,ˆ-fd„t          |dz   |¦  «        D ¦   «         }|g k    rDt?          |g‰(¢R Ž Š.‰.s4|r0|                     d	d
¦  «        rt
          j        g fS t
          j        S dS ni Š.|rt
          j        }n‰-}‰(dd…         }t          t=          ‰(‰)¦  «        ¦  «        D ]F\  }%}&|%‰.v r!‰.|%         |&z  }'‰(                      |%¦  «         n|%|&z  }'||'                     ¦   «         z  }ŒG‰(|k    rG| !                    tE          t=          ‰(|¦  «        ¦  «        ¦  «        }|dt          ‰(¦  «        …         Š(|                     d	d
¦  «        r|‰(fS |S )a.  
    Given linear recurrence operator `\operatorname{L}` of order
    `k` with polynomial coefficients and inhomogeneous equation
    `\operatorname{L} y = f`, where `f` is a polynomial, we seek for
    all polynomial solutions over field `K` of characteristic zero.

    The algorithm performs two basic steps:

        (1) Compute degree `N` of the general polynomial solution.
        (2) Find all polynomials of degree `N` or less
            of `\operatorname{L} y = f`.

    There are two methods for computing the polynomial solutions.
    If the degree bound is relatively small, i.e. it's smaller than
    or equal to the order of the recurrence, then naive method of
    undetermined coefficients is being used. This gives a system
    of algebraic equations with `N+1` unknowns.

    In the other case, the algorithm performs transformation of the
    initial equation to an equivalent one for which the system of
    algebraic equations has only `r` indeterminates. This method is
    quite sophisticated (in comparison with the naive one) and was
    invented together by Abramov, Bronstein and Petkovsek.

    It is possible to generalize the algorithm implemented here to
    the case of linear q-difference and differential equations.

    Lets say that we would like to compute `m`-th Bernoulli polynomial
    up to a constant. For this we can use `b(n+1) - b(n) = m n^{m-1}`
    recurrence, which has solution `b(n) = B_m + C`. For example:

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

    >>> rsolve_poly([-1, 1], 4*n**3, n)
    C0 + n**4 - 2*n**3 + n**2

    References
    ==========

    .. [1] S. A. Abramov, M. Bronstein and M. Petkovsek, On polynomial
           solutions of linear operator equations, in: T. Levelt, ed.,
           Proc. ISSAC '95, ACM Press, New York, 1995, 290-296.

    .. [2] M. Petkovsek, Hypergeometric solutions of linear recurrences
           with polynomial coefficients, J. Symbolic Computation,
           14 (1992), 243-264.

    .. [3] M. Petkovsek, H. S. Wilf, D. Zeilberger, A = B, 1996.

    Né   c                 ó0   •— g | ]}t          |‰¦  «        ‘ŒS © )r   )Ú.0ÚcoeffÚns     €úR/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/sympy/solvers/recurr.pyú
<listcomp>zrsolve_poly.<locals>.<listcomp>‚   s!   ø€ Ð1Ð1Ð1 �d�5˜!‰nŒnÐ1Ð1Ð1ó    r   ÚxÚZc                 ó   — | dk    S ©Nr   r%   ©Úrs    r)   ú<lambda>zrsolve_poly.<locals>.<lambda>£   ó
   € ˜A šF€ r+   ©ÚfilterÚ	predicateÚsymbolsFÚCc                 ó   •— g | ]}|‰v¯|‘Œ	S r%   r%   )r&   ÚcÚ	solutionss     €r)   r*   zrsolve_poly.<locals>.<listcomp>É   s#   ø€ Ð6Ð6Ð6�q !¨9Ð"4Ð"4�Ð"4Ð"4Ð"4r+   c                 ó   — | dk    S r/   r%   r0   s    r)   r2   zrsolve_poly.<locals>.<lambda>Ò   s
   €   Q¢€ r+   c                 ó"   — t           j        g| z  S ©N©r   ÚZero©Úks    r)   Ú_zero_vectorz!rsolve_poly.<locals>._zero_vectorÙ   s   € Ý”F�8˜a‘<Ðr+   c                 ó"   — t           j        g| z  S r>   ©r   ÚOnerA   s    r)   Ú_one_vectorz rsolve_poly.<locals>._one_vectorÜ   s   € Ý”E�7˜Q‘;Ðr+   c                 óô   •— t           j        }|                      ‰‰|z   ¦  «        }t          d|dz   ¦  «        D ]=}|t	          ||z
  dz
  |¦  «        z  }|||                      ‰‰|z   |z
  ¦  «        z  z  }Œ>|S )Nr#   )r   rF   ÚsubsÚranger   )ÚprB   ÚBÚDÚiÚar(   s        €€r)   Ú_deltazrsolve_poly.<locals>._deltaß   s„   ø€ Ý”ˆAØ—’�q˜!˜a™%Ñ Ô ˆAå˜1˜a !™e‘_”_ð .ð .�Ø•X˜a !™e a™i¨Ñ+Ô+Ñ+�Ø�Q˜Ÿš  1 q¡5¨1¡9Ñ-Ô-Ñ-Ñ-��àˆHr+   c                 ó(   — t          | |k    ¦  «        S r>   )Úint)rN   Újs     r)   r2   zrsolve_poly.<locals>.<lambda>ú   s   € ¥c¨!¨qª&¡k¤k€ r+   c                 óB   — g | ]\  }}||z                        ¦   «         ‘ŒS r%   ©Úexpand)r&   ÚvrK   s      r)   r*   zrsolve_poly.<locals>.<listcomp>,  s(   € ÐDÐDÐD©D¨A¨q˜!˜A™#Ÿš™œÐDÐDÐDr+   c                 óB   — g | ]\  }}||z                        ¦   «         ‘ŒS r%   rU   )r&   ÚgrK   s      r)   r*   zrsolve_poly.<locals>.<listcomp>/  s(   € Ð;Ð;Ð;©¨¨A�q˜‘s—l’l‘n”nÐ;Ð;Ð;r+   c           	      óT   •— g | ]$}t          d t          |‰z   ¦  «        z   ¦  «        ‘Œ%S )r8   )r   Ústr)r&   rN   Úshifts     €r)   r*   zrsolve_poly.<locals>.<listcomp>1  s0   ø€ Ð<Ð<Ð<¨a�V�C�#˜a %™i™.œ.Ñ(Ñ)Ô)Ð<Ð<Ð<r+   c                 óN   •‡ — t          ˆˆ fd„t          ‰‰¦  «        D ¦   «         Ž S )Nc                 ó4   •— g | ]\  }}| ‰|‰¦  «        z  ‘ŒS r%   r%   )r&   r:   ÚqrP   rN   s      €€r)   r*   z1rsolve_poly.<locals>.<lambda>.<locals>.<listcomp>3  s+   ø€ ÐAÐAÐA©t¨q°!˜A˜f˜f Q¨™lœl™NÐAÐAÐAr+   )r   Úzip)rN   r8   ÚQrP   s   `€€€r)   r2   zrsolve_poly.<locals>.<lambda>3  s-   øø€ •cÐAÐAÐAÐAÐAµs¸1¸a±y´yÐAÑAÔAÐB€ r+   c                 ó&   •— g | ]} ‰|¦  «        ‘ŒS r%   r%   )r&   rN   rY   s     €r)   r*   zrsolve_poly.<locals>.<listcomp>6  s!   ø€ Ð/Ð/Ð/˜!���1‘”Ð/Ð/Ð/r+   c                 ó@   •— g | ]} ‰|¦  «         ‰‰|¦  «        z   ‘ŒS r%   r%   )r&   rN   rP   rY   Úhs     €€€r)   r*   zrsolve_poly.<locals>.<listcomp>8  s0   ø€ Ð>Ð>Ð>¨���1‘”˜˜˜q !™œÑ$Ð>Ð>Ð>r+   )#r   Úis_polynomialÚis_zeroÚlenr   r   r@   ÚNegativeInfinityrJ   r   Úas_polyÚLTrR   r
   r   Úlistr   ÚkeysÚmaxÚdegreeÚgetÚappendr   r[   Úas_exprrI   r   r   rV   r   r`   r   ÚremoveÚxreplaceÚdict)/ÚcoeffsÚfr(   r\   ÚhintsÚhomogeneousr1   ÚpolysÚtermsrN   rS   Úexpr'   ÚdÚbr,   Údegree_polyÚ	nni_rootsÚNÚyÚEÚ_CÚresultÚAÚUrC   rG   Úalphar   rB   rL   rM   ÚVrW   ÚdenomÚGÚPr:   r_   Úsr8   ra   rP   rO   rY   rd   r;   s/     ``                                    @@@@@@@r)   Úrsolve_polyr�   E   s  øøøøøøøøø€ õh 	�‰
Œ
€Aà�?Š?˜1ÑÔð Øˆtà”)€KåˆF‰Œ�a‰€Aà1Ð1Ð1Ð1¨&Ð1Ñ1Ô1€Få�!�Q‰ZŒZˆL˜!˜a™%Ñ €EÝŒf•aÔ(Ð)Ð*¨A°©EÑ2€Eå�1�q‘5‰\Œ\ð $ð $ˆÝ�q˜!˜a™%‘”ð 	>ð 	>ˆAØ�!ˆHˆHŒH˜˜qœ	¥8¨A¨q¡>¤>×#9Ò#9¸!Ñ#<Ô#<Ñ=Ñ=ˆHˆH‰HˆHà�QŒxÔð 	$Ø! !œHŸKšK™MœM‰M‰FˆS�EØ˜s�|ˆE�!‰Høà�!ŒH�QŒKÐ€Aˆå�1�a˜!‘e‰_Œ_ð  ð  ˆØ�Œ8�AŒ;˜Š?ˆ?Ø�a”˜”ˆAà�Œ8�AŒ;˜‰?˜QÒÐØ�a”˜”˜a‘ˆAøåˆq‰6Œ6•3�q‘6”6€q€Aåˆc‰
Œ
€Aå”&€Kå�1�q‘5‰\Œ\ð >ð >ˆØ�Œ8�AŒ;˜‰?˜aÒÐØ˜5 œ8 Aœ;Õ'7¸¸1Ñ'=Ô'=Ñ=Ñ=ˆKøå•U˜;¨°#Ø"Ð"ð$ñ $ô $ß$(¢D¡F¤Fñ,ô ,€Ið ð Ý�‰^Œ^Ðˆˆàˆàð 1Ø	ˆqˆb�1‰fˆX‰ˆˆà	ˆa�iŠi˜‰lŒl×!Ò!Ñ#Ô# aÑ'¨!¨¨a©Ð0Ñ0ˆå�C�‰FŒF‰Œ€Aàˆ1‚u€uØð 	Ø�yŠy˜ EÑ*Ô*ð Ýœ �|Ð#å”v�à�4àˆA‚v€vØˆÝ”ˆˆˆAå�q˜1‘u‘”ð 	ð 	ˆAØ�HŠH•V˜C¥# a¨%¡i¡.¤.Ñ0Ñ1Ô1Ñ2Ô2Ð2Ø��1”˜˜1™‘ÑˆAˆAå�q˜1‘u‘”ð 	6ð 	6ˆAØ�˜”×"Ò"Ñ$Ô$ Q§V¢V¨A¨q°1©uÑ%5Ô%5Ñ5Ñ5ˆAˆAå-¨a°!©e°Q¸Ñ:Ô:ˆ	àÐ ØˆBØ6Ð6Ð6Ð6˜AÐ6Ñ6Ô6ˆAØ—V’V˜IÑ&Ô&ˆF‰Fà�4àˆØ�‰E�A‰I˜‰Mˆå�˜u Qœx°Ø&Ð&ð(ñ (ô (ß(,ª©¬ñ0ô 0ˆ	ð ˜Š?ˆ?Ý�I‘” Ñ"ˆAˆAå”ˆAð	 ð 	 ð 	 ð	ð 	ð 	ð	ð 	ð 	ð 	ð 	ð 	ð ˆå˜�r˜1˜q™5Ñ!Ô!ð 	)ð 	)ˆAØ�˜A ™EÑ"Ô"ˆAå˜1˜a !™e‘_”_ð 4ð 4�Ø˜˜Q™”x 1 q¡5¨1¡9¨q¡=Ñ1°!Ñ3��!‘�å”vˆE�!‰Hå˜1˜q™5‘\”\ð )ð )�Ý˜q 1™u™œð )ð )�AÝ   A¨¡EÑ*Ô*�AØ˜˜u Qœx×/Ò/Ñ1Ô1°1Ñ5Ô5�Aà˜!�H�H”H  !¤ Q¡ q¡Ñ(�H�H‘H�Hð	)ð)õ �1�aÐ1Ð1Ñ2Ô2ˆàð (	6Ý˜1˜a‘[”[ð ,ð ,�Ø �L ‘O”O�å˜q ! a¡%¨!¡)Ñ,Ô,ð 0ð 0�AØ˜1‘u˜q’y�yØ˜à˜a !™eœ×)Ò)¨!¨Q°©UÑ3Ô3�Aå" 1™XœXð 0ð 0˜Ø˜!˜˜œ  A a¨!¡e¨Q h¤K¡Ñ/˜˜™˜ð0ð ˜q˜bœ	Ÿš q¨!Ñ,Ô,�å˜q™œð ,ð ,�AØ  œt˜e e™m�A�a˜�d‘G�Gð,ñ,ð" �˜Q‘”ˆAå˜1˜a‘[”[ð 6ð 6�Ø �L ‘O”O�Ý”F�å˜q ! a¡%¨!¡)Ñ,Ô,ð 	&ð 	&�AØ˜1‘u˜q’y�yØ˜à˜a !™eœ×)Ò)¨!¨Q°©UÑ3Ô3�Aå" 1™XœXð 0ð 0˜Ø˜!˜˜œ  A a¨!¡e¨Q h¤K¡Ñ/˜˜™˜à˜˜Q˜q 1™uœX™Ñ%�A�Aà˜q˜bœ	Ÿš q¨!Ñ,Ô,�å˜q™œð ,ð ,�AØ  œt˜e e™m�A�a˜�d‘G�Gà˜˜q ! a¡%Ñ(Ô(¨1Ñ,°Ñ5��!‘�àˆ{˜1‰~Œ~˜|˜|¨A™œˆˆˆ1å�q˜!‘”ð 	;ð 	;ˆAØ�a˜!‘e”H  A¡¨¡	¨A¡Ñ.¨qÑ0×8Ò8Ñ:Ô:ˆAˆa‰DˆDå�q‘”ð 	Fð 	FˆAÝÐDÐDµC¸¸!¸!¸!¸Q¸$¼À±O´OÐDÑDÔDÐEˆAˆa‰DˆDàð 	=ÝÐ;Ð;µ°Q¸±´Ð;Ñ;Ô;Ð<ˆAà<Ð<Ð<Ð<µ5¸±8´8Ð<Ñ<Ô<ˆàBÐBÐBÐBÐBÐBˆàð 	?Ø/Ð/Ð/Ð/�u Q¨¡U¨A™œÐ/Ñ/Ô/ˆAˆAà>Ð>Ð>Ð>Ð>Ð>­e°A¸±E¸1©o¬oÐ>Ñ>Ô>ˆAà�Š7ˆ7Ý˜a˜ !˜˜˜ˆIàð  Øð  Ø—y’y ¨EÑ2Ô2ð &Ý !¤¨˜|Ð+å œv˜à˜4ð ð ˆIàð 	Ý”VˆFˆFàˆFàˆqˆqˆqŒTˆÝ�˜Q ™œ‘O”Oð 	!ð 	!‰DˆAˆqØ�Iˆ~ˆ~Ø˜a”L ‘N�Ø—’˜‘”��à�a‘C�à�a—h’h‘j”jÑ ˆFˆFàˆB‚w€wà—’¥¥c¨!¨R¡j¤jÑ!1Ô!1Ñ2Ô2ˆØˆw•�A‘”ˆwŒKˆà‡y‚y�˜EÑ"Ô"ð Ø˜ˆ{Ðàˆr+   c           
      óª  ‡‡‡— t          |¦  «        }|                     ‰¦  «        sdS t          t          t           | ¦  «        ¦  «        } t	          | ¦  «        dz
  }| |         | d         }}|                     ‰‰|z
  ¦  «                             ¦   «         }t          d¦  «        }t          ||                     ‰‰|z   ¦  «        ‰¦  «        }|                     |¦  «        s(| 	                    ¦   «         \  }	}
t          |	|
|¦  «        }t          t          ||dd„ ¬¦  «                             ¦   «         ¦  «        }|st          | |‰fi |¤ŽS t          j        t          j        g|dz   z  cŠ}t#          t%          t'          |¦  «        ¦  «        dd¦  «        D ]Œ}t)          ||                     ‰‰|z   ¦  «        ‰¦  «        Št          |‰‰¦  «        }t          |‰                     ‰‰|z
  ¦  «        ‰¦  «        }‰t+          ˆˆfd	„t#          |dz   ¦  «        D ¦   «         Ž z  ŠŒ�ˆˆfd
„t#          |dz   ¦  «        D ¦   «         }t#          |dz   ¦  «        D ]S}t)          | |         ||         ‰¦  «        }t          | |         |‰¦  «        ||<   t          ||         |‰¦  «        ||<   ŒTt#          |dz   ¦  «        D ]/}||xx         t+          |d|…         ||dz   d…         z   Ž z  cc<   Œ0t          ||t+          |Ž z  ‰fi |¤Ž}|�H|                     dd¦  «        r t/          |d         ‰z  ¦  «        |d         fS t/          |‰z  ¦  «        S dS )aß  
    Given linear recurrence operator `\operatorname{L}` of order `k`
    with polynomial coefficients and inhomogeneous equation
    `\operatorname{L} y = f`, where `f` is a polynomial, we seek
    for all rational solutions over field `K` of characteristic zero.

    This procedure accepts only polynomials, however if you are
    interested in solving recurrence with rational coefficients
    then use ``rsolve`` which will pre-process the given equation
    and run this procedure with polynomial arguments.

    The algorithm performs two basic steps:

        (1) Compute polynomial `v(n)` which can be used as universal
            denominator of any rational solution of equation
            `\operatorname{L} y = f`.

        (2) Construct new linear difference equation by substitution
            `y(n) = u(n)/v(n)` and solve it for `u(n)` finding all its
            polynomial solutions. Return ``None`` if none were found.

    The algorithm implemented here is a revised version of the original
    Abramov's algorithm, developed in 1989. The new approach is much
    simpler to implement and has better overall efficiency. This
    method can be easily adapted to the q-difference equations case.

    Besides finding rational solutions alone, this functions is
    an important part of Hyper algorithm where it is used to find
    a particular solution for the inhomogeneous part of a recurrence.

    Examples
    ========

    >>> from sympy.abc import x
    >>> from sympy.solvers.recurr import rsolve_ratio
    >>> rsolve_ratio([-2*x**3 + x**2 + 2*x - 1, 2*x**3 + x**2 - 6*x,
    ... - 2*x**3 - 11*x**2 - 18*x - 9, 2*x**3 + 13*x**2 + 22*x + 8], 0, x)
    C0*(2*x - 3)/(2*(x**2 - 1))

    References
    ==========

    .. [1] S. A. Abramov, Rational solutions of linear difference
           and q-difference equations with polynomial coefficients,
           in: T. Levelt, ed., Proc. ISSAC '95, ACM Press, New York,
           1995, 285-289

    See Also
    ========

    rsolve_hyper
    Nr#   r   rd   r-   c                 ó   — | dk    S r/   r%   r0   s    r)   r2   zrsolve_ratio.<locals>.<lambda>¬  r3   r+   r4   éÿÿÿÿc                 óB   •— g | ]}‰                      ‰‰|z
  ¦  «        ‘ŒS r%   ©rI   )r&   rS   r|   r(   s     €€r)   r*   z rsolve_ratio.<locals>.<listcomp>¹  s+   ø€ Ð>Ð>Ð>¨A�q—v’v˜a  Q¡Ñ'Ô'Ð>Ð>Ð>r+   c                 óB   •— g | ]}‰                      ‰‰|z   ¦  «        ‘ŒS r%   r’   )r&   rN   r8   r(   s     €€r)   r*   z rsolve_ratio.<locals>.<listcomp>»  s+   ø€ Ð9Ð9Ð9 q�!—&’&˜˜A ™EÑ"Ô"Ð9Ð9Ð9r+   r7   F)r   re   rk   Úmaprg   rI   rV   r
   r   Úas_numer_denomr   r   rl   r�   r   rF   r@   rJ   rR   rm   r   r   ro   r   )ru   rv   r(   rw   r1   r…   rL   rd   ÚresrK   r_   r   ÚnumersrN   ÚdenomsrY   r„   r8   r|   s     `              @@r)   Úrsolve_ratior™   b  sc  øøø€ õj 	�‰
Œ
€Aà�?Š?˜1ÑÔð Øˆtå•#•g˜vÑ&Ô&Ñ'Ô'€FåˆF‰Œ�a‰€Aà�!Œ9�f˜Q”i€q€AØ	�Šˆq�!�a‘%ÑÔ×ÒÑ!Ô!€Aåˆc‰
Œ
€Aå
�A�q—v’v˜a  Q¡Ñ'Ô'¨Ñ
+Ô
+€Cà×Ò˜QÑÔð Ø×!Ò!Ñ#Ô#‰ˆˆ1Ý�!�Q˜‰lŒlˆå•U˜3 ¨#Ø"Ð"ð$ñ $ô $ß$(¢D¡F¤Fñ,ô ,€Ið ð  Ý˜6 1 aÐ1Ð1¨5Ð1Ð1Ð1å”E�AœF˜8 Q¨¡UÑ+ˆ	ˆˆ6å•s�3˜y™>œ>Ñ*Ô*¨B°Ñ3Ô3ð 	@ð 	@ˆAÝ�A�q—v’v˜a  Q¡Ñ'Ô'¨Ñ+Ô+ˆAå�A�q˜!‘”ˆAÝ�A�q—v’v˜a  Q¡Ñ'Ô'¨Ñ+Ô+ˆAà•Ð>Ð>Ð>Ð>Ð>µ°q¸1±u±´Ð>Ñ>Ô>Ð?Ñ?ˆAˆAà9Ð9Ð9Ð9Ð9­E°!°a±%©L¬LÐ9Ñ9Ô9ˆå�q˜1‘u‘”ð 	-ð 	-ˆAÝ�F˜1”I˜v aœy¨!Ñ,Ô,ˆAå˜F 1œI q¨!Ñ,Ô,ˆF�1‰IÝ˜F 1œI q¨!Ñ,Ô,ˆF�1‰IˆIå�q˜1‘u‘”ð 	=ð 	=ˆAØ�1ˆIˆIŒI�˜v b q bœz¨F°1°q±5°6°6¬NÑ:Ð<Ñ<ˆIˆI‰IˆIå˜V Q­¨f¨Ñ%5°qÐBÐB¸EÐBÐBˆàÐØ�yŠy˜ EÑ*Ô*ð ,Ý  ¨¤¨Q¡Ñ/Ô/°¸´Ð;Ð;å ¨¡
Ñ+Ô+Ð+à�4r+   c                 ó¬  ‡‡&‡'‡(‡)‡*‡+— t          t          t          | ¦  «        ¦  «        } t          |¦  «        }t          | ¦  «        dz
  g t	          ¦   «         }}}|j        �sS|j        rži }|                     ¦   «         j        D ]c}| 	                    ‰¦  «        s dS | 
                    ¦   «         D ]%}	t          ||	‰¦  «        r||	xx         |z  cc<    nŒ&t          j        ||<   Œdd„ |                     ¦   «         D ¦   «         }
n| 	                    ‰¦  «        r|g}
ndS t          |
¦  «        D �]�\  }}t          j        | dd…         c}Š(t          j        g|dz   z  }t#          |‰¦  «        }t%          d|dz   ¦  «        D ]M}||                     ‰‰|z   dz
  ¦  «        z  }|                     ¦   «         \  }}‰(|xx         |z  cc<   |||<   ŒNt%          |dz   ¦  «        D ]/}‰(|xx         t+          |d|…         ||dz   d…         z   Ž z  cc<   Œ0t-          ‰(t+          |Ž ‰d¬¦  «        }|�<|\  }}|r4|                     t/          |dgt          |¦  «        z  ¦  «        ¦  «        }nt1          ‰(t+          |Ž ‰¦  «        }|r|
|xx         |z  cc<   n dS t3          |
Ž }t5          |¦  «        }�Œƒnt          j        }t7          d¦  «        }| d         | |                              ‰‰|z
  dz   ¦  «        }}t          t9          |‰¦  «         
                    ¦   «         ¦  «        }t          t9          |‰¦  «         
                    ¦   «         ¦  «        }t          j        t          j        fg}|D ]*}|D ]%}|j        r|j        r||k    rŒ|‰|z
  ‰|z
  fgz  }Œ&Œ+ˆfd„|D ¦   «         }ˆfd	„|D ¦   «         }||z   |z   }|D �]‚\  Š&Š'g g cŠ(}‰&‰'                     ‰‰|z   dz
  ¦  «        z  }t%          |dz   ¦  «        D ]Â}t+          ˆ&ˆfd
„t%          |¦  «        D ¦   «         Ž }t+          ˆ'ˆfd„t%          ||¦  «        D ¦   «         Ž }t=          | |         |z  |z  |‰¦  «        }‰(                     |                      ‰¦  «        ¦  «         |j        s-|                     ‰(|          !                    ¦   «         ¦  «         ŒÃ|rtE          |¦  «        t          j        }}n dS t%          |dz   ¦  «        D ]6}‰(|          #                    |¦  «        }|t          j        ur||||z  z  z  }Œ7t9          ||¦  «         
                    ¦   «         D �]õŠ+‰+j        rŒˆ(ˆ+fd„t%          |dz   ¦  «        D ¦   «         Š)|dk    rXdt3          ˆ)fd„t%          d|dz   ¦  «        D ¦   «         Ž k    r.tI          dtK          t          |¦  «        ¦  «        z   ¦  «        gŠ*nGt1          ‰)d‰t          |¦  «        d¬¦  «        \  Š*}‰* &                    |¦  «        Š*ˆ*fd„|D ¦   «         Š*‰*D �]"}‰+‰&z  |                     ‰‰dz   ¦  «        z  ‰'z  |z  } t5          | ¦  «        } d}!t9          |                      ¦   «         d         ‰¦  «         
                    ¦   «         D ]4}"|" '                    tP          ¦  «        r    dS |!|"dz   k     dk    r|"dz   }!Œ5tS          | ‰|!‰dz
  f¦  «        }#|# '                    tT          tV          tX          ¦  «        rt5          |#¦  «        }#t[          ||#gz   ‰d¬¦  «        dk    r|                     |#¦  «         �Œ$�Œ÷�Œ„| .                    t^          ¬¦  «         t          t/          ta          d¦  «        |¦  «        ¦  «        }$|$D ]\  }}%|||%z  z  }Œ| 1                    dd¦  «        r |d„ |$D ¦   «         z  }|t          |¦  «        fS |S )aò  
    Given linear recurrence operator `\operatorname{L}` of order `k`
    with polynomial coefficients and inhomogeneous equation
    `\operatorname{L} y = f` we seek for all hypergeometric solutions
    over field `K` of characteristic zero.

    The inhomogeneous part can be either hypergeometric or a sum
    of a fixed number of pairwise dissimilar hypergeometric terms.

    The algorithm performs three basic steps:

        (1) Group together similar hypergeometric terms in the
            inhomogeneous part of `\operatorname{L} y = f`, and find
            particular solution using Abramov's algorithm.

        (2) Compute generating set of `\operatorname{L}` and find basis
            in it, so that all solutions are linearly independent.

        (3) Form final solution with the number of arbitrary
            constants equal to dimension of basis of `\operatorname{L}`.

    Term `a(n)` is hypergeometric if it is annihilated by first order
    linear difference equations with polynomial coefficients or, in
    simpler words, if consecutive term ratio is a rational function.

    The output of this procedure is a linear combination of fixed
    number of hypergeometric terms. However the underlying method
    can generate larger class of solutions - D'Alembertian terms.

    Note also that this method not only computes the kernel of the
    inhomogeneous equation, but also reduces in to a basis so that
    solutions generated by this procedure are linearly independent

    Examples
    ========

    >>> from sympy.solvers import rsolve_hyper
    >>> from sympy.abc import x

    >>> rsolve_hyper([-1, -1, 1], 0, x)
    C0*(1/2 - sqrt(5)/2)**x + C1*(1/2 + sqrt(5)/2)**x

    >>> rsolve_hyper([-1, 1], 1 + x, x)
    C0 + x*(x + 1)/2

    References
    ==========

    .. [1] M. Petkovsek, Hypergeometric solutions of linear recurrences
           with polynomial coefficients, J. Symbolic Computation,
           14 (1992), 243-264.

    .. [2] M. Petkovsek, H. S. Wilf, D. Zeilberger, A = B, 1996.
    r#   Nc                 ó   — g | ]
\  }}||z   ‘ŒS r%   r%   )r&   rY   rd   s      r)   r*   z rsolve_hyper.<locals>.<listcomp>  s    € Ð?Ð?Ð?¡t q¨!˜Q ™UÐ?Ð?Ð?r+   T©r7   r   r-   c                 ó2   •— g | ]}‰|z
  t           j        f‘ŒS r%   rE   )r&   rK   r(   s     €r)   r*   z rsolve_hyper.<locals>.<listcomp>Y  s#   ø€ Ð+Ð+Ð+˜Aˆ!ˆa‰%•”ˆÐ+Ð+Ð+r+   c                 ó2   •— g | ]}t           j        ‰|z
  f‘ŒS r%   rE   )r&   r_   r(   s     €r)   r*   z rsolve_hyper.<locals>.<listcomp>Z  s#   ø€ Ð+Ð+Ð+˜A�!Œ%��Q‘ˆÐ+Ð+Ð+r+   c                 óB   •— g | ]}‰                      ‰‰|z   ¦  «        ‘ŒS r%   r’   )r&   rS   r…   r(   s     €€r)   r*   z rsolve_hyper.<locals>.<listcomp>c  s+   ø€ Ð9Ð9Ð9¨1�a—f’f˜Q  A¡Ñ&Ô&Ð9Ð9Ð9r+   c                 óB   •— g | ]}‰                      ‰‰|z   ¦  «        ‘ŒS r%   r’   )r&   rS   rL   r(   s     €€r)   r*   z rsolve_hyper.<locals>.<listcomp>d  s+   ø€ Ð<Ð<Ð<¨1�a—f’f˜Q  A¡Ñ&Ô&Ð<Ð<Ð<r+   c                 óP   •— g | ]"}‰|                               ¦   «         ‰|z  z  ‘Œ#S r%   )rq   )r&   rN   ry   Úzs     €€r)   r*   z rsolve_hyper.<locals>.<listcomp>{  s2   ø€ ÐKÐKÐK¸˜U 1œX×-Ò-Ñ/Ô/°°1±Ñ4ÐKÐKÐKr+   c                 ó&   •— g | ]}‰|         |z  ‘ŒS r%   r%   )r&   rS   Úrecurr_coeffss     €r)   r*   z rsolve_hyper.<locals>.<listcomp>|  s#   ø€ Ð$QÐ$QÐ$Q¸A ]°1Ô%5°aÑ%7Ð$QÐ$QÐ$Qr+   r8   c                 ó:   •— g | ]}‰                      |¦  «        ‘ŒS r%   )r'   )r&   rŒ   Úsols     €r)   r*   z rsolve_hyper.<locals>.<listcomp>ƒ  s#   ø€ Ð2Ð2Ð2¨�s—y’y ‘|”|Ð2Ð2Ð2r+   F)Úzero)Úkeyr7   c                 ó   — h | ]\  }}|’ŒS r%   r%   )r&   rŒ   rB   s      r)   ú	<setcomp>zrsolve_hyper.<locals>.<setcomp>   s   € Ð%Ð%Ð%™$˜!˜Q�AÐ%Ð%Ð%r+   )2rk   r”   r   rg   Úsetrf   Úis_AddrV   ÚargsÚis_hypergeometricrl   r   r   r@   ÚitemsÚ	enumeraterF   r   rJ   rI   r•   r   r™   r`   r�   r   r   r
   r   Ú
is_integerr   rp   ri   rn   rm   Únthr   r[   ÚcollectÚhasr   r   r   r   r   r    Úsortr   r!   ro   ),ru   rv   r(   rw   r1   Úkernelr7   ÚsimilarrY   rd   ÚinhomogeneousrN   r'   r˜   rŒ   rS   rK   r_   ÚRÚsymsr„   r-   Ú	p_factorsÚ	q_factorsÚfactorsÚdegreesrM   rO   r}   Úpolyr|   r8   ÚratioÚn0Ún_rootÚKÚskÚkerr…   rL   ry   r¤   r¦   r¢   s,     `                                   @@@@@@r)   Úrsolve_hyperrÆ   Ñ  s}  øøøøøøø€ õn •#•g˜vÑ&Ô&Ñ'Ô'€Få�‰
Œ
€Aå˜V™œ q™¨"­c©e¬eˆw€v€AàŒ9ñ 9ØŒ8ð 	ØˆGà—X’X‘Z”Z”_ð 	(ð 	(�Ø×*Ò*¨1Ñ-Ô-ð  Ø˜4˜4à Ÿš™œð (ð (�AÝ# A q¨!Ñ,Ô,ð Ø ˜
˜
œ
 a™˜
˜
™
Ø˜ðõ "#¤�G˜A‘Jøà?Ð?¨w¯}ª}©¬Ð?Ñ?Ô?ˆMˆMØ× Ò  Ñ#Ô#ð 	Ø˜CˆMˆMà�4å˜mÑ,Ô,ð "	&ñ "	&‰DˆAˆqÝœ5 &¨¨¨¤)ˆLˆE�5Ý”e�W˜a !™e‘_ˆFå˜!˜Q‘”ˆAå˜1˜a !™e‘_”_ð ð �Ø˜Ÿš  1 q¡5¨1¡9Ñ-Ô-Ñ-�à×+Ò+Ñ-Ô-‘��1à�a��”˜A‘��‘Ø��q‘	�	å˜1˜q™5‘\”\ð @ð @�Ø�a��”�C &¨¨!¨¤*¨v°a¸!±e°f°f¬~Ñ"=Ð?Ñ?��‘�õ
 ˜U¥C¨ L°!¸TÐBÑBÔBˆAØˆ}Ø‘��4Øð 9ØŸš�s 4¨!¨­S°©Y¬Y©Ñ7Ô7Ñ8Ô8�Aøå ¥s¨F |°QÑ7Ô7�àð Ø˜aÐ Ð Ô  AÑ%Ð Ð Ñ Ð à�t�tå˜-Ð(ˆFÝ˜fÑ%Ô%ˆF‰FðE"	&õH ”ˆåˆc‰
Œ
€Aà�!Œ9�f˜Q”i—n’n Q¨¨A©°©	Ñ2Ô2€q€Aå•U˜1˜a‘[”[×%Ò%Ñ'Ô'Ñ(Ô(€IÝ•U˜1˜a‘[”[×%Ò%Ñ'Ô'Ñ(Ô(€Iå”•q”uˆ~Ð€Gàð ,ð ,ˆØð 	,ð 	,ˆAØŒ|ð , ¤ð ,°°a²°Øà˜Q ™U A¨¡E˜NÐ+Ñ+��ð		,ð 	,Ð+Ð+Ð+ Ð+Ñ+Ô+€AØ+Ð+Ð+Ð+ Ð+Ñ+Ô+€Aà�'‰k˜A‰o€Gàð 8%ñ 8%‰ˆˆ1Ø˜RˆˆˆwØˆa�fŠf�Q˜˜A™ ™	Ñ"Ô"Ñ"ˆå�q˜1‘u‘”ð 	2ð 	2ˆAÝÐ9Ð9Ð9Ð9Ð9µ°a±´Ð9Ñ9Ô9Ð:ˆAÝÐ<Ð<Ð<Ð<Ð<µ°a¸±´Ð<Ñ<Ô<Ð=ˆAå�v˜a”y ‘{ 1‘} a¨Ñ+Ô+ˆDØ�LŠL˜Ÿš a™œÑ)Ô)Ð)à”<ð 2Ø—’˜u QœxŸšÑ0Ô0Ñ1Ô1Ð1øàð 	Ý˜'‘l”l¥A¤FˆtˆAˆAà�4�4å�q˜1‘u‘”ð 	%ð 	%ˆAØ˜!”H—L’L ‘O”OˆEà�AœFÐ"Ð"Ø˜  1¡™Ñ$�øå�t˜Q‘”×$Ò$Ñ&Ô&ð 	%ñ 	%ˆAØŒyð ØàKÐKÐKÐKÐK½eÀAÈÁE¹l¼lÐKÑKÔKˆMØ�AŠvˆv˜!�sÐ$QÐ$QÐ$QÐ$QÅÀqÈ!ÈaÉ%ÁÄÐ$QÑ$QÔ$QÐRÒRÐRõ ˜c¥C­¨G©¬Ñ$5Ô$5Ñ5Ñ6Ô6Ð7��å'¨°q¸!½SÀ¹\¼\ÐSWÐXÑXÔX‘	��TØ—k’k $Ñ'Ô'�Ø2Ð2Ð2Ð2¨TÐ2Ñ2Ô2�àð %ñ %�Ø˜A™ §¢ q¨!¨a©%Ñ 0Ô 0Ñ0°1Ñ4°qÑ8�Ý  ™œ�ð �Ý# E×$8Ò$8Ñ$:Ô$:¸1Ô$=¸qÑAÔA×FÒFÑHÔHð (ð (�FØ—z’z¥!‘}”}ð (Ø#˜t˜t˜t˜t˜tØ ¨¡
Ò+°Ò4Ð4Ø# a™Z˜øÝ˜E A r¨1¨q©5 >Ñ2Ô2�Ø—5’5�Õ$4µoÑFÔFð $Ý  ™œ�Aå˜f¨ s™l¨A°EÐ:Ñ:Ô:¸aÒ?Ð?Ø—M’M !Ñ$Ô$Ð$ùñ#%ñ	%ðB ‡K‚KÕ$€KÑ%Ô%Ð%Ý	�cÕ" 3Ñ'Ô'¨Ñ0Ô0Ñ	1Ô	1€Bàð ð ‰ˆˆ3Ø�!�c‘'Ñˆˆà‡y‚y�˜EÑ"Ô"ð àÐ%Ð% "Ð%Ñ%Ô%Ñ%ˆØ�˜W™œÐ&Ð&àˆr+   Nc                 ó  ‡‡‡— t          | t          ¦  «        r| j        | j        z
  } |j        d         Št          d‰f¬¦  «        }|                      ¦   «                              |                     t          dd¬¦  «        ¦  «        ¦  «        } t          t          ¦  «        }g }t          j        | ¦  «        D ]Ä}|                     |j        ¦  «        \  }}|s|                     |¦  «         Œ7|D ]Š}	|	j        rd|	j        |j        k    rT|	j        d                              ‰|z   ¦  «        }
|
�/|t#          |
|         ¦  «                                      |¦  «         Œmt%          d|j        ›d	‰›d
|	›d�¦  «        ‚ŒÅ|D ]}t          ||         Ž ||<   Œd„ |_        t          |Ž }|                     ¦   «         D ]\  }}t+          |¦  «        ||<   Œt,          j        }|j        s`|                     ‰¦  «        sK|j        r2t7          ˆfd„|                     ¦   «         j        D ¦   «         ¦  «        st%          d|z  ¦  «        ‚|                     ¦   «         D ]g}|                     ‰¦  «        r?|                     ‰¦  «        s)t?          ||                      ¦   «         d         ‰¦  «        }ŒVt%          d|z  ¦  «        ‚|                      ¦   «         \  }}|                     ‰¦  «        rt?          ||‰¦  «        }|t,          j        ur\|                     ¦   «         D ]3\  }}|                      ¦   «         \  }}|tC          ||‰¦  «        z  ||<   Œ4|tC          ||‰¦  «        z  }tE          | #                    ¦   «         ¦  «        }|dk     rÁtI          |¦  «        }t          d„ ¦  «        Š| %                    ‰‰|z   ¦  «                             ¦   «         }| %                    ‰‰|z   ¦  «                             ¦   «         }|                     ¦   «         D ]6\  }}| %                    ‰‰|z   ¦  «                             ¦   «         ‰||z   <   Œ7n|ŠtM          ‰ #                    ¦   «         ¦  «        }ˆfd„tO          |dz   ¦  «        D ¦   «         }tQ          || ‰d¬¦  «        }
|
€dS |
\  }}‰i g fv rdŠ|�rM‰��Jt          ‰t          ¦  «        r(ˆfd„tO          tS          ‰¦  «        ¦  «        D ¦   «         Šg }‰                     ¦   «         D ]Ð\  }}	 t#          |¦  «        }nT# tT          $ rG |j        r+|j        |j        k    rt#          |j        d         ¦  «        }nt%          d|z  ¦  «        ‚Y nw xY w| %                    ‰|¦  «        |z
  }| +                    t,          j,        ¦  «        r| -                    ‰|¦  «        |z
  }|                     |¦  «         ŒÑt]          |g|¢R Ž }
|
sdS | %                    |
¦  «        }|S )a‡  
    Solve univariate recurrence with rational coefficients.

    Given `k`-th order linear recurrence `\operatorname{L} y = f`,
    or equivalently:

    .. math:: a_{k}(n) y(n+k) + a_{k-1}(n) y(n+k-1) +
              \cdots + a_{0}(n) y(n) = f(n)

    where `a_{i}(n)`, for `i=0, \ldots, k`, are polynomials or rational
    functions in `n`, and `f` is a hypergeometric function or a sum
    of a fixed number of pairwise dissimilar hypergeometric terms in
    `n`, finds all solutions or returns ``None``, if none were found.

    Initial conditions can be given as a dictionary in two forms:

        (1) ``{  n_0  : v_0,   n_1  : v_1, ...,   n_m  : v_m}``
        (2) ``{y(n_0) : v_0, y(n_1) : v_1, ..., y(n_m) : v_m}``

    or as a list ``L`` of values:

        ``L = [v_0, v_1, ..., v_m]``

    where ``L[i] = v_i``, for `i=0, \ldots, m`, maps to `y(n_i)`.

    Examples
    ========

    Lets consider the following recurrence:

    .. math:: (n - 1) y(n + 2) - (n^2 + 3 n - 2) y(n + 1) +
              2 n (n + 1) y(n) = 0

    >>> from sympy import Function, rsolve
    >>> from sympy.abc import n
    >>> y = Function('y')

    >>> f = (n - 1)*y(n + 2) - (n**2 + 3*n - 2)*y(n + 1) + 2*n*(n + 1)*y(n)

    >>> rsolve(f, y(n))
    2**n*C0 + C1*factorial(n)

    >>> rsolve(f, y(n), {y(0):0, y(1):3})
    3*2**n - 3*factorial(n)

    See Also
    ========

    rsolve_poly, rsolve_ratio, rsolve_hyper

    r   rB   )ÚexcludeÚmT)ÚintegerNú'ú(z + k)' expected, got 'c                  ó   — dS r/   r%   r%   r+   r)   r2   zrsolve.<locals>.<lambda>õ  s   €  Q€ r+   c              3   óB   •K  — | ]}|                      ‰¦  «        V — Œd S r>   )r®   )r&   r,   r(   s     €r)   ú	<genexpr>zrsolve.<locals>.<genexpr>þ  s1   øè è € Ð"XÐ"X¸a 1×#6Ò#6°qÑ#9Ô#9Ð"XÐ"XÐ"XÐ"XÐ"XÐ"Xr+   zJThe independent term should be a sum of hypergeometric functions, got '%s'r#   z2Polynomial or rational function expected, got '%s'c                  ó   — t           j        S r>   r?   r%   r+   r)   r2   zrsolve.<locals>.<lambda>  s   € ¥Q¤V€ r+   c                 ó    •— g | ]
}‰|         ‘ŒS r%   r%   )r&   rN   ÚH_parts     €r)   r*   zrsolve.<locals>.<listcomp>$  s   ø€ Ð2Ð2Ð2˜Aˆf�QŒiÐ2Ð2Ð2r+   rœ   c                 ó"   •— i | ]}|‰|         “ŒS r%   r%   )r&   rN   Úinits     €r)   ú
<dictcomp>zrsolve.<locals>.<dictcomp>2  s   ø€ Ð9Ð9Ð9 1�A�t˜A”wÐ9Ð9Ð9r+   z"Integer or term expected, got '%s')/Ú
isinstancer   ÚlhsÚrhsr­   r	   rV   r³   Úfuncr   rk   r   Ú	make_argsÚas_coeff_mulrp   Úis_FunctionÚmatchrR   Ú
ValueErrorÚdefault_factoryr¯   r   r   rF   rf   r®   r¬   ÚallÚvaluesÚis_rational_functionre   r   r•   r   Úminrl   ÚabsrI   rm   rJ   rÆ   rg   Ú	TypeErrorr´   ÚNaNÚlimitr   )rv   r�   rÔ   rB   Úh_partÚi_partrY   r'   Údeprd   r„   ÚcommonÚi_numerÚi_denomÚnumerr‰   ÚK_minrÃ   ÚK_maxru   Úsolutionr7   Ú	equationsrW   rN   ÚeqrÒ   r(   s     `                       @@r)   Úrsolverô   ¦  sS  øøø€ õh �!•XÑÔð ØŒE�A”E‰Mˆà	ŒˆqŒ	€AÝˆS˜1˜$ÐÑÔ€Að 	
�Š‰
Œ
×Ò˜1Ÿ6š6¥$ s°DÐ"9Ñ"9Ô"9Ñ:Ô:Ñ;Ô;€Aå�ÑÔ€FØ€FÝŒ]˜1ÑÔð Dð DˆØ—^’^ A¤FÑ+Ô+‰
ˆˆsØð 	Ø�MŠM˜%Ñ Ô Ð ØØð 	Dð 	DˆAØŒ}ð  ¤¨1¬6Ò!1Ð!1Øœ œŸš¨¨Q©Ñ/Ô/�ØÐ%Ø�3˜v aœy™>œ>Ô*×1Ò1°%Ñ8Ô8Ð8ØÝ�*Ø56´V°V°V¸Q¸Q¸QÀÀÀÐBñDô Dð Dð	Dð ð $ð $ˆÝ˜ œ�Oˆˆq‰	ˆ	Ø&˜Y€FÔÝ�&ˆ\€Fà—L’L‘N”Nð $ð $‰ˆˆ5Ý˜U‘O”Oˆˆq‰	ˆ	åŒU€FàŒ>ð p &×":Ò":¸1Ñ"=Ô"=ð pØŒMðpÝ!Ð"XÐ"XÐ"XÐ"XÀ6Ç=Â=Á?Ä?ÔCWÐ"XÑ"XÔ"XÑYÔYðpåÐeÐhnÑnÑoÔoÐoà—’‘”ð Nð NˆØ×%Ò% aÑ(Ô(ð 	NØ×&Ò& qÑ)Ô)ð CÝ˜V U×%9Ò%9Ñ%;Ô%;¸AÔ%>ÀÑBÔB�øåØDÀuÑLñNô Nð Nð ×,Ò,Ñ.Ô.Ñ€GˆWà×Ò˜QÑÔð )Ý�V˜W aÑ(Ô(ˆà•Q”UÐÐØŸš™œð 	4ð 	4‰HˆAˆuØ ×/Ò/Ñ1Ô1‰LˆE�5Ø�c &¨%°Ñ3Ô3Ñ3ˆF�1‰IˆIà�˜V W¨aÑ0Ô0Ñ0ˆå�—’‘”ÑÔ€Eàˆq‚y€yÝ�‰JŒJˆå˜^˜^Ñ,Ô,ˆØ—’˜Q  A¡Ñ&Ô&×-Ò-Ñ/Ô/ˆØ—’˜Q  A¡Ñ&Ô&×-Ò-Ñ/Ô/ˆàŸš™œð 	:ð 	:‰HˆAˆuØ!ŸJšJ q¨!¨a©%Ñ0Ô0×7Ò7Ñ9Ô9ˆF�1�q‘5‰MˆMð	:ð ˆå�—’‘”ÑÔ€EØ2Ð2Ð2Ð2¥ u¨q¡yÑ!1Ô!1Ð2Ñ2Ô2€Få˜& 6 '¨1°dÐ;Ñ;Ô;€Fà€~ØˆtàÑ€Hˆgà��BˆxÐÐØˆàñ -�4Ñ#Ý�d�DÑ!Ô!ð 	:Ø9Ð9Ð9Ð9­­c°$©i¬iÑ(8Ô(8Ð9Ñ9Ô9ˆDàˆ	à—J’J‘L”Lð 	!ð 	!‰DˆAˆqðOÝ˜‘F”F��øÝð Oð Oð OØ”=ð O Q¤V¨q¬vÒ%5Ð%5Ý˜AœF 1œI™œ�A�Aå$Ð%IÈAÑ%MÑNÔNÐNð �AðOøøøð —’˜q !Ñ$Ô$ qÑ(ˆBØ�vŠv•a”e‰}Œ}ð .Ø—^’^ A qÑ)Ô)¨AÑ-�Ø×Ò˜RÑ Ô Ð Ð å�yÐ+ 7Ð+Ð+Ð+ˆàð 	-Ø�4à—}’} VÑ,Ô,ˆHà€Os   ÔT&Ô&AU7Õ6U7)r   r>   )4Ú__doc__Úcollectionsr   Úsympy.concreter   Úsympy.core.singletonr   Úsympy.core.numbersr   r   Úsympy.core.symbolr   r	   r
   Úsympy.core.relationalr   Úsympy.core.addr   Úsympy.core.mulr   Úsympy.core.sortingr   Úsympy.core.sympifyr   Úsympy.simplifyr   r   r   Úsympy.solversr   r   Úsympy.polysr   r   r   r   r   r   Úsympy.functionsr   r   r   r   Úsympy.matricesr   r    Úsympy.utilities.iterablesr!   r�   r™   rÆ   rô   r%   r+   r)   ú<module>r     sï  ðð/ð /ð` $Ð #Ð #Ð #Ð #Ð #à "Ð "Ð "Ð "Ð "Ð "Ø "Ð "Ð "Ð "Ð "Ð "Ø *Ð *Ð *Ð *Ð *Ð *Ð *Ð *Ø 1Ð 1Ð 1Ð 1Ð 1Ð 1Ð 1Ð 1Ð 1Ð 1Ø *Ð *Ð *Ð *Ð *Ð *Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø /Ð /Ð /Ð /Ð /Ð /Ø &Ð &Ð &Ð &Ð &Ð &à <Ð <Ð <Ð <Ð <Ð <Ð <Ð <Ð <Ð <Ø :Ð :Ð :Ð :Ð :Ð :Ð :Ð :Ø =Ð =Ð =Ð =Ð =Ð =Ð =Ð =Ð =Ð =Ð =Ð =Ð =Ð =Ð =Ð =Ø RÐ RÐ RÐ RÐ RÐ RÐ RÐ RÐ RÐ RÐ RÐ RØ -Ð -Ð -Ð -Ð -Ð -Ð -Ð -Ø 6Ð 6Ð 6Ð 6Ð 6Ð 6ðZð Zð Zð Zðzlð lð lð^Rð Rð Rðjeð eð eð eð eð er+   