K iSdZddlmZddlmZddlmZmZmZm Z m Z m Z ddl m Z ddlmZddlmZddlmZdd lmZdd lmZmZdd lmZdd lmZdd lmZddlm Z ddl!m"Z"ddl#m$Z$ddl%m&Z&m'Z'ddl(m)Z)ddl*m+Z+ddl,m-Z-ddl.m/Z/m0Z0ddl1m2Z2ddl3m4Z4ddl5m6Z6ddl7m8Z8e4e&fdZ9e4e&fdZ:e4e&fdZ;e4dZ<Gdde2Z=Gd d!ee2eZ>y")#z!Sparse rational function fields. ) annotations)reduce)addmulltlegtge)Expr)Mod)Exp1)S)Symbol) CantSympifysympify)ExpBase)Domain) DomainElement FractionField)PolynomialRing)construct_domain)lex MonomialOrder)CoercionFailed) build_options)_parallel_dict_from_expr)PolyRing PolyElement)DefaultPrinting)public) is_sequence)pollutec<t|||}|f|jzS)zFConstruct new rational function field returning (field, x1, ..., xn).  FracFieldgenssymbolsdomainorder_fields X/mnt/ssd/data/python-lab/Trading/venv/lib/python3.12/site-packages/sympy/polys/fields.pyfieldr.s#w .F 9v{{ ""c8t|||}||jfS)zHConstruct new rational function field returning (field, (x1, ..., xn)). r%r(s r-xfieldr1$s!w .F FKK  r/ct|||}t|jDcgc]}|jc}|j|Scc}w)zSConstruct new rational function field and inject generators into global namespace. )r&r#r)namer')r)r*r+r,syms r-vfieldr5*s=w .F &.. 23chh 2FKK@ M 3sAc d}t|s|gd}}ttt|}t ||}g}|D]!}|j |j #t||\}}|jFt|Dcgc]}t|jc}g} t| |\|_} t|j|j|j} g} tdt!|dD](} | j#| t%|| | dz*|r| | dfS| | fScc}w)aConstruct a field deriving generators and domain from options and input expressions. Parameters ========== exprs : py:class:`~.Expr` or sequence of :py:class:`~.Expr` (sympifiable) symbols : sequence of :py:class:`~.Symbol`/:py:class:`~.Expr` options : keyword arguments understood by :py:class:`~.Options` Examples ======== >>> from sympy import exp, log, symbols, sfield >>> x = symbols("x") >>> K, f = sfield((x*log(x) + 4*x**2)*exp(1/x + log(x)/3)/x**2) >>> K Rational function field in x, exp(1/x), log(x), x**(1/3) over ZZ with lex order >>> f (4*x**2*(exp(1/x)) + x*(exp(1/x))*(log(x)))/((x**(1/3))**5) FT)optr)r"listmaprrextendas_numer_denomrr*sumvaluesrr&r'r+rangelenappendtuple)exprsr)optionssingler7numdensexprrepsrepcoeffs_r,fracsis r-sfieldrN1s04F u v We$ %E  )CG.t**,-.(#6ID# zzD9Sd3::<(92>(S9  A sxxSYY 7F E 1c$i #1 VE$q1+./01a!!:s D<ceZdZUdZded<ded<ded<ded <d ed <d ed <efdZdZdZdZ dZ dZ dZ dZ d dZd dZdZdZdZeZdZdZdZdZy)!r&z2Multivariate distributed rational function field. rringztuple[FracElement, ...]r'ztuple[Expr, ...]r)intngensrr*rr+ct|||}|j}|j}|j}|j}|j ||||f}t j|}||_t||_ ||_ ||_||_||_||_t||jj|_|j|j|_ |j|j |_|j#|_t'|j|j$D]<\}} t)|t*s|j,} t/|| r0t1|| | >|SN)rr)rRr*r+__name__object__new__ _hash_tuplehash_hashrP FracElementzeroraw_newdtypeone_gensr'zip isinstancerr3hasattrsetattr) clsr)r*r+rPrRrXobjsymbol generatorr3s r-rWzFracField.__new__qs,/,,  ||WeVUC nnS!%%     TYY/77 99TYY'))DHH%99;!$S[[#((!; 2 FI&&){{sD)Cy1  2 r/ct|jjDcgc]}|j|c}Scc}w)z(Return a list of polynomial generators. )rBrPr'r^selfgens r-r`zFracField._genss+$))..B3tzz#BCCBs=cH|j|j|jfSrT)r)r*r+rks r-__getnewargs__zFracField.__getnewargs__s dkk4::66r/c|jSrT)rZrns r-__hash__zFracField.__hash__s zzr/c|j|r)|jj|jSt d|j d|d)Nz expected a , got z instead) is_elementrPindexto_poly ValueErrorr^rjs r-ruzFracField.indexs; ??3 99??3;;=1 1 3OP Pr/ct|txr]|j|j|j|j f|j|j|j|j fk(SrT)rbr&r)rRr*r+rkothers r-__eq__zFracField.__eq__sV%+D \\4::t{{DJJ ? ]]EKKu{{ C D Dr/c||k( SrTrys r-__ne__zFracField.__ne__s5=  r/cDt|txr|j|k(S)zBTrue if ``element`` is an element of this field. False otherwise. )rbr[r.rkelements r-rtzFracField.is_elements';/IGMMT4IIr/Nc&|j||SrT)r^rknumerdenoms r-r]zFracField.raw_newszz%''r/c~||jj}|j|\}}|j||SrT)rPr_cancelr]rs r-newz FracField.news6 =$))--%||E* u||E5))r/c8|jj|SrT)r*convertrs r- domain_newzFracField.domain_news{{""7++r/c |j|jj|S#t$r|j}|j s|j r|j}|j}|j|}|j|j|}|j|j|}|j||cYSwxYwrT) rrP ground_newrr*is_Fieldhas_assoc_Field get_fieldrrrr])rkrr*rP ground_fieldrrs r-rzFracField.ground_news 88DII009: : [[F??v'='=yy%//1 &..w7 (:(:7(CD (:(:7(CD||E511 s),B,CCcXt|tr||jk(r|St|jtr4|jj|jk(r|j |St|jt rB|jjj|jk(r|j |Stdt|tr|j\}}t|jt r?|j|jjk(r|jj |}nt|jtrM|j|jjjk(r|jj |}n|j|j}|jj |}|j||St|trLt!|dk(r>t#t%|jj&|\}}|j)||St|t*r tdt|t,r|j/|S|j |S)N conversionr8parsing)rbr[r.r*rrrrPto_fieldNotImplementedErrorr clear_denomsto_ringset_ringr]rBr@r9r:ring_newrstrr from_expr)rkrrrs r- field_newzFracField.field_news g{ +w}}$$++}5 !!W]]2w//DKK8   ))+w}}<w//),77  -"//1LE5$++~6 dkk... ,,U3DKK7 dkk//7799 ,,U3tyy1II((/E<<u- -  'CLA,=DII$6$6 @ALE588E5) )  %%i0 0  &>>'* *??7+ +r/c|jtdjDfd|S)Nc3xK|]2}|jst|tr||jf4ywrT)is_Powrbr as_base_exp).0rls r- z*FracField._rebuild_expr..s37CzzZW5S__./7s8:c p j|}||S|jr-ttt t |j S|jr-ttt t |j S|jst|ttfr|j\}} D]?\}\}}||k(st||dk(s j|t||z zcS|j rQ|t"j$ur?|t|zS jd|z d jd|z z S j'|S#t($r;j*s-j,r!j/j'|cYSwxYw)Nr)getis_Addrrr9r:argsis_Mulrrrbrr rr rQ is_IntegerrOnerrrrr) rGrhberlbgeg_rebuildr*mappingpowerss r-rz)FracField._rebuild_expr.._rebuildsq D)I$  c4Hdii(@#ABBc4Hdii(@#ABB 4'4 A'')1%+;MC"bQw3q":?&{{3/QrT::;<77 8~r/cttt|j|j} |j t ||}|j|S#t$rtd|d|wxYw)Nz=expected an expression convertible to a rational function in rs) dictr9rar)r'rrrrrw)rkrGrfracs r-rzFracField.from_exprsqtC dii89: (%%gdmW=D>>$' ' wjnptuv v ws A A;ct|SrTrrns r- to_domainzFracField.to_domains T""r/cXt|j|j|jSrT)rr)r*r+rns r-rzFracField.to_ring!s dkk4::>>r/rT)rU __module__ __qualname____doc____annotations__rrWr`rorqrur{r~rtr]rrrr__call__rrrrr}r/r-r&r&gs< N !!  J N ,/ DD7Q D !J(* , #,JH!F(#?r/r&ceZdZdZd'dZd'dZdZdZdZdZ dZ d Z d Z d Z d Zd ZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZ dZ!d Z"d!Z#d"Z$d#Z%d'd$Z&d'd%Z'd'd&Z(y)(r[z=Element of multivariate distributed rational function field. Ncz||jj}n |s td||_||_||_y)Nzzero denominator)rPr_ZeroDivisionErrorr.rr)rkr.rrs r-__init__zFracElement.__init__'s8 =JJNNE#$67 7   r/c<|j|j||SrT) __class__r.frrs r-r]zFracElement.raw_new1s{{177E511r/c>|j|j|SrT)r]rrs r-rzFracElement.new4sqyy%,,u-..r/cN|jdk7r td|jS)Nrzf.denom should be 1)rrwrrs r-rvzFracElement.to_poly7s" 77a<23 3wwr/c6|jjSrT)r.rrns r-parentzFracElement.parent<szz##%%r/cH|j|j|jfSrT)r.rrrns r-rozFracElement.__getnewargs__?s DJJ 33r/c|j}|3t|j|j|jfx|_}|SrT)rZrYr.rr)rkrZs r-rqzFracElement.__hash__Ds9  =!%tzz4::tzz&J!K KDJ r/c|j|jj|jjSrT)r]rcopyrrns r-rzFracElement.copyJs)||DJJOO-tzz/@AAr/c|j|k(r|S|j}|jj|}|jj|}|j ||SrT)r.rPrrrr)rk new_fieldnew_ringrrs r- set_fieldzFracElement.set_fieldMsU :: "K ~~HJJ''1EJJ''1E==. .r/ch|jj||jj|z SrT)ras_exprr)rkr)s r-rzFracElement.as_exprVs0!tzz!!7+,>DJJ,>,>,HHHr/c8t|trM|j|jk(r4|j|jk(xr|j|jk(S|j|k(xr-|j|jj j k(SrT)rbr[r.rrrPr_rgs r-r{zFracElement.__eq__Ysj a %!''QWW*<77agg%PP ZZ " "1 %5517719,agg6 6![)ellM:u||?Q?QUVU\U\?\ >177>>CWCW[`C`::a=())A{+ellN; @Q@QUVU[U[@[::a=(zz!}r/c|jjj|r6|j|j|j |zz|j S|j |\}}}|dk(r6|j|j|j |zz|j S|stS|j|j|z|j |zz|j |zSNrr.rPrtrrrrrrcrg_numerg_denoms r-rzFracElement.__radd__s 77<< " "1 %5517719,agg6 6 003GW 7551777?2AGG< <! !551777?:AGGGOL Lr/cz|j}|s|S|s| S|j|r|j|jk(r3|j|j|jz |jS|j|j|jz|j|jzz |j|jzS|j j|r6|j|j|j|zz |jSt |trt |jtr$|jj|jk(rnt |jjtr4|jjj|k(r|j|StSt |trOt |jtr$|jj |j k(rn|j|S|j|\}}}|dk(r6|j|j|j|zz |jS|stS|j|j|z|j|zz |j|zS)z-Subtract rational functions ``f`` and ``g``. r)r.rtrrrrPrbr[r*r__rsub__rrrrrrr.rrrs r-__sub__zFracElement.__sub__sH2I   a ww!''!uuQWWqww.88uuQWWQWW_qwwqww>PP ZZ " "1 %5517719,agg6 6![)ellM:u||?Q?QUVU\U\?\ >177>>CWCW[`C`::a=())A{+ellN; @Q@QUVU[U[@[::a=( 003GW 7551777?2AGG< <! !551777?:AGGGOL Lr/c|jjj|r7|j|j |j |zz|j S|j |\}}}|dk(r7|j|j |j |zz|j S|stS|j|j |z|j |zz|j |zSrrrs r-rzFracElement.__rsub__s 77<< " "1 %55!''AGGAI-qww7 7 003GW 755!''AGGGO3QWW= =! !55!''')AGGGO;QWWW_M Mr/c|j}|r|s |jS|j|r@|j|j|jz|j |j zS|j j|r)|j|j|z|j St|trt|jtr$|jj|jk(rnt|jjtr4|jjj|k(r|j|StSt|trOt|jtr$|jj |j k(rn|j|S|j|S)z-Multiply rational functions ``f`` and ``g``. )r.r\rtrrrrPrbr[r*r__rmul__rrrrs r-__mul__zFracElement.__mul__s>::    a 55!''!''/: : ZZ " "1 %55AGG, ,![)ellM:u||?Q?QUVU\U\?\ >177>>CWCW[`C`::a=())A{+ellN; @Q@QUVU[U[@[::a=(zz!}r/c|jjj|r)|j|j|z|j S|j |\}}}|dk(r)|j|j|z|j S|stS|j|j|z|j |zSrrrs r-r zFracElement.__rmul__ s 77<< " "1 %55AGG, , 003GW 755!''2 2! !55!'''/: :r/cX|j}|st|j|r@|j|j|j z|j |jzS|j j|r)|j|j|j |zSt|trt|jtr$|jj|jk(rnt|jjtr4|jjj|k(r|j|StSt|trOt|jtr$|jj |j k(rn|j|S|j|\}}}|dk(r)|j|j|j |zS|stS|j|j|z|j |zS)z0Computes quotient of fractions ``f`` and ``g``. r)r.rrtrrrrPrbr[r*r __rtruediv__rrrrrs r- __truediv__zFracElement.__truediv__s# #   a 55!''!''/: : ZZ " "1 %55!''!), ,![)ellM:u||?Q?QUVU\U\?\ >177>>CWCW[`C`>>!,,))A{+ellN; @Q@QUVU[U[@[>>!,, 003GW 755!'''/2 2! !55!'''/: :r/c|st|jjj|r)|j |j |z|j S|j|\}}}|dk(r)|j |j |z|j S|stS|j |j |z|j |zSr) rr.rPrtrrrrrrs r-rzFracElement.__rtruediv__:s# # WW\\ $ $Q '55AGG, , 003GW 755!''2 2! !55!'''/: :r/c|dk\r,|j|j|z|j|zS|st|j|j| z|j| zS)z+Raise ``f`` to a non-negative power ``n``. r)r]rrr)rns r-__pow__zFracElement.__pow__IsX 699QWWaZ!4 4# #99QWWqb[!''A2+6 6r/c|j}|j|jj||jz|j|jj|zz |jdzS)aComputes partial derivative in ``x``. Examples ======== >>> from sympy.polys.fields import field >>> from sympy.polys.domains import ZZ >>> _, x, y, z = field("x,y,z", ZZ) >>> ((x**2 + y)/(z + 1)).diff(x) 2*x/(z + 1) r8)rvrrdiffr)rxs r-rzFracElement.diffRsX IIKuuQWW\\!_QWW,qwwqww||A/FFQR SSr/c$dt|cxkr|jjkr;nn8|jt t |jj |Std|jjdt|)Nrz expected at least 1 and at most z values, got )r@r.rRevaluater9rar'rw)rr>s r-rzFracElement.__call__csb s6{ +aggmm +::d3qww||V#<=> >TUT[T[TaTacfgmcnop pr/ct|tr]|[|Dcgc]\}}|j|f}}}|jj ||j j |}}nH|j}|jj |||j j ||}}|j j}|j||Scc}}wrT) rbr9rvrrrrPrr)rraXrrr.s r-rzFracElement.evaluateis a 19/02tq!199;"2A277++A.0@0@0C5E A77++Aq11773C3CAq3I5E ##%yy&&3sC"ct|tr]|[|Dcgc]\}}|j|f}}}|jj ||j j |}}nH|j}|jj |||j j ||}}|j ||Scc}}wrT)rbr9rvrsubsrr)rrrrrrs r-rzFracElement.substs a 19/02tq!199;"2A277<<?AGGLLO5E A77<<1-qww||Aq/A5EuuUE"" 3sCctrT)r)rrrs r-composezFracElement.compose~s!!r/rT))rUrrrrr]rrvrrorZrqrrrr{r~rrrrrrrrrrrrrrr r rrrrrrrrr}r/r-r[r[$sG2/ &4 E B/I@ >" +,$(> M$ML N4 ;;B ;7T"q '#"r/r[N)?r __future__r functoolsroperatorrrrrr r sympy.core.exprr sympy.core.modr sympy.core.numbersr sympy.core.singletonrsympy.core.symbolrsympy.core.sympifyrr&sympy.functions.elementary.exponentialrsympy.polys.domains.domainr!sympy.polys.domains.domainelementr!sympy.polys.domains.fractionfieldr"sympy.polys.domains.polynomialringrsympy.polys.constructorrsympy.polys.orderingsrrsympy.polys.polyerrorsrsympy.polys.polyoptionsrsympy.polys.polyutilsrsympy.polys.ringsrrsympy.printing.defaultsr sympy.utilitiesr!sympy.utilities.iterablesr"sympy.utilities.magicr#r.r1r5rNr&r[r}r/r-r8s'"-- #"$3:-;;=4411:33"1)!$## "%!! "% 22j{?{?z["-+["r/