;iG dZddlZGddeZdedefdZdedefd Zded edefd Zd ed edejeeeffdZ dededefdZ dej edej edefdZ e dkrddlZejdSdS)z/Common functionality shared by several modules.Nc 6eZdZd dededededdf fd ZxZS) NotRelativePrimeErrorabdmsgreturnNct|pd|||fz||_||_||_dS)Nz.%d and %d are not relatively prime, divider=%i)super__init__rrr)selfrrrr __class__s >C:\PYTHON\MyICR_Workspace\venv\Lib\site-packages\rsa/common.pyr zNotRelativePrimeError.__init__sI \ PTUWXZ[S\ \]]])r)__name__ __module__ __qualname__intstrr __classcell__)rs@rrrse###Crrnumr c |S#t$r%}tdt|z|d}~wwxYw)a Number of bits needed to represent a integer excluding any prefix 0 bits. Usage:: >>> bit_size(1023) 10 >>> bit_size(1024) 11 >>> bit_size(1025) 11 :param num: Integer value. If num is 0, returns 0. Only the absolute value of the number is considered. Therefore, signed integers will be abs(num) before the number's bit length is determined. :returns: Returns the number of bits in the integer. z,bit_size(num) only supports integers, not %rN) bit_lengthAttributeError TypeErrortype)rexs rbit_sizersX,\~~ \\\FcRSSY[[\s A AAnumbercL|dkrdStt|dS)a Returns the number of bytes required to hold a specific long number. The number of bytes is rounded up. Usage:: >>> byte_size(1 << 1023) 128 >>> byte_size((1 << 1024) - 1) 128 >>> byte_size(1 << 1024) 129 :param number: An unsigned integer :returns: The number of bytes required to hold a specific long number. r)ceil_divr)r s r byte_sizer%8s*({{q HV$$a ( ((rdivc:t||\}}|r|dz }|S)av Returns the ceiling function of a division between `num` and `div`. Usage:: >>> ceil_div(100, 7) 15 >>> ceil_div(100, 10) 10 >>> ceil_div(1, 4) 1 :param num: Division's numerator, a number :param div: Division's divisor, a number :return: Rounded up result of the division between the parameters. r")divmod)rr&quantamods rr$r$Qs-$c""KFC !  Mrrrcd}d}d}d}|}|}|dkr&||z}|||z}}|||zz |}}|||zz |}}|dk&|dkr||z }|dkr||z }|||fS)z;Returns a tuple (r, i, j) such that r = gcd(a, b) = ia + jbrr") rrxylxlyoaobqs r extended_gcdr4is A A B B B B q&& FQUA!a%L1B!a%L1B q&&  Avv b Avv b b"9rr-nc\t||\}}}|dkrt||||S)zReturns the inverse of x % n under multiplication, a.k.a x^-1 (mod n) >>> inverse(7, 4) 3 >>> (inverse(143, 4) * 143) % 4 1 r")r4r)r-r5dividerinv_s rinverser:s:%Q**Wc1!||#Aq'222 Jra_values modulo_valuescd}d}|D]}||z}t||D](\}}||z}t||}|||z|zz|z})|S)aChinese Remainder Theorem. Calculates x such that x = a[i] (mod m[i]) for each i. :param a_values: the a-values of the above equation :param modulo_values: the m-values of the above equation :returns: x such that x = a[i] (mod m[i]) for each i >>> crt([2, 3], [3, 5]) 8 >>> crt([2, 3, 2], [3, 5, 7]) 23 >>> crt([2, 3, 0], [7, 11, 15]) 135 r"r)zipr:) r;r<mr-modulom_ia_iM_ir8s rcrtrDs{( A A V -22&& c3hc3 sS A % Hr__main__)__doc__typing ValueErrorrrrr%r$Tupler4r:IterablerDrdoctesttestmodr,rrrMs65 J\#\#\\\\8)c)c))))2#CC0CCFLc3$?0sss"  &/#&  vs7K  PS     F zNNNGOr