B
    dd<                 @   sT  d Z ddlmZmZmZmZmZmZmZm	Z	m
Z
mZmZmZmZ ddlmZmZ dd Zdd Zdd	 Zd
d Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zd d! Z d"d# Z!d$d% Z"d&d' Z#d(d) Z$d*d+ Z%d,d- Z&d.d/ Z'd0d1 Z(d2d3 Z)d4d5 Z*d6d7 Z+d8d9 Z,d:d; Z-d<d= Z.d>d? Z/d@dA Z0dBdC Z1dDdE Z2dFdG Z3dHdI Z4dJdK Z5dLdM Z6dNdO Z7dPdQ Z8dRdS Z9dTdU Z:dVdW Z;dXdY Z<dZd[ Z=d\d] Z>d^d_ Z?d`da Z@dbdc ZAddde ZBdfdg ZCdhdi ZDdjdk ZEdldm ZFdndo ZGdpdq ZHdrds ZIdtdu ZJdvdw ZKdxdy ZLdzd{ ZMd|d} ZNd~d ZOdd ZPdd ZQdS )zEArithmetics for dense recursive polynomials in ``K[x]`` or ``K[X]``.     )	dup_slicedup_LCdmp_LC
dup_degree
dmp_degree	dup_strip	dmp_strip
dmp_zero_pdmp_zero	dmp_one_pdmp_one
dmp_ground	dmp_zeros)ExactQuotientFailedPolynomialDivisionFailedc             C   s   |s| S t | }|| d }||d krFt| d | g| dd  S ||krh|g|jg||   |  S | d| | | | g | |d d  S dS )z
    Add ``c*x**i`` to ``f`` in ``K[x]``.

    Examples
    ========

    >>> from sympy.polys import ring, ZZ
    >>> R, x = ring("x", ZZ)

    >>> R.dup_add_term(x**2 - 1, ZZ(2), 4)
    2*x**4 + x**2 - 1

       r   N)lenr   zero)fciKnm r   c/work/yifan.wang/ringdown/master-ringdown-env/lib/python3.7/site-packages/sympy/polys/densearith.pydup_add_term   s    r   c             C   s   |st | |||S |d }t||r(| S t| }|| d }||d krntt| d |||g| dd  |S ||kr|gt|| || |  S | d| t| | |||g | |d d  S dS )z
    Add ``c(x_2..x_u)*x_0**i`` to ``f`` in ``K[X]``.

    Examples
    ========

    >>> from sympy.polys import ring, ZZ
    >>> R, x,y = ring("x,y", ZZ)

    >>> R.dmp_add_term(x*y + 1, 2, 2)
    2*x**2 + x*y + 1

    r   r   N)r   r	   r   r   dmp_addr   )r   r   r   ur   vr   r   r   r   r   dmp_add_term+   s    
&r    c             C   s   |s| S t | }|| d }||d krFt| d | g| dd  S ||krj| g|jg||   |  S | d| | | | g | |d d  S dS )z
    Subtract ``c*x**i`` from ``f`` in ``K[x]``.

    Examples
    ========

    >>> from sympy.polys import ring, ZZ
    >>> R, x = ring("x", ZZ)

    >>> R.dup_sub_term(2*x**4 + x**2 - 1, ZZ(2), 4)
    x**2 - 1

    r   r   N)r   r   r   )r   r   r   r   r   r   r   r   r   dup_sub_termM   s    r!   c             C   s   |st | | ||S |d }t||r*| S t| }|| d }||d krptt| d |||g| dd  |S ||krt|||gt|| || |  S | d| t| | |||g | |d d  S dS )z
    Subtract ``c(x_2..x_u)*x_0**i`` from ``f`` in ``K[X]``.

    Examples
    ========

    >>> from sympy.polys import ring, ZZ
    >>> R, x,y = ring("x,y", ZZ)

    >>> R.dmp_sub_term(2*x**2 + x*y + 1, 2, 2)
    x*y + 1

    r   r   N)r   r	   r   r   dmp_subdmp_negr   )r   r   r   r   r   r   r   r   r   r   r   dmp_sub_termj   s    
&"r$   c                s.    r| sg S  fdd| D |j g|  S dS )z
    Multiply ``f`` by ``c*x**i`` in ``K[x]``.

    Examples
    ========

    >>> from sympy.polys import ring, ZZ
    >>> R, x = ring("x", ZZ)

    >>> R.dup_mul_term(x**2 - 1, ZZ(3), 2)
    3*x**4 - 3*x**2

    c                s   g | ]}|  qS r   r   ).0cf)r   r   r   
<listcomp>   s    z dup_mul_term.<locals>.<listcomp>N)r   )r   r   r   r   r   )r   r   dup_mul_term   s    r(   c                s`   |st | | S |d t| |r(| S tr:t|S  fdd| D t|  S dS )z
    Multiply ``f`` by ``c(x_2..x_u)*x_0**i`` in ``K[X]``.

    Examples
    ========

    >>> from sympy.polys import ring, ZZ
    >>> R, x,y = ring("x,y", ZZ)

    >>> R.dmp_mul_term(x**2*y + x, 3*y, 2)
    3*x**4*y**2 + 3*x**3*y

    r   c                s   g | ]}t | qS r   )dmp_mul)r%   r&   )r   r   r   r   r   r'      s    z dmp_mul_term.<locals>.<listcomp>N)r(   r	   r
   r   )r   r   r   r   r   r   )r   r   r   r   dmp_mul_term   s    

