a
    RG5dR                     @   s  d 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
Z
dd Zd	d
 Ze ZZe Z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dd%d&Zd'd( Zd)d* Z d+d, Z!d-d. Z"d/d0 Z#d1d2 Z$d3d4 Z%d5d6 Z&d7d8 Z'd9d: Z(d;d< Z)d=d> Z*d?d@ Z+dAdB Z,dCdD Z-dEdF Z.dGdH Z/dIdJ Z0dKdL Z1dMdN Z2dOdP Z3dQdR Z4dSdT Z5dUdV Z6dWdX Z7dYdZ Z8d[d\ Z9dd^d_Z:dd`daZ;ddbdcZ<ddde Z=dfdg Z>dhdi Z?djdk Z@dldm ZAdndo ZBdpdq ZCdrds ZDdtdu ZEdvdw ZFdxdy ZGdzd{ ZHd|d} ZIdd~dZJdddZKdd ZLdd ZMdd ZNdddZOdd ZPdd ZQdd ZRdd ZSdd ZTdd ZUdS )zEBasic tools for dense recursive polynomials in ``K[x]`` or ``K[X]``.     )oo)igcd)monomial_minmonomial_div)monomial_keyNc                 C   s   | s
|j S | d S dS )z
    Return leading coefficient of ``f``.

    Examples
    ========

    >>> from sympy.polys.domains import ZZ
    >>> from sympy.polys.densebasic import poly_LC

    >>> poly_LC([], ZZ)
    0
    >>> poly_LC([ZZ(1), ZZ(2), ZZ(3)], ZZ)
    1

    r   NzerofK r   R/var/www/html/django/DPS/env/lib/python3.9/site-packages/sympy/polys/densebasic.pypoly_LC   s    r   c                 C   s   | s
|j S | d S dS )z
    Return trailing coefficient of ``f``.

    Examples
    ========

    >>> from sympy.polys.domains import ZZ
    >>> from sympy.polys.densebasic import poly_TC

    >>> poly_TC([], ZZ)
    0
    >>> poly_TC([ZZ(1), ZZ(2), ZZ(3)], ZZ)
    3

    Nr   r	   r   r   r   poly_TC!   s    r   c                 C   s"   |rt | |} |d8 }q t| |S )z
    Return the ground leading coefficient.

    Examples
    ========

    >>> from sympy.polys.domains import ZZ
    >>> from sympy.polys.densebasic import dmp_ground_LC

    >>> f = ZZ.map([[[1], [2, 3]]])

    >>> dmp_ground_LC(f, 2, ZZ)
    1

       )dmp_LCdup_LCr
   ur   r   r   r   dmp_ground_LC:   s    

r   c                 C   s"   |rt | |} |d8 }q t| |S )z
    Return the ground trailing coefficient.

    Examples
    ========

    >>> from sympy.polys.domains import ZZ
    >>> from sympy.polys.densebasic import dmp_ground_TC

    >>> f = ZZ.map([[[1], [2, 3]]])

    >>> dmp_ground_TC(f, 2, ZZ)
    3

    r   )dmp_TCdup_TCr   r   r   r   dmp_ground_TCQ   s    

r   c                 C   sb   g }|r.| t| d  | d |d  } }q| s>| d n| t| d  t|t| |fS )a  
    Return the leading term ``c * x_1**n_1 ... x_k**n_k``.

    Examples
    ========

    >>> from sympy.polys.domains import ZZ
    >>> from sympy.polys.densebasic import dmp_true_LT

    >>> f = ZZ.map([[4], [2, 0], [3, 0, 0]])

    >>> dmp_true_LT(f, 1, ZZ)
    ((2, 0), 4)

    r   r   )appendlentupler   )r
   r   r   monomr   r   r   dmp_true_LTh   s    r   c                 C   s   | s
t  S t| d S )aB  
    Return the leading degree of ``f`` in ``K[x]``.

    Note that the degree of 0 is negative infinity (the SymPy object -oo).

    Examples
    ========

    >>> from sympy.polys.domains import ZZ
    >>> from sympy.polys.densebasic import dup_degree

    >>> f = ZZ.map([1, 2, 0, 3])

    >>> dup_degree(f)
    3

    r   )r   r   r
   r   r   r   
dup_degree   s    r    c                 C   s    t | |rt S t| d S dS )a{  
    Return the leading degree of ``f`` in ``x_0`` in ``K[X]``.

    Note that the degree of 0 is negative infinity (the SymPy object -oo).

    Examples
    ========

    >>> from sympy.polys.domains import ZZ
    >>> from sympy.polys.densebasic import dmp_degree

    >>> dmp_degree([[[]]], 2)
    -oo

    >>> f = ZZ.map([[2], [1, 2, 3]])

    >>> dmp_degree(f, 1)
    1

    r   N)
dmp_zero_pr   r   r
   r   r   r   r   
dmp_degree   s    
r#   c                    s>    krt | S d  d   t fdd| D S )z4Recursive helper function for :func:`dmp_degree_in`.r   c                    s   g | ]}t | qS r   )_rec_degree_in.0cijvr   r   
<listcomp>       z"_rec_degree_in.<locals>.<listcomp>)r#   max)gr+   r)   r*   r   r(   r   r$      s    
r$   c                 C   s<   |st | |S |dk s||kr.td||f t| |d|S )a6  
    Return the leading degree of ``f`` in ``x_j`` in ``K[X]``.

    Examples
    ========

    >>> from sympy.polys.domains import ZZ
    >>> from sympy.polys.densebasic import dmp_degree_in

    >>> f = ZZ.map([[2], [1, 2, 3]])

    >>> dmp_degree_in(f, 0, 1)
    1
    >>> dmp_degree_in(f, 1, 1)
    2

    r   z0 <= j <= %s expected, got %s)r#   
IndexErrorr$   )r
   r*   r   r   r   r   dmp_degree_in   s
    
r1   c                 C   sN   t || t| |||< |dkrJ|d |d  }}| D ]}t|||| q6dS )z-Recursive helper for :func:`dmp_degree_list`.r   r   N)r.   r#   _rec_degree_list)r/   r+   r)   degsr'   r   r   r   r2      s
    r2   c                 C   s&   t  g|d  }t| |d| t|S )a  
    Return a list of degrees of ``f`` in ``K[X]``.

    Examples
    ========

    >>> from sympy.polys.domains import ZZ
    >>> from sympy.polys.densebasic import dmp_degree_list

    >>> f = ZZ.map([[1], [1, 2, 3]])

    >>> dmp_degree_list(f, 1)
    (1, 2)

    r   r   )r   r2   r   )r
   r   r3   r   r   r   dmp_degree_list   s    r4   c                 C   s<   | r| d r| S d}| D ]}|r& q0q|d7 }q| |d S )z
    Remove leading zeros from ``f`` in ``K[x]``.

    Examples
    ========

    >>> from sympy.polys.densebasic import dup_strip

    >>> dup_strip([0, 0, 1, 2, 3, 0])
    [1, 2, 3, 0]

    r   r   Nr   )r
   r)   cfr   r   r   	dup_strip   s    
r6   c                 C   sn   |st | S t| |r| S d|d  }}| D ]}t||s@ qJq,|d7 }q,|t| kr^t|S | |d S dS )z
    Remove leading zeros from ``f`` in ``K[X]``.

    Examples
    ========

    >>> from sympy.polys.densebasic import dmp_strip

    >>> dmp_strip([[], [0, 1, 2], [1]], 1)
    [[0, 1, 2], [1]]

    r   r   N)r6   r!   r   dmp_zero)r
   r   r)   r+   r'   r   r   r   	dmp_strip  s    


r8   c                 C   sr   t |ts:|dur0||s0td|| |jf |d hS |sD|hS t }|D ]}|t| ||d |O }qN|S dS )z*Recursive helper for :func:`dmp_validate`.Nz%s in %s in not of type %sr   )
isinstancelistof_type	TypeErrordtypeset_rec_validate)r
   r/   r)   r   levelsr'   r   r   r   r?   8  s    

r?   c                    s,   |st | S |d  t fdd| D |S )z(Recursive helper for :func:`_rec_strip`.r   c                    s   g | ]}t | qS r   )
_rec_stripr%   wr   r   r,   Q  r-   z_rec_strip.<locals>.<listcomp>)r6   r8   )r/   r+   r   rB   r   rA   J  s    rA   c                 C   s4   t | | d|}| }|s(t| ||fS tddS )at  
    Return the number of levels in ``f`` and recursively strip it.

    Examples
    ========

    >>> from sympy.polys.densebasic import dmp_validate

    >>> dmp_validate([[], [0, 1, 2], [1]])
    ([[1, 2], [1]], 1)

    >>> dmp_validate([[1], 1])
    Traceback (most recent call last):
    ...
    ValueError: invalid data structure for a multivariate polynomial

    r   z4invalid data structure for a multivariate polynomialN)r?   poprA   
ValueError)r
   r   r@   r   r   r   r   dmp_validateT  s    rF   c                 C   s   t tt| S )a  
    Compute ``x**n * f(1/x)``, i.e.: reverse ``f`` in ``K[x]``.

    Examples
    ========

    >>> from sympy.polys.domains import ZZ
    >>> from sympy.polys.densebasic import dup_reverse

    >>> f = ZZ.map([1, 2, 3, 0])

    >>> dup_reverse(f)
    [3, 2, 1]

    )r6   r:   reversedr   r   r   r   dup_reverseq  s    rH   c                 C   s   t | S )a  
    Create a new copy of a polynomial ``f`` in ``K[x]``.

    Examples
    ========

    >>> from sympy.polys.domains import ZZ
    >>> from sympy.polys.densebasic import dup_copy

    >>> f = ZZ.map([1, 2, 3, 0])

    >>> dup_copy([1, 2, 3, 0])
    [1, 2, 3, 0]

    r:   r   r   r   r   dup_copy  s    rJ   c                    s&   |st | S |d   fdd| D S )a  
    Create a new copy of a polynomial ``f`` in ``K[X]``.

    Examples
    ========

    >>> from sympy.polys.domains import ZZ
    >>> from sympy.polys.densebasic import dmp_copy

    >>> f = ZZ.map([[1], [1, 2]])

    >>> dmp_copy(f, 1)
    [[1], [1, 2]]

    r   c                    s   g | ]}t | qS r   )dmp_copyr%   r+   r   r   r,     r-   zdmp_copy.<locals>.<listcomp>rI   r"   r   rL   r   rK     s    rK   c                 C   s   t | S )a2  
    Convert `f` into a tuple.

    This is needed for hashing. This is similar to dup_copy().

    Examples
    ========

    >>> from sympy.polys.domains import ZZ
    >>> from sympy.polys.densebasic import dup_copy

    >>> f = ZZ.map([1, 2, 3, 0])

    >>> dup_copy([1, 2, 3, 0])
    [1, 2, 3, 0]

    r   r   r   r   r   dup_to_tuple  s    rN   c                    s*   |st | S |d  t  fdd| D S )aG  
    Convert `f` into a nested tuple of tuples.

    This is needed for hashing.  This is similar to dmp_copy().

    Examples
    ========

    >>> from sympy.polys.domains import ZZ
    >>> from sympy.polys.densebasic import dmp_to_tuple

    >>> f = ZZ.map([[1], [1, 2]])

    >>> dmp_to_tuple(f, 1)
    ((1,), (1, 2))

    r   c                 3   s   | ]}t | V  qd S N)dmp_to_tupler%   rL   r   r   	<genexpr>  r-   zdmp_to_tuple.<locals>.<genexpr>rM   r"   r   rL   r   rP     s    rP   c                    s   t  fdd| D S )z
    Normalize univariate polynomial in the given domain.

    Examples
    ========

    >>> from sympy.polys.domains import ZZ
    >>> from sympy.polys.densebasic import dup_normal

    >>> dup_normal([0, 1.5, 2, 3], ZZ)
    [1, 2, 3]

    c                    s   g | ]}  |qS r   )normalr%   r   r   r   r,     r-   zdup_normal.<locals>.<listcomp>r6   r	   r   rS   r   
dup_normal  s    rU   c                    s0   |st |  S |d t fdd| D |S )z
    Normalize a multivariate polynomial in the given domain.

    Examples
    ========

    >>> from sympy.polys.domains import ZZ
    >>> from sympy.polys.densebasic import dmp_normal

    >>> dmp_normal([[], [0, 1.5, 2]], 1, ZZ)
    [[1, 2]]

    r   c                    s   g | ]}t | qS r   )
dmp_normalr%   r   r+   r   r   r,     r-   zdmp_normal.<locals>.<listcomp>)rU   r8   r   r   rW   r   rV     s    
rV   c                    s0    dur kr| S t  fdd| D S dS )a  
    Convert the ground domain of ``f`` from ``K0`` to ``K1``.

    Examples
    ========

    >>> from sympy.polys.rings import ring
    >>> from sympy.polys.domains import ZZ
    >>> from sympy.polys.densebasic import dup_convert

    >>> R, x = ring("x", ZZ)

    >>> dup_convert([R(1), R(2)], R.to_domain(), ZZ)
    [1, 2]
    >>> dup_convert([ZZ(1), ZZ(2)], ZZ, R.to_domain())
    [1, 2]

    Nc                    s   g | ]} | qS r   )convertr%   K0K1r   r   r,     r-   zdup_convert.<locals>.<listcomp>rT   )r
   rZ   r[   r   rY   r   dup_convert  s    r\   c                    sH   |st |  S  dur$ kr$| S |d t fdd| D |S )a  
    Convert the ground domain of ``f`` from ``K0`` to ``K1``.

    Examples
    ========

    >>> from sympy.polys.rings import ring
    >>> from sympy.polys.domains import ZZ
    >>> from sympy.polys.densebasic import dmp_convert

    >>> R, x = ring("x", ZZ)

    >>> dmp_convert([[R(1)], [R(2)]], 1, R.to_domain(), ZZ)
    [[1], [2]]
    >>> dmp_convert([[ZZ(1)], [ZZ(2)]], 1, ZZ, R.to_domain())
    [[1], [2]]

    Nr   c                    s   g | ]}t | qS r   )dmp_convertr%   rZ   r[   r+   r   r   r,   7  r-   zdmp_convert.<locals>.<listcomp>)r\   r8   )r
   r   rZ   r[   r   r^   r   r]     s    r]   c                    s   t  fdd| D S )a$  
    Convert the ground domain of ``f`` from SymPy to ``K``.

    Examples
    ========

    >>> from sympy import S
    >>> from sympy.polys.domains import ZZ
    >>> from sympy.polys.densebasic import dup_from_sympy

    >>> dup_from_sympy([S(1), S(2)], ZZ) == [ZZ(1), ZZ(2)]
    True

    c                    s   g | ]}  |qS r   )
from_sympyr%   rS   r   r   r,   I  r-   z"dup_from_sympy.<locals>.<listcomp>rT   r	   r   rS   r   dup_from_sympy:  s    r`   c                    s0   |st |  S |d t fdd| D |S )a/  
    Convert the ground domain of ``f`` from SymPy to ``K``.

    Examples
    ========

    >>> from sympy import S
    >>> from sympy.polys.domains import ZZ
    >>> from sympy.polys.densebasic import dmp_from_sympy

    >>> dmp_from_sympy([[S(1)], [S(2)]], 1, ZZ) == [[ZZ(1)], [ZZ(2)]]
    True

    r   c                    s   g | ]}t | qS r   )dmp_from_sympyr%   rW   r   r   r,   `  r-   z"dmp_from_sympy.<locals>.<listcomp>)r`   r8   r   r   rW   r   ra   L  s    
