
    wgE                        d dl mZ d dlmZ d dlmZmZ d dlmZ d dl	m
Z
 d dlmZ d dlmZ d dlmZ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 d dlmZ d dlmZ d dlm Z m!Z! d dl"m#Z# d Z$ddZ%d Z&d Z'd Z(dddZ)y)    )Add)factor_terms)
expand_log_mexpand)Pow)S)ordered)Dummy)LambertWexplog)root)roots)Polyfactor)separatevars)collect)powsimp)solve_invert)uniqc                 
   | j                   D ch c]  }||j                  v s| }}t        |      D ]G  }d|z  }||v s||v s|j                         d   t        j
                  ur|}|j                  |       I |S c c}w )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        \/home/mcse/projects/flask/flask-venv/lib/python3.12/site-packages/sympy/solvers/bivariate.py_filtered_gensr%      s    $ yy=!Fann$<A=D=$Z qS9t  "1%QUU2KKN K >s
   B B Nc                 ,   | j                        D cg c]=  }|r7|j                  r||j                  v s|j                  s|j                  |      r|? }}t	        |      dk(  r|d   S |r"t        t        t        |            fd      S yc c}w )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                 &    | j                        S N)count)xfuncs    r$   <lambda>z_mostfunc.<locals>.<lambda>P   s         )keyN)atoms	is_Symbolr   haslenmaxr   r	   )lhsr+   Xtmpftermss    `   r$   	_mostfuncr8   /   s    6 !YYt_ )cQ	S---KKCGGAJ  )F ) 6{aay	4(.EFF)s   ABc                 `   t        | j                               } | j                  |      \  }}| j                  r'|j                  rt        ||      \  }}}||z  ||z  |fS | j                  sd}||}}n!|}t        |      j                  |d      \  }}|j                         r| }| }|||fS )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$   r@   r@   T   s    ( szz|
$C!!&)HC
zzcjjf%1a1uc!eQ::C1C //u/E1!!#BBa7Nr-   c                 <   t        t        |             } t        | t        |      }|sg S | j	                  |d      }t        | t              rY| |z
  j	                  ||j                  d         } |j                  d   }t        |t              sg S | j                  d    }| |z  } ||j                  vrg S t        ||      \  }}}t        | |z
  |      }|j                  |      }|||j                  v rg S |j                  d   }	t        |	|      \  }
}}||k7  rg S t        d      t        |z
  |      }ddg}g }||z  |
|z  z
  |z  |
z  j                         \  }}|j                         \  }}t        ||z        }t        d      }t!        ||z  |z
  |      j#                         D cg c]  }|||
z  z  |z   }}|D ]N  }|D ]G  }t%        ||      }|r|j&                  s| |
z  ||z  |z  z   |j)                  fd|D               I P |S c c}w )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   B   K   | ]  }|j                          y wr(   )subs).0xurH   us     r$   	<genexpr>z_lambert.<locals>.<genexpr>   s     92rwwq#9s   )r   r   r8   r   rL   
isinstanceargsr   r@   r   as_coefficientr
   r   r   as_coeff_Mulr   r   keysr   is_realextend)eqr*   mainlogotherdfX2logtermrE   logargrF   cX1xusolnslambert_real_branchessolnumdenperJ   rR   rB   kwrH   rO   s                            @@r$   _lambertrk   y   s@    
