
    \hc!                         S r SSKJrJrJrJr  SSKJrJrJ	r	J
r
  SSKJrJr  SSKJrJr  SSKJrJr  SSKJr  SSKJrJrJr  \S	 5       r\S
 5       r\S 5       r\\" S5      4S j5       r\SS j5       rg)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                     [        USS/5        Sn[        U S5      (       d  SnU /n [        U /UQ70 UD6u  p@UR                  n[	        X5      nUR                  n[        [        U5      5       Vs/ s H  n[        U5      PM     nn/ nU  HC  n	U	R                  5       u  pnUR                  U
R                  " U6 UR                  " U6 45        ME     [        UW5       VVVs/ s H  u  nu  pXR                  5       4PM     nnnnUR                  (       d-  [        U5       H  u  nu  nnUR                  U5      U4X'   M      U(       d  Uu  nUR                  (       d  U$ U(       a  UU4$ UU4-   $ s  snf s  snnnf )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                      M/var/www/auris/envauris/lib/python3.13/site-packages/sympy/polys/polyfuncs.pyr   r      sc   B $9-.H1j!!C"T"T"DA99D

#CkkG&+CI&67&6tG}&6G7F,,.aqyy'*AIIt,<=>  037A?)!VaaE?::!*6!2A~W%'2FI "3 ::5= UH$$/ 8 @s   1E4# E9c                    [        U/ 5         [        U /UQ70 UD6u  p4[        R
                  UR                  pvUR                  (       a   UR                  5        H
  nXg-  U-   nM     U$ [        X75      USS pUR                  5        H  nXg-  [        U/UQ70 UD6-   nM     U$ ! [         a  nUR                  s SnA$ SnAff = f)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 #\\^E8e#D $ K q,QR4\\^E8fU:T:T::D $ K  xxs   B' '
C1C<CCc                    [        U 5      n[        U [        5      (       a4  X;   a  [        X   5      $ [	        [        U R                  5       6 5      u  p4O[        U S   [        5      (       a5  [	        [        U 6 5      u  p4X;   a  [        XCR                  U5         5      $ OFU[        SUS-   5      ;   a  [        XS-
     5      $ [	        U 5      n[	        [        SUS-   5      5      n [        X!X45      R                  5       $ ! [         a6    [        5       n[        X%X45      R                  5       R                  XQ5      s $ f = f)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TW:C&'1d1gu%%T
#DAv771:''  E!QUO#!e~%T
AU1a!e_%AB!!-4466 BG!!-446;;AAABs   )D =EErJ   c                 v  ^^^
 SSK Jn  [        [        U 6 5      u  pE[	        U5      T-
  S-
  nUS:  a  [        S5      eU" TU-   S-   TU-   S-   5      n[        [        TU5      5       H-  n[        TU-   S-   5       H  n	XyU4   XI   -  XyUS-   4'   M     M/     [        US-   5       H6  n[        TU-   S-   5       H  n	XyXh-
  4   * XY   -  XyTU-   S-   U-
  4'   M      M8     UR                  5       S   m
[        UU
4S j[        TS-   5       5       5      [        UUU
4S j[        US-   5       5       5      -  $ )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   :   >#    U  H  nTU   TU-  -  v   M     g 7fN ).0r(   rL   r,   s     r4   	<genexpr>'rational_interpolate.<locals>.<genexpr>  s     7%6!q!t%6s   c              3   F   >#    U  H  nTUT-   S -      TU-  -  v   M     g7f)r6   NrU   )rV   r(   rL   degnumr,   s     r4   rW   rX     s'     ALq!AJN#ad*Ls   !)
sympy.matrices.denserQ   rC   r   r   r
   r   max	nullspacesum)rI   rZ   rL   rQ   xdataydatakcjr(   r,   s    ``       @r4   rational_interpolaterd      sD   R *T
#LEE
VaA1uCDDVaZ!^VaZ!^,A3vq>"vzA~&AqD'%(*AQhK ' # 1q5\vzA~&A()QU(|EH'<A!a!##$ '  	
aA7U6A:%677AE!a%LAAB C    Nc                    [        U/ 5        [        U[        5      (       a  U4U-   Sp [        U /UQ70 UD6u  pU R                  (       a  [        S5      eU R                  5       nUS:  a  [        S5      eUc
  [        SSS9n[        X5      nU[        U5      :w  a  [        SU< S	[        U5      < 35      eU R                  5       U R                  5       p/ S
p[        USS 5       H0  u  p[!        US-   U5      nXU-  -  nU	R#                  X45        U
* n
M2     U	$ ! [         a  n[        SSU5      eSnAff = f)z
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   rg   rg     sH   " $%hote11D1D1 	)68 	8 	

A1uFH 	H } A.NECJ3u:FGGrDfQRj)a!eU+Bhtm$u	 * M=  1C001s   D! !
D=+D88D=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   rd   rg   rU   re   r4   <module>rz      s    5 0 /. . A 6( # : :D% D%N 2 2j >B >BB )0 8C 8Cv 5 5re   