K i`C UdZddlmZddlmZddlmZmZmZm Z m Z m Z m Z m Z ddlmZmZddlmZddlmZmZddlmZdd lZid d d d ddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5 Zd6Zej6d7ej8ZdRd8Zd9Zd:Z d;Z!d<Z"eDcgc] }e#| c}Z$ed=d>Dcgc] }e%| c}Z&d?Z'd@Z(dAZ)dBZ*dCZ+dDZ,dEZ-dFZ.dGZ/dHZ0e,Z1e.Z2e0Z3dIZ4GdJdKZ5GdLdMZ6dNe7dO<edPk(rdd l8Z8e8jre8jtfZ;y ddQlz_nsort..(s*qq{{*rc3HK|]}|D]}|jdk(yw)rBN)_prec)r=rrs r>r?z_nsort..0s$CqCAagglClCs "z%could not compute root with precision) allNotImplementedErrorlen as_real_imagr anysortedzipappendlist)roots separatedr/rkeyim_r3s r>_nsortrSs4 *E* *!! u:"r0R0JO OAann.> ?ACCF   !! $ ? OC O 5zA~#CCCC!"IJJ-0 1TQA1a 1C 1 S% !C    MJRA    !t CyHAu ;% @ O 2sD,)D' 1D,)D2'D,c t|}idc|4i|jct|jD] \}}|dz|<fd} t ||}t |S#t $r Yt |SwxYw)z1Sort generators in a reasonably intelligent way. NrBcft|}" t j|z|dfStj |j \}}|r t|}nd} |||fS#t$rYJwxYw#t$rYnwxYw t|||fS#t$rYnwxYwt||fS)Nr) strrGindex ValueError_re_genmatchgroupsintKeyError _gens_order _max_order)gennamerW gens_orderwrts r> order_keyz_sort_gens..order_keyOs#h ? S CIIcN2C;;mmC(//1 e JEE %tU3 3      %tU3 3   D%((s5 A0(A?0 A<;A<? B  B  B B'&B'rP)rrc enumeratesortrJ TypeErrortuple)gensargsoptrr`rdrbrcs @@r> _sort_gensrmCs  C$OJ cgg C) $FAs!eJsO $)8 d * ;   ; s A(( A>=A>ct|}t|}||k(r t|Sggd}}}|D]}||vs|j|t|D]\}}||vs |||dzc||<}|D]m}|j |}|j |d|||dzd}|j |}|j |d|||dzd}|j|o|j ||j |t|S)z2Unify generators in a reasonably intelligent way. rrBN)rMrirLrfrWextend)f_gensg_gensrjcommonrr`rs r> _unify_gensrsss, &\F &\F V}"a!&D &= MM# F#,3 &=!!9a!eLF1Iq,  LL  F2AJA LL  F2AJA C  KKKK ;cnt|dk(rt|ddrt|dSt|S)z8Support for passing generators as `*gens` and `[gens]`. rBr__iter__)rGhasattrri)rjs r> _analyze_gensrxs2 4yA~'$q':6T!W~T{rtc zfdfd}fd}|jddr t||St||S)z9Sort low-level factors in increasing 'complexity' order. ct|tr t|St|tr|Dcgc] }| c}S|Scc}wr:) isinstance _GF_typesr\rM)factorrrds r>rdz _sort_factors..order_keys@ fi (v;   %*01QIaL1 1M2sAc6|\}}t|||fSr:rG)r}rr rds r>order_if_multiple_keyz,_sort_factors..order_if_multiple_keys!AA9Q<((rtc*t||fSr:r)rrds r>order_no_multiple_keyz,_sort_factors..order_no_multiple_keysA ! %%rtmultipleTre)getrJ)factorsrkrrrds @r> _sort_factorsrs> )& xx D!g#899g#899rtrBcvt|tvs|tvryt|trt ||k7ryy)zBDo not treat NaN and infinities as valid polynomial coefficients. TN)type illegal_typesfinfr{floatexprs r> _not_a_coeffrs2 Dz]"ddl$5;$#6 rtc|t|ji}}t|jD] \}}|||< g}|D]%}i}|jr|j|j z }t j|D]} gdg|z} } tj| D]} t| s| jr| j| , |jdur2t| \} }|dkr-| t| tj } }nt#| \} }|| || <t+| } | |vr|| xxt| z cc<t| || <|j|(||jfS#t$$r=| j&|js| j| nt)d| zYwxYw)z@Transform expressions into a multinomial form given generators. rFz0%s contains an element of the set of generators.)rGrjrf is_Equalitylhsrhsr make_argsrr is_NumberrLseriesr rrOnerr]has_freerri)exprsrlrindicesrrpolysrpolytermcoeffmonomr}baseexps r> _parallel_dict_from_expr_if_gensrsSXXwA#((#1  E%   88dhh&DMM$' *Ds1u5E--- U#F+0@0@LL(U::.(7(?ID#"Qw-0D#dQUUF2CT(;F(CID#/2gdm, U*%LE}U sE{* !5kU ; *>  TK%N #((?!$U.v9!LL0"13KMS3T#UU1Us AE55AF; :F; chjfd}n'jdurd}njdurd}nd}tg}}|D].}g}|jr|j |j z }tj|D]}gi} }tj|D]} t| s&| js|| r|j| 4jdur2t| \} } | dkr-| t| t j" } } nt%| \} } | j'| d| z| | <|j)| |j|| f|j|1t+|}t-|i}} t/|D] \}}|||< g}|D]s}i}|D]Y\}}dg| z}|j1D] \} } | ||| <t3|}||vr||xxt|z cc<Ot|||<[|j|u|t3|fS) zITransform expressions into a multinomial form and figure out generators. c |jvSr:)domain)r}rls r> _is_coeffz3_parallel_dict_from_expr_no_gens.._is_coeffsSZZ' 'rtTc|jSr:) is_algebraicr}s r>rz3_parallel_dict_from_expr_no_gens.._is_coeffs&& &rtFc&|tjuSr:)r ImaginaryUnitrs r>rz3_parallel_dict_from_expr_no_gens.._is_coeffsQ__, ,rtc|jSr:r;rs r>rz3_parallel_dict_from_expr_no_gens.._is_coeffs## #rtr)rl)r extensiongreedysetrrrrrrrrrLrr rrrr setdefaultaddrmrGrfitemsri)rrlrrjreprsrtermsrrelementsr}rrrrrrrrrs ` r> _parallel_dict_from_expr_no_gensrsJ zz ( $  ' 5  - $%%D   88dhh&DMM$' ,D "8E--- ##F+1A1AYvEVLL(zzU*$3F$; c7),c$.?C$7$? c%-%8%8q%AC%GHTNHHTN # LL%* +% ,(  U58 d $DTBwA$1  E *KE4CEE!ZZ\ + c'*gdm$ +%LE}U sE{* !5kU  *  T!$ %+ rtc.t|f|\\}}||fS)zBTransform an expression into a multinomial form given generators. )rrrlrrjs r>_dict_from_expr_if_gensrE 4dWcBMGTT :rtc.t|f|\\}}||fS)zKTransform an expression into a multinomial form and figure out generators. )rrs r>_dict_from_expr_no_gensrKrrtc Nt|t|\}}||jfS)/Transform expressions into a multinomial form. )_parallel_dict_from_exprrrj)rrkrepsrls r>parallel_dict_from_exprrQs%( d0CDID# >rtc|jdur|Dcgc]}|j}}td|Dr td|jrt ||\}}nt ||\}}||j d|ifScc}w)rFc38K|]}|jduyw)FN)is_commutative)r=rs r>r?z+_parallel_dict_from_expr..\s :D4  % ' :s-non-commutative expressions are not supportedrj)expandrIrrjrrclone)rrlrrrjs r>rrWs zz,13D$++-33 :E ::MNN xx5eSA d5eSA d FD>* **4sB c Nt|t|\}}||jfS)1Transform an expression into a multinomial form. )_dict_from_exprrrj)rrkreprls r>dict_from_exprrgs%t]4%89HC =rtc|jdur tdd|jdurt|tt fs td|j}t fdtj|Dr3t|}t fdtj|Dr3t dtj|Dr1t|}t dtj|Dr1|jrt||\}}nt||\}}||jd|ifS)rFrc|jxrF|jjxr.|jjxr|jj Sr:)is_Powr is_positive is_Integerris_Addrs r>_is_expandable_powz+_dict_from_expr.._is_expandable_powrsB % 4 4%9L9L%II$$ &rtzexpression must be of type Exprc3K|]:}|xs,|jxrtfd|jD<yw)c3.K|] }|ywr:)r=rrs r>r?z,_dict_from_expr...|s6!"1%6sNis_MulrIrk)r=rrs r>r?z"_dict_from_expr..{sE%;<%Q'7188,7 6qvv6 67%sAAc3pK|].}|jxrtd|jD0yw)c34K|]}|jywr:)r)r=rs r>r?z,_dict_from_expr...s"<188"r?z"_dict_from_expr..s+Z!((rrms e#MNN& zz$r +!"CD D{{}% d#%%&d+D % d#%% ZcmmTXFYZZd#DZcmmTXFYZZ xx+D#6 T+D#6 T  64.) ))rtcg}|jD]Q\}}|g}t||D]#\}}|s |jt||%|jt |St |S)z/Convert a multinomial form into an expression. )rrKrLrrr)rrjresultrrrrrs r>expr_from_dictrst F " uwe$ 'DAq C1I& '  c4j! " <rtc,t|}|j}|j}tt |Dcgc]}g}}t }|D]M} |j |} |j| t||D]\} } | j| | Ot|D]!\} }| |vs |D]} | | s td#tt||fScc}w#t$r|D]} | jdYwxYw)z*Reorder levels using dict representation. rzunable to drop generators)rMkeysvaluesrangerGrrWrrKrLrXrfrmapri)rrjnew_gensmonomscoeffsrR new_monoms used_indicesr`rMnew_Mrrs r> _dict_reorderrs' :D XXZF ZZ\F$SX0!20J05L    3A   Q  3 #5 QqT" #  $G1 L  G8)*EFF GG uj !6 )))1 #  Q  s C*A C//!DDc"eZdZdZdZddZdZy)PicklableWithSlotsa Mixin class that allows to pickle objects with ``__slots__``. Examples ======== First define a class that mixes :class:`PicklableWithSlots` in:: >>> from sympy.polys.polyutils import PicklableWithSlots >>> class Some(PicklableWithSlots): ... __slots__ = ('foo', 'bar') ... ... def __init__(self, foo, bar): ... self.foo = foo ... self.bar = bar To make :mod:`pickle` happy in doctest we have to use these hacks:: >>> import builtins >>> builtins.Some = Some >>> from sympy.polys import polyutils >>> polyutils.Some = Some Next lets see if we can create an instance, pickle it and unpickle:: >>> some = Some('abc', 10) >>> some.foo, some.bar ('abc', 10) >>> from pickle import dumps, loads >>> some2 = loads(dumps(some)) >>> some2.foo, some2.bar ('abc', 10) rNc| |j}i}|jD]@}t|dd}ttdd}|$||us)|j |||B|j D]}t ||st||||< |S)N __getstate__) __class__ __bases__getattrobjectupdate __slots__rw)selfclsrrgetstateobjstateras r>rzPicklableWithSlots.__getstate__s ;..C  ,A q.$7Hv~t __setstate__zPicklableWithSlots.__setstate__s'779 'KD% D$ & 'rtr:)__name__ __module__ __qualname____doc__rrrrrtr>rrs#JI4'rtrc,eZdZdZddZddZdZdZy)IntegerPowerablea Mixin class for classes that define a `__mul__` method, and want to be raised to integer powers in the natural way that follows. Implements powering via binary expansion, for efficiency. By default, only integer powers $\geq 2$ are supported. To support the first, zeroth, or negative powers, override the corresponding methods, `_first_power`, `_zeroth_power`, `_negative_power`, below. Nc|dkr> |dk(r|jS|dk(r|jS|j||St t |ddDcgc] }t|}}t|}|}d}t|D]0}||r|r|} d}n  |z} || |z} ||dz ks$||z}|,||z}2 S#t$r tcYSwxYwcc}w)NrArBr)moduloTF) _first_power _zeroth_power_negative_powerrFNotImplementedreversedbinr\rGr) rrrrbitsr r"firstrr/s r>__pow__zIntegerPowerable.__pow__s q5 &6,,..!V--////&/AA%-SVABZ$89qCF9D9D AAE1X $7 %Q!-KAq1u9FA)V  $H)' &%% &:s!CCCCCCct)z Compute inverse of self, then raise that to the abs(e) power. For example, if the class has an `inv()` method, return self.inv() ** abs(e) % modulo rF)rrrs r>rz IntegerPowerable._negative_power.s "!rtct)z?Return unity element of algebraic struct to which self belongs.rrs r>rzIntegerPowerable._zeroth_power6!!rtct)zReturn a copy of self.rrs r>rzIntegerPowerable._first_power:rrtr:)rrrrr rrrrrtr>rrs>"""rtrztuple[type, ...]r|flint)ModularInteger)F)>r __future__rsympy.external.gmpyr sympy.corerrrrr r r r sympy.core.exprtoolsr rsympy.core.numbersrsympy.polys.polyerrorsrrsympy.polys.polyoptionsrrer^r_compile MULTILINErYrSrmrsrxrrrrrrrrrrrrrrrparallel_dict_from_basicdict_from_basicbasic_from_dictrrr__annotations__rnmodfmpz_modr|"sympy.polys.domains.modularintegerr)objrs00r>r(s<",$$$E'C1 3S"%s3S"%s3S#&s 3 S #&s    Ss 3Ss 3  "**_bll 3!H-`"J:6'//sc/ "1Q-(Qa( 0fGT   +  *< 3  *