From 42dbf1103d3992b7e280e8f2ffdf49a8b843f771 Mon Sep 17 00:00:00 2001 From: Walter Oggioni Date: Sun, 28 May 2023 20:02:00 +0800 Subject: [PATCH] added BigInteger parse function --- src/mmath/bigint.nim | 9 +++++++++ src/mmath/error.nim | 4 ++++ src/mmath/hmatrix.nim | 3 ++- src/mmath/pivot.nim | 2 -- src/mmath/smatrix.nim | 3 ++- 5 files changed, 17 insertions(+), 4 deletions(-) create mode 100644 src/mmath/error.nim diff --git a/src/mmath/bigint.nim b/src/mmath/bigint.nim index 066b116..8648114 100644 --- a/src/mmath/bigint.nim +++ b/src/mmath/bigint.nim @@ -1,3 +1,4 @@ +from error import ParseError import nwo/clib type mpz_t = object @@ -15,6 +16,7 @@ cxface: proc mpz_set_si(self : mpz_ptr, value : clong) : void proc mpz_get_str(destination : cstring, base : cint, self : mpz_ptr) : cstring proc mpz_sizeinbase(self : mpz_ptr, base :cint) : csize_t + proc mpz_set_str(self : mpz_ptr, std: cstring, base : cint) : int proc mpz_add(rop : mpz_ptr, op1 : mpz_ptr, op2 : mpz_ptr) : void proc mpz_add_ui(rop : mpz_ptr, op1 : mpz_ptr, op2 : culong) : void proc mpz_sub(rop : mpz_ptr, op1 : mpz_ptr, op2 : mpz_ptr) : void @@ -68,6 +70,13 @@ proc toString*(n : BigInt, base : cint) : string = result = $space dealloc(space) +proc fromString*(t : type[BigInt], s : string, base : int = 10) : BigInt = + new(result) + let mpz : mpz_ptr = addr(result[]) + let rc = mpz_set_str(mpz, s, base.cint) + if rc != 0: + raise newException(ParseError, "Cannot parse integer with base " & $base & " from string " & "'" & s & "'") + proc `$`*(n : BigInt) : string = toString(n, 10) proc `+`*(n1 : BigInt, n2 : BigInt) : BigInt = diff --git a/src/mmath/error.nim b/src/mmath/error.nim new file mode 100644 index 0000000..ddbde58 --- /dev/null +++ b/src/mmath/error.nim @@ -0,0 +1,4 @@ +type + SingularMatrixError* = object of ValueError + SizeError* = object of ValueError + ParseError* = object of ValueError \ No newline at end of file diff --git a/src/mmath/hmatrix.nim b/src/mmath/hmatrix.nim index 2e6cb81..002dd9c 100644 --- a/src/mmath/hmatrix.nim +++ b/src/mmath/hmatrix.nim @@ -1,6 +1,7 @@ from nwo/utils import `-->` from hvector import HVector, newHVector, buildHVector -from pivot import HPivot, newHPivot, `[]`, `[]=`, len, SizeError, SingularMatrixError +from pivot import HPivot, newHPivot, `[]`, `[]=`, len +from error import SizeError, SingularMatrixError from math import sqrt type diff --git a/src/mmath/pivot.nim b/src/mmath/pivot.nim index 9be55b1..6927df8 100644 --- a/src/mmath/pivot.nim +++ b/src/mmath/pivot.nim @@ -8,8 +8,6 @@ type SPivot*[SIZE : static[int], T] = object data : array[SIZE, int] permutations* : int - SingularMatrixError* = object of ValueError - SizeError* = object of ValueError proc `[]`*[T](p : HPivot[T], index : int) : int = p.data[index] proc `[]=`*[T](p : var HPivot[T], index : int, value : int) = p.data[index] = value diff --git a/src/mmath/smatrix.nim b/src/mmath/smatrix.nim index 4f61759..80ee321 100644 --- a/src/mmath/smatrix.nim +++ b/src/mmath/smatrix.nim @@ -1,6 +1,7 @@ from nwo/utils import `-->`, box from svector import SVector -from pivot import SPivot, newSPivot, `[]`, `[]=`, SingularMatrixError, len +from pivot import SPivot, newSPivot, `[]`, `[]=`, len +from error import SizeError, SingularMatrixError from math import sqrt type