o
    ¹0 i@'  ã                   @   sÔ   d Z ddlmZ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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„ Zdd„ Z dd„ Z!dd„ Z"dd„ Z#dS )aO  
This module contains the implementation of the 2nd_hypergeometric hint for
dsolve. This is an incomplete implementation of the algorithm described in [1].
The algorithm solves 2nd order linear ODEs of the form

.. math:: y'' + A(x) y' + B(x) y = 0\text{,}

where `A` and `B` are rational functions. The algorithm should find any
solution of the form

.. math:: y = P(x) _pF_q(..; ..;\frac{\alpha x^k + \beta}{\gamma x^k + \delta})\text{,}

where pFq is any of 2F1, 1F1 or 0F1 and `P` is an "arbitrary function".
Currently only the 2F1 case is implemented in SymPy but the other cases are
described in the paper and could be implemented in future (contributions
welcome!).

References
==========

.. [1] L. Chan, E.S. Cheb-Terrab, Non-Liouvillian solutions for second order
       linear ODEs, (2004).
       https://arxiv.org/abs/math-ph/0402063
é    )ÚSÚPow)Úexpand)ÚEq)ÚSymbolÚWild)ÚexpÚsqrtÚhyper)ÚIntegral)ÚrootsÚgcd)ÚcancelÚfactor)ÚcollectÚsimplifyÚ
logcombine)Ú	powdenest)Úget_numbered_constantsc                 C   sN  |j d }| |¡}td|| |¡| |d¡gd}td|| |¡| |d¡gd}td|| |¡| |d¡gd}|| |d¡ ||  ||  }t| | |d¡| |¡|gƒ |¡}|r…tdd„ | ¡ D ƒƒs…|  ¡ \}	}
t|	ƒ} t| | |d¡| |¡|gƒ |¡}|r¥|| dkr¥t	|| ||  ƒ}t	|| ||  ƒ}||gS g S )	Nr   Úa3é   )ÚexcludeÚb3Úc3c                 s   s    | ]}|  ¡ V  qd S )N)Zis_polynomial)Ú.0Úval© r   úl/home/app/PaddleOCR-VL-test/.venv_paddleocr/lib/python3.10/site-packages/sympy/solvers/ode/hypergeometric.pyÚ	<genexpr>1   s   € z+match_2nd_hypergeometric.<locals>.<genexpr>)
ÚargsÚdiffr   r   ÚmatchÚallÚvaluesÚas_numer_denomr   r   )ÚeqÚfuncÚxÚdfr   r   r   ZdeqÚrÚnÚdÚAÚBr   r   r   Úmatch_2nd_hypergeometric'   s*   

    ÿÿ$r.   c              	      sê  |j d ‰tt|  ˆ¡d | d d  | ƒƒ}ttˆd | tdƒd  ƒƒ}| ¡ \}}tt|ƒƒ}tt|ƒƒ}‡ ‡fdd„‰ ˆ |fƒ}ˆ |fƒ}| |¡ |}	t	|	ƒ}
tt
t||
d  tdƒd  ˆ|
 d  ƒƒdd}ttt| ˆˆtdƒ|
  ¡ddƒƒ}| ˆ¡s‹d S | ¡ \}}tˆ |fƒƒ}|j }g }g }|D ]?}| ˆ¡ràt|tƒrÉ| | ¡ d ¡ | tt| ¡ d ˆƒ ¡ ƒd ¡ q¡| | ¡ d ¡ | tt|ˆƒ ¡ ƒd ¡ q¡| ¡  t||ƒd	kró||
|d	d
œS d S )Nr   r   é   é   c                    sx   dh}| D ]4}|  ˆ¡r9t|tƒr#| ¡ d ˆkr#| | ¡ d ¡ q|ˆkr1| | ¡ d ¡ q| ˆ |jƒ¡ q|S )Nr   r0   )ÚhasÚ
isinstancer   Úas_base_expÚaddÚupdater   )ÚnumÚ_powr   ©Ú_power_countingr'   r   r   r9   N   s   
€z3equivalence_hypergeometric.<locals>._power_countingT©ÚforceÚ2F1)ÚI0ÚkÚ
sing_pointÚtype)r   r   r   r    r   r$   r   r   r5   r   r   ÚsubsZis_rational_functionÚmaxr1   r2   r   Úappendr3   Úlistr   ÚkeysÚsortÚequivalence)r,   r-   r&   ZI1ZJ1r6   ZdemZpow_numZpow_demr7   r>   r=   Úmax_num_powZdem_argsr?   Údem_powÚargr   r8   r   Úequivalence_hypergeometric>   sB   
& 