ra   c                 C   s<   |dk rt d| n"|t| kr(|jS | t| |  S dS )a  
    Return the ``n``-th coefficient of ``f`` in ``K[x]``.

    Examples
    ========

    >>> from sympy.polys.domains import ZZ
    >>> from sympy.polys.densebasic import dup_nth

    >>> f = ZZ.map([1, 2, 3])

    >>> dup_nth(f, 0, ZZ)
    3
    >>> dup_nth(f, 4, ZZ)
    0

    r    'n' must be non-negative, got %iN)r0   r   r   r    )r
   nr   r   r   r   dup_nthc  s
    rd   c                 C   sD   |dk rt d| n*|t| kr.t|d S | t| ||  S dS )a)  
    Return the ``n``-th coefficient of ``f`` in ``K[x]``.

    Examples
    ========

    >>> from sympy.polys.domains import ZZ
    >>> from sympy.polys.densebasic import dmp_nth

    >>> f = ZZ.map([[1], [2], [3]])

    >>> dmp_nth(f, 0, 1, ZZ)
    [3]
    >>> dmp_nth(f, 4, 1, ZZ)
    []

    r   rb   r   N)r0   r   r7   r#   )r
   rc   r   r   r   r   r   dmp_nth}  s
    re   c                 C   sl   |}|D ]^}|dk r"t d| q|t| kr8|j  S t| |}|t krPd}| ||  |d  } }q| S )a  
    Return the ground ``n``-th coefficient of ``f`` in ``K[x]``.

    Examples
    ========

    >>> from sympy.polys.domains import ZZ
    >>> from sympy.polys.densebasic import dmp_ground_nth

    >>> f = ZZ.map([[1], [2, 3]])

    >>> dmp_ground_nth(f, (0, 1), 1, ZZ)
    2

    r   z `n` must be non-negative, got %ir   r   )r0   r   r   r#   r   )r
   Nr   r   r+   rc   dr   r   r   dmp_ground_nth  s    


