K ifLddlmZmZmZmZmZmZddlmZddl m Z ddl m Z m Z mZmZddlmZddlmZmZddlmZddlmZmZGd d eZeZy ) )SsympifyExprDummyAddMul)cacheit)Tuple)Function PoleErrorexpand_power_base expand_logdefault_sort_key)explog) Complement)uniq is_sequenceceZdZdZdZdZedZddZe dZ e dZ e dZ e d Z d Zd Zd Zd ZedZdZdZdZdZdZdZy)Ordera Represents the limiting behavior of some function. Explanation =========== The order of a function characterizes the function based on the limiting behavior of the function as it goes to some limit. Only taking the limit point to be a number is currently supported. This is expressed in big O notation [1]_. The formal definition for the order of a function `g(x)` about a point `a` is such that `g(x) = O(f(x))` as `x \rightarrow a` if and only if there exists a `\delta > 0` and an `M > 0` such that `|g(x)| \leq M|f(x)|` for `|x-a| < \delta`. This is equivalent to `\limsup_{x \rightarrow a} |g(x)/f(x)| < \infty`. Let's illustrate it on the following example by taking the expansion of `\sin(x)` about 0: .. math :: \sin(x) = x - x^3/3! + O(x^5) where in this case `O(x^5) = x^5/5! - x^7/7! + \cdots`. By the definition of `O`, there is a `\delta > 0` and an `M` such that: .. math :: |x^5/5! - x^7/7! + ....| <= M|x^5| \text{ for } |x| < \delta or by the alternate definition: .. math :: \lim_{x \rightarrow 0} | (x^5/5! - x^7/7! + ....) / x^5| < \infty which surely is true, because .. math :: \lim_{x \rightarrow 0} | (x^5/5! - x^7/7! + ....) / x^5| = 1/5! As it is usually used, the order of a function can be intuitively thought of representing all terms of powers greater than the one specified. For example, `O(x^3)` corresponds to any terms proportional to `x^3, x^4,\ldots` and any higher power. For a polynomial, this leaves terms proportional to `x^2`, `x` and constants. Examples ======== >>> from sympy import O, oo, cos, pi >>> from sympy.abc import x, y >>> O(x + x**2) O(x) >>> O(x + x**2, (x, 0)) O(x) >>> O(x + x**2, (x, oo)) O(x**2, (x, oo)) >>> O(1 + x*y) O(1, x, y) >>> O(1 + x*y, (x, 0), (y, 0)) O(1, x, y) >>> O(1 + x*y, (x, oo), (y, oo)) O(x*y, (x, oo), (y, oo)) >>> O(1) in O(1, x) True >>> O(1, x) in O(1) False >>> O(x) in O(1, x) True >>> O(x**2) in O(x) True >>> O(x)*x O(x**2) >>> O(x) - O(x) O(x) >>> O(cos(x)) O(1) >>> O(cos(x), (x, pi/2)) O(x - pi/2, (x, pi/2)) References ========== .. [1] `Big O notation `_ Notes ===== In ``O(f(x), x)`` the expression ``f(x)`` is assumed to have a leading term. ``O(f(x), x)`` is automatically transformed to ``O(f(x).as_leading_term(x),x)``. ``O(expr*f(x), x)`` is ``O(f(x), x)`` ``O(expr, x)`` is ``O(1)`` ``O(0, x)`` is 0. Multivariate O is also supported: ``O(f(x, y), x, y)`` is transformed to ``O(f(x, y).as_leading_term(x,y).as_leading_term(y), x, y)`` In the multivariate case, it is assumed the limits w.r.t. the various symbols commute. If no symbols are passed then all symbols in the expression are used and the limit point is assumed to be zero. Tc !t|}|sX|jr|j}|j!nt |j }t jgt|z!nt t|r|n|g}ggc}!t|drF|D]@}t tt|\}}|j|!j|Bn6t tt|}t jgt|z!td|Dstd|ztt t|t|k7rtd|z|jrt!|j"dd}t!|} t!t%|!} | j'D]0\}}|| j)vr|| |k7s!t+d|| |<2t-|j)t-| j)k(r|St | j)}|Dcgc]}| | c}!|t j.urt j.St1!fd|Drtd!z|rt1!fd !Dr t+d !dt j2t j2t j4zfvrc|D cic]} | dt7z } } | j'D cic]\} }d|z d| z } } }!Dcgc]}t j}}n5!dt j8t j8t j4zfvrb|D cic]} | d t7z } } | j'D cic]\} }d |z d | z } } }!Dcgc]}t j}}n!dt jury|D cic]} | t7!dz} } | j'D cic]"\} }|!dz j;| !dz $} } }!Dcgc]}t j}}nd } d } t !}|j=| }|j>r|jA}| r+tC| j'Dcgc]}|d c}}n tC|}t|dkDr|jE}d}||k7r6|}|j>r8|jG|}tI|Dcgc]\}}|jJc}}}n|r |jL|}|jbrt j}n|jd|ddid}tg|}ti|}t|dk(r|d}t tYjj|je|dd}tm|D]1\}}|jZs|j"\}}||| fvr&|jnr|jq|s ||z||<P|jZrK|j\jq|s0|j"\}}||| fvs|jns|||zz||<|jVs|j"dt jrus| }|jZs|j\jq|r|j"\}}||| fvs|jns'|||zz||<4tY|}||k7r6|j=| }|jr |jJ}|jp|s|jbst jt}t!t%|!} |jwtx|Dcgc]}| | c}!|ft{t%|!z}t}j~|g|} | Scc}wcc} wcc}} wcc}wcc} wcc}} wcc}wcc} wcc}} wcc}wcc}wcc}}w#tN$rtQ|tRstd |j"DrnVg}tCt%||}|j"D]Q} |jL|}n#tN$r|}YnwxYw||vr tU|}n tU|g|}|j|S|j>retUtI|g|}|j>r:tUtI|j"Dcgc]}|jJncc}wc}g|}|jJ}nn|jVr'tY|Dcgc]}|jJncc}wc}}n;|jZr/|j\}|j^}t]|ta|z}YnwxYwcc}w)Nrc34K|]}|jywN) is_symbol).0vs X/mnt/ssd/data/python-lab/Trading/venv/lib/python3.12/site-packages/sympy/series/order.py z Order.__new__..s211;;2sz!Variables are not symbols, got %sz3Variables are supposed to be unique symbols, got %sz2Mixing Order at different points is not supported.c3HK|]}D]}||jvywr) free_symbols)rxppoints rr z Order.__new__..s'EquE!qANN"E"Es"zGot %s as a point.c3.K|] }|dk7ywrNrrr%r&s rr z Order.__new__..s0Q1a=0sz;Multivariable orders at different points are not supported.rc3<K|]}t|tywr) isinstancer )rargs rr z Order.__new__..s#S#JsH$=#Ssas_AddFr.key)@ris_Order variablesr&listr#rZerolenrmapappendall TypeErrorr ValueErrordictargszipitemskeysNotImplementedErrorsetNaNanyInfinity ImaginaryUnitrNegativeInfinitytogethersubsis_Addfactortupleexpandextract_leading_orderrexpras_leading_termr r,r ris_Mulris_Powrbaseris_zeroas_independentr r make_args enumerateis_realhas NegativeOneOnesortrr r__new__)"clsrOr=kwargsr3arr%expr_vpnew_vpvpksrspsrold_exprlstefordersptsr-ltordernew_exprbr$margsitqobjr&s" @rr]z Order.__new__sut}}} NN   !2!23 Y/ D 1v>D!2 Iu47#$AGQ0DAq$$Q'LLO$ !Wd!34 Y/2 22?)KL L tDO$ %Y 7RU^^_ _ ==499QR=)G']Fc)U+,B  "1 %F1I~1PRR!"F1I  "7<<>"c&++-&88  / ,56q6 155=55L EIE E1E9: : 0%00)QSSQxAJJ 1??(BCC+45aQ%' \55+,779541aac1Q3h55&+,aff,,qa00!2D2DQ__2TUU,56qQ57 ]66-.WWY7TQbdBqDj77&+,aff,,q'4=>qQ%(**>>JK'')T$!Qq58|--/U1X=TT&+,aff,,%[99QT,8"!; %7%dH5 ##S#S S!%'F"'D" "6C'+yy 5!-)<)<),1"IE,1"OsOE & e 4 5 ${{+0f+D+D#+??/4S8==:Ya166:Y:Y5Z/a]`/aH'/}}!%'*V,DQVV,D,D'E!%$(HH$(II'*1s1v:=7d+s? `.`` 2``1` `#>`(+'`-`3 `86`= a gAg"b21g2 c=g?cA4g4e1g8f Aggc|Srr)selfr$nlogxcdirs r _eval_nserieszOrder._eval_nseries> c |jdSNrr=rys rrOz Order.exprAsyy|rc`|jddrtd|jddDSy)Nr!c3&K|] }|d ywr(rrr$s rr z"Order.variables..H5!15rr=rLrs rr3zOrder.variablesE- 99QR=5tyy}55 5rc`|jddrtd|jddDSy)Nr!c3&K|] }|d ywr!Nrrs rr zOrder.point..Orrrrrs rr&z Order.pointLrrcZ|jjt|jzSr)rOr#rBr3rs rr#zOrder.free_symbolsSs yy%%DNN(;;;rc|jr9|jr-|j|j|zg|jddS|t dk(r|SyNr!) is_Numberis_nonnegativefuncrOr=O)rrrks r _eval_powerzOrder._eval_powerWsL ;;1++166!&&A+3qr 3 3 !9HrcjddntfdDs6tfdjDstdjzr#ddjdk7r tdt t jddj D]\}}|j vs||<tj djtfS) Nr!c3:K|]}|dddk(yw)r!rNr)ro order_symbolss rr z*Order.as_expr_variables..bs$K! a 0 33Ksc3BK|]}|jdk(ywr()r&)rr%rys rr z*Order.as_expr_variables..csC1AA.CszDOrder at points other than 0 or oo not supported, got %s as a point.rz7Multiplying Order at different points is not supported.ct|dSrr)r$s rz)Order.as_expr_variables..msHXYZ[\Y]H^rr0) r=r9r&rAr<r?r@sortedrOrL)ryrrer%s`` ras_expr_variableszOrder.as_expr_variables^s   IIabMMK]KKC CC)+>@D +KLLq!1!!4 1 !E)QSS /MTYYqr]+113 )1M..00'(M!$ )#=#6#6#8>^_Myy% ...rc"tjSr)rr5rs rremoveOz Order.removeOps vv rc|Srrrs rgetOz Order.getOsr~rcF  tjrytjuryjrjdntj j r t fdjDst fdjDryjjk(r!tfdjddDSjjr(tfd jjDSjjr5 jr)tfd jjDSjr?jr3tjDcgc]}|jvs|c}}n%jr j}n j}|syjjr tjdk(rjjk(rىjd}jj!|d d}|jr|j"|k(rjj"|k(rv jr-jj$|j$z j&} j(r-jj$|j$z j*}|Sdd lm}d}jjz } || dd } |D]B}ddlm} | | | j5d} t7| | s| dk7} nd} || }<|| k7sBy|Sjjrtjdk(rωjd}j!|d d}|jr|j"|k(rjj"|k(rv jr-jj$|j$z j&} j(r-jj$|j$z j*}|Sj8gjdd} j;| Scc}w)z Return True if expr belongs to Order(self.expr, \*self.variables). Return False if self belongs to expr. Return None if the inclusion relation cannot be determined (e.g. when self and expr have different symbols). TFrc3(K|] }|k7 ywrrr)s rr z!Order.contains..s31AJ3c3(K|] }|k7 ywrrr)s rr z!Order.contains..s6aqEz6rNc3@K|]}|jddvywrrrr$rys rr z!Order.contains..s E!1 !" -Er!c3@K|]}j|ywr)containsrs rr z!Order.contains..sD4==+Drc3|K|]3}j|gjddj5ywr)rr=r)rr$rOrys rr z!Order.contains..s>5 !%499Q7127@@F5s9<r/)powsimpr)deepcombine)Limit) heuristics)rrTrrCr&r5r2rDrOr9r=rJr3rLrRr6rUrSris_nonpositive is_infinitersympy.simplify.powsimprsympy.series.limitsrdoitr,rr)ryrOrecommon_symbolssymbolotherrvrrhratiorlrwr&s`` @rrzOrder.containsvst} << 155=!% 1  ==3 3364::66yyDII%Etyy}EEEyyDTYY^^DDDyyEMM5%)YY^^555~~$..!& $F1!t~~2EQF"H!%!%!   S%8A%=NNdnn4!^^A.F II44VE4J1ME v)= &0$}}&*iimmeii&?%O%O$00&*iimmeii&?%O%O!~') 6AIIdii'EEeAB B rc||jvr|jj||}|jj|}t |j}t |j }|j r|||<n2|j}t|dk(s||vr||vr|j|}n|j}ddl m } |jtr| |jj||jj d|j |k(r5|jj d} t|gt|g| gS|j||j |} | |j |k7rddlm} t%} | ||j|| z | } t'| t(r5| j*d}| j*d}t-|t-|z } t/t| f| g}| j|dj||j |} |||<| ||<n]||vrX||=||=|sQ||j |k(r?|j1||j1t2j4gt|znyt|gt||Sy)Nr!r)limit)solveset)r3rOrIindexr4r&rr#r6popsympyrrYrrr>sympy.solvers.solvesetrrr,rr=rBr<extendrr5)ryoldnewnewexprrtnewvarsnewptsymsvarrr&rdsole1e2ress r _eval_subszOrder._eval_subssV $.. iinnS#.G$$S)A4>>*G$E}}  ''t9>SD[d{"nnQ/"hhj,wwu~% chhjFVFVWXFY*Z^b^h^hij^k*k # 0 0 3$WCsC55'/BCC #djjm < 1 -C!G&sSXXc1-='=qA%c:6!$!B!$!B"%b'CG"3C#CsO45 !s1v 4 4S$**Q- H!$GAJ$E!H_ E!HC4::a=$8t, affXc$i%7873w#67 7U !rc||jj}| |j|g|jddSyr)rO_eval_conjugaterr=ryrOs rrzOrder._eval_conjugate?yy((*  499T2DIIabM2 2 rc||j|jj|g|jddxs|Sr)rrOdiffr=)ryr$s r_eval_derivativezOrder._eval_derivatives4tyy*;TYYqr];CtCrc||jj}| |j|g|jddSyr)rO_eval_transposerr=rs rrzOrder._eval_transposerrc|Srrrs r__neg__z Order.__neg__r~rN)r)__name__ __module__ __qualname____doc__r2 __slots__r r]r}propertyrOr3r&r#rrrrrrrrrrrrrrrr spdHI y yv  <</$ N" N"` +8Z3 D3 rrN) sympy.corerrrrrrsympy.core.cacher sympy.core.containersr sympy.core.functionr r r rsympy.core.sortingr&sympy.functions.elementary.exponentialrrsympy.sets.setsrsympy.utilities.iterablesrrrrrrrrs988$'RR/;&7}D}~ r