aboutsummaryrefslogtreecommitdiff
path: root/v_windows/v/vlib/math/big/big.js.v
diff options
context:
space:
mode:
Diffstat (limited to 'v_windows/v/vlib/math/big/big.js.v')
-rw-r--r--v_windows/v/vlib/math/big/big.js.v198
1 files changed, 198 insertions, 0 deletions
diff --git a/v_windows/v/vlib/math/big/big.js.v b/v_windows/v/vlib/math/big/big.js.v
new file mode 100644
index 0000000..0ed469c
--- /dev/null
+++ b/v_windows/v/vlib/math/big/big.js.v
@@ -0,0 +1,198 @@
+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))
+}