rh   c                 C   s,   |r&t | dkrdS | d } |d8 }q |  S )z
    Return ``True`` if ``f`` is zero in ``K[X]``.

    Examples
    ========

    >>> from sympy.polys.densebasic import dmp_zero_p

    >>> dmp_zero_p([[[[[]]]]], 4)
    True
    >>> dmp_zero_p([[[[[1]]]]], 4)
    False

    r   Fr   )r   r"   r   r   r   r!     s    
r!   c                 C   s   g }t | D ]
}|g}q|S )z
    Return a multivariate zero.

    Examples
    ========

    >>> from sympy.polys.densebasic import dmp_zero

    >>> dmp_zero(4)
    [[[[[]]]]]

    range)r   rr)   r   r   r   r7     s    r7   c                 C   s   t | |j|S )z
    Return ``True`` if ``f`` is one in ``K[X]``.

    Examples
    ========

    >>> from sympy.polys.domains import ZZ
    >>> from sympy.polys.densebasic import dmp_one_p

    >>> dmp_one_p([[[ZZ(1)]]], 2, ZZ)
    True

    )dmp_ground_poner   r   r   r   	dmp_one_p  s    rn   c                 C   s   t |j| S )z
    Return a multivariate one over ``K``.

    Examples
    ========

    >>> from sympy.polys.domains import ZZ
    >>> from sympy.polys.densebasic import dmp_one

    >>> dmp_one(2, ZZ)
    [[[1]]]

    )
