
    wgc!                         d Z ddlmZmZmZmZ ddlmZmZm	Z	m
Z
 ddlmZmZ ddlmZmZ ddlmZmZ ddlmZ ddlmZmZmZ ed	        Zed
        Zed        Ze ed      fd       Zedd       Zy)z/High-level polynomials manipulation functions.     )SBasicsymbolsDummy)PolificationFailedComputationFailedMultivariatePolynomialErrorOptionError)allowed_flagsbuild_options)poly_from_exprPoly)symmetric_polyinterpolating_poly)sring)numbered_symbolstakepublicc                    t        |ddg       d}t        | d      sd}| g} t        | g|i |\  }} |j                  }t	        ||      }|j                  }t        t        |            D cg c]  }t        |       }}g }| D ]C  }	|	j                         \  }
}}|j                   |
j                  |  |j                  | f       E t        |      D cg c]  \  }\  }}||j                         f }}}}|j                  s,t        |      D ]  \  }\  }}|j                  |      |f||<     |s|\  }|j                  s|S |r||fS ||fz   S c c}w c c}}}w )a  
    Rewrite a polynomial in terms of elementary symmetric polynomials.

    A symmetric polynomial is a multivariate polynomial that remains invariant
    under any variable permutation, i.e., if `f = f(x_1, x_2, \dots, x_n)`,
    then `f = f(x_{i_1}, x_{i_2}, \dots, x_{i_n})`, where
    `(i_1, i_2, \dots, i_n)` is a permutation of `(1, 2, \dots, n)` (an
    element of the group `S_n`).

    Returns a tuple of symmetric polynomials ``(f1, f2, ..., fn)`` such that
    ``f = f1 + f2 + ... + fn``.

    Examples
    ========

    >>> from sympy.polys.polyfuncs import symmetrize
    >>> from sympy.abc import x, y

    >>> symmetrize(x**2 + y**2)
    (-2*x*y + (x + y)**2, 0)

    >>> symmetrize(x**2 + y**2, formal=True)
    (s1**2 - 2*s2, 0, [(s1, x + y), (s2, x*y)])

    >>> symmetrize(x**2 - y**2)
    (-2*x*y + (x + y)**2, -2*y**2)

    >>> symmetrize(x**2 - y**2, formal=True)
    (s1**2 - 2*s2, -2*y**2, [(s1, x + y), (s2, x*y)])

    formalr   T__iter__F)r   hasattrr   r   r   rangelennext
symmetrizeappendas_exprzipr   	enumeratesubs)FgensargsiterableRoptr   iresultfprms_gpolyssymnon_syms                      Z/home/mcse/projects/flask/flask-venv/lib/python3.12/site-packages/sympy/polys/polyfuncs.pyr   r      sy   B $9-.H1j!C"T"T"DAq99D
d
#CkkG&+CI&67tG}7G7F ?,,.1ayqyy'*IAIIt,<=>? 037A??)!Vaa?E?::!*6!2 	3A~W%'2F1I	3 ::5= UH$$/ 8 @s   .EEc                    t        |g        	 t        | g|i |\  }}t        j
                  |j                  }}|j                  r|j                         D ]
  }||z  |z   } |S t        ||      |dd }}|j                         D ]  }||z  t        |g|i |z   } |S # t        $ r}|j                  cY d}~S d}~ww xY w)a  
    Rewrite a polynomial in Horner form.

    Among other applications, evaluation of a polynomial at a point is optimal
    when it is applied using the Horner scheme ([1]).

    Examples
    ========

    >>> from sympy.polys.polyfuncs import horner
    >>> from sympy.abc import x, y, a, b, c, d, e

    >>> horner(9*x**4 + 8*x**3 + 7*x**2 + 6*x + 5)
    x*(x*(x*(9*x + 8) + 7) + 6) + 5

    >>> horner(a*x**4 + b*x**3 + c*x**2 + d*x + e)
    e + x*(d + x*(c + x*(a*x + b)))

    >>> f = 4*x**2*y**2 + 2*x**2*y + 2*x*y**2 + x*y

    >>> horner(f, wrt=x)
    x*(x*y*(4*y + 2) + y*(2*y + 1))

    >>> horner(f, wrt=y)
    y*(x*y*(4*x + 2) + x*(2*x + 1))

    References
    ==========
    [1] - https://en.wikipedia.org/wiki/Horner_scheme

    N   )r   r   r   exprr   Zerogenis_univariate
all_coeffsr   horner)	r*   r#   r$   r"   r'   excformr9   coeffs	            r4   r<   r<   W   s    B $1D1D13 #D\\^ 	$E8e#D	$ K q#,QR4\\^ 	;E8fU:T:T::D	; K  xxs   B$ $	C-B>8C>Cc                    t        |       }t        | t              r5|| v rt        | |         S t	        t        | j                                \  }}nt        | d   t              r5t	        t        |        \  }}||v rbt        ||j                  |               S |t        d|dz         v rt        | |dz
           S t	        |       }t	        t        d|dz               }	 t        ||||      j                         S # t        $ r9 t               }t        ||||      j                         j                  ||      cY S w xY w)a)  
    Construct an interpolating polynomial for the data points
    evaluated at point x (which can be symbolic or numeric).

    Examples
    ========

    >>> from sympy.polys.polyfuncs import interpolate
    >>> from sympy.abc import a, b, x

    A list is interpreted as though it were paired with a range starting
    from 1:

    >>> interpolate([1, 4, 9, 16], x)
    x**2

    This can be made explicit by giving a list of coordinates:

    >>> interpolate([(1, 1), (2, 4), (3, 9)], x)
    x**2

    The (x, y) coordinates can also be given as keys and values of a
    dictionary (and the points need not be equispaced):

    >>> interpolate([(-1, 2), (1, 2), (2, 5)], x)
    x**2 + 1
    >>> interpolate({-1: 2, 1: 2, 2: 5}, x)
    x**2 + 1

    If the interpolation is going to be used only once then the
    value of interest can be passed instead of passing a symbol:

    >>> interpolate([1, 4, 9], 5)
    25

    Symbolic coordinates are also supported:

    >>> [(i,interpolate((a, b), i)) for i in range(1, 4)]
    [(1, a), (2, b), (3, -a + 2*b)]
    r   r6   )r   