r*   c             C   s   t | |d|S )z
    Add an element of the ground domain to ``f``.

    Examples
    ========

    >>> from sympy.polys import ring, ZZ
    >>> R, x = ring("x", ZZ)

    >>> R.dup_add_ground(x**3 + 2*x**2 + 3*x + 4, ZZ(4))
    x**3 + 2*x**2 + 3*x + 8

    r   )r   )r   r   r   r   r   r   dup_add_ground   s    r+   c             C   s   t | t||d d||S )z
    Add an element of the ground domain to ``f``.

    Examples
    ========

    >>> from sympy.polys import ring, ZZ
    >>> R, x,y = ring("x,y", ZZ)

    >>> R.dmp_add_ground(x**3 + 2*x**2 + 3*x + 4, ZZ(4))
    x**3 + 2*x**2 + 3*x + 8

    r   r   )r    r   )r   r   r   r   r   r   r   dmp_add_ground   s    r,   c             C   s   t | |d|S )z
    Subtract an element of the ground domain from ``f``.

    Examples
    ========

    >>> from sympy.polys import ring, ZZ
    >>> R, x = ring("x", ZZ)

    >>> R.dup_sub_ground(x**3 + 2*x**2 + 3*x + 4, ZZ(4))
    x**3 + 2*x**2 + 3*x

    r   )r!   )r   r   r   r   r   r   dup_sub_ground   s    r-   c             C   s   t | t||d d||S )z
    Subtract an element of the ground domain from ``f``.

    Examples
    ========

    >>> from sympy.polys import ring, ZZ
    >>> R, x,y = ring("x,y", ZZ)

    >>> R.dmp_sub_ground(x**3 + 2*x**2 + 3*x + 4, ZZ(4))
    x**3 + 2*x**2 + 3*x

    r   r   )r$   r   )r   r   r   r   r   r   r   dmp_sub_ground   s    r.   c                s"    r| sg S  fdd| D S dS )z
    Multiply ``f`` by a constant value in ``K[x]``.

    Examples
    ========

    >>> from sympy.polys import ring, ZZ
    >>> R, x = ring("x", ZZ)

    >>> R.dup_mul_ground(x**2 + 2*x - 1, ZZ(3))
    3*x**2 + 6*x - 3

    c                s   g | ]}|  qS r   r   )r%   r&   )r   r   r   r'     s    z"dup_mul_ground.<locals>.<listcomp>Nr   )r   r   r   r   )r   r   dup_mul_ground   s    r/   c                s.   |st |  S |d  fdd| D S )z
    Multiply ``f`` by a constant value in ``K[X]``.

    Examples
    ========

    >>> from sympy.polys import ring, ZZ
    >>> R, x,y = ring("x,y", ZZ)

    >>> R.dmp_mul_ground(2*x + 2*y, ZZ(3))
    6*x + 6*y

    r   c                s   g | ]}t | qS r   )dmp_mul_ground)r%   r&   )r   r   r   r   r   r'   &  s    z"dmp_mul_ground.<locals>.<listcomp>)r/   )r   r   r   r   r   )r   r   r   r   r0     s    r0   c                sD   st d| s| S  jr. fdd| D S fdd| D S dS )a)  
    Quotient by a constant in ``K[x]``.

    Examples
    ========

    >>> from sympy.polys import ring, ZZ, QQ

    >>> R, x = ring("x", ZZ)
    >>> R.dup_quo_ground(3*x**2 + 2, ZZ(2))
    x**2 + 1

    >>> R, x = ring("x", QQ)
    >>> R.dup_quo_ground(3*x**2 + 2, QQ(2))
    3/2*x**2 + 1

    zpolynomial divisionc                s   g | ]}  |qS r   )Zquo)r%   r&   )r   r   r   r   r'   A  s    z"dup_quo_ground.<locals>.<listcomp>c                s   g | ]}|  qS r   r   )r%   r&   )r   r   r   r'   C  s    N)ZeroDivisionErroris_Field)r   r   r   r   )r   r   r   dup_quo_ground)  s    r3   c                s.   |st |  S |d  fdd| D S )a=  
    Quotient by a constant in ``K[X]``.

    Examples
    ========

    >>> from sympy.polys import ring, ZZ, QQ

    >>> R, x,y = ring("x,y", ZZ)
    >>> R.dmp_quo_ground(2*x**2*y + 3*x, ZZ(2))
    x**2*y + x

    >>> R, x,y = ring("x,y", QQ)
    >>> R.dmp_quo_ground(2*x**2*y + 3*x, QQ(2))
    x**2*y + 3/2*x

    r   c                s   g | ]}t | qS r   )dmp_quo_ground)r%   r&   )r   r   r   r   r   r'   ]  s    z"dmp_quo_ground.<locals>.<listcomp>)r3   )r   r   r   r   r   )r   r   r   r   r4   F  s    r4   c                s(   st d| s| S  fdd| D S )z
    Exact quotient by a constant in ``K[x]``.

    Examples
    ========

    >>> from sympy.polys import ring, QQ
    >>> R, x = ring("x", QQ)

    >>> R.dup_exquo_ground(x**2 + 2, QQ(2))
    1/2*x**2 + 1

    zpolynomial divisionc                s   g | ]}  |qS r   )exquo)r%   r&   )r   r   r   r   r'   s  s    z$dup_exquo_ground.<locals>.<listcomp>)r1   )r   r   r   r   )r   r   r   dup_exquo_ground`  s
    r6   c                s.   |st |  S |d  fdd| D S )z
    Exact quotient by a constant in ``K[X]``.

    Examples
    ========

    >>> from sympy.polys import ring, QQ
    >>> R, x,y = ring("x,y", QQ)

    >>> R.dmp_exquo_ground(x**2*y + 2*x, QQ(2))
    1/2*x**2*y + x

    r   c                s   g | ]}t | qS r   )dmp_exquo_ground)r%   r&   )r   r   r   r   r   r'     s    z$dmp_exquo_ground.<locals>.<listcomp>)r6   )r   r   r   r   r   )r   r   r   r   r7   v  s    r7   c             C   s   | s| S | |j g|  S dS )z
    Efficiently multiply ``f`` by ``x**n`` in ``K[x]``.

    Examples
    ========

    >>> from sympy.polys import ring, ZZ
    >>> R, x = ring("x", ZZ)

    >>> R.dup_lshift(x**2 + 1, 2)
    x**4 + x**2

    N)r   )r   r   r   r   r   r   
