added rational numbers
This commit is contained in:
@@ -1,7 +1,8 @@
|
||||
from random import initRand, rand
|
||||
from nwo/utils import `...`
|
||||
from mmath/rational import newRational, Rational, one, zero, abs, `>`, `<`, `==`, `*`, `+`, `-`, `/`, `/=`, `+=`, `sqrt`
|
||||
from mmath/hmatrix import det, lu, from_pivot, newHMatrix, HMatrix, lu_det, invert, identity,
|
||||
clone, tril, triu, lu_solve, `*`, `-`, `+`, `+=`, `-=`, `==`, norm2, transpose, lup
|
||||
clone, tril, triu, lu_solve, `*`, `-`, `+`, `+=`, `-=`, `==`, norm2, transpose, lup, squared_norm2
|
||||
from mmath/hvector import buildHVector, newHVector, `-`, abs, norm
|
||||
import unittest
|
||||
|
||||
@@ -58,16 +59,16 @@ suite "Nim linear algebra library":
|
||||
|
||||
test "LU decomposition":
|
||||
var rng = initRand(101325)
|
||||
var arr : array[0..(25 - 1), float32]
|
||||
var arr : array[0..(25 - 1), Rational[int64]]
|
||||
for i in 0..<arr.len:
|
||||
arr[i] = rng.rand(-4f32..4f32)
|
||||
let mtx = newHMatrix[float32](5, 5, arr)
|
||||
arr[i] = newRational(rng.rand(-20..20).int64, 20.int64)
|
||||
let mtx = newHMatrix[Rational[int64]](5, 5, arr)
|
||||
var lu = mtx.clone()
|
||||
let pivot = lu.lup()
|
||||
let l = lu.tril(1.0)
|
||||
let l = lu.tril(Rational[int64].one)
|
||||
let u = lu.triu()
|
||||
let err = pivot * mtx - (l * u)
|
||||
check(err.norm2() < 1e-5)
|
||||
check(err.squared_norm2() == Rational[int64].zero)
|
||||
|
||||
test "Linear system solve":
|
||||
var rng = initRand(101325)
|
||||
|
96
tests/test_rational.nim
Normal file
96
tests/test_rational.nim
Normal file
@@ -0,0 +1,96 @@
|
||||
import unittest
|
||||
from mmath/rational import newRational, `+`, `-`, `*`, `/`, `$`, simplify, gcd, pow, mcm, `==`, `cmp`, `<`, `>`, `<=`, `>=`, abs
|
||||
|
||||
suite "Nim rational numbers":
|
||||
|
||||
test "gcd":
|
||||
let a = 14
|
||||
let b = 21
|
||||
check 7 == gcd(a, b)
|
||||
|
||||
test "mcm":
|
||||
let a = 14
|
||||
let b = 21
|
||||
check 42 == mcm(a, b)
|
||||
|
||||
test "pow":
|
||||
check 625 == pow(5, 4)
|
||||
|
||||
test "==":
|
||||
let r1 = newRational(1, 3)
|
||||
let r2 = newRational(5, 15)
|
||||
let r3 = newRational(35, 105)
|
||||
check r1 == r2
|
||||
check r1 == r3
|
||||
check r2 == r3
|
||||
|
||||
test "+":
|
||||
let r1 = newRational(1, 3)
|
||||
let r2 = newRational(2, 3)
|
||||
let r3 = r1 + r2
|
||||
check r3 == newRational(1)
|
||||
|
||||
test "-":
|
||||
let r1 = newRational(1, 3)
|
||||
let r2 = newRational(2, 3)
|
||||
let r3 = r1 - r2
|
||||
check r3 == newRational(-1, 3)
|
||||
|
||||
test "*":
|
||||
let r1 = newRational(1, 3)
|
||||
let r2 = newRational(2, 3)
|
||||
let r3 = r1 * r2
|
||||
check r3 == newRational(2, 9)
|
||||
|
||||
test "/":
|
||||
let r1 = newRational(1, 3)
|
||||
let r2 = newRational(2, 3)
|
||||
let r3 = r1 / r2
|
||||
check r3 == newRational(1, 2)
|
||||
|
||||
test "simplify":
|
||||
var r1 = newRational(65, 169)
|
||||
check r1 == newRational(5, 13)
|
||||
r1.simplify()
|
||||
check r1.num == 5
|
||||
check r1.den == 13
|
||||
|
||||
test "pow":
|
||||
let r1 = newRational(65, 169)
|
||||
let r2 = r1.pow(2)
|
||||
check r2 == newRational(25, 169)
|
||||
|
||||
test "cmp":
|
||||
let r1 = newRational(65, 169)
|
||||
let r2 = newRational(5, 13)
|
||||
let r3 = newRational(6, 13)
|
||||
check r1 < r3
|
||||
check r3 > r1
|
||||
check r1 <= r3
|
||||
check r1 <= r2
|
||||
check r3 >= r1
|
||||
check r2 >= r1
|
||||
check r2 == r1
|
||||
|
||||
test "abs":
|
||||
let r1 = newRational(-65, -169)
|
||||
let r2 = newRational(65, -169)
|
||||
check r1 == r1.abs()
|
||||
check r1 == r2.abs()
|
||||
check r1 != r2
|
||||
|
||||
test "i64":
|
||||
let p1 = 32452867i64
|
||||
let p2 = 49979687i64
|
||||
let p3 = 15485867i64
|
||||
let r1 = newRational(p3, p1 * p2)
|
||||
let r2 = newRational(p2, p1 * p3)
|
||||
var r3 = newRational(p2, p2 * p3)
|
||||
check newRational(1i64, p3) == r3
|
||||
r3.simplify()
|
||||
check r3.num == 1i64
|
||||
check r3.den == p3
|
||||
expect(OverflowDefect):
|
||||
discard r1 / r2
|
||||
expect(OverflowDefect):
|
||||
discard r1 + r2
|
@@ -2,9 +2,10 @@ from random import initRand, rand
|
||||
from nwo/utils import `...`
|
||||
from mmath/smatrix import det, lu, lup, lu_det, lup, det, from_pivot, invert, identity,
|
||||
newSMatrix, SMatrix, clone, tril, triu, lu_solve, `$`, `*`, `-`, `+`, `-=`, `+=`, `==`, `*`, norm2, newSMatrixFromArray,
|
||||
gauss_jordan_high, gauss_jordan_low, transpose
|
||||
gauss_jordan_high, gauss_jordan_low, transpose, squared_norm2
|
||||
from mmath/svector import buildSVector, `-`, abs, norm, Svector
|
||||
from mmath/pivot import SingularMatrixError
|
||||
from mmath/rational import newRational, Rational, one, zero, abs, `>`, `<`, `==`, `*`, `+`, `-`, `/`, `/=`, `+=`, `sqrt`
|
||||
import unittest
|
||||
|
||||
suite "Nim linear algebra library":
|
||||
@@ -58,19 +59,19 @@ suite "Nim linear algebra library":
|
||||
test "Inverse":
|
||||
let err = test_matrix * test_matrix.invert() - identity[3, float32]()
|
||||
check(err.norm2() < 1e-5)
|
||||
|
||||
|
||||
test "LU decomposition":
|
||||
var rng = initRand(101325)
|
||||
var arr : array[0..(25 - 1), float32]
|
||||
var arr : array[0..(25 - 1), Rational[int64]]
|
||||
for i in 0..<arr.len:
|
||||
arr[i] = rng.rand(-4f32..4f32)
|
||||
let mtx = newSMatrixFromArray[5, 5, float32](arr)
|
||||
var lu = mtx.clone()
|
||||
arr[i] = newRational(rng.rand(-20..20).int64, 20.int64)
|
||||
let mtx = newSMatrixFromArray[5, 5, Rational[int64]](arr)
|
||||
var lu = mtx.clone()
|
||||
let pivot = lu.lup()
|
||||
let l = lu.tril(1.0)
|
||||
let l = lu.tril(Rational[int64].one)
|
||||
let u = lu.triu()
|
||||
let err = pivot * mtx - (l * u)
|
||||
check(err.norm2() < 1e-5)
|
||||
check(err.squared_norm2() == Rational[int64].zero)
|
||||
|
||||
test "Linear system solve":
|
||||
var rng = initRand(101325)
|
||||
|
Reference in New Issue
Block a user