U
    9%e@'                     @   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/Darija-Ai-API/env/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|| ||  qd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rdS nr| dkrV|dddgdddgddgddgfkrd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rd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st|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