4(


&€rK   c           "      C   s®  |j d }tdƒ}tdƒ}tdƒ}tdƒ}tdƒ}	tdƒ}
tdƒ}td	ƒ}td
ƒ}tdƒ}|| d || d  |d  dd| | | d| |   |  ||d   d|d  |d d   }|ddgkrg }| | | | || ||  g}tdƒD ]!}|t|ƒk r”| t|| || ƒ¡ q| td||  dƒ¡ q| |d  }| |d  }|}t|ƒdkrÇ||d |  |d |d   }|| | || |  }| ||¡}| ||¡}| ||¡}t|ƒ}|||  || |  }t| ||¡ ||¡ ||¡ƒ}n|}|}|  ||¡} | | |¡d  } t	| ƒ} |d d|dddi}| 
¡ \}}|d |	d d |dd|
  | |
|	 |
|	   d||d  i}| ttt| | ƒƒ|d |gdd¡ g }|d |dfD ]}| t|| || ƒ¡ qjdt	td|d j ƒƒ }| t¡s˜ttt|d |ƒƒƒ}t	t|d jd ƒƒ}|t	t|d |d  |d j d|  ƒƒ }|| d }|| d } t|ƒt| ƒt|ƒ||ddœ}!|!S )Nr   ÚaÚbÚcÚtÚsr)   ÚalphaÚbetaÚgammaÚdeltar0   r   r/   é   F)Úevaluater<   )rL   rM   rN   r>   Úmobiusr@   )r   r   ÚrangeÚlenrC   r   rA   r   r    r   r$   r5   r   r   r	   Úlhsr1   r   ÚminrD   r   r   )"ÚIr>   r?   r&   r'   rL   rM   rN   rO   rP   r)   rQ   rR   rS   rT   r=   ZeqsZsing_eqsÚiZ_betaZ_deltaZ_gammaZmobZdict_IZI0_numZI0_demZdict_I0ÚkeyZ_cZ_sÚ_rÚ_aÚ_bZrnr   r   r   Úmatch_2nd_2F1_hypergeometric‡   sh   
h" "@(.rb   c              	   C   s”   | dkr|ddgg d¢fv rdS d S | dkr*|g d¢g d¢ddgddgfv r(dS d S | dkrH|g d¢ddgg d¢ddgdgddgddgfv rHdS d S )Nr   )r   r   r   r<   r0   )r0   r   r   r   )r0   r0   r   r   )rH   rI   r   r   r   rG   Ò   s   ù ü0rG   c                 C   s  |j d }ddlm} ddlm} t| dd\}}|d }|d }	|d }
|d	 }d }|
jd
krW|t||	g|
g|ƒ |t||
 d |	|
 d gd|
 g|ƒ |d|
    }n€|
dkrštt	t||	 d  | |
 |d |  |ƒƒ|t||	g|
g|ƒƒd  |ƒt||	g|
g|ƒ }|t||	g|
g|ƒ ||  }n=|
| |	 jd
kr×|t||	gd| |	 |
 gd| ƒ |t|
| |
|	 gd|
 | |	 gd| ƒ d| |
| |	    }|rŒ|d }t
d| |¡ ƒ}||	 d | |
  ||¡| }|||d |  ||¡| |¡|   ƒ}||d |  ||¡|d  ƒ}t	ttt|d|  ƒ|ƒddƒ}| ||d ¡}| |||d  ¡}| |||d  ¡}|jsvt|d |ƒ}t	t|ddƒ}t|| ||d  d d   ƒ| }t||ƒ}|S t|||d  d d   ƒ| }t||ƒ}|S )Nr   )Úhyperexpand)r   r   )r6   rL   rM   rN   r,   Fr0   rW   Tr:   r>   )r   Zsympy.simplify.hyperexpandrc   Úsympy.polys.polytoolsr   r   Ú
is_integerr
   r   r   r   r    rA   r   r   Úis_zeror   )r%   r&   Zmatch_objectr'   rc   r   ZC0ZC1rL   rM   rN   r,   ZsolÚy2rA   ZdtdxZ_BZ_AÚeÚe1r   r   r   Úget_sol_2F1_hypergeometricç   sF   

N^ h * "&
"
rj   N)$Ú__doc__Z
sympy.corer   r   Zsympy.core.functionr   Zsympy.core.relationalr   Zsympy.core.symbolr   r   Zsympy.functionsr   r	   r
   Zsympy.integralsr   Zsympy.polysr   r   rd   r   r   Zsympy.simplifyr   r   r   Zsympy.simplify.powsimpr   Zsympy.solvers.ode.oder   r.   rK   rb   rG   rj   r   r   r   r   Ú<module>   s"    IK