o
    ohr                     @   s  d Z ddlmZ ddlmZmZ ddlmZ ddlZe	d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]``.     )igcd)monomial_minmonomial_div)monomial_keyNz-infc                 C      | s|j 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   zerofK r   j/var/www/html/construction_image-detection-poc/venv/lib/python3.10/site-packages/sympy/polys/densebasic.pypoly_LC      r   c                 C   r   )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

    r   r	   r   r   r   poly_TC$   r   r   c                 C   $   |rt | |} |d8 }|s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=   
   

r   c                 C   r   )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_TCT   r   r   c                 C   sd   g }|r| t| d  | d |d } }|s| 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_LTk   s   r!   c                 C   s   | st S t| d S )a?  
    Return the leading degree of ``f`` in ``K[x]``.

    Note that the degree of 0 is negative infinity (``float('-inf')``).

    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   )ninfr   r
   r   r   r   
dup_degree   s   r$   c                 C   s   t | |rtS t| d S )ay  
    Return the leading degree of ``f`` in ``x_0`` in ``K[X]``.

    Note that the degree of 0 is negative infinity (``float('-inf')``).

    Examples
    ========

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

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

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

    >>> dmp_degree(f, 1)
    1

    r   )
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                 3   s    | ]
}t | V  qd S N)_rec_degree_in.0cijvr   r   	<genexpr>   s    z!_rec_degree_in.<locals>.<genexpr>)r'   max)gr0   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
   
r5   c                 C   sR   t || t| |||< |dkr%|d |d }}| D ]}t|||| qdS dS )z-Recursive helper for :func:`dmp_degree_list`.r   r   N)r2   r'   _rec_degree_list)r3   r0   r.   degsr,   r   r   r   r6      s   r6   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"   r6   r   )r
   r   r7   r   r   r   dmp_degree_list   s   r8   c                 C   s:   | r| d r| S d}| D ]
}|r n|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   
r:   c                 C   sh   |st | S t| |r| S d|d }}| D ]}t||s n|d7 }q|t| kr.t|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)r:   r%   r   dmp_zero)r
   r   r.   r0   r,   r   r   r   	dmp_strip  s   


r<   c                 C   sn   t |ts|dur||std|| |jf |d hS |s"|hS t }|D ]}|t| ||d |O }q'|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
   r3   r.   r   levelsr,   r   r   r   rC   ;  s   

rC   c                    s,   |st | S |d  t fdd| D |S )z(Recursive helper for :func:`_rec_strip`.r   c                       g | ]}t | qS r   )
_rec_stripr*   wr   r   
<listcomp>T      z_rec_strip.<locals>.<listcomp>)r:   r<   )r3   r0   r   rG   r   rF   M  s   rF   c                 C   s0   t | | d|}| }|st| ||fS td)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 polynomial)rC   poprF   
ValueError)r
   r   rD   r   r   r   r   dmp_validateW  s   rM   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]

    )r:   r>   reversedr#   r   r   r   dup_reverset  s   rO   c                 C      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   rR   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                    rE   r   )dmp_copyr*   r0   r   r   rI     rJ   zdmp_copy.<locals>.<listcomp>rQ   r&   r   rT   r   rS     s   rS   c                 C   rP   )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   rV   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 r(   )dmp_to_tupler*   rT   r   r   r1     s    zdmp_to_tuple.<locals>.<genexpr>rU   r&   r   rT   r   rW     s   rW   c                       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, 2, 3], ZZ)
    [1, 2, 3]

    c                       g | ]}  |qS r   )normalr*   r   r   r   rI     rJ   zdup_normal.<locals>.<listcomp>r:   r	   r   r[   r   
dup_normal  s   r]   c                    0   |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, 2]], 1, ZZ)
    [[1, 2]]

    r   c                       g | ]}t | qS r   )
dmp_normalr*   r   r0   r   r   rI         zdmp_normal.<locals>.<listcomp>)r]   r<   r   r   ra   r   r`     s   
r`   c                    s,    dur
 kr
| S 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 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   rI     rb   zdup_convert.<locals>.<listcomp>r\   )r
   re   rf   r   rd   r   dup_convert  s   rg   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*   re   rf   r0   r   r   rI   :      zdmp_convert.<locals>.<listcomp>)rg   r<   )r
   r   re   rf   r   ri   r   rh      s   rh   c                    rX   )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                    rY   r   )
from_sympyr*   r[   r   r   rI   L  rJ   z"dup_from_sympy.<locals>.<listcomp>r\   r	   r   r[   r   dup_from_sympy=  s   rl   c                    r^   )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                    r_   r   )dmp_from_sympyr*   ra   r   r   rI   c  rb   z"dmp_from_sympy.<locals>.<listcomp>)rl   r<   r   r   ra   r   rm   O  s   
rm   c                 C   s6   |dk r
t d| |t| kr|jS | t| |  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 %i)r4   r   r   r$   )r
   nr   r   r   r   dup_nthf  s
   rp   c                 C   s>   |dk r