dmp_groundrm   )r   r   r   r   r   dmp_one  s    rp   c                 C   s^   |dur|st | |S |r<t| dkr*dS | d } |d8 }q|du rPt| dkS | |gkS dS )z
    Return True if ``f`` is constant in ``K[X]``.

    Examples
    ========

    >>> from sympy.polys.densebasic import dmp_ground_p

    >>> dmp_ground_p([[[3]]], 3, 2)
    True
    >>> dmp_ground_p([[[4]]], None, 2)
    True

    Nr   Fr   )r!   r   )r
   r'   r   r   r   r   rl     s    

rl   c                 C   s(   | st |S t|d D ]
}| g} q| S )z
    Return a multivariate constant.

    Examples
    ========

    >>> from sympy.polys.densebasic import dmp_ground

    >>> dmp_ground(3, 5)
    [[[[[[3]]]]]]
    >>> dmp_ground(1, -1)
    1

    r   )r7   rj   )r'   r   r)   r   r   r   ro   %  s
    ro   c                    s6   | sg S  dk r|j g|  S  fddt| D S dS )a  
    Return a list of multivariate zeros.

    Examples
    ========

    >>> from sympy.polys.domains import ZZ
    >>> from sympy.polys.densebasic import dmp_zeros

    >>> dmp_zeros(3, 2, ZZ)
    [[[[]]], [[[]]], [[[]]]]
    >>> dmp_zeros(3, -1, ZZ)
    [0, 0, 0]

    r   c                    s   g | ]}t  qS r   r7   r&   r)   r   r   r   r,   S  r-   zdmp_zeros.<locals>.<listcomp>N)r   rj   )rc   r   r   r   rs   r   	dmp_zeros=  s
    rt   c                    s6   |sg S dk r g| S  fddt |D S dS )a#  
    Return a list of multivariate constants.

    Examples
    ========

    >>> from sympy.polys.domains import ZZ
    >>> from sympy.polys.densebasic import dmp_grounds

    >>> dmp_grounds(ZZ(4), 3, 2)
    [[[[4]]], [[[4]]], [[[4]]]]
    >>> dmp_grounds(ZZ(4), 3, -1)
    [4, 4, 4]

    r   c                    s   g | ]}t  qS r   ro   rr   r'   r   r   r   r,   l  r-   zdmp_grounds.<locals>.<listcomp>Nri   )r'   rc   r   r   rv   r   dmp_groundsV  s
    
rw   c                 C   s   | t| ||S )a/  
    Return ``True`` if ``LC(f)`` is negative.

    Examples
    ========

    >>> from sympy.polys.domains import ZZ
    >>> from sympy.polys.densebasic import dmp_negative_p

    >>> dmp_negative_p([[ZZ(1)], [-ZZ(1)]], 1, ZZ)
    False
    >>> dmp_negative_p([[-ZZ(1)], [ZZ(1)]], 1, ZZ)
    True

    )is_negativer   r   r   r   r   dmp_negative_po  s    ry   c                 C   s   | t| ||S )a/  
    Return ``True`` if ``LC(f)`` is positive.

    Examples
    ========

    >>> from sympy.polys.domains import ZZ
    >>> from sympy.polys.densebasic import dmp_positive_p

    >>> dmp_positive_p([[ZZ(1)], [-ZZ(1)]], 1, ZZ)
    True
    >>> dmp_positive_p([[-ZZ(1)], [ZZ(1)]], 1, ZZ)
    False

    )is_positiver   r   r   r   r   dmp_positive_p  s    r{   c                 C   s   | sg S t |  g  }}t|trLt|ddD ]}|| ||j q0n.|\}t|ddD ]}|| |f|j q^t|S )a5  
    Create a ``K[x]`` polynomial from a ``dict``.

    Examples
    ========

    >>> from sympy.polys.domains import ZZ
    >>> from sympy.polys.densebasic import dup_from_dict

    >>> dup_from_dict({(0,): ZZ(7), (2,): ZZ(5), (4,): ZZ(1)}, ZZ)
    [1, 0, 5, 0, 7]
    >>> dup_from_dict({}, ZZ)
    []

    r   )	r.   keysr9   intrj   r   getr   r6   r
   r   rc   hkr   r   r   dup_from_dict  s    