dup_lshift  s    r8   c             C   s   | d|  S )a  
    Efficiently divide ``f`` by ``x**n`` in ``K[x]``.

    Examples
    ========

    >>> from sympy.polys import ring, ZZ
    >>> R, x = ring("x", ZZ)

    >>> R.dup_rshift(x**4 + x**2, 2)
    x**2 + 1
    >>> R.dup_rshift(x**4 + x**2 + 2, 2)
    x**2 + 1

    Nr   )r   r   r   r   r   r   
dup_rshift  s    r9   c                s    fdd| D S )z
    Make all coefficients positive in ``K[x]``.

    Examples
    ========

    >>> from sympy.polys import ring, ZZ
    >>> R, x = ring("x", ZZ)

    >>> R.dup_abs(x**2 - 1)
    x**2 + 1

    c                s   g | ]}  |qS r   )abs)r%   coeff)r   r   r   r'     s    zdup_abs.<locals>.<listcomp>r   )r   r   r   )r   r   dup_abs  s    r<   c                s*   |st |  S |d  fdd| D S )z
    Make all coefficients positive in ``K[X]``.

    Examples
    ========

    >>> from sympy.polys import ring, ZZ
    >>> R, x,y = ring("x,y", ZZ)

    >>> R.dmp_abs(x**2*y - x)
    x**2*y + x

    r   c                s   g | ]}t | qS r   )dmp_abs)r%   r&   )r   r   r   r   r'     s    zdmp_abs.<locals>.<listcomp>)r<   )r   r   r   r   )r   r   r   r=     s    
r=   c             C   s   dd | D S )z
    Negate a polynomial in ``K[x]``.

    Examples
    ========

    >>> from sympy.polys import ring, ZZ
    >>> R, x = ring("x", ZZ)

    >>> R.dup_neg(x**2 - 1)
    -x**2 + 1

    c             S   s   g | ]
}| qS r   r   )r%   r;   r   r   r   r'     s    zdup_neg.<locals>.<listcomp>r   )r   r   r   r   r   dup_neg  s    r>   c                s*   |st |  S |d  fdd| D S )z
    Negate a polynomial in ``K[X]``.

    Examples
    ========

    >>> from sympy.polys import ring, ZZ
    >>> R, x,y = ring("x,y", ZZ)

    >>> R.dmp_neg(x**2*y - x)
    -x**2*y + x

    r   c                s   g | ]}t | qS r   )r#   )r%   r&   )r   r   r   r   r'     s    zdmp_neg.<locals>.<listcomp>)r>   )r   r   r   r   )r   r   r   r#     s    
