; TEST of Multi Precision Library #SingleInstance Force #NoEnv SetBatchLines -1 #include MultiPrecLib.ahk S = GCD:`n MP_Set(x,30) MP_Set(y,18) MP_GCD(g,c,d, x,y) S .= "`n" . MP_Dec(g) ", " MP_Dec(c) ", " MP_Dec(d) ; 6, -1, 2 MP_Set(x,2*3*5*7*11*13*17*23**4*29**3) MP_Set(y,17**5*23*31**2) MP_GCD(g,c,d, x,y) S .= "`n" . MP_Dec(g) ", " MP_Dec(c) ", " MP_Dec(d) ; 391, -6878429, 763665233731 MP_Set(x,176023680645013966468226945392411250770384383304492191886725992896575345044216019675) MP_Set(y,222232244629420445529739893461909967206666939096499764990979600) MP_GCD(g,c,d, x,y) ; GCD of the 400th and 300th Fibonacci numbers = 100th Fibonacci number S .= "`n" . MP_Dec(g) ", " MP_Dec(c) ", " MP_Dec(d) ; 354224848179261915075, -792070839848372253127, 627376215338105766356982006981782561278128 MP_Set(x,1414213562373095048801688724209698078569671875376948073176679737990732478462107038850387534327641572) MP_Set(y,3141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825342117068) MP_GCD(g,c,d, x,y) S .= "`n" . MP_Dec(g) "`n" MP_Dec(c) "`n" MP_Dec(d) ; 4 ; 277618068276139372139970459366882728416722612456219294511921887244235666622301044198307082946902119 ; -124972038264512876885991215247412539326590817554290162245629946727004984493348100970663253404223898 Msgbox %S% /* ; Measure running time n = 10000 MP_Set(a,1) MP_SFT(x,a,64*n-1) MP_SFT(y,a,32*n-1) i := j := 4 Loop %n% { Random r, -0x80000000,0x7fffffff NumPut(r,x,i+=4) Random r, -0x80000000,0x7fffffff NumPut(r,x,i+=4) Random r, -0x80000000,0x7fffffff NumPut(r,y,j+=4) } t := A_TickCount MP_Div(q,r,x,y) MsgBox % A_TickCount - t ; 20,000/10,000 words 881ms(DIVpq),1065ms(DIVpp), 60,000/0,000 dec digits = 100 ms ; Cut'n Paste comparisions with other MP packages Loop 5000 { Random r, 0, 999 a .= SubStr(1000+r,2,2) b .= SubStr(r,0) } MsgBox Dividend: %a% MsgBox Divisor: %b% MP_Set(x,a) MP_Set(y,b) MP_Div(q,r,x,y) c := MP_Dec(q) d := MP_Dec(r) ClipBoard := "floor(" a "/" b ") - " c MsgBox ClipBoard = floor(a / b) - q`nQuotient: %c% ClipBoard := "(" a " mod " b ") - " d MsgBox ClipBoard = (a mod b) - r`nRemainder: %d% ;;; POWER ;;; MP_SET(f,2) Loop 15 { MP_Pow(g,f,A_Index-1) MsgBox % "2**" A_Index-1 " = " MP_DEC(g) } MP_SET(f,5) t := A_TickCount MP_POW(g,f,4**(3**2)-1) t -= A_TickCount x := MP_DEC(g) MsgBox % StrLen(x) " digits`n`n" . "First 20: " SubStr(x, 1, 20) "`n" . "Last 20: " SubStr(x, -19) "`n`n" . "Computed in " round(-t/1000,2) " seconds" */ MsgBox % "100 Digits of Sqrt(2):`n" SQT(2,100) ; 1414213562373095048801688724209698078569671875376948073176679737990732478462107038850387534327641572 MsgBox % "100 Digits of Pi:`n" PI0(100) ; 3141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825342117067 S = Division:`n MP_Set(x,12345678) MP_Set(y,-1000) MP_Div(q,r,x,y) S .= "`n" . MP_Dec(q) " / " MP_Dec(r) ; -12345 / 678 MP_Set(x,1234567890123) MP_Set(y,1000) MP_Div(q,r,x,y) S .= "`n" . MP_Dec(q) " / " MP_Dec(r) ; 1234567890 / 123 MP_Div(q,r,y,x) S .= "`n" . MP_Dec(q) " / " MP_Dec(r) ; 0 / 1000 MP_Set(x,1234567890123456789012345) MP_Set(y,1000000000000) MP_Div(q,r,x,y) S .= "`n" . MP_Dec(q) " / " MP_Dec(r) ; 1234567890123 / 456789012345 MP_Set(x,0xfffffffffffffffe00000000) MP_Set(y,0xffffffffffffffff) MP_Div(q,r,x,y) S .= "`n" . MP_Hex(q) " / " MP_Hex(r) ; 0xFFFFFFFF / 0xFFFFFFFeFFFFFFFF MP_Set(x,0xffffffffe00000000) MP_Set(y,0xfffffffff) MP_Div(q,r,x,y) S .= "`n" . MP_Hex(q) " / " MP_Hex(r) ; 0xFFFFFFFF / 0xeFFFFFFFF (9 digits) MP_Set(x,0x10000000000000000) ; 1,0,0 MP_Set(y,0x100000000) ; 1,0 MP_Div(q,r,x,y) S .= "`n" . MP_Hex(q) " / " MP_Hex(r) ; 0x100000000 / 0x0 (9/1 digits) MP_Set(x,0x1000000000000000000000000) ; 1,0,0,0 MP_Set(y,0x10000000000000001) ; 1,0,1 MP_Div(q,r,x,y) S .= "`n" . MP_Hex(q) " / " MP_Hex(r) ; 0xFFFFFFFF / 0xFFFFFFFF00000001 (8/16 digits) MP_Set(x,0xffffffffe00000000) ; f,-2,0 MP_Set(y,0x111111111) ; 1,1..1 MP_Div(q,r,x,y) S .= "`n" . MP_Hex(q) " / " MP_Hex(r) ; 0xeFFFFFFFF / 0x11111111 (9/8 digits) MsgBox %S% S = Shift:`n MP_Set(x,0x2) MP_SFT(y,x,0) S .= "`n" . MP_Dec(y) ; 2 MP_SFT(y,x,-2) S .= "`n" . MP_Dec(y) ; 0 MP_Set(x,0x100000000) MP_SFT(y,x,-32) S .= "`n" . MP_Dec(y) ; 1 MP_Set(x,2222220000000022222222) MP_SFT(y,x,1) S .= "`n" . MP_Dec(y) ; 4444440000000044444444 MP_SFT(y,x,-1) S .= "`n" . MP_Dec(y) ; 1111110000000011111111 MP_Set(x,1) MP_SFT(y,x,2000) S .= "`n" . MP_Dec(y) ; 2**2000 = 114813069527425452...62184851149029376 MsgBox %S% S = Multiply:`n MP_Set(x,10000000) MP_Set(y,200) MP_Mul(z,y,x) S .= "`n" . MP_Dec(z) ; 2000000000 MP_Set(x,1000000000000) MP_Set(y,-12345678901234256789) MP_Mul(z,y,x) S .= "`n" . MP_Dec(z) ; -12345678901234256789000000000000 MsgBox %S% S = Subtract: `n MP_Set(x,0xff) MP_Set(y,255) MP_Sub(z,y,x) S .= "`n" . MP_Hex(z) ; 0x0 MP_Set(x,1) MP_Set(y,0x100000000) MP_Sub(z,y,x) S .= "`n" . MP_Hex(z) ; 0xffffffff MP_Set(x,0xffffffffffffffffffffffffffffffffff) MP_Set(y,-1) MP_Sub(z,y,x) S .= "`n" . MP_Hex(z) ; -0x10000000000000000000000000000000000 MP_Set(x, 0xffffffffffffffffffffffffff12345678) MP_Set(y, 0x10000000012345678) MP_Sub(z,y,x) S .= "`n" . MP_Hex(z) ; -0xFFFFFFFFFFFFFFFFFEFFFFFFFF00000000 MsgBox %S% S = Add:`n MP_Set(x, 0xffffffff00000001) MP_Set(y,0xffffffffffffffffff00000000ffffffff) MP_Add(z,x,y) S .= "`n" . MP_Hex(z) ; 0x10000000000000000000000000000000000 MP_Set(x,0xffffffffffffffffffffffffffffffffff) MP_Set(y,1) MP_Add(z,y,x) S .= "`n" . MP_Hex(z) ; 0x10000000000000000000000000000000000 MP_Set(x,-0xffffffffffffffffffffffffff12345678) MP_Set(y,-0x10000000012345678) MP_Add(z,y,x) S .= "`n" . MP_Hex(z) ; -0x1000000000000000000FFFFFFFF2468ACF0 MP_Set(x,111111110000000033333333) MP_Cpy(y,x) MP_Add(z,y,x) S .= "`n" . MP_Dec(z) ; 222222220000000066666666 MsgBox %S% S = Compare:`n MP_Set(x,-0x123456789abcdef0123456789abcdef01) MP_Set(y,-0x123456789abcdef0123456789abcdef01) c := MP_CMP(x,y,eq) S .= "`n" c "/" eq ; 0/5 MP_Set(x,-0xfffffffffffffffffffccccccccccccc) MP_Set(y,-0xfffffffffffffffffffffffffffffffd) c := MP_CMP(x,y,eq) S .= "`n" c "/" eq ; 1/2 MP_Set(x,-1) MP_Set(y, 1) c := MP_CMP(x,y) S .= "`n" c ; -1 MP_Set(x,-0xffffffffffffffffffffffffffffffffff) MP_Set(y,-0xfffffffffffffffff) c := MP_CMP(x,y) S .= "`n" c ; -1 MP_Set(x,0xffffffffffffffffffffffffffffffffff) MP_Set(y,0xfffffffffffffffffffffffffffffffffd) c := MP_CMP(x,y,eq) S .= "`n" c "/" eq ; 1/4 MsgBox %S% S = Operations with UInt:`n MP_Set(x,1) MP_SubIpp(y,x,0) S .= "`n" . MP_Dec(y) ; 1 MP_SubIpp(y,x,1) S .= "`n" . MP_Dec(y) ; 0 MP_SubIpp(y,x,2) S .= "`n" . MP_Dec(y) ; -1 MP_Set(x,0x100000000) MP_SubIpp(y,x,1) S .= "`n" . MP_Hex(y) ; 0xffffffff MP_Set(x,0xffffffffffffffffffffffffffffffffff) MP_AddIpp(y,x,0xfffffff0) S .= "`n" . MP_Hex(y) ; 0x100000000000000000000000000FFFFFFEF MP_Set(x,0xffffffffffffffffffffffffffffffffff) MP_MulIpp(y,x,0xfffffff0) S .= "`n" . MP_Hex(y) ; 0xFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFF00000010 MP_Set(x,0xffffffffffffffffffffffffffffffffffffff) r := MP_DivIpp(y,x,0xfffffff0) S .= "`n" . r " / " MP_Hex(y) ; 4095(0xFFF) / 0x1000000100000010000001000000100 MP_Set(x,0xffffffffffffffffffffffffffffffffff) r := MP_DivIpp(y,x,0xfffffff0) S .= "`n" . r " / " MP_Hex(y) ; 16777215(0xFFFFFF) / 0x100000010000001000000100000 MsgBox %S% S = Set Hex:`n i := 0 i++, MP_Set(a%i%,"0x0") i++, MP_Set(a%i%, 0x1234567) ; no need for quotes i++, MP_Set(a%i%, 0x12345678) i++, MP_Set(a%i%, 0x123456789) i++, MP_Set(a%i%,-0x123456789) i++, MP_Set(a%i%, 0x1234567890abcdef1234567890abcdef0fedcba98765432100) i++, MP_Set(a%i%,-0x1234567890abcdef1234567890abcdef0fedcba98765432100) i++, MP_Set(a%i%,-9223372036854775807) ; 2^63-1 i++, MP_Set(a%i%, 100) i++, MP_Set(a%i%,-0) i++, MP_Set(a%i%, 1.5) i++, MP_Set(a%i%,-0.75) i++, MP_Set(a%i%, 2.**52) i++, MP_Set(a%i%, 2.**52+3) i++, MP_Set(a%i%, 2.**62+2.**59) i++, MP_Set(a%i%, 2.**63-2.**59) i++, MP_Set(a%i%, 2.**63) i++, MP_Set(a%i%, 2.**63+2.**59) i++, MP_Set(a%i%, 2.**64-2.**59) i++, MP_Set(a%i%, 2.**64) i++, MP_Set(a%i%, 2.**64+2.**59) i++, MP_Set(a%i%, 2.**128-2.**120) i++, MP_Set(a%i%, 2.**128) i++, MP_Set(a%i%, 2.**128+2.**120) i++, MP_Set(a%i%, 2.**843+2.**842+2.**840+2.**839+2.**837) ; ~ max 0xDA000... i++, MP_Set(a%i%, 36028797018963968) ; 2**55 0x80000000000000 i++, MP_Set(a%i%, 4611686018427387904) ; 2**62 0x4000000000000000 i++, MP_Set(a%i%, 9223372036854775808) ; 2**63 0x8000000000000000 i++, MP_Set(a%i%, 18446744073709551616) ; 2**64 0x10000000000000000 i++, MP_Set(a%i%, 36893488147419103232) ; 2**65 0x20000000000000000 i++, MP_Set(a%i%,-987654321098765432109876543210) ;-0xC7748819DFFB62438D1C67EEA Loop %i% S .= A_Index . ": " . MP_Hex(a%A_Index%) . "`n" MsgBox %S% S = Set Decimal:`n i := 0 i++, MP_Set(a%i%, 36028797018963968) ; 2**55 0x80000000000000 i++, MP_Set(a%i%, 4611686018427387904) ; 2**62 0x4000000000000000 i++, MP_Set(a%i%, 9223372036854775808) ; 2**63 0x8000000000000000 i++, MP_Set(a%i%, 18446744073709551616) ; 2**64 0x10000000000000000 i++, MP_Set(a%i%, 36893488147419103232) ; 2**65 0x20000000000000000 i++, MP_Set(a%i%,-987654321098765432109876543210) ;-0xC7748819DFFB62438D1C67EEA Loop %i% S .= A_Index . ": " . MP_Dec(a%A_Index%) . "`n" MsgBox %S% S = Hex/Decimal Conversion:`n VarSetCapacity(z,999,Asc("0")) MP_Set(x, 0x1 . SubStr(z,500)) S .= "`n" . MP_Dec(x) ; 2**2000 in decimal form = 114813069527425452...62184851149029376 MP_Set(x, 1 . SubStr(z,500)) S .= "`n`n" . MP_Hex(x) ; 10**500 in hexadecimal form = 0x1F365FEC9370D2BAEE34B150720878EA52CCBA5E661...000(*125) MsgBox %S% ;--------------------------------------------------------------------------------------------------