
    \hE                        S SK Jr  S SKJr  S SKJrJr  S SKJr  S SK	J
r
  S SKJr  S SKJr  S SKJrJrJr  S S	KJr  S S
KJr  S SKJrJr  S SKJr  S SKJr  S SKJr  S SKJ r J!r!  S SK"J#r#  S r$SS jr%S r&S r'S r(SS.S jr)g)    )Add)factor_terms)
expand_log_mexpand)Pow)S)ordered)Dummy)LambertWexplog)root)roots)Polyfactor)separatevars)collect)powsimp)solve_invert)uniqc                 "   U R                    Vs1 s H  o!UR                  ;   d  M  UiM     nn[        U5       HM  nSU-  nX#;   d  M  XC;   d  M  UR                  5       S   [        R
                  La  UnUR                  U5        MO     U$ s  snf )a  process the generators of ``poly``, returning the set of generators that
have ``symbol``.  If there are two generators that are inverses of each other,
prefer the one that has no denominator.

Examples
========

>>> from sympy.solvers.bivariate import _filtered_gens
>>> from sympy import Poly, exp
>>> from sympy.abc import x
>>> _filtered_gens(Poly(x + 1/x + exp(x)), x)
{x, exp(x)}

   )gensfree_symbolslistas_numer_denomr   Oneremove)polysymbolgr   ags        O/var/www/auris/envauris/lib/python3.13/site-packages/sympy/solvers/bivariate.py_filtered_gensr%      s{    $ yy=y!ann$<AyD=$ZqS9  "1%QUU2KKN  K >s
   BBNc                 j  ^ U R                  T5       Vs/ s HV  o2(       aK  UR                  (       a  X#R                  ;   d+  UR                  (       a  M<  UR                  U5      (       d  MT  UPMX     nn[	        U5      S:X  a  US   $ U(       a   [        [        [        U5      5      U4S jS9$ gs  snf )a  Returns the term in lhs which contains the most of the
func-type things e.g. log(log(x)) wins over log(x) if both terms appear.

``func`` can be a function (exp, log, etc...) or any other SymPy object,
like Pow.

If ``X`` is not ``None``, then the function returns the term composed with the
most ``func`` having the specified variable.

Examples
========

>>> from sympy.solvers.bivariate import _mostfunc
>>> from sympy import exp
>>> from sympy.abc import x, y
>>> _mostfunc(exp(x) + exp(exp(x) + 2), exp)
exp(exp(x) + 2)
>>> _mostfunc(exp(x) + exp(exp(y) + 2), exp)
exp(exp(y) + 2)
>>> _mostfunc(exp(x) + exp(exp(y) + 2), exp, x)
exp(x)
>>> _mostfunc(x, exp, x) is None
True
>>> _mostfunc(exp(x) + exp(x*y), exp, x)
exp(x)
r   r   c                 &   > U R                  T5      $ N)count)xfuncs    r$   <lambda>_mostfunc.<locals>.<lambda>P   s        )keyN)atoms	is_Symbolr   haslenmaxr   r	   )lhsr+   Xtmpftermss    `   r$   	_mostfuncr9   /   s    6 !YYt_ )_cQ	---KK GGAJ _F ) 6{aay	4(.EFF)s   ;B0B0,B0c                 p   [        U R                  5       5      n U R                  U5      u  p#U R                  (       a(  UR                  (       a  [        X15      u  pEnX$-  X%-  U4$ U R                  (       d  SnX#pdOUn[        U5      R                  USS9u  pFUR                  5       (       a  U* nU* nXEU4$ )a  Return ``a, b, X`` assuming ``arg`` can be written as ``a*X + b``
where ``X`` is a symbol-dependent factor and ``a`` and ``b`` are
independent of ``symbol``.

Examples
========

>>> from sympy.solvers.bivariate import _linab
>>> from sympy.abc import x, y
>>> from sympy import exp, S
>>> _linab(S(2), x)
(2, 0, 1)
>>> _linab(2*x, x)
(2, 0, x)
>>> _linab(y + y*x + 2*x, x)
(y + 2, y, x)
>>> _linab(3 + 2*exp(x), x)
(2, 3, exp(x))
r   Fas_Add)r   expandas_independentis_Mulis_Add_linabr   could_extract_minus_sign)argr!   inddepabr*   s          r$   rA   rA   T   s    ( szz|
$C!!&)HC
zzcjj%auceQ::1C //u/E!!##BB7Nr.   c                 n  ^^ [        [        U 5      5      n [        U [        U5      nU(       d  / $ U R	                  US5      n[        U* [        5      (       a[  X-
  R	                  X"R                  S   5      n UR                  S   n[        U[        5      (       d  / $ U* R                  S   * nX-  n XR                  ;  a  / $ [        X15      u  pEn[        X-
  U5      nUR                  U5      nUb  XR                  ;   a  / $ UR                  S   n	[        X5      u  pnX:w  a  / $ [        S5      m[        UT-
  U5      nSS/n/ nX-  X-  -
  U-  U
-  R                  5       u  nnUR                  5       u  nn[        UU-  5      n[        S5      n[!        UU-  U-
  U5      R#                  5        Vs/ s H  nXHU
-  -  U-  PM     nnU H\  nU HS  n[%        UU5      nU(       a  UR&                  (       d  M)  U* U
-  X-  U-  -   mUR)                  UU4S jU 5       5        MU     M^     U$ s  snf )z
Given an expression assumed to be in the form
    ``F(X, a..f) = a*log(b*X + c) + d*X + f = 0``
where X = g(x) and x = g^-1(X), return the Lambert solution,
    ``x = g^-1(-c/b + (a/d)*W(d/(a*b)*exp(c*d/a/b)*exp(-f/a)))``.
r   rhstc              3   F   >#    U  H  oR                  TT5      v   M     g 7fr(   )subs).0xurI   us     r$   	<genexpr>_lambert.<locals>.<genexpr>   s     92wwq#s   !)r   r   r9   r   rM   
isinstanceargsr   rA   r   as_coefficientr
   r   r   as_coeff_Mulr   r   keysr   is_realextend)eqr*   mainlogotherdfX2logtermrF   logargrG   cX1xusolnslambert_real_branchessolnumdenperK   rT   rC   kwrI   rP   s                            @@r$   _lambertrm   y   s!    
*R.	!BC#G	GGGQE5&#jwQ8,,q/'3''I&q!!
"""	eHA"bj'*Gw'AyA'	\\!_Ff HA"	x	 	eABFAG  G
C QS!A--/HCFAsCGAc
A$QTAXq166898!AsGAI8D9 &Aa A"Q$!#q.CJJ999 '  J :s   8H2c                 *  ^^^ U4S jnU R                  TSS9u  pEU* nT Vs/ s HN  nUR                  [        [        4;   d/  UR                  (       d  M0  TUR                  R
                  ;   d  ML  UPMP     nnU(       d
  [        5       eUR                  (       d  UR                  (       Gad  [        S0 TR                  D6mUR                  U4S jU4S j5      nUR                  (       a  UR                  T5      (       a  UR                  TS5      n	XY-
  n
Xi-
  nU
R                  (       dd  U(       a]  U
R                  [        R                  [        R                   5      (       d*  [#        [        U
5      [        U5      -
  5      nU" UTT5      $ OkUR                  (       aZ  U(       aS  [#        [        U5      SS9n[        U5      nUR                  T5      (       a  UR                  (       a  XV-
  nU" UTT5      $ UR%                  TT05      n['        [)        USS95      n[        5       n[+        X]-
  T5      u  pUR%                  X05      n/ nU(       Gd-  [-        U[        T5      nU(       Ga  UR                  (       a(  US:w  a"  [/        [        U5      [        U5      -
  T5      nOUR                  (       a  UR                  US5      nU(       a  UR                  (       d  UR1                  [2        5       Vs/ s H  nTUR
                  ;   d  M  UPM     sn(       aU  U(       d  [        U5      [        UU-
  5      -
  nO[        UU-
  5      [        UU-
  5      -
  n[/        [#        U5      T5      nO[/        XV-
  T5      nU(       d  [-        U[        T5      nU(       a  [5        UU5      nUR                  (       a1  US:w  a+  [/        [#        [        U5      [        U5      -
  5      T5      nOUR                  (       a|  UR                  US5      nUU-
  nUU-
  nUR7                  5       (       a  UR7                  5       (       a
  US	-  nUS	-  n[        U5      [        U5      -
  n[/        [#        U5      T5      nU(       d  [-        U[2        T5      nU(       a  TUR                  R
                  ;   a  [5        UU5      nUR                  (       a1  US:w  a+  [/        [#        [        U5      [        U5      -
  5      T5      nOYUR                  (       aH  UR                  US5      nUU-
  nUU-
  n[        U5      [        U5      -
  n[/        [#        U5      T5      nU(       d  [        S
U -  5      e[9        [;        U5      5      $ s  snf s  snf )ap  Return solution to ``f`` if it is a Lambert-type expression
else raise NotImplementedError.

For ``f(X, a..f) = a*log(b*X + c) + d*X - f = 0`` the solution
for ``X`` is ``X = -c/b + (a/d)*W(d/(a*b)*exp(c*d/a/b)*exp(f/a))``.
There are a variety of forms for `f(X, a..f)` as enumerated below:

1a1)
  if B**B = R for R not in [0, 1] (since those cases would already
  be solved before getting here) then log of both sides gives
  log(B) + log(log(B)) = log(log(R)) and
  X = log(B), a = 1, b = 1, c = 0, d = 1, f = log(log(R))
1a2)
  if B*(b*log(B) + c)**a = R then log of both sides gives
  log(B) + a*log(b*log(B) + c) = log(R) and
  X = log(B), d=1, f=log(R)
1b)
  if a*log(b*B + c) + d*B = R and
  X = B, f = R
2a)
  if (b*B + c)*exp(d*B + g) = R then log of both sides gives
  log(b*B + c) + d*B + g = log(R) and
  X = B, a = 1, f = log(R) - g
2b)
  if g*exp(d*B + h) - b*B = c then the log form is
  log(g) + d*B + h - log(b*B + c) = 0 and
  X = B, a = -1, f = -h - log(g)
3)
  if d*p**(a*B + g) - b*B = c then the log form is
  log(d) + (a*B + g)*log(p) - log(b*B + c) = 0 and
  X = B, a = -1, d = a*log(p), f = -log(d) - g*log(p)
c                    > S Vs/ s H  o0R                  XU-  05      PM     snu  pE[        XBT5      nXT:w  a  UR                  [        XRT5      5        [        [	        U5      5      $ s  snf )a  Return the unique solutions of equations derived from
``expr`` by replacing ``t`` with ``+/- symbol``.

Parameters
==========

expr : Expr
    The expression which includes a dummy variable t to be
    replaced with +symbol and -symbol.

symbol : Symbol
    The symbol for which a solution is being sought.

Returns
=======

List of unique solution of the two equations generated by
replacing ``t`` with positive and negative ``symbol``.

Notes
=====

If ``expr = 2*log(t) + x/2` then solutions for
``2*log(x) + x/2 = 0`` and ``2*log(-x) + x/2 = 0`` are
returned by this function. Though this may seem
counter-intuitive, one must note that the ``expr`` being
solved here has been derived from a different expression. For
an expression like ``eq = x**2*g(x) = 1``, if we take the
log of both sides we obtain ``log(x**2) + log(g(x)) = 0``. If
x is positive then this simplifies to
``2*log(x) + log(g(x)) = 0``; the Lambert-solving routines will
return solutions for this, but we must also consider the
solutions for  ``2*log(-x) + log(g(x))`` since those must also
be a solution of ``eq`` which has the same value when the ``x``
in ``x**2`` is negated. If `g(x)` does not have even powers of
symbol then we do not want to replace the ``x`` there with
``-x``. So the role of the ``t`` in the expression received by
this function is to mark where ``+/-x`` should be inserted
before obtaining the Lambert solutions.

)rJ   r   )xreplace_solve_lambertrY   r   r   )exprrK   r!   sgnnlhsplhssolsr   s          r$   _solve_even_degree_expr/_solve_lambert.<locals>._solve_even_degree_expr   sh    V 7>?6=sMM1&j/*g?
dD1<KKtT:; DJ?s   A)Tr;   c                    > U R                   =(       a,    U R                  T:H  =(       a    U R                  R                  $ r(   )is_Powbaser   is_even)ir!   s    r$   r,    _solve_lambert.<locals>.<lambda>(  s(    ?QVVv-?!%%--?r.   c                 "   > TU R                   -  $ r(   )r   )r}   rK   s    r$   r,   r~   *  s    155r.   r   )force)deeprJ   z:%s does not appear to have a solution in terms of LambertW)rK   )r>   r+   r   r   rz   r   NotImplementedErrorr@   r?   r
   assumptions0replacer2   rM   r   ComplexInfinityNaNr   rp   r   r   r   r9   rm   r0   r   r   rB   r   r	   )r^   r!   r   rw   nrhsr5   rI   r7   lamcheckt_indept_term_rhsrZ   rr}   solnr[   r\   diffmainexpmaintermmainpowrK   s    ``                   @r$   rq   rq      sp   D4 l    5ID%C# BtHHc
*  &#''*>*> > tH B !##
zzSZZZ -,,-kk@ ::#''!**hhq!nG]F=D==TJJq00!%%88Fc$i 78.r1f==ZZCSXT2Cc(CwwqzzcjjY.r1f== llAv;'
&4(
)C 	ASWf%FA
**aX
C DCf-zzcQhC3s8 3V<!,',{{3'737'7!S%5%55 '737 "5zC,<<"3;/#cEk2BB#Jt$4f=D $CIv6D Cf-#w'CzzcQh
3s8c#h+> ?H!,;Ek55770022NH2IC8}s3x/
4 0&9 Cf-v!9!99#w'CzzcQh
3s8c#h+> ?H!,;Ek8}s3x/
4 0&9! # "##$ % 	% EB@37s   /VV2V?VVTfirstc          
        ^^ [        SSS9nU(       a  [        U TT5      nUR                  5       n [        5       n[        5       n[        [        U R	                  TUTU05      Xg5      XgSS9nU(       a2  UTUT0n	US   R                  U	5      US   R                  U	5      US   4$ g	U nUR                  5       n [        R                  " UR                  5       5      n
/ nU
 HL  n[        UR	                  TUT-  5      5      nUR                  nTU;   d  TU;   a    O#UR                  U5        MN     TT-  [        U6 U4$ UU4S
 jn/ nUR                  T5      nUR                  T5      U:X  a_  [        UR                  TU-  5      U5      n[        UR                  TU-  5      U5      nU" U TUUT-  -
  U-  5      nUb  UT-  UT-  -   X4$ / nUR                  T5      nUR                  T5      U:X  a  [        S5       Hu  n[        UR                  TU-  TU-  -  5      U5      n[        UR                  TU-  5      U5      nU" U TUUT-  -
  U-  T-  5      nUb  UT-  T-  UT-  -   X4s  $ TTsmmMw     g	g	)ao  Given an expression, f, 3 tests will be done to see what type
of composite bivariate it might be, options for u(x, y) are::

    x*y
    x+y
    x*y+x
    x*y+y

If it matches one of these types, ``u(x, y)``, ``P(u)`` and dummy
variable ``u`` will be returned. Solving ``P(u)`` for ``u`` and
equating the solutions to ``u(x, y)`` and then solving for ``x`` or
``y`` is equivalent to solving the original expression for ``x`` or
``y``. If ``x`` and ``y`` represent two functions in the same
variable, e.g. ``x = g(t)`` and ``y = h(t)``, then if ``u(x, y) - p``
can be solved for ``t`` then these represent the solutions to
``P(u) = 0`` when ``p`` are the solutions of ``P(u) = 0``.

Only positive values of ``u`` are considered.

Examples
========

>>> from sympy import solve
>>> from sympy.solvers.bivariate import bivariate_type
>>> from sympy.abc import x, y
>>> eq = (x**2 - 3).subs(x, x + y)
>>> bivariate_type(eq, x, y)
(x + y, _u**2 - 3, _u)
>>> uxy, pu, u = _
>>> usol = solve(pu, u); usol
[sqrt(3)]
>>> [solve(uxy - s) for s in solve(pu, u)]
[[{x: -y + sqrt(3)}]]
>>> all(eq.subs(s).equals(0) for sol in _ for s in sol)
True

rP   T)positiveFr   r   r      Nc                 p   > [        U R                  X5      5      nUR                  nTU;   d  TU;   a  S $ U$ r(   )r   rM   r   )r^   vrb   newfreer*   ys        r$   okbivariate_type.<locals>.ok  s7    qvva|$T	Q$Yt8S8r.   )r
   r   as_exprbivariate_typerM   rp   r   	make_argsr   r   appenddegreer   coeff_monomialrange)r^   r*   r   r   rP   ri   _x_yrvrepsrT   r   rF   r   r   r]   rG   itrys    ``               r$   r   r     s{   N 	cD!AAqMIIKWWDB2!7@"PUV2q>Da5>>$'A)=r!uDD	A			A ==%D
CQVVAqs^$~~9T	

1  sCIq  9 C	Axx{a!!!Q$'+!!!Q$'+AAaC{#?Q319c$$ C	Axx{a!HDQ%%ad1a4i0!4AQ%%ad+Q/AQA!GQ;q=)Cs1uqs{C**aDAq  r.   r(   )*sympy.core.addr   sympy.core.exprtoolsr   sympy.core.functionr   r   sympy.core.powerr   sympy.core.singletonr   sympy.core.sortingr	   sympy.core.symbolr
   &sympy.functions.elementary.exponentialr   r   r   (sympy.functions.elementary.miscellaneousr   sympy.polys.polyrootsr   sympy.polys.polytoolsr   r   sympy.simplify.simplifyr   sympy.simplify.radsimpr   r   sympy.solvers.solversr   r   sympy.utilities.iterablesr   r%   r9   rA   rm   rq   r    r.   r$   <module>r      sb     - 4   " & # G G 9 ' . 0 * + 0 *8"J"JEP]@ &* \r.   