r#   c             C   s   | s|S |s| S t | }t |}||kr@tdd t| |D S t|| }||krp| d| | |d  }} n|d| ||d  }}|dd t| |D  S dS )z
    Add dense polynomials in ``K[x]``.

    Examples
    ========

    >>> from sympy.polys import ring, ZZ
    >>> R, x = ring("x", ZZ)

    >>> R.dup_add(x**2 - 1, x - 2)
    x**2 + x - 3

    c             S   s   g | ]\}}|| qS r   r   )r%   abr   r   r   r'     s    zdup_add.<locals>.<listcomp>Nc             S   s   g | ]\}}|| qS r   r   )r%   r?   r@   r   r   r   r'   !  s    )r   r   zipr:   )r   gr   dfdgkhr   r   r   dup_add  s    rG   c                s   |st | | S t| |}|dk r&|S t||}|dk r<| S |d ||krlt fddt| |D |S t|| }||kr| d| | |d  }} n|d| ||d  }}| fddt| |D  S dS )z
    Add dense polynomials in ``K[X]``.

    Examples
    ========

    >>> from sympy.polys import ring, ZZ
    >>> R, x,y = ring("x,y", ZZ)

    >>> R.dmp_add(x**2 + y, x**2*y + x)
    x**2*y + x**2 + x + y

    r   r   c                s   g | ]\}}t || qS r   )r   )r%   r?   r@   )r   r   r   r   r'   B  s    zdmp_add.<locals>.<listcomp>Nc                s   g | ]\}}t || qS r   )r   )r%   r?   r@   )r   r   r   r   r'   K  s    )rG   r   r   rA   r:   )r   rB   r   r   rC   rD   rE   rF   r   )r   r   r   r   $  s     

 r   c             C   s   | st ||S |s| S t| }t|}||krFtdd t| |D S t|| }||krv| d| | |d  }} n t |d| |||d  }}|dd t| |D  S dS )z
    Subtract dense polynomials in ``K[x]``.

    Examples
    ========

    >>> from sympy.polys import ring, ZZ
    >>> R, x = ring("x", ZZ)

    >>> R.dup_sub(x**2 - 1, x - 2)
    x**2 - x + 1

    c             S   s   g | ]\}}|| qS r   r   )r%   r?   r@   r   r   r   r'   e  s    zdup_sub.<locals>.<listcomp>Nc             S   s   g | ]\}}|| qS r   r   )r%   r?   r@   r   r   r   r'   n  s    )r>   r   r   rA   r:   )r   rB   r   rC   rD   rE   rF   r   r   r   dup_subN  s    
 rH   c                s   |st | | S t| |}|dk r.t|| S t||}|dk rD| S |d ||krtt fddt| |D |S t|| }||kr| d| | |d  }} n"t|d| | ||d  }}| fddt| |D  S dS )z
    Subtract dense polynomials in ``K[X]``.

    Examples
    ========

    >>> from sympy.polys import ring, ZZ
    >>> R, x,y = ring("x,y", ZZ)

    >>> R.dmp_sub(x**2 + y, x**2*y + x)
    -x**2*y + x**2 - x + y

    r   r   c                s   g | ]\}}t || qS r   )r"   )r%   r?   r@   )r   r   r   r   r'     s    zdmp_sub.<locals>.<listcomp>Nc                s   g | ]\}}t || qS r   )r"   )r%   r?   r@   )r   r   r   r   r'     s    )rH   r   r#   r   rA   r:   )r   rB   r   r   rC   rD   rE   rF   r   )r   r   r   r"   q  s     

 "r"   c             C   s   t | t||||S )z
    Returns ``f + g*h`` where ``f, g, h`` are in ``K[x]``.

    Examples
    ========

    >>> from sympy.polys import ring, ZZ
    >>> R, x = ring("x", ZZ)

    >>> R.dup_add_mul(x**2 - 1, x - 2, x + 2)
    2*x**2 - 5

    )rG   dup_mul)r   rB   rF   r   r   r   r   dup_add_mul  s    rJ   c             C   s   t | t||||||S )z
    Returns ``f + g*h`` where ``f, g, h`` are in ``K[X]``.

    Examples
    ========

    >>> from sympy.polys import ring, ZZ
    >>> R, x,y = ring("x,y", ZZ)

    >>> R.dmp_add_mul(x**2 + y, x, x + 2)
    2*x**2 + 2*x + y

    )r   r)   )r   rB   rF   r   r   r   r   r   dmp_add_mul  s    rK   c             C   s   t | t||||S )z
    Returns ``f - g*h`` where ``f, g, h`` are in ``K[x]``.

    Examples
    ========

    >>> from sympy.polys import ring, ZZ
    >>> R, x = ring("x", ZZ)

    >>> R.dup_sub_mul(x**2 - 1, x - 2, x + 2)
    3

    )rH   rI   )r   rB   rF   r   r   r   r   dup_sub_mul  s    rL   c             C   s   t | t||||||S )z
    Returns ``f - g*h`` where ``f, g, h`` are in ``K[X]``.

    Examples
    ========

    >>> from sympy.polys import ring, ZZ
    >>> R, x,y = ring("x,y", ZZ)

    >>> R.dmp_sub_mul(x**2 + y, x, x + 2)
    -2*x + y

    )r"   r)   )r   rB   rF   r   r   r   r   r   dmp_sub_mul  s    rM   c             C   s  | |krt | |S | r|sg S t| }t|}t||d }|dk rg }xjtd|| d D ]T}|j}x>ttd|| t||d D ]}	|| |	 |||	   7 }qW || q\W t|S |d }
t| d|
|t|d|
| }}t	t| |
|||
|}t	t||
|||
|}t
|||t
||| }}t
t|||t||||}t|t||||}tt|t||
||t|d|
 ||S dS )z
    Multiply dense polynomials in ``K[x]``.

    Examples
    ========

    >>> from sympy.polys import ring, ZZ
    >>> R, x = ring("x", ZZ)

    >>> R.dup_mul(x - 2, x + 2)
    x**2 - 4

    r   d   r      N)dup_sqrr   maxranger   minappendr   r   r9   rI   rG   rH   r8   )r   rB   r   rC   rD   r   rF   r   r;   jZn2flglfhghlohimidr   r   r   rI     s0    
$rI   c          	   C   s   |st | ||S | |kr$t| ||S t| |}|dk r:| S t||}|dk rP|S g |d  }}xxtd|| d D ]b}t|}	xJttd|| t||d D ](}
t|	t| |
 |||
  ||||}	qW |	|	 qrW t
||S )z
    Multiply dense polynomials in ``K[X]``.

    Examples
    ========

    >>> from sympy.polys import ring, ZZ
    >>> R, x,y = ring("x,y", ZZ)

    >>> R.dmp_mul(x*y + 1, x)
    x**2*y + x

    r   r   )rI   dmp_sqrr   rR   r
   rQ   rS   r   r)   rT   r   )r   rB   r   r   rC   rD   rF   r   r   r;   rU   r   r   r   r)     s"    