r   c                 C   sH   | sg S t |  g  }}t|ddD ]}|| ||j q&t|S )a  
    Create a ``K[x]`` polynomial from a raw ``dict``.

    Examples
    ========

    >>> from sympy.polys.domains import ZZ
    >>> from sympy.polys.densebasic import dup_from_raw_dict

    >>> dup_from_raw_dict({0: ZZ(7), 2: ZZ(5), 4: ZZ(1)}, ZZ)
    [1, 0, 5, 0, 7]

    r   )r.   r|   rj   r   r~   r   r6   r   r   r   r   dup_from_raw_dict  s    r   c                 C   s   |st | |S | st|S i }|  D ]@\}}|d |dd  }}||v rZ||| |< q&||i||< q&t| |d g   }}	}
t|ddD ]8}||}|dur|
t||	| q|
t|	 qt	|
|S )aF  
    Create a ``K[X]`` polynomial from a ``dict``.

    Examples
    ========

    >>> from sympy.polys.domains import ZZ
    >>> from sympy.polys.densebasic import dmp_from_dict

    >>> dmp_from_dict({(0, 0): ZZ(3), (0, 1): ZZ(2), (2, 1): ZZ(1)}, 1, ZZ)
    [[1, 0], [], [2, 3]]
    >>> dmp_from_dict({}, 0, ZZ)
    []

    r   r   Nr   )
r   r7   itemsr.   r|   rj   r~   r   dmp_from_dictr8   )r
   r   r   coeffsr   coeffheadtailrc   r+   r   r   r   r   r   r     s"    

r   Fc                 C   sZ   | s|rd|j iS t| d i  }}td|d D ]"}| ||  r2| ||  ||f< q2|S )z
    Convert ``K[x]`` polynomial to a ``dict``.

    Examples
    ========

    >>> from sympy.polys.densebasic import dup_to_dict

    >>> dup_to_dict([1, 0, 5, 0, 7])
    {(0,): 7, (2,): 5, (4,): 1}
    >>> dup_to_dict([])
    {}

    r   r   r   r   r   rj   r
   r   r   rc   resultr   r   r   r   dup_to_dict  s    
r   c                 C   sX   | s|rd|j iS t| d i  }}td|d D ] }| ||  r2| ||  ||< q2|S )z
    Convert a ``K[x]`` polynomial to a raw ``dict``.

    Examples
    ========

    >>> from sympy.polys.densebasic import dup_to_raw_dict

    >>> dup_to_raw_dict([1, 0, 5, 0, 7])
    {0: 7, 2: 5, 4: 1}

    r   r   r   r   r   r   r   dup_to_raw_dict  s    
r   c                 C   s   |st | ||dS t| |r2|r2d|d  |jiS t| ||d i   }}}|t krZd}td|d D ]6}t| ||  |}| D ]\}	}
|
||f|	 < qqh|S )a  
    Convert a ``K[X]`` polynomial to a ``dict````.

    Examples
    ========

    >>> from sympy.polys.densebasic import dmp_to_dict

    >>> dmp_to_dict([[1, 0], [], [2, 3]], 1)
    {(0, 0): 3, (0, 1): 2, (2, 1): 1}
    >>> dmp_to_dict([], 0)
    {}

    r   r   r   r   r   )r   r!   r   r#   r   rj   dmp_to_dictr   )r
   r   r   r   rc   r+   r   r   r   expr   r   r   r   r   /  s    
r   c           	      C   s   |dk s |dk s ||ks ||kr.t d| n||kr:| S t| |i  }}| D ]L\}}|||d| || f ||d |  || f ||d d  < qRt|||S )a  
    Transform ``K[..x_i..x_j..]`` to ``K[..x_j..x_i..]``.

    Examples
    ========

    >>> from sympy.polys.domains import ZZ
    >>> from sympy.polys.densebasic import dmp_swap

    >>> f = ZZ.map([[[2], [1, 0]], []])

    >>> dmp_swap(f, 0, 1, 2, ZZ)
    [[[2], []], [[1, 0], []]]
    >>> dmp_swap(f, 1, 2, 2, ZZ)
    [[[1], [2, 0]], [[]]]
    >>> dmp_swap(f, 0, 2, 2, ZZ)
    [[[1, 0]], [[2, 0], []]]

    r   z0 <= i < j <= %s expectedNr   )r0   r   r   r   )	r
   r)   r*   r   r   FHr   r   r   r   r   dmp_swapR  s     r   c                 C   sd   t | |i  }}| D ]>\}}dgt| }t||D ]\}	}
|	||
< q8||t|< qt|||S )at  
    Return a polynomial in ``K[x_{P(1)},..,x_{P(n)}]``.

    Examples
    ========

    >>> from sympy.polys.domains import ZZ
    >>> from sympy.polys.densebasic import dmp_permute

    >>> f = ZZ.map([[[2], [1, 0]], []])

    >>> dmp_permute(f, [1, 0, 2], 2, ZZ)
    [[[2], []], [[1, 0], []]]
    >>> dmp_permute(f, [1, 2, 0], 2, ZZ)
    [[[1], []], [[2, 0], []]]

    r   )r   r   r   zipr   r   )r
   Pr   r   r   r   r   r   new_expepr   r   r   dmp_permuteu  s    
r   c                 C   s,   t | tst| |S t|D ]
}| g} q| S )z
    Return a multivariate value nested ``l``-levels.

    Examples
    ========

    >>> from sympy.polys.domains import ZZ
    >>> from sympy.polys.densebasic import dmp_nest

    >>> dmp_nest([[ZZ(1)]], 2, ZZ)
    [[[[1]]]]

    )r9   r:   ro   rj   )r
   lr   r)   r   r   r   dmp_nest  s
    

