U +¥Mb@+ã@s0ddlmZddlmZmZGdd„deƒZdS)é)Ú IntegerBaseé)Ú long_to_bytesÚ bytes_to_longc@s¬eZdZdZdd„Zdd„Zdd„Zdd „Zd d „Zd d „Z dfdd„Z e dd„ƒZ dd„Z dd„Zdd„Zdd„Zdd„Zdd„Zdd „ZeZd!d"„Zd#d$„Zd%d&„Zd'd(„Zd)d*„Zd+d,„Zdgd.d/„Zdhd0d1„Zd2d3„Zdid4d5„Zd6d7„Zd8d9„Z d:d;„Z!dd?„Z#d@dA„Z$dBdC„Z%dDdE„Z&dFdG„Z'dHdI„Z(dJdK„Z)dLdM„Z*dNdO„Z+dPdQ„Z,dRdS„Z-dTdU„Z.dVdW„Z/dXdY„Z0dZd[„Z1d\d]„Z2d^d_„Z3d`da„Z4dbdc„Z5e6ddde„ƒZ7d-S)jÚ IntegerNativez3A class to model a natural integer (including zero)cCs>t|tƒrtdƒ‚z |j|_Wntk r8||_YnXdS)Nz-A floating point type is not a natural number)Ú isinstanceÚfloatÚ ValueErrorÚ_valueÚAttributeError)ÚselfÚvalue©rúA/tmp/pip-target-t616c12r/lib/python/Crypto/Math/_IntegerNative.pyÚ__init__'s   zIntegerNative.__init__cCs|jS©N©r ©r rrrÚ__int__0szIntegerNative.__int__cCs tt|ƒƒSr)ÚstrÚintrrrrÚ__str__3szIntegerNative.__str__cCs dt|ƒS)Nz Integer(%s))rrrrrÚ__repr__6szIntegerNative.__repr__cCs t|jƒSr)Úhexr rrrrÚ__hex__:szIntegerNative.__hex__cCs t|jƒSr©rr rrrrÚ __index__>szIntegerNative.__index__rcCsF|jdkrtdƒ‚t|j|ƒ}t|ƒ|kr6dkrBnntdƒ‚|S)Nrú.Conversion only valid for non-negative numberszValue too large to encode)r r rÚlen)r Ú block_sizeÚresultrrrÚto_bytesAs   zIntegerNative.to_bytescCs |t|ƒƒSr)r)ÚclsZ byte_stringrrrÚ from_bytesIszIntegerNative.from_bytescCs|dkr dS|jt|ƒkS)NF©r r©r ÚtermrrrÚ__eq__NszIntegerNative.__eq__cCs | |¡ Sr)r'r%rrrÚ__ne__SszIntegerNative.__ne__cCs|jt|ƒkSrr$r%rrrÚ__lt__VszIntegerNative.__lt__cCs| |¡p| |¡Sr)r)r'r%rrrÚ__le__YszIntegerNative.__le__cCs | |¡ Sr)r*r%rrrÚ__gt__\szIntegerNative.__gt__cCs | |¡ Sr)r)r%rrrÚ__ge___szIntegerNative.__ge__cCs |jdkS©NrrrrrrÚ __nonzero__bszIntegerNative.__nonzero__cCs |jdkSr-rrrrrÚ is_negativefszIntegerNative.is_negativec Cs:z| |jt|ƒ¡WStttfk r4tYSXdSr©Ú __class__r rr r Ú TypeErrorÚNotImplementedr%rrrÚ__add__jszIntegerNative.__add__c Cs:z| |jt|ƒ¡WStttfk r4tYSXdSrr0r%rrrÚ__sub__pszIntegerNative.__sub__c Cs:z| |jt|ƒ¡WStttfk r4tYSXdSrr0)r ÚfactorrrrÚ__mul__vszIntegerNative.__mul__cCs| |jt|ƒ¡Sr©r1r r)r ÚdivisorrrrÚ __floordiv__|szIntegerNative.__floordiv__cCs(t|ƒ}|dkrtdƒ‚| |j|¡S)NrúModulus must be positive)rr r1r )r r9Z divisor_valuerrrÚ__mod__szIntegerNative.__mod__NcCsbt|ƒ}|dkrtdƒ‚|dk rJt|ƒ}|dkr8tdƒ‚|dkrNtdƒ‚nd}t|j||ƒ|_|S)NrzExponent must not be negativer;úModulus cannot be zero)rr ÚZeroDivisionErrorÚpowr )r ÚexponentÚmodulusZ exp_valueZ mod_valuerrrÚ inplace_pow…s zIntegerNative.inplace_powcCs| |¡}| ||¡Sr)r1rB)r r@rAr rrrÚ__pow__•s zIntegerNative.__pow__cCs t|jƒSr)Úabsr rrrrÚ__abs__™szIntegerNative.__abs__cCs||j}|dkrR|dkrtdƒ‚|}|dd}||krL|}|||d}q.|}n |dkrbtdƒ‚| |||¡}| |¡S)NrzSquare root of negative valuerér;)r r Z_tonelli_shanksr1)r rAr ÚxÚyr rrrÚsqrtœs zIntegerNative.sqrtcCs|jt|ƒ7_|Srr$r%rrrÚ__iadd__±szIntegerNative.__iadd__cCs|jt|ƒ8_|Srr$r%rrrÚ__isub__µszIntegerNative.__isub__cCs|jt|ƒ9_|Srr$r%rrrÚ__imul__¹szIntegerNative.__imul__cCs:t|ƒ}|dkrtdƒ‚|dkr(tdƒ‚|j|;_|S)NrzDivision by zeror;)rr>r r )r r&rArrrÚ__imod__½szIntegerNative.__imod__cCs| |jt|ƒ@¡Srr8r%rrrÚ__and__ÇszIntegerNative.__and__cCs| |jt|ƒB¡Srr8r%rrrÚ__or__ÊszIntegerNative.__or__cCsFz| |jt|ƒ?¡WStk r@|jdkr6YdSYdSYnXdS©Nréÿÿÿÿ)r1r rÚ OverflowError©r ÚposrrrÚ __rshift__Ís  zIntegerNative.__rshift__cCsFz|jt|ƒL_Wn*tk r@|jdkr6YdSYdSYnX|SrP)r rrRrSrrrÚ __irshift__Ös  zIntegerNative.__irshift__cCs8z| |jt|ƒ>¡WStk r2tdƒ‚YnXdS©NzIncorrect shift count)r1r rrRr rSrrrÚ __lshift__àszIntegerNative.__lshift__cCs8z|jt|ƒK_Wntk r2tdƒ‚YnX|SrW)r rrRr rSrrrÚ __ilshift__æs zIntegerNative.__ilshift__cCsŽ|jdkrtdƒ‚z^z&|j|j?d@}|jdkr8tdƒ‚Wn2tk rl|j|?d@}|dkrhtdƒ‚YnXWntk rˆd}YnX|S)Nrz)no bit representation for negative valuesrznegative bit count)r r r rR)r Únr rrrÚget_bitís    zIntegerNative.get_bitcCs|jd@dkS)NrrrrrrÚis_oddþszIntegerNative.is_oddcCs|jd@dkS)NrrrrrrrÚis_evenszIntegerNative.is_evencCsD|jdkrtdƒ‚|jdkr dSd}|j}|r@|dL}|d7}q*|S)Nrrr)r r )r Zbit_sizeÚtmprrrÚ size_in_bitss   zIntegerNative.size_in_bitscCs| ¡dddS)Nré)r_rrrrÚ size_in_bytesszIntegerNative.size_in_bytescCsb|jdkrdS|jdkrdS|jd}|d}||jkrT||jd|}|d}q.|j|dkS)NrF)rrTrFr)r rGZsquare_xrrrÚis_perfect_squares     zIntegerNative.is_perfect_squarecCs|jt|ƒdkrtdƒ‚dS)NrzValue is composite)r rr )r Z small_primerrrÚfail_if_divisible_by&sz"IntegerNative.fail_if_divisible_bycCs|jt|ƒt|ƒ7_|Srr$)r ÚaÚbrrrÚmultiply_accumulate*sz!IntegerNative.multiply_accumulatecCst|ƒ|_dSrr)r ÚsourcerrrÚset.szIntegerNative.setcCs¦t|ƒ}|dkrtdƒ‚|dkr(tdƒ‚|j|}}d\}}|dkrr||}||||}}||||}}q<|dkrŠtdt|ƒƒ‚|dkrœ||7}qŠ||_|S)Nrr=zModulus cannot be negative)rrrz No inverse value can be computed)rr>r r r)r rAÚr_pÚr_nZs_pZs_nÚqrrrÚinplace_inverse1s"  zIntegerNative.inplace_inversecCs| |¡}| |¡|Sr)r1rl)r rAr rrrÚinverseDs  zIntegerNative.inversecCsFt|jƒtt|ƒƒ}}|dkr<||}||||}}q| |¡Sr-)rDr rr1)r r&rirjrkrrrÚgcdIs zIntegerNative.gcdcCsDt|ƒ}|jdks|dkr$| d¡S| t|j|| |¡jƒ¡Sr-)rr r1rDrnr%rrrÚlcmPs zIntegerNative.lcmcCsàt|ƒ}t|ƒ}|dkr tdƒ‚|d@dkr4tdƒ‚||}|dksL|dkrPdS|dkr\dSd}|}|d@dkr‚|dL}|d7}qd|d@dkr”d}n|ddkr¦d}nd}|dd krÈ|dd krÈ| }||}|t ||¡S) Nrzn must be a positive integerrz$n must be even for the Jacobi symbolr`)rérQéé)rr rÚ jacobi_symbol)rdrZÚeZa1ÚsZn1rrrrsVs2     zIntegerNative.jacobi_symbol)r)N)N)N)8Ú__name__Ú __module__Ú __qualname__Ú__doc__rrrrrrr!Ú classmethodr#r'r(r)r*r+r,r.Ú__bool__r/r4r5r7r:r<rBrCrErIrJrKrLrMrNrOrUrVrXrYr[r\r]r_rarbrcrfrhrlrmrnroÚ staticmethodrsrrrrr$sj         rN)Z _IntegerBaserZCrypto.Util.numberrrrrrrrÚs