$(r)   c             C   s   t | d g  }}xtdd| d D ]}|j}td|| }t||}|| d }||d  d }x.t||d D ]}	|| |	 | ||	   7 }qtW ||7 }|d@ r| |d  }
||
d 7 }|| q&W t|S )z
    Square dense polynomials in ``K[x]``.

    Examples
    ========

    >>> from sympy.polys import ring, ZZ
    >>> R, x = ring("x", ZZ)

    >>> R.dup_sqr(x**2 + 1)
    x**4 + 2*x**2 + 1

    r   r   rO   )r   rR   r   rQ   rS   rT   r   )r   r   rC   rF   r   r   jminjmaxr   rU   elemr   r   r   rP   C  s    
rP   c          	   C   s  |st | |S t| |}|dk r$| S g |d  }}xtdd| d D ]}t|}td|| }t||}	|	| d }
||
d  d }	x:t||	d D ](}t|t| | | ||  ||||}qW t||d||}|
d@ r t	| |	d  ||}t||||}|
| qFW t||S )z
    Square dense polynomials in ``K[X]``.

    Examples
    ========

    >>> from sympy.polys import ring, ZZ
    >>> R, x,y = ring("x,y", ZZ)

    >>> R.dmp_sqr(x**2 + x*y + y**2)
    x**4 + 2*x**3*y + 3*x**2*y**2 + 2*x*y**3 + y**4

    r   r   rO   )rP   r   rR   r
   rQ   rS   r   r)   r0   r]   rT   r   )r   r   r   rC   rF   r   r   r   r^   r_   r   rU   r`   r   r   r   r]   k  s(    


(
r]   c             C   s|   |s|j gS |dk rtd|dks4| r4| |j gkr8| S |j g}x6|d | }}|d rjt|| |}|sjP t| |} qBW |S )z
    Raise ``f`` to the ``n``-th power in ``K[x]``.

    Examples
    ========

    >>> from sympy.polys import ring, ZZ
    >>> R, x = ring("x", ZZ)

    >>> R.dup_pow(x - 2, 3)
    x**3 - 6*x**2 + 12*x - 8

    r   z+Cannot raise polynomial to a negative powerr   rO   )one
ValueErrorrI   rP   )r   r   r   rB   r   r   r   r   dup_pow  s    rc   c             C   s   |st | ||S |st||S |dk r.td|dksLt| |sLt| ||rP| S t||}x:|d | }}|d@ rt|| ||}|sP t| ||} q\W |S )z
    Raise ``f`` to the ``n``-th power in ``K[X]``.

    Examples
    ========

    >>> from sympy.polys import ring, ZZ
    >>> R, x,y = ring("x,y", ZZ)

    >>> R.dmp_pow(x*y + 1, 3)
    x**3*y**3 + 3*x**2*y**2 + 3*x*y + 1

    r   z+Cannot raise polynomial to a negative powerr   rO   )rc   r   rb   r	   r   r)   r]   )r   r   r   r   rB   r   r   r   r   dmp_pow  s"    

rd   c             C   s  t | }t |}g | |  }}}|s.tdn||k r>||fS || d }t||}	xt||}
|| |d  }}t||	|}t||
||}t||	|}t||
||}t|||}|t | }}||k rP qV||k sVt| ||qVW |	| }t|||}t|||}||fS )z
    Polynomial pseudo-division in ``K[x]``.

    Examples
    ========

    >>> from sympy.polys import ring, ZZ
    >>> R, x = ring("x", ZZ)

    >>> R.dup_pdiv(x**2 + 1, 2*x - 4)
    (2*x + 4, 20)

    zpolynomial divisionr   )r   r1   r   r/   r   r(   rH   r   )r   rB   r   rC   rD   qrdrNlc_glc_rrU   QRG_drr   r   r   r   dup_pdiv  s4    


ro   c             C   s   t | }t |}| | }}|s(tdn||k r4|S || d }t||}xtt||}	|| |d  }
}t|||}t||	|
|}t|||}|t | }}||k rP qL||k sLt| ||qLW t||| |S )z
    Polynomial pseudo-remainder in ``K[x]``.

    Examples
    ========

    >>> from sympy.polys import ring, ZZ
    >>> R, x = ring("x", ZZ)

    >>> R.dup_prem(x**2 + 1, 2*x - 4)
    20

    zpolynomial divisionr   )r   r1   r   r/   r(   rH   r   )r   rB   r   rC   rD   rf   rg   rh   ri   rj   rU   rl   rm   rn   r   r   r   dup_prem  s*    



rp   c             C   s   t | ||d S )a   
    Polynomial exact pseudo-quotient in ``K[X]``.

    Examples
    ========

    >>> from sympy.polys import ring, ZZ
    >>> R, x = ring("x", ZZ)

    >>> R.dup_pquo(x**2 - 1, 2*x - 2)
    2*x + 2

    >>> R.dup_pquo(x**2 + 1, 2*x - 4)
    2*x + 4

    r   )ro   )r   rB   r   r   r   r   dup_pquoJ  s    rq   c             C   s&   t | ||\}}|s|S t| |dS )a\  
    Polynomial pseudo-quotient in ``K[x]``.

    Examples
    ========

    >>> from sympy.polys import ring, ZZ
    >>> R, x = ring("x", ZZ)

    >>> R.dup_pexquo(x**2 - 1, 2*x - 2)
    2*x + 2

    >>> R.dup_pexquo(x**2 + 1, 2*x - 4)
    Traceback (most recent call last):
    ...
    ExactQuotientFailed: [2, -4] does not divide [1, 0, 1]

    N)ro   r   )r   rB   r   re   rf   r   r   r   
dup_pexquo^  s    rr   c             C   sH  |st | ||S t| |}t||}|dk r4tdt|| |  }}}||k rX||fS || d }	t||}
xt||}|| |	d  }}	t||
d||}t|||||}t||
d||}t|||||}t||||}|t|| }}||k rP qp||k spt| ||qpW t	|
|	|d |}t||d||}t||d||}||fS )z
    Polynomial pseudo-division in ``K[X]``.

    Examples
    ========

    >>> from sympy.polys import ring, ZZ
    >>> R, x,y = ring("x,y", ZZ)

    >>> R.dmp_pdiv(x**2 + x*y, 2*x + 2)
    (2*x + 2*y - 2, -4*y + 4)

    r   zpolynomial divisionr   )
ro   r   r1   r
   r   r*   r    r"   r   rd   )r   rB   r   r   rC   rD   re   rf   rg   rh   ri   rj   rU   rk   rl   rm   rn   r   r   r   r   dmp_pdivy  s8    



rs   c             C   s  |st | ||S t| |}t||}|dk r4td| | }}||k rJ|S || d }t||}	x~t||}
|| |d  }}t||	d||}t||
|||}t||||}|t|| }}||k rP qb||k sbt| ||qbW t|	||d |}t||d||S )z
    Polynomial pseudo-remainder in ``K[X]``.

    Examples
    ========

    >>> from sympy.polys import ring, ZZ
    >>> R, x,y = ring("x,y", ZZ)

    >>> R.dmp_prem(x**2 + x*y, 2*x + 2)
    -4*y + 4

    r   zpolynomial divisionr   )rp   r   r1   r   r*   r"   r   rd   )r   rB   r   r   rC   rD   rf   rg   rh   ri   rj   rU   rl   rm   rn   r   r   r   r   dmp_prem  s0    




rt   c             C   s   t | |||d S )a.  
    Polynomial exact pseudo-quotient in ``K[X]``.

    Examples
    ========

    >>> from sympy.polys import ring, ZZ
    >>> R, x,y = ring("x,y", ZZ)

    >>> f = x**2 + x*y
    >>> g = 2*x + 2*y
    >>> h = 2*x + 2

    >>> R.dmp_pquo(f, g)
    2*x

    >>> R.dmp_pquo(f, h)
    2*x + 2*y - 2

    r   )rs   )r   rB   r   r   r   r   r   dmp_pquo  s    ru   c             C   s.   t | |||\}}t||r |S t| |dS )a  
    Polynomial pseudo-quotient in ``K[X]``.

    Examples
    ========

    >>> from sympy.polys import ring, ZZ
    >>> R, x,y = ring("x,y", ZZ)

    >>> f = x**2 + x*y
    >>> g = 2*x + 2*y
    >>> h = 2*x + 2

    >>> R.dmp_pexquo(f, g)
    2*x

    >>> R.dmp_pexquo(f, h)
    Traceback (most recent call last):
    ...
    ExactQuotientFailed: [[2], [2]] does not divide [[1], [1, 0], []]

    N)rs   r	   r   )r   rB   r   r   re   rf   r   r   r   
dmp_pexquo  s    
rv   c             C   s   t | }t |}g | |  }}}|s.tdn||k r>||fS t||}xt||}	|	| r^P ||	|}
|| }t||
||}t||
||}t|||}|t | }}||k rP qJ||k sJt| ||qJW ||fS )z
    Univariate division with remainder over a ring.

    Examples
    ========

    >>> from sympy.polys import ring, ZZ
    >>> R, x = ring("x", ZZ)

    >>> R.dup_rr_div(x**2 + 1, 2*x - 4)
    (0, x**2 + 1)

    zpolynomial division)r   r1   r   r5   r   r(   rH   r   )r   rB   r   rC   rD   re   rf   rg   ri   rj   r   rU   rF   rn   r   r   r   
dup_rr_div  s.    


rw   c             C   s  |st | ||S t| |}t||}|dk r4tdt|| |  }}}||k rX||fS t|||d  }	}
xt||}t||	|
|\}}t||
sP || }t|||||}t|||||}t	||||}|t|| }}||k rP qn||k snt
| ||qnW ||fS )z
    Multivariate division with remainder over a ring.

    Examples
    ========

    >>> from sympy.polys import ring, ZZ
    >>> R, x,y = ring("x,y", ZZ)

    >>> R.dmp_rr_div(x**2 + x*y, 2*x + 2)
    (0, x**2 + x*y)

    r   zpolynomial divisionr   )rw   r   r1   r
   r   
dmp_rr_divr	   r    r*   r"   r   )r   rB   r   r   rC   rD   re   rf   rg   ri   r   rj   r   rl   rU   rF   rn   r   r   r   rx   M  s2    



rx   c             C   s   t | }t |}g | |  }}}|s.tdn||k r>||fS t||}xt||}	||	|}
|| }t||
||}t||
||}t|||}|t | }}||k rP qJ||kr|jst|dd }t |}||k rP qJ||k sJt	| ||qJW ||fS )z
    Polynomial division with remainder over a field.

    Examples
    ========

    >>> from sympy.polys import ring, QQ
    >>> R, x = ring("x", QQ)

    >>> R.dup_ff_div(x**2 + 1, 2*x - 4)
    (1/2*x + 1, 5)

    zpolynomial divisionr   N)
r   r1   r   r5   r   r(   rH   Zis_Exactr   r   )r   rB   r   rC   rD   re   rf   rg   ri   rj   r   rU   rF   rn   r   r   r   
dup_ff_div  s4    


ry   c             C   s  |st | ||S t| |}t||}|dk r4tdt|| |  }}}||k rX||fS t|||d  }	}
xt||}t||	|
|\}}t||
sP || }t|||||}t|||||}t	||||}|t|| }}||k rP qn||k snt
| ||qnW ||fS )z
    Polynomial division with remainder over a field.

    Examples
    ========

    >>> from sympy.polys import ring, QQ
    >>> R, x,y = ring("x,y", QQ)

    >>> R.dmp_ff_div(x**2 + x*y, 2*x + 2)
    (1/2*x + 1/2*y - 1/2, -y + 1)

    r   zpolynomial divisionr   )ry   r   r1   r
   r   
dmp_ff_divr	   r    r*   r"   r   )r   rB   r   r   rC   rD   re   rf   rg   ri   r   rj   r   rl   rU   rF   rn   r   r   r   rz     s2    



rz   c             C   s"   |j rt| ||S t| ||S dS )a.  
    Polynomial division with remainder in ``K[x]``.

    Examples
    ========

    >>> from sympy.polys import ring, ZZ, QQ

    >>> R, x = ring("x", ZZ)
    >>> R.dup_div(x**2 + 1, 2*x - 4)
    (0, x**2 + 1)

    >>> R, x = ring("x", QQ)
    >>> R.dup_div(x**2 + 1, 2*x - 4)
    (1/2*x + 1, 5)

    N)r2   ry   rw   )r   rB   r   r   r   r   dup_div  s    r{   c             C   s   t | ||d S )a  
    Returns polynomial remainder in ``K[x]``.

    Examples
    ========

    >>> from sympy.polys import ring, ZZ, QQ

    >>> R, x = ring("x", ZZ)
    >>> R.dup_rem(x**2 + 1, 2*x - 4)
    x**2 + 1

    >>> R, x = ring("x", QQ)
    >>> R.dup_rem(x**2 + 1, 2*x - 4)
    5

    r   )r{   )r   rB   r   r   r   r   dup_rem  s    r|   c             C   s   t | ||d S )a  
    Returns exact polynomial quotient in ``K[x]``.

    Examples
    ========

    >>> from sympy.polys import ring, ZZ, QQ

    >>> R, x = ring("x", ZZ)
    >>> R.dup_quo(x**2 + 1, 2*x - 4)
    0

    >>> R, x = ring("x", QQ)
    >>> R.dup_quo(x**2 + 1, 2*x - 4)
    1/2*x + 1

    r   )r{   )r   rB   r   r   r   r   dup_quo  s    r}   c             C   s&   t | ||\}}|s|S t| |dS )aW  
    Returns polynomial quotient in ``K[x]``.

    Examples
    ========

    >>> from sympy.polys import ring, ZZ
    >>> R, x = ring("x", ZZ)

    >>> R.dup_exquo(x**2 - 1, x - 1)
    x + 1

    >>> R.dup_exquo(x**2 + 1, 2*x - 4)
    Traceback (most recent call last):
    ...
    ExactQuotientFailed: [2, -4] does not divide [1, 0, 1]

    N)r{   r   )r   rB   r   re   rf   r   r   r   	dup_exquo-  s    r~   c             C   s&   |j rt| |||S t| |||S dS )aK  
    Polynomial division with remainder in ``K[X]``.

    Examples
    ========

    >>> from sympy.polys import ring, ZZ, QQ

    >>> R, x,y = ring("x,y", ZZ)
    >>> R.dmp_div(x**2 + x*y, 2*x + 2)
    (0, x**2 + x*y)

    >>> R, x,y = ring("x,y", QQ)
    >>> R.dmp_div(x**2 + x*y, 2*x + 2)
    (1/2*x + 1/2*y - 1/2, -y + 1)

    N)r2   rz   rx   )r   rB   r   r   r   r   r   dmp_divH  s    r   c             C   s   t | |||d S )a)  
    Returns polynomial remainder in ``K[X]``.

    Examples
    ========

    >>> from sympy.polys import ring, ZZ, QQ

    >>> R, x,y = ring("x,y", ZZ)
    >>> R.dmp_rem(x**2 + x*y, 2*x + 2)
    x**2 + x*y

    >>> R, x,y = ring("x,y", QQ)
    >>> R.dmp_rem(x**2 + x*y, 2*x + 2)
    -y + 1

    r   )r   )r   rB   r   r   r   r   r   dmp_rem`  s    r   c             C   s   t | |||d S )a2  
    Returns exact polynomial quotient in ``K[X]``.

    Examples
    ========

    >>> from sympy.polys import ring, ZZ, QQ

    >>> R, x,y = ring("x,y", ZZ)
    >>> R.dmp_quo(x**2 + x*y, 2*x + 2)
    0

    >>> R, x,y = ring("x,y", QQ)
    >>> R.dmp_quo(x**2 + x*y, 2*x + 2)
    1/2*x + 1/2*y - 1/2

    r   )r   )r   rB   r   r   r   r   r   dmp_quou  s    r   c             C   s.   t | |||\}}t||r |S t| |dS )a  
    Returns polynomial quotient in ``K[X]``.

    Examples
    ========

    >>> from sympy.polys import ring, ZZ
    >>> R, x,y = ring("x,y", ZZ)

    >>> f = x**2 + x*y
    >>> g = x + y
    >>> h = 2*x + 2

    >>> R.dmp_exquo(f, g)
    x

    >>> R.dmp_exquo(f, h)
    Traceback (most recent call last):
    ...
    ExactQuotientFailed: [[2], [2]] does not divide [[1], [1, 0], []]

    N)r   r	   r   )r   rB   r   r   re   rf   r   r   r   	dmp_exquo  s    
