U
    ZÊ¹j@'  ã                   @   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   sZ  |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ƒ |¡}|�rR|| dk�rRt	|| ||  ƒ}t	|| ||  ƒ}||gS g S d S )	Nr   Úa3é   )ÚexcludeÚb3Úc3c                 s   s   | ]}|  ¡ V  qd S )N)Zis_polynomial)Ú.0Úval© r   ú_/var/www/html/bwave/python/venv/lib/python3.8/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ÚxZ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 ]„}| ˆ¡�rDt|tƒ�r˜| | ¡ d ¡ | tt| ¡ d ˆƒ ¡ ƒd ¡ n.| | ¡ d ¡ | tt|ˆƒ ¡ ƒd ¡ �qD| ¡  t||ƒd	k�rð||
|d	d
œS d S d S )Nr   r   é   é   c                    sx   dh}| D ]h}|  ˆ¡r
t|tƒrF| ¡ d ˆkrF| | ¡ d ¡ q
|ˆkrb| | ¡ d ¡ q
| ˆ |jƒ¡ q
|S )Nr   r/   )ÚhasÚ
isinstancer   Úas_base_expÚaddÚupdater   )ÚnumÚ_powr   ©Ú_power_countingr'   r   r   r8   N   s    
z3equivalence_hypergeometric.<locals>._power_countingT©ÚforceÚ2F1)ÚI0ÚkÚ
sing_pointÚtype)r   r   r   r    r   r$   r   r   r4   r   r   ÚsubsZis_rational_functionÚmaxr0   r1   r   Úappendr2   Úlistr   ÚkeysÚsortÚequivalence)r+   r,   r&   ZI1ZJ1r5   ZdemZpow_numZpow_demr6   r=   r<   Úmax_num_powZdem_argsr>   Údem_powÚargr   r7   r   Úequivalence_hypergeometric>   s@    
& 


4(& rJ   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 ]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|| || ƒ¡ �qØdt	td|d j ƒƒ }| t¡�s4t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Údeltar/   r   r.   é   F)Úevaluater;   )rK   rL   rM   r=   Úmobiusr?   )r   r   ÚrangeÚlenrB   r   r@   r   r    r   r$   r4   r   r   r	   Úlhsr0   r   ÚminrC   r   r   )"ÚIr=   r>   r&   r'   rK   rL   rM   rN   rO   r(   rP   rQ   rR   rS   r<   ZeqsZsing_eqsÚiZ_betaZ_deltaZ_gammaZmobZdict_IZI0_numZI0_demZdict_I0ÚkeyZ_cZ_sÚ_rZ_aÚ_bZrnr   r   r   Úmatch_2nd_2F1_hypergeometric‡   sh    
h" "@(.r`   c              	   C   sš   | dkr$|ddgdddgfkr–dS nr| dkrV|dddgdddgddgddgfkr–dS n@| dkr–|dddgddgdddgddgdgddgddgfkr–dS d S )Nr   r;   r/   r   r   )rG   rH   r   r   r   rF   Ò   s    $4rF   c                 C   s"  |j d }ddlm} ddlm} t| dd�\}}|d }|d }	|d }
|d	 }d }|
jd
kr°|t||	g|
g|ƒ |t||
 d |	|
 d gd|
 g|ƒ |d|
    }�n|
dk�r8t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�sòt|d |ƒ}t	t|dd�ƒ}t|| ||d  d d   ƒ| }t||ƒ}|S t|||d  d d   ƒ| }t||ƒ}|S )Nr   )Úhyperexpand)r   r   )r5   rK   rL   rM   r+   Fr/   rV   Tr9   r=   )r   Zsympy.simplify.hyperexpandra   Úsympy.polys.polytoolsr   r   Ú
is_integerr
   r   r   r   r    r@   r   r   Úis_zeror   )r%   r&   Zmatch_objectr'   ra   r   ZC0ZC1rK   rL   rM   r+   ZsolÚy2r@   ZdtdxZ_BZ_AÚeÚe1r   r   r   Úget_sol_2F1_hypergeometricç   sF    

P
^ h * "&
"
rh   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   rb   r   r   Zsympy.simplifyr   r   r   Zsympy.simplify.powsimpr   Zsympy.solvers.ode.oder   r-   rJ   r`   rF   rh   r   r   r   r   Ú<module>   s    IK