v/vlib/math/big/big.js.v

199 lines
2.9 KiB
V

module big
struct JS.BigInt {}
#const jsNumber = Number;
pub struct Number {
}
pub fn new() Number {
return Number{}
}
pub fn from_int(i int) Number {
n := Number{}
#n.value = BigInt(+i)
return n
}
pub fn from_u64(u u64) Number {
n := Number{}
#n.value = BigInt(u.val)
return n
}
pub fn from_hex_string(input string) Number {
n := Number{}
#n.value = BigInt(input.val)
return n
}
pub fn from_string(input string) Number {
n := Number{}
#n.value = BigInt(input.val)
return n
}
pub fn (n &Number) int() int {
r := 0
#r.val = jsNumber(n.val.value)
return r
}
pub fn (n &Number) str() string {
s := ''
#s.str = n.val.value + ""
return s
}
pub fn (a &Number) + (b &Number) Number {
c := Number{}
#c.value = a.val.value + b.val.value
return c
}
pub fn (a &Number) - (b &Number) Number {
c := Number{}
#c.value = a.val.value - b.val.value
return c
}
pub fn (a &Number) / (b &Number) Number {
c := Number{}
#c.value = a.val.value / b.val.value
return c
}
pub fn (a &Number) * (b &Number) Number {
c := Number{}
#c.value = a.val.value * b.val.value
return c
}
/*
pub fn (a &Number) % (b &Number) Number {
c := Number{}
# c.value = a.val.value % b.val.value
return c
}*/
pub fn divmod(a &Number, b &Number) (Number, Number) {
c := Number{}
d := Number{}
#c.value = a.val.value / b.val.value
#d.value = a.val.value % b.val.value
return c, d
}
pub fn cmp(a &Number, b &Number) int {
res := 0
#if (a.val.value < b.val.value) res.val = -1
#else if (a.val.value > b.val.value) res.val = 1
#else res.val = 0
return res
}
pub fn (a &Number) is_zero() bool {
res := false
#res.val = a.val.value == BigInt(0)
return res
}
pub fn (mut a Number) inc() {
#a.val.value = a.val.value + BigInt(1)
}
pub fn (mut a Number) dec() {
#a.val.value = a.val.value - BigInt(1)
}
pub fn (a &Number) isqrt() Number {
b := Number{}
#let x0 = a.val.value >> 1n
#if (x0) {
#let x1 = (x0 + a.val.value / x0) >> 1n
#while (x1 < x0) {
#x0 = x1
#x1 = (x0 + a.val.value / x0) >> 1n
#}
#b.value = x0
#} else { b.value = a.val.value; }
return b
}
pub fn b_and(a &Number, b &Number) Number {
c := Number{}
#c.value = a.val.value & b.val.value
return c
}
pub fn b_or(a &Number, b &Number) Number {
c := Number{}
#c.value = a.val.value | b.val.value
return c
}
pub fn b_xor(a &Number, b &Number) Number {
c := Number{}
#c.value = a.val.value ^ b.val.value
return c
}
pub fn (a &Number) lshift(nbits int) Number {
c := Number{}
#c.value = a.val.value << BigInt(+nbits)
return c
}
pub fn (a &Number) rshift(nbits int) Number {
c := Number{}
#c.value = a.val.value << BigInt(+nbits)
return c
}
pub fn (a &Number) clone() Number {
b := Number{}
#b.value = a.val.value
return b
}
pub fn factorial(nn &Number) Number {
mut n := nn.clone()
mut a := nn.clone()
n.dec()
mut i := 1
for !n.is_zero() {
res := a * n
n.dec()
a = res
i++
}
return a
}
pub fn fact(n int) Number {
return factorial(from_int(n))
}