r   c             C   s   | s
|j S tt| |S dS )z
    Returns maximum norm of a polynomial in ``K[x]``.

    Examples
    ========

    >>> from sympy.polys import ring, ZZ
    >>> R, x = ring("x", ZZ)

    >>> R.dup_max_norm(-x**2 + 2*x - 3)
    3

    N)r   rQ   r<   )r   r   r   r   r   dup_max_norm  s    r   c                s.   |st |  S |d t fdd| D S )z
    Returns maximum norm of a polynomial in ``K[X]``.

    Examples
    ========

    >>> from sympy.polys import ring, ZZ
    >>> R, x,y = ring("x,y", ZZ)

    >>> R.dmp_max_norm(2*x*y - x - 3)
    3

    r   c                s   g | ]}t | qS r   )dmp_max_norm)r%   r   )r   r   r   r   r'     s    z dmp_max_norm.<locals>.<listcomp>)r   rQ   )r   r   r   r   )r   r   r   r     s    
r   c             C   s   | s
|j S tt| |S dS )z
    Returns l1 norm of a polynomial in ``K[x]``.

    Examples
    ========

    >>> from sympy.polys import ring, ZZ
    >>> R, x = ring("x", ZZ)

    >>> R.dup_l1_norm(2*x**3 - 3*x**2 + 1)
    6

    N)r   sumr<   )r   r   r   r   r   dup_l1_norm  s    r   c                s.   |st |  S |d t fdd| D S )z
    Returns l1 norm of a polynomial in ``K[X]``.

    Examples
    ========

    >>> from sympy.polys import ring, ZZ
    >>> R, x,y = ring("x,y", ZZ)

    >>> R.dmp_l1_norm(2*x*y - x - 3)
    6

    r   c                s   g | ]}t | qS r   )dmp_l1_norm)r%   r   )r   r   r   r   r'     s    zdmp_l1_norm.<locals>.<listcomp>)r   r   )r   r   r   r   )r   r   r   r     s    