r   c                    sP   s| S |s2| st S d fdd| D S |d  fdd| D S )a  
    Return a multivariate polynomial raised ``l``-levels.

    Examples
    ========

    >>> from sympy.polys.domains import ZZ
    >>> from sympy.polys.densebasic import dmp_raise

    >>> f = ZZ.map([[], [1, 2]])

    >>> dmp_raise(f, 2, 1, ZZ)
    [[[[]]], [[[1]], [[2]]]]

    r   c                    s   g | ]}t | qS r   ru   r%   )r   r   r   r,     r-   zdmp_raise.<locals>.<listcomp>c                    s   g | ]}t | qS r   )	dmp_raiser%   )r   r   r+   r   r   r,     r-   rq   )r
   r   r   r   r   )r   r   r   r+   r   r     s    r   c                 C   sj   t | dkrd| fS d}tt| D ]2}| | d  s8q$t||}|dkr$d| f  S q$|| dd| fS )a  
    Map ``x**m`` to ``y`` in a polynomial in ``K[x]``.

    Examples
    ========

    >>> from sympy.polys.domains import ZZ
    >>> from sympy.polys.densebasic import dup_deflate

    >>> f = ZZ.map([1, 0, 0, 1, 0, 0, 1])

    >>> dup_deflate(f, ZZ)
    (3, [1, 1, 1])

    r   r   N)r    rj   r   r   )r
   r   r/   r)   r   r   r   dup_deflate  s    
r   c                 C   s   t | |rd|d  | fS t| |}dg|d  }| D ](}t|D ]\}}t|| |||< qFq:t|D ]\}}|sld||< qlt|}tdd |D r|| fS i }	| D ](\}
}dd t|
|D }||	t|< q|t	|	||fS )a5  
    Map ``x_i**m_i`` to ``y_i`` in a polynomial in ``K[X]``.

    Examples
    ========

    >>> from sympy.polys.domains import ZZ
    >>> from sympy.polys.densebasic import dmp_deflate

    >>> f = ZZ.map([[1, 0, 0, 2], [], [3, 0, 0, 4]])

    >>> dmp_deflate(f, 1, ZZ)
    ((2, 3), [[1, 2], [3, 4]])

    )r   r   r   c                 s   s   | ]}|d kV  qdS r   Nr   r&   br   r   r   rQ     r-   zdmp_deflate.<locals>.<genexpr>c                 S   s   g | ]\}}|| qS r   r   r&   ar   r   r   r   r,     r-   zdmp_deflate.<locals>.<listcomp>)
r!   r   r|   	enumerater   r   allr   r   r   )r
   r   r   r   BMr)   mr   r   Ar   rf   r   r   r   dmp_deflate  s$    


r   c                    s   d | D ]n}t |dkr$d| f  S d}tt|D ]6}|| d  sHq4t||}|dkr4d| f    S q4t | q t fdd| D fS )aP  
    Map ``x**m`` to ``y`` in a set of polynomials in ``K[x]``.

    Examples
    ========

    >>> from sympy.polys.domains import ZZ
    >>> from sympy.polys.densebasic import dup_multi_deflate

    >>> f = ZZ.map([1, 0, 2, 0, 3])
    >>> g = ZZ.map([4, 0, 0])

    >>> dup_multi_deflate((f, g), ZZ)
    (2, ([1, 2, 3], [4, 0]))

    r   r   c                    s   g | ]}|d d   qS rO   r   )r&   r   Gr   r   r,   <  r-   z%dup_multi_deflate.<locals>.<listcomp>)r    rj   r   r   r   )polysr   r   r/   r)   r   r   r   dup_multi_deflate  s    
