K irdZddlmZddlmZmZddlmZddlZe dZ dZ dZ e xZ Ze xZZd Zd Zd Zd Zd ZdZdZdZdZdZdZdZdZdNdZdZdZ dZ!dZ"dZ#dZ$dZ%dZ&dZ'd Z(d!Z)d"Z*d#Z+d$Z,d%Z-d&Z.d'Z/d(Z0d)Z1d*Z2d+Z3d,Z4d-Z5d.Z6d/Z7d0Z8d1Z9dOd2Z:dOd3Z;dOd4Zd7Z?d8Z@d9ZAd:ZBd;ZCd<ZDd=ZEd>ZFd?ZGd@ZHdAZIdPdBZJdPdCZKdDZLdEZMdFZNdNdGZOdHZPdIZQdJZRdKZSdLZTdMZUy)QzEBasic tools for dense recursive polynomials in ``K[x]`` or ``K[X]``. )igcd) monomial_min monomial_div) monomial_keyNz-infc(|s |jS|dS)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 rzerofKs \/mnt/ssd/data/python-lab/Trading/venv/lib/python3.12/site-packages/sympy/polys/densebasic.pypoly_LCrs vv t c(|s |jS|dS)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 rr s r poly_TCr$s vv u rcF|rt||}|dz}|rt||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_LCdup_LCr ur s r dmp_ground_LCr=. 1aL Q  !Q<rcF|rt||}|dz}|rt||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_TCdup_TCrs r dmp_ground_TCrTrrcg}|r*|jt|dz |d|dz }}|r*|s|jdn|jt|dz t|t||fS)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) rr)appendlentupler)r rr monoms r dmp_true_LTr$kso E  SVaZ tQU1   Q SVaZ <1 %%rc.|stSt|dz 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 s r dup_degreer(s$  q6A:rcBt||rtSt|dz 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 rs r dmp_degreer,s!*!Q 1vzrclk(r t|Sdz dzctfd|DS)z4Recursive helper function for :func:`dmp_degree_in`.rc3:K|]}t|ywN)_rec_degree_in).0cijvs r z!_rec_degree_in..s5a~aAq)5s)r,max)gr5r3r4s ```r r0r0s;Av!Q q5!a%DAq 515 55rcp|s t||S|dks||kDrtd|d|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 rz 0 <= j <=  expected, got )r, IndexErrorr0)r r4rs r dmp_degree_inr<sB$ !Q1uAAqABB !Q1 %%rct||t||||<|dkDr |dz |dz}}|D]}t||||yy)z-Recursive helper for :func:`dmp_degree_list`.rrN)r7r,_rec_degree_list)r8r5r3degsr2s r r>r>sW$q':a+,DG1u1ua!e1 ,A Q1d + , rcNtg|dzz}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) rr)r&r>r")r rr?s r dmp_degree_listrAs+ 61q5>DQ1d# ;rcB|r|dr|Sd}|D] }|rn|dz } ||dS)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] rrN)r r3cfs r dup_striprEsB ! A  FA  QR5Lrc|s t|St||r|Sd|dz }}|D]}t||sn|dz }|t|k(r t|S||dS)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]] rrN)rEr*r!dmp_zero)r rr3r5r2s r dmp_striprHst |!Q a!eqA !Q  FA   CF{{u rct|ts6|.|j|st|d|d|j|dz hS|s|hSt }|D]}|t |||dz|z}|S)z*Recursive helper for :func:`dmp_validate`.z in z in not of type r) isinstancelistof_type TypeErrordtypeset _rec_validate)r r8r3r levelsr2s r rPrP;s| a  =1Aq!''JK KAw s  4A mAq!a%3 3F 4 rc x|s t|S|dz }t|Dcgc]}t||c}|Scc}w)z(Recursive helper for :func:`_rec_strip`.r)rErH _rec_strip)r8r5wr2s r rSrSMs: | AA 4Az!Q'4a 884s7ctt||d|}|j}|st|||fStd)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 rz4invalid data structure for a multivariate polynomial)rPpoprS ValueError)r r rQrs r dmp_validaterXWsF$1aA &F A !Q"" BD Drc<ttt|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] )rErKreversedr's r dup_reverser[ts T(1+& ''rct|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] )rKr's r dup_copyr]s 7Nrcd|s t|S|dz }|Dcgc]}t||c}Scc}w)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)rKdmp_copy)r rr5r2s r r_r_s3 Aw AA%& (Xa^ (( (s-ct|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's r dup_to_tuplerbs $ 8OrcP|s t|S|dz tfd|DS)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)) rc36K|]}t|ywr/) dmp_to_tuple)r1r2r5s r r6zdmp_to_tuple..s/a#/sra)r rr5s @r reres+$ Qx AA /Q/ //rc\t|Dcgc]}|j|c}Scc}w)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] )rEnormalr r r2s r dup_normalris% A/qqxx{/ 00/)c ||s t||S|dz }t|Dcgc]}t|||c}|Scc}w)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)rirH dmp_normalr rr r5r2s r rlrlsA !Q AA A7qz!Q*7 ;;79c p|||k(r|St|Dcgc]}|j||c}Scc}w)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] )rEconvert)r K0K1r2s r dup_convertrss8& ~"(a92::a,9::9s3c |s t|||S|||k(r|S|dz }t|Dcgc]}t||||c}|Scc}w)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]] r)rsrH dmp_convert)r rrqrrr5r2s r ruru sU& 1b"%% ~"( AA !=Q{1aR0=q AA=sAc\t|Dcgc]}|j|c}Scc}w)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 )rE from_sympyrhs r dup_from_sympyrx=s% 31q||A3 443rjc ||s t||S|dz }t|Dcgc]}t|||c}|Scc}w)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)rxrHdmp_from_sympyrms r rzrzOsA a## AA ;1~aA.;Q ??;rnc~|dkrtd|z|t|k\r |jS|t||z 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)r;r!r r()r nr s r dup_nthr~fsD$ 1u;a?@@ c!fvv A"##rc|dkrtd|z|t|k\rt|dz S|t|||z 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) [] rr|r)r;r!rGr,)r r}rr s r dmp_nthrsL$ 1u;a?@@ c!fAAq!A%&&rc|}|D]U}|dkrtd|z|t|k\r|jcSt||}|tk(rd}|||z |dz }}W|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 rz `n` must be non-negative, got %irr)r;r!r r,r&)r Nrr r5r}ds r dmp_ground_nthrsx A  # q5?!CD D #a&[66M1a ADyQU8QUqA # HrcD|rt|dk7ry|d}|dz}|r| 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 rFr)r!r+s r r*r*s5 q6Q; aD Q 5Lrc0g}t|D]}|g}|S)z Return a multivariate zero. Examples ======== >>> from sympy.polys.densebasic import dmp_zero >>> dmp_zero(4) [[[[[]]]]] )range)rrr3s r rGrGs* A 1X C Hrc0t||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_poners r dmp_one_prs 155! $$rc.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_groundr)rr s r dmp_oners aeeQ rc||s t||S|rt|dk7ry|d}|dz}|r|t|dkS||gk(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 rFr)r*r!)r r2rs r rr s` }Q!Q q6Q; aD Q  y1v{QCxrcL|s t|St|dzD]}|g}|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)rGr)r2rr3s r rr(s6 { 1q5\ C Hrc|sgS|dkr|jg|zSt|Dcgc] }t|c}Scc}w)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)r rrG)r}rr r3s r dmp_zerosr@s?  1uxz&+Ah0!000s<cp|sgS|dkr|g|zSt|Dcgc]}t||c}Scc}w)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)rr)r2r}rr3s r dmp_groundsrYs=  1us1u +085aAq!555s3c:|jt|||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_negativerrs r dmp_negative_prr ==q!Q/ 00rc:|jt|||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_positiverrs r dmp_positive_prrrc|sgSt|jg}}t|trHt |ddD]-}|j |j ||j/t|S|\}t |ddD].}|j |j |f|j0t|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) r7keysrJintrr getr rEr r r}hks r dup_from_dictrs  qvvx="qA!Sq"b! 'A HHQUU1aff% & ' Q< q"b! *A HHQUUA4( ) * Q<rc|sgSt|jg}}t|ddD]-}|j|j ||j /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)r7rrr rr rErs r dup_from_raw_dictrs^  qvvx="qA 1b" # q!&&!"# Q<rc|s t||S|s t|Si}|jD]#\}}|d|dd}}||vr ||||<||i||<%t|j |dz g} } }t |ddD]L} |j | }|| jt|| |3| jt| Nt| |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) [] rrNr) rrGitemsr7rrrr dmp_from_dictrH) r rr coeffsr#coeffheadtailr}r5rrs r rrs Q"" { F + u1XuQRyd 6>!&F4L !5?F4L +&++- !a%!qA 1b" " 1    HH]5!Q/ 0 HHXa[ ! " Q?rc|s|rd|jiSt|dz i}}td|dzD]}|||z s |||z ||f<|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([]) {} rrrr r!rr r r r}resultrs r dup_to_dictrsf aff~A BvA 1a!e_$ QU8QU8FA4L$ Mrc|s|rd|jiSt|dz i}}td|dzD]}|||z s |||z ||<|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} rrrrs r dup_to_raw_dictrsd 166{A BvA 1a!e_! QU8!a%F1I! Mrc4|st|||St||r|rd|dzz|jiSt|||dz i}}}|tk(rd}t d|dzD]5}t |||z |}|jD]\} } | ||f| z<7|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) {} rrrrr)rr*r r,r&r dmp_to_dictr) r rr r r}r5rrrexprs r rr2s 1ad++!QDa!e aff%%a#QUB&qADy  1a!e_' !a%! $'') 'JC!&FA4#:  '' Mrc |dks|dks ||kDs||kDrtd|z||k(r|St||i}}|jD]-\}}|||d|||fz||dz|z||fz||dzdz</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], []]] rz0 <= i < j <= %s expectedNr)r;rrr) r r3r4rr FHrrs r dmp_swaprUs( 1uAQ!a%4q899 a q! bqAggi+ U&+ #bq'SVI  a!eA,  q6) !a%&k " #+ Aq !!rct||i}}|jD];\}}dgt|z}t||D] \} } | || < ||t |<=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)rrr!zipr"r) r Prr rrrrnew_expeps r dmp_permuterxs$ q! bqAggi" U#c#h,QK DAqGAJ "%. " Aq !!rcdt|ts t||St|D]}|g}|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]]]] )rJrKrr)r lr r3s r dmp_nestrs< a !Q 1X C Hrc |s|S|s,|s t|S|dz }|Dcgc]}t||c}S|dz }|Dcgc]}t||||c}Scc}wcc}w)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)rGr dmp_raise)r rrr rr2r5s r rrsl  A;  E+,.aAq!.. AA,- /qYq!Q " // / 0s AAct|dkrd|fSd}tt|D]#}|| dz s t||}|dk(sd|fcS||dd|fS)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]) rrN)r(rr!r)r r r8r3s r dup_deflaterst !}!t  A 3q6]!ay  AJ 6a4K a!f9rct||r d|dzz|fSt||}dg|dzz}|jD]'}t|D]\}}t |||||<)t|D] \}}|r d||<t |}t d|Dr||fSi} |jD]4\} } t| |D cgc] \} }| |z } } }| | t | <6|t| ||fScc}} w)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]]) )rrrc3&K|] }|dk( ywrNrCr1bs r r6zdmp_deflate.. a16 ) r*rr enumeraterr"allrrr)r rr rBMr3mrrArars r dmp_deflaters( !QQU|QAqA QU A VVX!aL !DAq!a=AaD !!! 1AaD aA 1 !t  AGGI5!$Q ,Aa1f , ,%(  mAq!$ $$ -s C:c d}|D]`}t|dkrd|fcSd}tt|D]%}|| dz s t||}|dk(sd|fccSt||}b|t |Dcgc] }|dd| c}fScc}w)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])) rrN)r(rr!rr")polysr Grr8r3s r dup_multi_deflaters" A  a=A e8O s1v AaR!V9Q AAv%x  AJ" ee-a!f-. ..-s2B c|st||\}}|f|fSgdg|dzz}}|D]e}t||}t||s:|jD]'}t |D]\} } t || | || <)|j |gt |D] \} } | r d|| <t|}td|Dr||fSg}|D]g}i} |jD]4\} }t| |D cgc] \}} || z }}} || t|<6|j t| ||i|t|fScc} }w)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]])) rrc3&K|] }|dk( ywrrCrs r r6z$dmp_multi_deflate..irr) rrr*rrrr r"rrrr)rrr rrrrrr r3rrrrrrrs r dmp_multi_deflaterBsy"  *1tQw sAE{qA  1 !QVVX )%aL)DAq!a=AaD) )  ! 1AaD aA 1 %x A )   HAu%(AY0TQ!q&0A0AeAhK  q!Q'() eAh; 1s6E c|dkrtd|z|dk(s|s|S|dg}|ddD]5}|j|jg|dz z|j|7|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] rz'm' must be positive, got %srN)r;extendr r )r rr rrs r dup_inflaterzsx  Av7!;<<AvQdVF12 qvvhA&' e Mrc P|st||||S||dkrtd||z|dz |dz}}|Dcgc]}t|||||}}|dg}|ddD]A} td||D]} |j t ||j | C|Scc}w)z)Recursive helper for :func:`dmp_inflate`.rz!all M[i] must be positive, got %srN)rr; _rec_inflaterr rG) r8rr5r3r rTr4r2rr_s r rrs 1adA&&tqy>> 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]] rc3&K|] }|dk( ywrrC)r1rs r r6zdmp_inflate..rr)rrr)r rrr s r dmp_inflaters@ 1adA&& 1 Aq!Q**rc|r t|d|rg||fSgt||}}td|dzD]/}|jD] }||s |j |1|sg||fSi}|j D]1\}}t |}t|D]}||=||t|<3|t|z}|t||||fS)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) Nrr) rrrrr rrKrZr"r!r)r rr Jrr4r#rs r dmp_excluders$ Qa(1ax {1a qA 1a!e_VVX EQx  HHQK  1ax A  uU ! Aa  %,  QKA mAq!$a ''rc|s|St||i}}|jD]7\}}t|}|D]}|j|d||t |<9|t |z }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)rrrKinsertr"r!r)r rrr rr#rr4s r dmp_includers  q! bqA  uU  A LLA   %,  QKA Aq !!rc$t||i}}|jdz }|jD]@\}}|j}|jD]\}} |r | |||z<| |||z<B||zdz} t || |j | fS)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)rngensrto_dictrdom) r rr frontrr5f_monomr8g_monomr2rTs r dmp_injectrs& q! bqA ! Aggi)  IIK'') )JGQ'('G#$'('G#$  )) A A Aquu %q ((rcJt||i}}|j}||jz dz}|jD]2\}}|r |d|||d} } n || d|d| } } | |vr ||| | <,| |i|| <4|jD]\}}||||<t||dz |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] rN)rrrr) r rr rrr}r5r#r2rrs r dmp_ejectr>s q! bqA A AGG aAGGI &q $Ray%)WG$aRSz51":WG a<"#AgJw !1AgJ &GGIqQ4% AE1 %%rclt||s|sd|fSd}t|D] }|s|dz } n||d| fS)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]) rrN)rrZ)r r r3r2s r dup_terms_gcdrbsS a|1!t  A a[ FA   a!f9rc:t|||s t||r d|dzz|fSt||}tt |j }t d|Dr||fSi}|jD]\}}||t||<|t|||fS)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]]) rrc3&K|] }|dk( yw)rNrC)r1r8s r r6z dmp_terms_gcd..rr) rr*rrrKrrrrr)r rr rrr#rs r dmp_terms_gcdrs Q1Aq!1QU|QAqAd1668n%A 1 !t  A * u$),ua !* mAq!$ $$rc t||g}}|s2t|D]"\}}|s |j|||z fz|f$|S|dz }t|D](\}}|jt |||||z fz*|S)z,Recursive helper for :func:`dmp_list_terms`.r)r,rr r_rec_list_terms)r8r5r#rtermsr3r2rTs r rrs!QuA aL 0DAq LL%1q5(*A. /  0 L EaL BDAq LLAuAx/?@ A B Lrc|d}t||d}|sd|dzz|jfgS||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&t|fddS)Nc|dS)NrrC)termOs r z.dmp_list_terms..sort..saQjrT)keyreverse)sorted)rrs `r sortzdmp_list_terms..sortse!8$GGrrCrr)rr r)r rr orderr rs r dmp_list_termsr sQ$H Aq" %E q1uqvv&'' } E<.//rct|t|}}||k7r2||kDr|jg||z z|z}n|jg||z z|z}g}t||D]\}} |j||| g| 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 rr rE) r r8rargsr r}rrrrs r dup_apply_pairsrs q63q6qAAv q5!a% 1$A!a% 1$A FAq &1 a1ntn%& V rc >|st|||||St|t||dz }}}||k7r,||kDrt||z |||z}nt||z |||z}g} t||D]$\} } | j t | | ||||&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)rr!rrr dmp_apply_pairsrH) r r8rrrr r}rr5rrrs r rrs q!Qa00!fc!fa!e!qAAv q5!a%A&*A!a%A&*A FAq <1 oaAtQ:;< VQ rct|}||k\r||z }nd}||k\r||z }nd}|||}|r8|d|jk(r&|jd|r|d|jk(r&|sgS||jg|zzS)z=Take a continuous subsequence of terms of ``f`` in ``K[x]``. r)r!r rV)r rr}r rrrs r dup_slicers AAAv E Av E  !AA ! a !  AFF8A:~rc"t|||d||S)z=Take a continuous subsequence of terms of ``f`` in ``K[X]``. r) dmp_slice_in)r rr}rr s r dmp_slicer/s 1aAq ))rc2|dks||kDrtd|d|d||st||||St||i}}|jD]<\}}||} | |ks| |k\r|d|dz||dzdz}||vr||xx|z cc<8|||<>t |||S)zHTake a continuous subsequence of terms of ``f`` in ``x_j`` in ``K[X]``. r-z <= j < r:Nrr)r;rrrr) r rr}r4rr r8r#rrs r rr4s1uAQ1EFF Aq!$$ q! bqA  u !H q5AF"1I$uQUV}4E A: eH HAeH  Aq !!rc td|dzDcgc]'}|jtj||)}}|ds.|jtj|||d<|ds.|Scc}w)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] rr)rrprandomrandint)r}rrr rr s r dup_randomrLso49AE?Da!))FNN1a( )DADdyy1-.!d H Es,A5r/)NF)F)V__doc__ sympy.corersympy.polys.monomialsrrsympy.polys.orderingsrrfloatr&rrrrrrrrr$r(r,r0r<r>rArErHrPrSrXr[r]r_rbrerirlrsrurxrzr~rrr*rGrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr rrrrrrrCrr r#sK<.  V},*..&<.66&4,*6B$9D:(&&)0*021"<,;2B:5$@.$4'4 @2 *%" "< 012621&1&B2)X62 F "F"> .0@B)%X$/N5p<,+2-(`"D")J!&H<%B&0@@  F0* "0 r