r   c             C   s   t dd | D |jS )z
    Returns squared l2 norm of a polynomial in ``K[x]``.

    Examples
    ========

    >>> from sympy.polys import ring, ZZ
    >>> R, x = ring("x", ZZ)

    >>> R.dup_l2_norm_squared(2*x**3 - 3*x**2 + 1)
    14

    c             S   s   g | ]}|d  qS )rO   r   )r%   r;   r   r   r   r'     s    z'dup_l2_norm_squared.<locals>.<listcomp>)r   r   )r   r   r   r   r   dup_l2_norm_squared  s    r   c                s.   |st |  S |d t fdd| D S )z
    Returns squared l2 norm of a polynomial in ``K[X]``.

    Examples
    ========

    >>> from sympy.polys import ring, ZZ
    >>> R, x,y = ring("x,y", ZZ)

    >>> R.dmp_l2_norm_squared(2*x*y - x - 3)
    14

    r   c                s   g | ]}t | qS r   )dmp_l2_norm_squared)r%   r   )r   r   r   r   r'   !  s    z'dmp_l2_norm_squared.<locals>.<listcomp>)r   r   )r   r   r   r   )r   r   r   r     s    
r   c             C   s:   | s|j gS | d }x | dd D ]}t|||}q"W |S )z
    Multiply together several polynomials in ``K[x]``.

    Examples
    ========

    >>> from sympy.polys import ring, ZZ
    >>> R, x = ring("x", ZZ)

    >>> R.dup_expand([x**2 - 1, x, 2])
    2*x**3 - 2*x

    r   r   N)ra   rI   )polysr   r   rB   r   r   r   
dup_expand$  s    r   c             C   s>   | st ||S | d }x"| dd D ]}t||||}q$W |S )z
    Multiply together several polynomials in ``K[X]``.

    Examples
    ========

    >>> from sympy.polys import ring, ZZ
    >>> R, x,y = ring("x,y", ZZ)

    >>> R.dmp_expand([x**2 + y**2, x + 1])
    x**3 + x**2 + x*y**2 + y**2

    r   r   N)r   r)   )r   r   r   r   rB   r   r   r   
dmp_expand=  s    
r   N)R__doc__Zsympy.polys.densebasicr   r   r   r   r   r   r   r	   r
   r   r   r   r   Zsympy.polys.polyerrorsr   r   r   r    r!   r$   r(   r*   r+   r,   r-   r.   r/   r0   r3   r4   r6   r7   r8   r9   r<   r=   r>   r#   rG   r   rH   r"   rJ   rK   rL   rM   rI   r)   rP   r]   rc   rd   ro   rp   rq   rr   rs   rt   ru   rv   rw   rx   ry   rz   r{   r|   r}   r~   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   <module>   s   <""#*#*9+(0%(5-931545