isinstancedictr   listr   itemstupleindexr   r   expand
ValueErrorr   r!   )dataxnXYds         r4   interpolaterO      s$   T 	D	A$9T!W:C&'1d1gu%T
#DAqAv1771:''E!QUO#a!e~%T
AU1a!e_%AB!!Q1-4466 BG!!Q1-446;;AqAABs   C; ;?D=<D=rJ   c                 p  
 ddl m} t        t        |        \  }}t	        |      z
  dz
  }|dk  rt        d       ||z   dz   |z   dz         }t        t        |            D ]-  }t        |z   dz         D ]  }	||	|f   ||	   z  ||	|dz   f<    / t        |dz         D ]7  }t        |z   dz         D ]!  }	||	||z
  f    ||	   z  ||	|z   dz   |z
  f<   # 9 |j                         d   
t        
fdt        dz         D              t        
fdt        |dz         D              z  S )a  
    Returns a rational interpolation, where the data points are element of
    any integral domain.

    The first argument  contains the data (as a list of coordinates). The
    ``degnum`` argument is the degree in the numerator of the rational
    function. Setting it too high will decrease the maximal degree in the
    denominator for the same amount of data.

    Examples
    ========

    >>> from sympy.polys.polyfuncs import rational_interpolate

    >>> data = [(1, -210), (2, -35), (3, 105), (4, 231), (5, 350), (6, 465)]
    >>> rational_interpolate(data, 2)
    (105*x**2 - 525)/(x + 1)

    Values do not need to be integers:

    >>> from sympy import sympify
    >>> x = [1, 2, 3, 4, 5, 6]
    >>> y = sympify("[-1, 0, 2, 22/5, 7, 68/7]")
    >>> rational_interpolate(zip(x, y), 2)
    (3*x**2 - 7*x + 2)/(x + 1)

    The symbol for the variable can be changed if needed:
    >>> from sympy import symbols
    >>> z = symbols('z')
    >>> rational_interpolate(data, 2, X=z)
    (105*z**2 - 525)/(z + 1)

    References
    ==========

    .. [1] Algorithm is adapted from:
           http://axiom-wiki.newsynthesis.org/RationalInterpolation

    r   )onesr6   z'Too few values for the required degree.   c              3   4   K   | ]  }|   |z  z    y wN ).0r(   rL   r,   s     r4   	<genexpr>z'rational_interpolate.<locals>.<genexpr>  s     7!q!t7s   c              3   @   K   | ]  }|z   d z      |z  z    yw)r6   NrU   )rV   r(   rL   degnumr,   s     r4   rW   z'rational_interpolate.<locals>.<genexpr>  s'     Aq!AJN#ad*As   )
sympy.matrices.denserQ   rC   r   r   r
   r   max	nullspacesum)rI   rY   rL   rQ   xdataydatakcjr(   r,   s    ``       @r4   rational_interpolaterc      sh   R *T
#LE5E
VaA1uCDDVaZ!^VaZ!^,A3vq>" +vzA~& 	+AAqD'%(*AaQhK	++ 1q5\ =vzA~& 	=A()!QU(|E!H'<Aa!a!##$	== 	
aA7U6A:%677AE!a%LAAB C    Nc                 r   t        |g        t        |t              r|f|z   d}}	 t        | g|i |\  } }| j                  rt        d      | j                         }|dk  rt        d      |t        dd      }t        ||      }|t        |      k7  rt        d|d	t        |            | j                         | j                         }}g d
}
}	t        |dd       D ]2  \  }}t!        |dz   |      }|
||z  z  }|	j#                  ||f       |
 }
4 |	S # t        $ r}t        dd|      d}~ww xY w)a#  
    Generate Viete's formulas for ``f``.

    Examples
    ========

    >>> from sympy.polys.polyfuncs import viete
    >>> from sympy import symbols

    >>> x, a, b, c, r1, r2 = symbols('x,a:c,r1:3')

    >>> viete(a*x**2 + b*x + c, [r1, r2], x)
    [(r1 + r2, -b/a), (r1*r2, c/a)]

    Nvieter6   z(multivariate polynomials are not allowedz8Cannot derive Viete's formulas for a constant polynomialr,   )startz	required z roots, got )r   rA   r   r   r   r   is_multivariater	   degreerH   r   r   r   LCr;   r    r   r   )r*   rootsr#   r$   r'   r=   rK   lccoeffsr)   signr(   r?   polys                 r4   rf   rf     sZ   " $%hote11D1D13 	)68 	8 	

A1uFH 	H } A.NECJ3u:FGGBrDFfQRj) 5a!eU+eBhtUm$u	 M=  1C001s   D 	D6$D11D6rT   )__doc__
sympy.corer   r   r   r   sympy.polys.polyerrorsr   r   r	   r
   sympy.polys.polyoptionsr   r   sympy.polys.polytoolsr   r   sympy.polys.specialpolysr   r   sympy.polys.ringsr   sympy.utilitiesr   r   r   r   r<   rO   rc   rf   rU   rd   r4   <module>ry      s    5 0 /. . A 6( # : :D% D%N 2 2j >B >BB )0 8C 8Cv 5 5rd   