t d| |t| krt|d S | t| ||  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   rn   r   )r4   r   r;   r'   )r
   ro   r   r   r   r   r   dmp_nth  s
   rq   c                 C   sh   |}|D ]-}|dk rt d| |t| kr|j  S t| |}|tkr&d}| ||  |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   )r4   r   r   r'   r"   )r
   Nr   r   r0   ro   dr   r   r   dmp_ground_nth  s   

rt   c                 C   s.   |rt | dkr
dS | d } |d8 }|s|  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   r;     s   r;   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   rz   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_groundry   )r   r   r   r   r   dmp_one  s   r|   c                 C   s\   |dur|st | |S |rt| dkrdS | d } |d8 }|s|du r)t| dkS | |gk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   rx   
  s   

rx   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   )r;   rv   )r,   r   r.   r   r   r   r{   (  s
   r{   c                    s2   | sg S  dk r|j g|  S  fddt| 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   r;   r+   r.   r   r   r   rI   V  s    zdmp_zeros.<locals>.<listcomp>)r   rv   )ro   r   r   r   r   r   	dmp_zeros@  s
   r   c                    s2   |sg S dk r g| S  fddt |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   r{   r~   r,   r   r   r   rI   o  rJ   zdmp_grounds.<locals>.<listcomp>ru   )r,   ro   r   r   r   r   dmp_groundsY  s
   
r   c                 C      | 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_pr     r   c                 C   r   )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  r   r   c                 C   s   | sg S t |  g }}t|tr)t|ddD ]}|| ||j qt|S |\}t|ddD ]}|| |f|j q2t|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   )	r2   keysr=   intrv   r   getr   r:   r
   r   ro   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   )r2   r   rv   r   r   r   r:   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 r-||| |< q||i||< qt| |d g }}	}
t|ddD ]}||}|dur]|
t||	| qH|
t|	 qHt	|
|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   r;   itemsr2   r   rv   r   r   dmp_from_dictr<   )r
   r   r   coeffsr    coeffheadtailro   r0   r   r   r   r   r   r     s"   


r   Fc                 C   sZ   | s	|r	d|j iS t| d i }}td|d D ]}| ||  r*| ||  ||f< q|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   rv   r
   r   r   ro   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 ]}| ||  r)| ||  ||< q|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| |r|rd|d  |jiS t| ||d i }}}|tkr,d}td|d D ]}t| ||  |}| D ]\}	}
|
||f|	 < qBq3|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"   rv   dmp_to_dictr   )r
   r   r   r   ro   r0   r   r   r   expr   r   r   r   r   2  s   r   c           	      C   s   |dk s|dk s||ks||krt d| ||kr| S t| |i }}| D ]&\}}|||d| || f ||d |  || f ||d d  < q(t|||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   )r4   r   r   r   )	r
   r.   r/   r   r   FHr   r   r   r   r   dmp_swapU  s    r   c                 C   sd   t | |i }}| D ]\}}dgt| }t||D ]\}	}
|	||
< q||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_permutex  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]]]]

    )r=   r>   r{   rv   )r
   lr   r.   r   r   r   dmp_nest  s
   

r   c                    sP   s| S |s| 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                    rE   r   r   r*   )r   r   r   rI     rJ   zdmp_raise.<locals>.<listcomp>c                    s   g | ]	}t | qS r   )	dmp_raiser*   )r   r   r0   r   r   rI     rj   r}   )r
   r   r   r   r   )r   r   r   r0   r   r     s   r   c                 C   sj   t | dkr
d| fS d}tt| D ]}| | d  sq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$   rv   r   r   )r
   r   r3   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|| |||< q#qt|D ]
\}}|s@d||< q6t|}tdd |D rR|| fS i }	| D ]\}
}dd t|
|D }||	t|< qX|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       | ]}|d kV  qdS r   Nr   r+   br   r   r   r1         zdmp_deflate.<locals>.<genexpr>c                 S      g | ]\}}|| qS r   r   r+   ar   r   r   r   rI     rb   zdmp_deflate.<locals>.<listcomp>)
r%   r   r   	enumerater   r   allr   r   r   )r
   r   r   r   BMr.   mr   r   Ar   rr   r   r   r   dmp_deflate  s(   

r   c                    s   d | D ]7}t |dkrd| f  S d}tt|D ]}|| d  s$qt||}|dkr5d| f    S qt | 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 r(   r   )r+   r   Gr   r   rI   ?  rj   z%dup_multi_deflate.<locals>.<listcomp>)r$   rv   r   r   r   )polysr   r   r3   r.   r   r   r   dup_multi_deflate  s   
r   c                 C   s,  |st | |\}}|f|fS g dg|d  }}| D ]*}t||}t||s?| D ]}t|D ]\}	}
t||	 |
||	< q0q*|| qt|D ]
\}	}|sSd||	< qIt|}tdd |D re|| fS g }|D ]&}i }|	 D ]\}}dd t
||D }||t|< qq|t||| qi|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   r   r   r   r   r   r   r   r1   i  r   z$dmp_multi_deflate.<locals>.<genexpr>c                 S   r   r   r   r   r   r   r   rI   r  rb   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   rr   r   r   r   dmp_multi_deflateB  s6   


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)r4   extendr   r   )r
   r   r   r   r   r   r   r   dup_inflatez  s   
