a DOg_@stddlmZddlZddlZddlZddlZddlZdgZejj Z ejj Z e dejejBZGdddejZdS)DecimalNFractionaC \A\s* # optional whitespace at the start, then (?P[-+]?) # an optional sign, then (?=\d|\.\d) # lookahead for digit or .digit (?P\d*) # numerator (possibly empty) (?: # followed by (?:/(?P\d+))? # an optional denominator | # or (?:\.(?P\d*))? # an optional fractional part (?:E(?P[-+]?\d+))? # and optional exponent ) \s*\Z # and optional whitespace to finish cseZdZdZdQddfdd Zedd Zed d Zd d ZdRddZ e ddZ e ddZ ddZ ddZddZddZeeej\ZZddZeeej\ZZdd Zeeej\ZZd!d"Zeeej\ZZ d#d$Z!ee!ej"\Z#Z$d%d&Z%ee%e&\Z'Z(d'd(Z)ee)ej*\Z+Z,d)d*Z-d+d,Z.d-d.Z/d/d0Z0d1d2Z1d3d4Z2d5d6Z3d7d8Z4dSd9d:Z5d;d<Z6d=d>Z7d?d@Z8dAdBZ9dCdDZ:dEdFZ;dGdHZdMdNZ?dOdPZ@ZAS)Tr _numerator _denominatorrNT _normalizec s"tt||}|durdt|tur6||_d|_|St|tj rV|j |_|j |_|St|t t frx|\|_|_|St|trZt|}|durtd|t|dpd}|d}|rt|}nvd}|d}|rdt|}||t|}||9}|d} | rBt| } | d kr4|d| 9}n|d| 9}|d d krb| }ntd nft|turt|urnnn@t|tj rt|tj r|j |j |j |j }}ntd |d krtd||rt||} |d kr| } || }|| }||_||_|S)Nz Invalid literal for Fraction: %rnum0denomdecimal exprsign-z2argument should be a string or a Rational instancez+both arguments should be Rational instanceszFraction(%s, 0))superr__new__typeintrr isinstancenumbersRational numerator denominatorfloatras_integer_ratiostr_RATIONAL_FORMATmatch ValueErrorgrouplen TypeErrorZeroDivisionErrormathgcd) clsrrr selfmr rZscalerg __class__!/usr/lib64/python3.9/fractions.pyr>st            $       zFraction.__new__cCsDt|tjr||St|ts8td|j|t|jf||S)Nz.%s.from_float() only takes floats, not %r (%s))rrIntegralrr$__name__rr)r(fr.r.r/ from_floats  zFraction.from_floatcCsVddlm}t|tjr&|t|}n$t||sJtd|j|t|jf|| S)Nrrz2%s.from_decimal() only takes Decimals, not %r (%s)) rrrrr0rr$r1rr)r(Zdecrr.r.r/ from_decimals   zFraction.from_decimalcCs |j|jfSNrr)r.r.r/rszFraction.as_integer_ratio@Bc Cs|dkrtd|j|kr"t|Sd\}}}}|j|j}}||}|||} | |krZq|||||| f\}}}}||||}}q<|||} t|| ||| |} t||} t| |t| |kr| S| SdS)Nr z$max_denominator should be at least 1)rr r r)r!rrrabs) r)Zmax_denominatorZp0Zq0Zp1Zq1ndaZq2kZbound1Zbound2r.r.r/limit_denominators$      zFraction.limit_denominatorcCs|jSr5)rr;r.r.r/rszFraction.numeratorcCs|jSr5)rr>r.r.r/rszFraction.denominatorcCsd|jj|j|jfS)Nz %s(%s, %s))r-r1rrr6r.r.r/__repr__szFraction.__repr__cCs(|jdkrt|jSd|j|jfSdS)Nr z%s/%s)rrrr6r.r.r/__str__ s  zFraction.__str__csTfdd}djd|_j|_fdd}djd|_j|_||fS)NcsPt|ttfr||St|tr0t||St|trHt||StSdSr5)rrrrcomplexNotImplementedr;bfallback_operatormonomorphic_operatorr.r/forwardds   z-Fraction._operator_fallbacks..forward__csZt|tjr||St|tjr4t|t|St|tjrRt|t|StSdSr5)rrrZRealrComplexrArBrDr;rEr.r/reverseps    z-Fraction._operator_fallbacks..reverseZ__r)r1__doc__)rGrFrHrLr.rEr/_operator_fallbackssP  zFraction._operator_fallbackscCs,|j|j}}t|j||j|||Sr5rrrr;rDdadbr.r.r/_addsz Fraction._addcCs,|j|j}}t|j||j|||Sr5rOrPr.r.r/_subsz Fraction._subcCst|j|j|j|jSr5rrrrCr.r.r/_mulsz Fraction._mulcCst|j|j|j|jSr5rUrCr.r.r/_divs  z Fraction._divcCs|j|j|j|jSr5rrrCr.r.r/ _floordivszFraction._floordivcCs:|j|j}}t|j|||j\}}|t|||fSr5)rdivmodrr)r;rDrQrRZdivZn_modr.r.r/_divmodszFraction._divmodcCs,|j|j}}t|j||j|||Sr5rOrPr.r.r/_modsz Fraction._modcCst|tjr|jdkr|j}|dkr>t|j||j|ddS|jdkrft|j| |j| ddSt|j | |j | ddSqt|t|Sn t||SdS)Nr rFr) rrrrrrrrr)r;rDZpowerr.r.r/__pow__s&       zFraction.__pow__cCs\|jdkr|jdkr||jSt|tjrr.r.r/__pos__szFraction.__pos__cCst|j |jddSr_r`r>r.r.r/__neg__szFraction.__neg__cCstt|j|jddSr_)rr8rrr>r.r.r/__abs__szFraction.__abs__cCs*|jdkr|j |j S|j|jSdS)Nrrr>r.r.r/ __trunc__s zFraction.__trunc__cCs |j|jSr5rXr>r.r.r/ __floor__szFraction.__floor__cCs|j |j Sr5rXr>r.r.r/__ceil__szFraction.__ceil__cCs|durZt|j|j\}}|d|jkr,|S|d|jkrB|dS|ddkrR|S|dSdt|}|dkrtt|||Stt|||SdS)Nr rr)rZrrr8rround)r)ndigitsfloor remaindershiftr.r.r/ __round__s  zFraction.__round__cCsdzt|jdt}Wnty(t}Yn0ttt|j|}|jdkrN|n| }|dkr`dS|S)Nr)powr_PyHASH_MODULUSr! _PyHASH_INFhashr8r)r)ZdinvZhash_resultr.r.r/__hash__s  zFraction.__hash__cCst|tur |j|ko|jdkSt|tjrD|j|jkoB|j|jkSt|tj r`|j dkr`|j }t|t rt |s~t |rd|kS|||kSntSdS)Nr r)rrrrrrrrrrJimagrealrr&isnanisinfr3rBrCr.r.r/__eq__3s     zFraction.__eq__cCsht|tjr&||j|j|j|jSt|tr`t |sDt |rN|d|S||| |Snt SdS)Nrv) rrrrrrrrr&ryrzr3rB)r)otheropr.r.r/_richcmpHs     zFraction._richcmpcCs||tjSr5)r~operatorltrCr.r.r/__lt__^szFraction.__lt__cCs||tjSr5)r~rgtrCr.r.r/__gt__bszFraction.__gt__cCs||tjSr5)r~rlerCr.r.r/__le__fszFraction.__le__cCs||tjSr5)r~rgerCr.r.r/__ge__jszFraction.__ge__cCs t|jSr5)boolrr>r.r.r/__bool__nszFraction.__bool__cCs|jt|ffSr5)r-rr6r.r.r/ __reduce__vszFraction.__reduce__cCs t|tkr|S||j|jSr5rrr-rrr6r.r.r/__copy__ys zFraction.__copy__cCs t|tkr|S||j|jSr5r)r)memor.r.r/ __deepcopy__~s zFraction.__deepcopy__)rN)r7)N)Br1 __module__ __qualname__ __slots__r classmethodr3r4rr=propertyrrr?r@rNrSradd__add____radd__rTsub__sub____rsub__rVmul__mul____rmul__rWtruediv __truediv__ __rtruediv__rYfloordiv __floordiv__ __rfloordiv__r[rZ __divmod__ __rdivmod__r\mod__mod____rmod__r]r^rarbrcrdrerfrmrur{r~rrrrrrrr __classcell__r.r.r,r/r&sbi   7  k !)rrr&rrresys__all__ hash_infomodulusrqinfrrcompileVERBOSE IGNORECASErrrr.r.r.r/s