*R.	!BC#G	GGGQE5&#5jwQ8,,q/'3'I&q!!
e"""	eQHAq"b5j'*Gw'AyA'	\\!_Ffa HAq"	Rx	 	eABFAG  G
C 1QqS!A--/HCFAsCGAc
A$QTAXq16689!AqsGAI9D9  :& 	:Aa A"Q$!A#q.CJJ999	:: J :s   0Hc                 	   fd}| j                  d      \  }}| }D cg c]@  }|j                  t        t        fv s$|j                  r|j                  j
                  v r|B }}|s
t               |j                  s|j                  r:t        di j                  |j                  fdfd      }|j                  r|j                        r|j                  d      }	||	z
  }
||	z
  }|
j                  s|r|
j                  t        j                  t        j                         st#        t        |
      t        |      z
        } ||      S |j                  rO|rMt#        t        |      d      }t        |      }|j                        r|j                  r||z
  } ||      S |j%                  i      }t'        t)        |d            }t               }t+        ||z
        \  }}|j%                  ||i      }g }|st-        |t              }|r|j                  r'|dk7  r"t/        t        |      t        |      z
        }n|j                  r|j                  |d      }|r|j                  s|j1                  t2              D cg c]  }|j
                  v r| c}rP|st        |      t        ||z
        z
  }nt        ||z
        t        ||z
        z
  }t/        t#        |            }nt/        ||z
        }|st-        |t              }|rt5        ||      }|j                  r0|dk7  r+t/        t#        t        |      t        |      z
              }n~|j                  rr|j                  |d      }||z
  }||z
  }|j7                         r|j7                         r
|d	z  }|d	z  }t        |      t        |      z
  }t/        t#        |            }|st-        |t2              }|r|j                  j
                  v rt5        ||      }|j                  r0|dk7  r+t/        t#        t        |      t        |      z
              }nT|j                  rH|j                  |d      }||z
  }||z
  }t        |      t        |      z
  }t/        t#        |            }|st        d
| z        t9        t;        |            S c c}w c c}w )a  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                     dD cg c]  }| j                  |||z  i       c}\  }}t        ||      }||k7  r|j                  t        ||             t        t	        |            S c c}w )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.

        )rI   r   )xreplace_solve_lambertrW   r   r   )exprrJ   r!   sgnnlhsplhssolsr   s          r$   _solve_even_degree_exprz/_solve_lambert.<locals>._solve_even_degree_expr   sp    V 7>?/2DMM1c&j/*?
ddFD14<KKtVT:; DJ?s   A+Tr:   c                 n    | j                   xr' | j                  k(  xr | j                  j                  S r(   )is_Powbaser   is_even)ir!   s    r$   r,   z _solve_lambert.<locals>.<lambda>(  s*    ?QVVv-?!%%-- r-   c                 "    | j                   z  S r(   )r   )rz   rJ   s    r$   r,   z _solve_lambert.<locals>.<lambda>*  s    155 r-   r   )force)deeprI   z:%s does not appear to have a solution in terms of LambertW)rJ   )r=   r+   r   r   rw   r   NotImplementedErrorr?   r>   r
   assumptions0replacer1   rL   r   ComplexInfinityNaNr   rn   r   r   r   r8   rk   r/   r   r   rA   r   r	   )r\   r!   r   ru   nrhsr4   rH   r6   lamcheckt_indept_term_rhsrX   rrz   solnrY   rZ   diffmainexpmaintermmainpowrJ   s    ``                   @r$   ro   ro      sg   D4 l    5ID#%C# BHHc
*#''*>*> >  BH B !##
zzSZZ -,,-kk@ ::#''!*hhq!nG7]F=D==TJJq00!%%8Fc$i 78.r1f==ZZCSXT2Cc(Cwwqzcjj3Y.r1f== llAv;'
&4(
)C 	AS1Wf%FAs
**aX
C DCf-zzcQhC3s8 3V<!,',{{3'737 #!S%5%55 37 "5zC,<<"3;/#cEk2BB#Jt$4f=D $C#Iv6D Cf-#w'CzzcQh
3s8c#h+> ?H!,;Ek55700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   AS S%Tfirstc          
         t        dd      }|rt        |       }|j                         } t               }t               }t        t        | j	                  ||i      ||      ||d      }|r2||i}	|d   j                  |	      |d   j                  |	      |d   fS y	| }|j                         } t        j                  |j                               }
g }|
D ]G  }t        |j	                  |z              }|j                  }|v s|v r n!|j                  |       I z  t        | |fS fd
}g }|j                        }|j                        |k(  r_t        |j                  |z        |      }t        |j                  |z        |      } || ||z  z
  |z        }||z  |z  z   ||fS g }|j                        }|j                        |k(  rt        d      D ]t  }t        |j                  |z  |z  z        |      }t        |j                  |z        |      } || ||z  z
  |z  z        }||z  z  |z  z   ||fc S cv y	y	)a  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

    rO   T)positiveFr   r   r      Nc                 j    t        | j                  ||            }|j                  }|v s|v rd S |S r(   )r   rL   r   )r\   vr`   newfreer*   ys        r$   okzbivariate_type.<locals>.ok  s9    qvva|$T	Q$Yt8S8r-   )r
   r   as_exprbivariate_typerL   rn   r   	make_argsr   r   appenddegreer   coeff_monomialrange)r\   r*   r   r   rO   rg   _x_yrvrepsrR   r   rE   r   r   r[   rF   itrys    ``               r$   r   r     s   N 	cD!AAqMIIKWWDB2!7R@"bPU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9c1$$ C	Axx{a!H 	D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%   r8   r@   rk   ro   r    r-   r$   <module>r      sb     - 4   " & # G G 9 ' . 0 * + 0 *8"J"JEP]@ &* \r-   