
    g@'                         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 Zd Z d Z!d Z"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           	      l   |j         d         }|                    |          }t          d||                    |          |                    |d          g          }t          d||                    |          |                    |d          g          }t          d||                    |          |                    |d          g          }||                    |d          z  ||z  z   ||z  z   }t          | |                    |d          |                    |          |g                              |          }|rt          d |                                D                       ss|                                 \  }	}
t          |	          } t          | |                    |d          |                    |          |g                              |          }|rL||         dk    r@t          ||         ||         z            }t          ||         ||         z            }||gS g S )Nr   a3   )excludeb3c3c              3   >   K   | ]}|                                 V  d S )N)is_polynomial).0vals     \/var/www/html/ai-engine/env/lib/python3.11/site-packages/sympy/solvers/ode/hypergeometric.py	<genexpr>z+match_2nd_hypergeometric.<locals>.<genexpr>1   s.      ==33$$&&======    )
argsdiffr   r   matchallvaluesas_numer_denomr   r   )eqfuncxdfr   r   r   deqrndABs                r    match_2nd_hypergeometricr3   '   s   	!A	1B	dT499Q<<1aA	B	B	BB	dT499Q<<1aA	B	B	BB	dT499Q<<1aA	B	B	BB
dii1oo
B
&D
0C	1a$))A,,-	/ 	//4uSzz  N==!((**===== 	N$$&&DAqBTYYq!__diillDABBHHMMA QrUAXX1R52;1R52;1v	r"   c                    |j         d         t          t          |                               dz  | dz  dz  z   |z
                      }t          t          dz  |z  t	          d          dz  z                       }|                                \  }}t          t          |                    }t          t          |                    }fd |f          } |f          }|                    |           |}	t          |	          }
t          t          t          ||
dz  z  t	          d          dz  z
  |
z  dz  z                      d          }t          t          t          |                    t	          d          |
z  z            d                              }|                              sd S |                                \  }}t           |f                    }|j         }g }g }|D ]1}|                              rt          |t                     r|                    |                                d                    |                    t'          t)          |                                d                                                             d                    |                    |                                d                    |                    t'          t)          |                                                    d                    3|                                 t/          ||          dk    r||
|dd	S d S )
Nr   r         c                    dh}| D ]}|                               rt          |t                    rL|                                d         k    r.|                    |                                d                    x|k    r.|                    |                                d                    |                     |j                             |S )Nr   r6   )has
isinstancer   as_base_expaddupdater#   )num_powr   _power_countingr+   s      r    r?   z3equivalence_hypergeometric.<locals>._power_countingN   s    s 	; 	;Cwwqzz ;c3'' ;COO,=,=a,@A,E,EHHS__..q12222AXXHHS__..q12222KK 9 9:::r"   Tforce2F1)I0k
sing_pointtype)r#   r   r   r$   r   r(   r   r   r<   r   r   subsis_rational_functionmaxr8   r9   r   appendr:   listr   keyssortequivalence)r1   r2   r*   I1J1r=   dempow_numpow_demr>   rD   rC   max_num_powdem_argsrE   dem_powargr?   r+   s                    @@r    equivalence_hypergeometricrX   >   s,    		!A 
qvvayy{QT!V+a/00	1	1B 
q!tBw1a'((	)	)B  ""HC
F3KK
 
 C
F3KK
 
 C
 
 
 
 
 
 osg&&Gosg&&GNN7DD		A 
8FR1W!Q$6!Q$#CDDEET	R	R	RB	yA!QK!8!8EEEFF	G	GB ""1%% t  ""HCoosg..//KxHJG 	A 	A771:: 	A#s## As003444!!$uS__->->q-A1'E'E'J'J'L'L"M"Ma"PQQQQ s003444!!$uS!}}'9'9';';"<"<Q"?@@@LLNNN ;((E11QZFFFtr"   c           
      	   |j         d         }t          d          }t          d          }t          d          }t          d          }t          d          }	t          d          }
t          d          }t          d	          }t          d
          }t          d          }||z
  dz   ||z
  dz
  z  |dz  z  dd|z
  |z
  |z  d|z  |z  z   z  |z  z   ||dz
  z  z   d|dz  z  |dz
  dz  z  z  }|ddgk    rg }| |z  | |z  ||z
  ||z
  z  g}t          d          D ]q}|t          |          k     r0|                    t          ||         ||                              E|                    t          d||         z  d                     r| |d         z  }| |d         z  }|}t          |          dk    r ||d         |z  z   |d         |d         z
  z  }||z  |z   ||z  |z   z  }|                    ||          }|                    ||          }|                    ||          }t          |          }|||z  z
  ||z  |z
  z  }t          |                    ||                              ||                              ||                    }n|}|}|                     ||          } | |                    |          dz  z  } t          |           } |dz  d|dddi}|
                                \  }}|dz  |	dz  dz
  |dd|
z
  z  |z  |
