
    wg@'                         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#y)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           	         |j                   d   }|j                  |      }t        d||j                  |      |j                  |d      g      }t        d||j                  |      |j                  |d      g      }t        d||j                  |      |j                  |d      g      }||j                  |d      z  ||z  z   ||z  z   }t        | |j                  |d      |j                  |      |g      j	                  |      }|r{t        d |j                         D              s[| j                         \  }	}
t        |	      } t        | |j                  |d      |j                  |      |g      j	                  |      }|r4||   dk7  r,t        ||   ||   z        }t        ||   ||   z        }||gS g S )Nr   a3   )excludeb3c3c              3   <   K   | ]  }|j                           y w)N)is_polynomial).0vals     e/home/mcse/projects/flask/flask-venv/lib/python3.12/site-packages/sympy/solvers/ode/hypergeometric.py	<genexpr>z+match_2nd_hypergeometric.<locals>.<genexpr>1   s     =33$$&=s   )
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_hypergeometricr2   '   s   		!A	1B	dT499Q<1aA	BB	dT499Q<1aA	BB	dT499Q<1aA	BB
dii1o
B
&D
0C	1a$))A,-	//4uSz =!((*==$$&DAqBTYYq!_diilDABHHMAQrUAX1R52;1R52;1v	    c                 `   |j                   d   t        t        | j                        dz  | dz  dz  z   |z
              }t        t        dz  |z  t	        d      dz  z               }|j                         \  }}t        t        |            }t        t        |            }fd |f      } |f      }|j                  |       |}	t        |	      }
t        t        t        ||
dz  z  t	        d      dz  z
  |
z  dz  z              d      }t        t        t        |j                  t	        d      |
z  z        d                  }|j                        sy |j                         \  }}t         |f            }|j                   }g }g }|D ]  }|j                        st        |t               ri|j#                  |j%                         d          |j#                  t'        t)        |j%                         d         j+                               d          |j#                  |j%                         d          |j#                  t'        t)        |      j+                               d           |j-                          t/        ||      dk(  r||
|dd	S y )
Nr   r         c                 d   dh}| D ]  }|j                        st        |t              r9|j                         d   k(  r#|j	                  |j                         d          ^|k(  r#|j	                  |j                         d          |j                   |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wwqzc3'COO,=a,@A,EHHS__.q12AXHHS__.q12KK 9:	; r3   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)r0   r1   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 
qvvay{QT!V+a/0	1B 
q!tBw1a'(	)B  "HC
F3K
 C
F3K
 C
 sg&Gsg&GNN7DD	A 
8FR1W!Q$6!Q$#CDET	RB	yA!QK!8EF	GB ""1%  "HCosg./KxxHJG 	A771:#s#s034!!$uS__->q-A1'E'J'J'L"Ma"PQ s034!!$uS!}'9'9';"<Q"?@	A LLN ;(E1QZFFr3   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k7  rQg }| |z  | |z  ||z
  ||z
  z  g}t        d      D ]S  }|t        |      k  r"|j	                  t        ||   ||                3|j	                  t        d||   z  d             U | |d   z  }| |d   z  }|}t        |      dk(  r||d   |z  z   |d   |d   z
  z  }||z  |z   ||z  |z   z  }|j                  ||      }|j                  ||      }|j                  ||      }t        |      }|||z  z
  ||z  |z
  z  }t        |j                  ||      j                  ||      j                  ||            }n|}|}| j                  ||      } | |j                  |      dz  z  } t        |       } |dz  d|dddi}|j                         \  }}|dz  |	dz  dz
  |dd|
z
  z  |z  |
|	z   |
|	z
  z  z   d||dz
  z  i}|j                  t        t        t        | |z              |dz  |gd             g }|dz  |dfD ]#  }|j	                  t        ||   ||                % dt        t        d|d   j                  z               z
  }|j!                  t"              s!t%        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ME<DMEMEQ3q51Q3q5/!Q$
QqSUAI!A$5!6q!8
81ac7
BQq!tVQqSSTH_	UBaVE%K%d
U5[/IJq 	1AZ 

2hqk:a=9:

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

2fSk73<012 
VD3q6::&'	'B66&>eCFA&'(	SVZZ!^$	%B	fT"a%"a%-#a&**4qt;<=	=B
r'1B
r'1Brl(2,APS\a	bBIr3   c           	          | dk(  r|ddgg dfv ryy | dk(  r|g dg dddgddgfv ryy | dk(  r|g dddgg dddgdgddgddgfv ryy )Nr   )r   r   r   rB   r6   )r6   r   r   r   )r6   r6   r    )rT   rV   s     r    rN   rN      s     a1vy))  
	y)aVaV<<
 	 
	y1a&)aVaS1a&1a&QQr3   c                 2   |j                   d   }ddlm} ddlm} t        | d      \  }}|d   }|d   }	|d   }
|d	   }d }|
j                  d
k(  r@|t        ||	g|
g|      z  |t        ||
z
  dz   |	|
z
  dz   gd|
z
  g|      z  |d|
z
  z  z  z   }n|
dk(  rzt        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   }ni|
|z
  |	z
  j                  d
k(  rT|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|j                  |      z        }||	z   dz   |z  |
z
  j                  ||      |z  } |||dz  |z
  j                  ||      |j                  |      |z  z  z         } ||dz  |z
  j                  ||      |dz  z        }t        t        t        t        |d|z  z        |      d            }|j                  ||d         }|j                  |||d   z        }|j                  |||d   z        }|j                  sTt        |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\   r0   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\   r0   soly2rG   dtdx_B_Aee1s                       r    get_sol_2F1_hypergeometricr      s   		!A6,#BA.FBSASASASA
C||u1vsA&&E1Q3q5!A#a%.1Q3%,K)KAPQRSPSH)TT	
ac(ac!eHQJNQT!V#<a@A;uVWYZU[^_]`bcOdCeghChiklmnsuvxytz}~|  BC  oD  D1vsA&&B.
A#a%		u	$1v!Aay!A#..E1Q3!*qs1uQwiQRSTQT4U1UWXYZWZ^_`a^abc^cVd1dd
H%499Q<()1uqy!ma%%a.t3B1a47..D1DIIaL4EFFGQTAXOOAt,dAg67
8F2qt9$5q9FGhhq,x01hhq!\#../FF1ac**+yy!A#q!BZ$/0B!B$l3&7%7%91$< ==>sBCT3-CJa|C002A5667;smJr3   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   r2   rX   r}   rN   r   r   r3   r    <module>r      sP   2  & $ * , , $ " 0 8 8 , 8.FRHV*)r3   