r   c                    s   |s
t | |  S | dkrtd|  |d |d  fdd| D } | d g}| dd D ]}td| D ]	}|t qA|| q8|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/   rH   r   r   rI     s    z _rec_inflate.<locals>.<listcomp>N)r   r4   rv   r   r;   )r3   r   r0   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 )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   r   r   r   )r+   r   r   r   r   r1     r   zdmp_inflate.<locals>.<genexpr>)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 ]}|| r* nq"|| q|s8g | |fS i } | D ]\}}t|}t|D ]}||= qJ|| 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   )rx   r   rv   r   r   r   r>   rN   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 ]\}}t|}|D ]}||d q|| 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 ]\}}	|r*|	||| < 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   r0   f_monomr3   g_monomr,   rH   r   r   r   
dmp_inject  s   
r   c                 C   s   t | |i } }|j}||j d }|  D ]4\}}|r*|d| ||d }	}
n|| d |d|  }	}
|
|v rD|||
 |	< q|	|i||
< q| D ]
\}}||||< qOt||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   ro   r0   r    r,   r   r   r   r   r   	dmp_eject>  s   r   c                 C   sH   t | |s| sd| fS d}t| D ]	}|s|d7 }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   rN   )r
   r   r.   r,   r   r   r   dup_terms_gcdb  s   
r   c                 C   s   t | ||st| |rd|d  | fS t| |}tt|  }tdd |D r-|| fS i } | D ]\}}|| t||< q3|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   r   )r   Nr   )r+   r3   r   r   r   r1     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 }}|s$t| D ]\}}|sq|||| f |f q|S |d }t| D ]\}}|t||||| f  q,|S )z,Recursive helper for :func:`dmp_list_terms`.r   )r'   r   r   r   _rec_list_terms)r3   r0   r    rs   termsr.   r,   rH   r   r   r   r     s   r   c                 C   sF   dd }t | |d}|sd|d  |jfgS |du r|S ||t|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>  s    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r&||kr|jg||  | }n
|jg||  |  } g }t| |D ]\}}	||||	g|R   q-t|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   r:   )
r
   r3   r   argsr   ro   r   r   r   r   r   r   r   dup_apply_pairs  s   r   c              
   C   s   |s
t | ||||S t| t||d }}}||kr5||kr+t|| ||| }n
t|| |||  } g }	t| |D ]\}
}|	t|
||||| q<t|	|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   r   r   r   dmp_apply_pairsr<   )r
   r3   r   r   r   r   ro   r   r0   r   r   r   r   r   r   r     s   
r   c                 C   s   t | }||kr|| }nd}||kr|| }nd}| || } | r7| d |jkr7| d | r7| d |jks)| s;g S | |jg|  S )z=Take a continuous subsequence of terms of ``f`` in ``K[x]``. r   )r   r   rK   )r
   r   ro   r   r   r   rr   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   ro   r   r   r   r   r   	dmp_slice/  s   r   c           
      C   s   |dk s||krt d|||f |st| |||S t| |i } }|  D ]1\}}|| }	|	|k s6|	|krF|d| d ||d d  }||v rS||  |7  < q&|||< q&t|||S )zHTake a continuous subsequence of terms of ``f`` in ``x_j`` in ``K[X]``. r   z-%s <= j < %s expected, got %sNr   r   )r4   r   r   r   r   )
r
   r   ro   r/   r   r   r3   r    r   r   r   r   r   r   4  s    
r   c                    sJ    fddt d| d D }|d s# t|d< |d r|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   )rc   randomrandint)r+   r   r   r   r   r   r   rI   Z  s    zdup_random.<locals>.<listcomp>r   r   )rv   rc   r   r   )ro   r   r   r   r
   r   r   r   
dup_randomL  s
    r   r(   )NF)F)V__doc__
sympy.corer   sympy.polys.monomialsr   r   sympy.polys.orderingsr   r   floatr"   r   r   r   r   r   r   r   r   r!   r$   r'   r)   r5   r6   r8   r:   r<   rC   rF   rM   rO   rR   rS   rV   rW   r]   r`   rg   rh   rl   rm   rp   rq   rt   r%   r;   rz   r|   rx   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   r   r   r   r   <module>   s    
!

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