/* Ċ Ġ* ĠĠĠ ĠCopyright Ġ 2 0 1 9 ĠU gl jes a ĠJ ovan ov ic Ċ Ġ* Ċ Ġ* ĠĠĠ ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* ĠĠĠ Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠĠĠ ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠĠĠ ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* ĠĠĠ Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠĠĠ ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠĠĠ ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* ĠĠĠ Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ* Ċ Ġ*/ Ċ Ċ package Ġcom . ion spin . kotlin . b ignum . integer Ċ Ċ import Ġcom . ion spin . kotlin . b ignum . En di ann ess Ċ Ċ /** Ċ Ġ* ĠInterface Ġdefining Ġbig Ġinteger Ġoperations Ċ Ġ* Ċ Ġ* ĠCreated Ġby ĠU gl jes a ĠJ ovan ov ic Ċ Ġ* Ġug lj es a . j ovan ov ic @ ion spin . com Ċ Ġ* Ġon Ġ 1 0 - Mar - 2 0 1 9 Ċ Ġ*/ Ċ Ċ interface ĠBigInteger 3 2 Arithmetic Interface Ġ{ ĊĠĠĠ Ġval Ġ_ emit IntArray : ĠInt Array ĊĠĠĠ Ġval ĠZERO : ĠUInt Array ĊĠĠĠ Ġval ĠONE : ĠUInt Array ĊĠĠĠ Ġval ĠTWO : ĠUInt Array ĊĠĠĠ Ġval ĠT EN : ĠUInt Array ĊĊĠĠĠ Ġval Ġbase Power Of Two : ĠInt ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġthe Ġnumber Ġof Ġleading Ġzeros Ġin Ġa Ġword ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun ĠnumberOf Leading Z eros In A Word ( value : ĠUInt ): ĠInt ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠNumber Ġof Ġbits Ġneeded Ġto Ġrepresent Ġthis Ġnumber ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġbit Length ( value : ĠUInt Array ): ĠInt ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠNumber Ġof Ġconsecutive Ġzeros Ġcount Ġfrom Ġthe Ġright Ġin Ġbinary Ġrepresentation ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġtrailing Zero Bits ( value : ĠUInt Array ): ĠInt ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠArithmetic Ġshift Ġleft . ĠSh ifts Ġthe Ġnumber Ġto Ġthe Ġleft , Ġby Ġrequired Ġplaces Ġof Ġbits , Ġcreating Ġnew Ġwords Ġif Ġnecessary ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġshift Left ( operand : ĠUInt Array , Ġplaces : ĠInt ): ĠUInt Array ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠArithmetic Ġshift Ġright . ĠSh ifts Ġthe Ġnumber Ġto Ġthe Ġright , Ġby Ġrequired Ġplaces Ġof Ġbits , Ġremoving Ġwords Ġthat Ġno Ġlonger Ġrelevant ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġshift Right ( operand : ĠUInt Array , Ġplaces : ĠInt ): ĠUInt Array ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠComp ares Ġtwo Ġnumbers ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġ- 1 Ġif Ġfirst Ġis Ġbigger , Ġ 0 Ġif Ġequal , Ġ+ 1 Ġif Ġsecond Ġis Ġbigger ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġcompare ( first : ĠUInt Array , Ġsecond : ĠUInt Array ): ĠInt ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAdds Ġtwo Ġbig Ġintegers ĊĠĠĠĠ Ġ* Ġ@ return Ġresult Ġof Ġadd ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġadd ( first : ĠUInt Array , Ġsecond : ĠUInt Array ): ĠUInt Array ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSubtract s Ġtwo Ġbig Ġintegers ĊĠĠĠĠ Ġ* Ġ@ return Ġresult Ġof Ġsubtract ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġsubtract ( first : ĠUInt Array , Ġsecond : ĠUInt Array ): ĠUInt Array ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠMultip lies Ġtwo Ġbig Ġintegers ĊĠĠĠĠ Ġ* Ġ@ return Ġresult Ġof Ġmultiply ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġmultiply ( first : ĠUInt Array , Ġsecond : ĠUInt Array ): ĠUInt Array ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDiv ide Ġtwo Ġbig Ġintegers ĊĠĠĠĠ Ġ* Ġ@ return ĠA Ġpair Ġrepresenting Ġquot ient Ġ( first Ġmember Ġof Ġthe Ġpair ) Ġand Ġremainder Ġ( second Ġmember Ġof Ġthe Ġpair ) ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġdivide ( ĊĠĠĠĠĠĠĠ Ġfirst : ĠUInt Array , ĊĠĠĠĠĠĠĠ Ġsecond : ĠUInt Array ĊĠĠĠ Ġ): ĠPair < UInt Array , ĠUInt Array > ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġa Ġinteger Ġre ci pro cal Ġof Ġthis Ġnumber Ġsuch Ġthat Ġ 0 Ġ<= Ġbase Ġ^ Ġword Ġ- Ġoperand Ġ* Ġre ci pro cal Ġ<= Ġoperand , ĊĠĠĠĠ Ġ* Ġand Ġremainder Ġsuch Ġthat Ġ 0 Ġ< Ġre ci pro cal Ġ< Ġoperand ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġre ci pro cal ( operand : ĠUInt Array ): ĠPair < UInt Array , ĠUInt Array > ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠExp onent iation Ġfunction ĊĠĠĠĠ Ġ* Ġ@ return ĠBigInteger Ġresult Ġof Ġexponent iation Ġof Ġnumber Ġby Ġexponent ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġpow ( base : ĠUInt Array , Ġexponent : ĠLong ): ĠUInt Array ĊĊĠĠĠ Ġfun Ġsqrt ( operand : ĠUInt Array ): ĠPair < UInt Array , ĠUInt Array > ĊĊĠĠĠ Ġfun Ġgcd ( first : ĠUInt Array , Ġsecond : ĠUInt Array ): ĠUInt Array ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠParse Ġa Ġstring Ġin Ġa Ġspecific Ġbase Ġinto Ġa Ġbig Ġinteger ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġparse For Base ( number : ĠString , Ġbase : ĠInt ): ĠUInt Array ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġreturn Ġa Ġstring Ġrepresentation Ġof Ġbig Ġinteger Ġin Ġa Ġspecific Ġnumber Ġbase ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun ĠtoString ( operand : ĠUInt Array , Ġbase : ĠInt ): ĠString ĊĊĠĠĠ Ġfun ĠnumberOf Decimal Digits ( operand : ĠUInt Array ): ĠLong ĊĊĠĠĠ Ġfun Ġfrom UL ong ( u Long : ĠU Long ): ĠUInt Array ĊĠĠĠ Ġfun Ġfrom UInt ( u Int : ĠUInt ): ĠUInt Array ĊĠĠĠ Ġfun Ġfrom U Short ( u Short : ĠU Short ): ĠUInt Array ĊĠĠĠ Ġfun Ġfrom U Byte ( u Byte : ĠU Byte ): ĠUInt Array ĊĠĠĠ Ġfun Ġfrom Long ( long : ĠLong ): ĠUInt Array ĊĠĠĠ Ġfun Ġfrom Int ( int : ĠInt ): ĠUInt Array ĊĠĠĠ Ġfun Ġfrom Short ( short : ĠShort ): ĠUInt Array ĊĠĠĠ Ġfun Ġfrom Byte ( byte : ĠByte ): ĠUInt Array ĊĊĠĠĠ Ġfun Ġor ( operand : ĠUInt Array , Ġmask : ĠUInt Array ): ĠUInt Array ĊĠĠĠ Ġfun Ġxor ( operand : ĠUInt Array , Ġmask : ĠUInt Array ): ĠUInt Array ĊĠĠĠ Ġfun Ġand ( operand : ĠUInt Array , Ġmask : ĠUInt Array ): ĠUInt Array ĊĠĠĠ Ġfun Ġnot ( operand : ĠUInt Array ): ĠUInt Array ĊĊĠĠĠ Ġfun Ġbit At ( operand : ĠUInt Array , Ġposition : ĠLong ): ĠBoolean ĊĠĠĠ Ġfun Ġset Bit At ( operand : ĠUInt Array , Ġposition : ĠLong , Ġbit : ĠBoolean ): ĠUInt Array ĊĊĠĠĠ Ġfun Ġfrom U ByteArray ( ĊĠĠĠĠĠĠĠ Ġsource : ĠU ByteArray ĊĠĠĠ Ġ): ĠPair < UInt Array , ĠSign > ĊĊĠĠĠ Ġfun Ġfrom ByteArray ( ĊĠĠĠĠĠĠĠ Ġsource : ĠByteArray ĊĠĠĠ Ġ): ĠPair < UInt Array , ĠSign > ĊĊĠĠĠ Ġfun Ġto U ByteArray ( ĊĠĠĠĠĠĠĠ Ġoperand : ĠUInt Array ĊĠĠĠ Ġ): ĠU ByteArray ĊĊĠĠĠ Ġfun Ġto ByteArray ( ĊĠĠĠĠĠĠĠ Ġoperand : ĠUInt Array ĊĠĠĠ Ġ): ĠByteArray ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠConverts Ġan ĠUInt Array Ġinto Ġa Ġbyte Ġarray Ġrepresentation , Ġwith Ġconsideration Ġto Ġrequested Ġend i ann ess ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠE . g . ĊĠĠĠĠ Ġ* ĠInput ĠUInt Array : ĊĠĠĠĠ Ġ* Ġ 0 xA ABB CC DD U , Ġ 0 x 1 1 2 2 3 3 4 4 ĊĠĠĠĠ Ġ* ĠOutput ĠU ByteArray ĊĠĠĠĠ Ġ* ĠL ittle Ġendian : ĊĠĠĠĠ Ġ* Ġ 0 x DD , Ġ 0 xCC , Ġ 0 xBB , Ġ 0 xAA , Ġ 0 x 4 4 , Ġ 0 x 3 3 , Ġ 0 x 2 2 , Ġ 0 x 1 1 ĊĠĠĠĠ Ġ* ĠBig Ġendian : ĊĠĠĠĠ Ġ* Ġ 0 xAA , Ġ 0 xBB , Ġ 0 xCC , Ġ 0 x DD , Ġ 0 x 1 1 , Ġ 0 x 2 2 , Ġ 0 x 3 3 , Ġ 0 x 4 4 ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġto UInt Array Represent ed As Typed U ByteArray ( ĊĠĠĠĠĠĠĠ Ġoperand : ĠUInt Array , ĊĠĠĠĠĠĠĠ Ġend i ann ess : ĠEn di ann ess Ġ= ĠEn di ann ess . BIG ĊĠĠĠ Ġ): ĠArray < U Byte > ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠConverts Ġan ĠUInt Array Ġinto Ġa Ġbyte Ġarray Ġrepresentation , Ġwith Ġconsideration Ġto Ġrequested Ġend i ann ess ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠE . g . ĊĠĠĠĠ Ġ* ĠInput ĠUInt Array : ĊĠĠĠĠ Ġ* Ġ 0 xA ABB CC DD U , Ġ 0 x 1 1 2 2 3 3 4 4 ĊĠĠĠĠ Ġ* ĠOutput ĠU ByteArray ĊĠĠĠĠ Ġ* ĠL ittle Ġendian : ĊĠĠĠĠ Ġ* Ġ 0 x DD , Ġ 0 xCC , Ġ 0 xBB , Ġ 0 xAA , Ġ 0 x 4 4 , Ġ 0 x 3 3 , Ġ 0 x 2 2 , Ġ 0 x 1 1 ĊĠĠĠĠ Ġ* ĠBig Ġendian : ĊĠĠĠĠ Ġ* Ġ 0 xAA , Ġ 0 xBB , Ġ 0 xCC , Ġ 0 x DD , Ġ 0 x 1 1 , Ġ 0 x 2 2 , Ġ 0 x 3 3 , Ġ 0 x 4 4 ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġto UInt Array Represent ed As U ByteArray ( operand : ĠUInt Array , Ġend i ann ess : ĠEn di ann ess Ġ= ĠEn di ann ess . BIG ): ĠU ByteArray Ċ } Ċ