r   c                 C   s,  |st | |\}}|f|fS g dg|d   }}| D ]T}t||}t||s~| D ](}t|D ]\}	}
t||	 |
||	< q`qT|| q4t|D ]\}	}|sd||	< qt|}tdd |D r|| fS g }|D ]L}i }|	 D ](\}}dd t
||D }||t|< q|t||| q|t|fS )a  
    Map ``x_i**m_i`` to ``y_i`` in a set of polynomials in ``K[X]``.

    Examples
    ========

    >>> from sympy.polys.domains import ZZ
    >>> from sympy.polys.densebasic import dmp_multi_deflate

    >>> f = ZZ.map([[1, 0, 0, 2], [], [3, 0, 0, 4]])
    >>> g = ZZ.map([[1, 0, 2], [], [3, 0, 4]])

    >>> dmp_multi_deflate((f, g), 1, ZZ)
    ((2, 1), ([[1, 0, 0, 2], [3, 0, 0, 4]], [[1, 0, 2], [3, 0, 4]]))

    r   r   c                 s   s   | ]}|d kV  qdS r   r   r   r   r   r   rQ   f  r-   z$dmp_multi_deflate.<locals>.<genexpr>c                 S   s   g | ]\}}|| qS r   r   r   r   r   r   r,   o  r-   z%dmp_multi_deflate.<locals>.<listcomp>)r   r   r!   r|   r   r   r   r   r   r   r   r   )r   r   r   r   r   r   r   r   r
   r)   r   r   r   r   r   rf   r   r   r   dmp_multi_deflate?  s2    



r   c                 C   sd   |dkrt d| |dks | s$| S | d g}| dd D ]$}||jg|d   || q:|S )a  
    Map ``y`` to ``x**m`` in a polynomial in ``K[x]``.

    Examples
    ========

    >>> from sympy.polys.domains import ZZ
    >>> from sympy.polys.densebasic import dup_inflate

    >>> f = ZZ.map([1, 1, 1])

    >>> dup_inflate(f, 3, ZZ)
    [1, 0, 0, 1, 0, 0, 1]

    r   z'm' must be positive, got %sr   N)r0   extendr   r   )r
   r   r   r   r   r   r   r   dup_inflatew  s    
r   c                    s   |st | |  S | dkr0td|  |d |d   fdd| D } | d g}| dd D ]0}td| D ]}|t q|| qp|S )z)Recursive helper for :func:`dmp_inflate`.r   z!all M[i] must be positive, got %sr   c                    s   g | ]}t | qS r   )_rec_inflater%   r   r   r*   rC   r   r   r,     r-   z _rec_inflate.<locals>.<listcomp>N)r   r0   rj   r   r7   )r/   r   r+   r)   r   r   r   _r   r   r   r     s    
r   c                 C   s>   |st | |d |S tdd |D r*| S t| ||d|S dS )a3  
    Map ``y_i`` to ``x_i**k_i`` in a polynomial in ``K[X]``.

    Examples
    ========

    >>> from sympy.polys.domains import ZZ
    >>> from sympy.polys.densebasic import dmp_inflate

    >>> f = ZZ.map([[1, 2], [3, 4]])

    >>> dmp_inflate(f, (2, 3), 1, ZZ)
    [[1, 0, 0, 2], [], [3, 0, 0, 4]]

    r   c                 s   s   | ]}|d kV  qdS r   r   )r&   r   r   r   r   rQ     r-   zdmp_inflate.<locals>.<genexpr>N)r   r   r   )r
   r   r   r   r   r   r   dmp_inflate  s
    r   c                 C   s   |rt | d|rg | |fS g t| | }}td|d D ](}| D ]}|| rD q8qD|| q8|spg | |fS i } | D ]0\}}t|}t|D ]
}||= q|| t|< q||t	|8 }|t
| |||fS )a[  
    Exclude useless levels from ``f``.

    Return the levels excluded, the new excluded ``f``, and the new ``u``.

    Examples
    ========

    >>> from sympy.polys.domains import ZZ
    >>> from sympy.polys.densebasic import dmp_exclude

    >>> f = ZZ.map([[[1]], [[1], [2]]])

    >>> dmp_exclude(f, 2, ZZ)
    ([2], [[1], [1, 2]], 1)

    Nr   r   )rl   r   rj   r|   r   r   r:   rG   r   r   r   )r
   r   r   Jr   r*   r   r   r   r   r   dmp_exclude  s$    

r   c                 C   sl   |s| S t | |i  }} | D ]2\}}t|}|D ]}||d q4|| t|< q |t|7 }t| ||S )a  
    Include useless levels in ``f``.

    Examples
    ========

    >>> from sympy.polys.domains import ZZ
    >>> from sympy.polys.densebasic import dmp_include

    >>> f = ZZ.map([[1], [1, 2]])

    >>> dmp_include(f, [2], 1, ZZ)
    [[[1]], [[1], [2]]]

    r   )r   r   r:   insertr   r   r   )r
   r   r   r   r   r   r   r*   r   r   r   dmp_include  s    r   c                 C   s   t | |i  } }|jd }|  D ]@\}}| }| D ]&\}}	|rT|	||| < q:|	||| < q:q"|| d }
t||
|j|
fS )a  
    Convert ``f`` from ``K[X][Y]`` to ``K[X,Y]``.

    Examples
    ========

    >>> from sympy.polys.rings import ring
    >>> from sympy.polys.domains import ZZ
    >>> from sympy.polys.densebasic import dmp_inject

    >>> R, x,y = ring("x,y", ZZ)

    >>> dmp_inject([R(1), x + 2], 0, R.to_domain())
    ([[[1]], [[1], [2]]], 2)
    >>> dmp_inject([R(1), x + 2], 0, R.to_domain(), front=True)
    ([[[1]], [[1, 2]]], 2)

    r   )r   ngensr   to_dictr   dom)r
   r   r   frontr   r+   f_monomr/   g_monomr'   rC   r   r   r   
dmp_inject  s    
r   c                 C   s   t | |i  } }|j}||j d }|  D ]h\}}|rT|d| ||d  }	}
n|| d |d|   }	}
|
|v r|||
 |	< q,|	|i||
< q,| D ]\}}||||< qt||d |S )z
    Convert ``f`` from ``K[X,Y]`` to ``K[X][Y]``.

    Examples
    ========

    >>> from sympy.polys.domains import ZZ
    >>> from sympy.polys.densebasic import dmp_eject

    >>> dmp_eject([[[1]], [[1], [2]]], 2, ZZ['x', 'y'])
    [1, x + 2]

    r   N)r   r   r   r   )r
   r   r   r   r   rc   r+   r   r'   r   r   r   r   r   	dmp_eject;  s    r   c                 C   sL   t | |s| sd| fS d}t| D ]}|s4|d7 }q" q:q"|| d|  fS )a  
    Remove GCD of terms from ``f`` in ``K[x]``.

    Examples
    ========

    >>> from sympy.polys.domains import ZZ
    >>> from sympy.polys.densebasic import dup_terms_gcd

    >>> f = ZZ.map([1, 0, 1, 0, 0])

    >>> dup_terms_gcd(f, ZZ)
    (2, [1, 0, 1])

    r   r   N)r   rG   )r
   r   r)   r'   r   r   r   dup_terms_gcd_  s    
r   c                 C   s   t | ||st| |r&d|d  | fS t| |}tt|  }tdd |D rZ|| fS i } | D ]\}}|| t||< qf|t	| ||fS )a$  
    Remove GCD of terms from ``f`` in ``K[X]``.

    Examples
    ========

    >>> from sympy.polys.domains import ZZ
    >>> from sympy.polys.densebasic import dmp_terms_gcd

    >>> f = ZZ.map([[1, 0], [1, 0, 0], [], []])

    >>> dmp_terms_gcd(f, 1, ZZ)
    ((2, 1), [[1], [1, 0]])

    r   r   c                 s   s   | ]}|d kV  qdS )r   Nr   )r&   r/   r   r   r   rQ     r-   z dmp_terms_gcd.<locals>.<genexpr>)
r   r!   r   r   r:   r|   r   r   r   r   )r
   r   r   r   r   r   r   r   r   r   dmp_terms_gcd}  s    
r   c              	   C   s   t | |g  }}|sFt| D ]&\}}|s*q|||| f |f qn6|d }t| D ]$\}}|t||||| f  qV|S )z,Recursive helper for :func:`dmp_list_terms`.r   )r#   r   r   r   _rec_list_terms)r/   r+   r   rg   termsr)   r'   rC   r   r   r   r     s    r   c                 C   sJ   dd }t | |d}|s,d|d  |jfgS |du r8|S ||t|S dS )a  
    List all non-zero terms from ``f`` in the given order ``order``.

    Examples
    ========

    >>> from sympy.polys.domains import ZZ
    >>> from sympy.polys.densebasic import dmp_list_terms

    >>> f = ZZ.map([[1, 1], [2, 3]])

    >>> dmp_list_terms(f, 1, ZZ)
    [((1, 1), 1), ((1, 0), 1), ((0, 1), 2), ((0, 0), 3)]
    >>> dmp_list_terms(f, 1, ZZ, order='grevlex')
    [((1, 1), 1), ((1, 0), 1), ((0, 1), 2), ((0, 0), 3)]

    c                    s   t |  fddddS )Nc                    s    | d S )Nr   r   )termOr   r   <lambda>  r-   z.dmp_list_terms.<locals>.sort.<locals>.<lambda>T)keyreverse)sorted)r   r   r   r   r   sort  s    zdmp_list_terms.<locals>.sortr   r   r   N)r   r   r   )r
   r   r   orderr   r   r   r   r   dmp_list_terms  s    r   c           
      C   s   t | t | }}||krL||kr8|jg||  | }n|jg||  |  } g }t| |D ] \}}	||||	g|R   qZt|S )a8  
    Apply ``h`` to pairs of coefficients of ``f`` and ``g``.

    Examples
    ========

    >>> from sympy.polys.domains import ZZ
    >>> from sympy.polys.densebasic import dup_apply_pairs

    >>> h = lambda x, y, z: 2*x + y - z

    >>> dup_apply_pairs([1, 2, 3], [3, 2, 1], h, (1,), ZZ)
    [4, 5, 6]

    )r   r   r   r   r6   )
r
   r/   r   argsr   rc   r   r   r   r   r   r   r   dup_apply_pairs  s    r   c              
   C   s   |st | ||||S t| t||d   }}}||krj||krVt|| ||| }nt|| |||  } g }	t| |D ] \}
}|	t|
||||| qxt|	|S )aG  
    Apply ``h`` to pairs of coefficients of ``f`` and ``g``.

    Examples
    ========

    >>> from sympy.polys.domains import ZZ
    >>> from sympy.polys.densebasic import dmp_apply_pairs

    >>> h = lambda x, y, z: 2*x + y - z

    >>> dmp_apply_pairs([[1], [2, 3]], [[3], [2, 1]], h, (1,), 1, ZZ)
    [[4], [5, 6]]

    r   )r   r   rt   r   r   dmp_apply_pairsr8   )r
   r/   r   r   r   r   rc   r   r+   r   r   r   r   r   r   r     s    r   c                 C   s\   t | }||kr|| }nd}||kr0|| }nd}| || } | sHg S | |jg|  S dS )z=Take a continuous subsequence of terms of ``f`` in ``K[x]``. r   N)r   r   )r
   r   rc   r   r   r   rf   r   r   r   	dup_slice  s    

r   c                 C   s   t | ||d||S )z=Take a continuous subsequence of terms of ``f`` in ``K[X]``. r   )dmp_slice_in)r
   r   rc   r   r   r   r   r   	dmp_slice)  s    r   c           
      C   s   |dk s||kr"t d|||f |s4t| |||S t| |i  } }|  D ]b\}}|| }	|	|k sl|	|kr|d| d ||d d  }||v r||  |7  < qL|||< qLt|||S )zHTake a continuous subsequence of terms of ``f`` in ``x_j`` in ``K[X]``. r   z-%s <= j < %s expected, got %sNr   r   )r0   r   r   r   r   )
r
   r   rc   r*   r   r   r/   r   r   r   r   r   r   r   .  s     
r   c                    sD    fddt d| d D }|d s@ t|d< q |S )a  
    Return a polynomial of degree ``n`` with coefficients in ``[a, b]``.

    Examples
    ========

    >>> from sympy.polys.domains import ZZ
    >>> from sympy.polys.densebasic import dup_random

    >>> dup_random(3, -10, 10, ZZ) #doctest: +SKIP
    [-2, -8, 9, -4]

    c                    s   g | ]}  tqS r   )rX   randomrandint)r&   r   r   r   r   r   r   r,   T  r-   zdup_random.<locals>.<listcomp>r   r   )rj   rX   r   r   )rc   r   r   r   r
   r   r   r   
dup_randomF  s     r   )N)NF)NF)NF)F)F)N)V__doc__sympy.core.numbersr   
sympy.corer   sympy.polys.monomialsr   r   sympy.polys.orderingsr   r   r   r   r   r   r   r   r   r   r   r    r#   r$   r1   r2   r4   r6   r8   r?   rA   rF   rH   rJ   rK   rN   rP   rU   rV   r\   r]   r`   ra   rd   re   rh   r!   r7   rn   rp   rl   ro   rt   rw   ry   r{   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   <module>   s   
!

 !,


## !,'80"
%
$!
  #