|	z   |
|	z
  z  z   d||dz
  z  i}|                    t          t          t          | |z                      |dz  |gd                     g }|dz  |dfD ]1}|                    t          ||         ||                              2dt          t          d|d         j        z                       z
  }|                    t"                    s0t%          t'          t)          |d         |                              }t          t          |d         j        dz                       }|t          t          |dz  |dz  z   |d         j        z   d|z  z
                      z
  }||z   dz  }||z
  dz  } t+          |          t+          |           t+          |          ||dd}!|!S )Nr   abctsr.   alphabetagammadeltar6   r   r5      F)evaluaterB   )rZ   r[   r\   rD   mobiusrF   )r#   r   rangelenrJ   r   rG   r   r$   r   r(   r<   r   r   r
   lhsr8   r   minrK   r   r   )"IrD   rE   r*   r+   rZ   r[   r\   r]   r^   r.   r_   r`   ra   rb   rC   eqssing_eqsi_beta_delta_gammamobdict_II0_numI0_demdict_I0key_c_s_r_a_brns"                                     r    match_2nd_2F1_hypergeometricr}      s   	!AS		AS		AS		AS		AS		AS		AMME<<DMMEMMEQ3q51Q3q5/!Q$
QqSUAI!A$5!6q!8
81ac7
BQq!tVQqSSTH_	UBaVE%K%d
U5[/IJq 	1 	1AZ  

2hqk:a=99::::

2amQ//0000z!}$
1%z??ajmE11JqMJqM4QRFQw~a%0hhtU##hhuf%%hhuf%%SkkE!G^eAgo.QVVD%((..uf==CCE6RRSS 	
q!A	166!99q.Aq		Ad1a1QF&&((NFF !tAqD1HaAaCacAaC[!81Q!WEG
MM'&&!1!122QT1INNNOOO
C 1a| 2 2

2fSk73<001111 
VD3q6:&&''	'B66&>> )eCFA&&''((	SVZ!^$$	%	%B	fT"a%"a%-#a&*4qt;<<==	=B
r'1B
r'1Brll(2,,APS\a	b	bBIr"   c           	          | dk    r|ddgg dfv rdS n9| dk    r|g dg dddgddgfv rdS n | dk    r|g dddgg dddgdgddgddgfv rdS d S )Nr   )r   r   r   rB   r6   )r6   r   r   r   )r6   r6   r    )rT   rV   s     r    rN   rN      s     a1vyyy)))5 *			yyy)))aVaV<<<5 =			yyy1a&)))aVaS1a&1a&QQQ54r"   c                 ^   |j         d         }ddlm} ddlm} t          | d          \  }}|d         }|d         }	|d         }
|d	         }d }|
j        d
k    rI|t          ||	g|
g|          z  |t          ||
z
  dz   |	|
z
  dz   gd|
z
  g|          z  |d|
z
  z  z  z   }n|
dk    rt          t          t          ||	z   dz    |z  |
z   |dz  |z
  z  |                     |t          ||	g|
g|                    dz  z  |          t          ||	g|
g|          z  }|t          ||	g|
g|          z  ||z  z   }nm|
|z
  |	z
  j        d
k    r\|t          ||	gd|z   |	z   |
z
  gd|z
            z  |t          |
|z
  |
|	z
  gd|
z   |z
  |	z
  gd|z
            z  d|z
  |
|z
  |	z
  z  z  z   }|r|d         }t          d|                    |          z            }||	z   dz   |z  |
z
                      ||          |z  } |||dz  |z
                      ||          |                    |          |z  z  z             } ||dz  |z
                      ||          |dz  z            }t          t          t          t          |d|z  z            |          d                    }|                    ||d                   }|                    |||d         z            }|                    |||d         z            }|j        skt          |dz  |          }t          t          |d                    }t          ||z  ||d          dz   dz  z  z            |z  }t!          ||          }|S t          |||d          dz   dz  z  z            |z  }t!          ||          }|S )Nr   )hyperexpand)r   r   )r=   rZ   r[   r\   r1   Fr6   re   Tr@   rD   )r#   sympy.simplify.hyperexpandr   sympy.polys.polytoolsr   r   
is_integerr   r   r	   r   r$   rG   r   r   is_zeror   )r)   r*   match_objectr+   r   r   C0C1rZ   r[   r\   r1   soly2rG   dtdx_B_Aee1s                       r    get_sol_2F1_hypergeometricr      sG   	!A666666,,,,,,#BA...FBSASASASA
C|u1vsA&&&E1Q3q5!A#a%.1Q3%,K,K)KAPQRSPSH)TT	
ac(ac!eHQJNQT!V#<a@@AA;;uVWYZU[^_]`bcOdOdCeCeghChiklmmnsuvxytz}~|  BC  oD  oD  D1vsA&&&B.
A#a%	u	$	$1v!Aay!A#...E1Q3!*qs1uQwiQRSTQT4U4U1UWXYZWZ^_`a^abc^cVd1dd
 H%499Q<<())1uqy!ma%%a..t3VB1a47..D11DIIaLL4EFFGGVQTAXOOAt,,dAg677
8F2qt9$5$5q99FFFGGhhq,x011hhq!\#..//FF1ac**++y 	!A#q!!BZ$///00B!B$l3&7%7%91$< ==>>sBCT3--CJa|C002A56677;smmJr"   N)$__doc__
sympy.corer   r   sympy.core.functionr   sympy.core.relationalr   sympy.core.symbolr   r   sympy.functionsr	   r
   r   sympy.integralsr   sympy.polysr   r   r   r   r   sympy.simplifyr   r   r   sympy.simplify.powsimpr   sympy.solvers.ode.oder   r3   rX   r}   rN   r   r   r"   r    <module>r      sd   2         & & & & & & $ $ $ $ $ $ * * * * * * * * , , , , , , , , , , $ $ $ $ $ $ " " " " " " " " 0 0 0 0 0 0 0 0 8 8 8 8 8 8 8 8 8 8 , , , , , , 8 8 8 8 8 8  .F F FRH H HV  *) ) ) ) )r"   