You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
267 lines
6.0 KiB
267 lines
6.0 KiB
var w = 4294967296; // 先固定
|
|
var M = r2(0,0,false);
|
|
|
|
|
|
function mul_(v0, v1, v2, v3){
|
|
let i32_v0 = new Int32Array(8);
|
|
i32_v0[0] = v0;
|
|
let i64_v0 = new BigInt64Array(i32_v0.buffer)[0];
|
|
// console.log(i64_v0)
|
|
let i32_v1 = new Int32Array(8);
|
|
i32_v1[0] = v1;
|
|
let i64_v1 = new BigInt64Array(i32_v1.buffer)[0];
|
|
|
|
|
|
let i32_v2 = new Int32Array(8);
|
|
i32_v2[0] = v2;
|
|
let i64_v2 = new BigInt64Array(i32_v2.buffer)[0];
|
|
|
|
|
|
let i32_v3 = new Int32Array(8);
|
|
i32_v3[0] = v3;
|
|
let i64_v3 = new BigInt64Array(i32_v3.buffer)[0];
|
|
|
|
let i64_const = 32n;
|
|
|
|
// shl、or、mul操作
|
|
let tmp = (i64_v0 | (i64_v1 << i64_const)) * (i64_v2 | (i64_v3 << i64_const));
|
|
|
|
// console.log(Number(tmp), tmp)
|
|
// global0 shr_s
|
|
let get_length = Number(tmp >> i64_const);
|
|
|
|
let res = Number(tmp) >> 32;
|
|
|
|
// console.log(res, get_length);
|
|
return {mul: res, get_length: get_length}
|
|
|
|
}
|
|
|
|
|
|
|
|
function div_u_(v0, v1, v2, v3){
|
|
let i32_v0 = new Int32Array(8);
|
|
i32_v0[0] = v0;
|
|
let i64_v0 = new BigInt64Array(i32_v0.buffer)[0];
|
|
// console.log(i64_v0)
|
|
let i32_v1 = new Int32Array(8);
|
|
i32_v1[0] = v1;
|
|
let i64_v1 = new BigInt64Array(i32_v1.buffer)[0];
|
|
// console.log(i64_v1)
|
|
|
|
let i32_v2 = new Int32Array(8);
|
|
i32_v2[0] = v2;
|
|
let i64_v2 = new BigInt64Array(i32_v2.buffer)[0];
|
|
|
|
|
|
let i32_v3 = new Int32Array(8);
|
|
i32_v3[0] = v3;
|
|
let i64_v3 = new BigInt64Array(i32_v3.buffer)[0];
|
|
|
|
let i64_const = 32n;
|
|
// let u32_max = 0xFFFFFFFF;
|
|
|
|
// shl、or、div操作
|
|
let tmp = ((i64_v0 | (i64_v1 << i64_const)) / (i64_v2 | (i64_v3 << i64_const)))
|
|
|
|
// console.log(Number(tmp))
|
|
// global0 shr_s
|
|
let get_length = Number(tmp >> i64_const);
|
|
|
|
let res = Number(tmp) >> 32;
|
|
|
|
// console.log(res, get_length);
|
|
return {div_u: res, get_length: get_length}
|
|
|
|
}
|
|
|
|
|
|
|
|
function randomInt (e, t) {
|
|
return Math.floor(Math.random() * (t - e + 1) + e)
|
|
}
|
|
|
|
function o(t) {
|
|
return !0 === (t && t.__isLong__)
|
|
}
|
|
|
|
function m(t, e) {
|
|
return "number" == typeof t ? l(t, e) : "string" == typeof t ? y(t, e) : d(t.low, t.high, "boolean" == typeof e ? e : t.unsigned)
|
|
}
|
|
|
|
|
|
function toUnsigned(obj) {
|
|
return obj.unsigned ? obj : d(obj.low, obj.high, !0)
|
|
}
|
|
|
|
function isZero(obj) {
|
|
return 0 === obj.high && 0 === obj.low
|
|
}
|
|
|
|
|
|
function r2(t, e, n) {
|
|
return {low:0 | t, high:0 | e, unsigned:!!n}
|
|
}
|
|
|
|
|
|
function d(t, e, n) {
|
|
return r2(t,e,n)
|
|
}
|
|
|
|
function eq(t, obj) {
|
|
return o(t) || (t = m(t)),
|
|
(obj.unsigned === t.unsigned || obj.high >>> 31 != 1 || t.high >>> 31 != 1) && (obj.high === t.high && obj.low === t.low)
|
|
}
|
|
|
|
function not(obj){
|
|
return d(~obj.low, ~obj.high, obj.unsigned);
|
|
}
|
|
|
|
function neg(obj) {
|
|
let k = {
|
|
"low": 1,
|
|
"high": 0,
|
|
"unsigned": false
|
|
}
|
|
return add(k, not(obj));
|
|
}
|
|
|
|
|
|
|
|
function l(t, e) {
|
|
return t < 0 ? l(-t, e).neg() : d(t % w | 0, t / w | 0, e)
|
|
}
|
|
|
|
function isNegative(obj){
|
|
return !obj.unsigned && obj.high < 0
|
|
}
|
|
|
|
|
|
function isOdd(obj) {
|
|
return 1 == (1 & obj.low)
|
|
}
|
|
|
|
|
|
function mul(t, obj) {
|
|
if (isZero(obj))
|
|
return M;
|
|
if (o(t) || (t = m(t))){
|
|
let mul$ = mul_(obj.low, obj.high, t.low, t.high);
|
|
return d(mul$["mul"], mul$["get_length"], obj.unsigned);
|
|
}
|
|
if (isZero(t))
|
|
return M;
|
|
if (eq(j, obj))
|
|
return t.isOdd() ? j : M;
|
|
if (eq(j, t))
|
|
return isOdd(obj) ? j : M;
|
|
if (isNegative(obj))
|
|
return t.isNegative() ? this.neg().mul(t.neg()) : this.neg().mul(t).neg();
|
|
if (t.isNegative())
|
|
return this.mul(t.neg()).neg();
|
|
if (this.lt(x) && t.lt(x))
|
|
return l(this.toNumber() * t.toNumber(), this.unsigned);
|
|
var e = obj.high >>> 16
|
|
, r = 65535 & obj.high
|
|
, f = obj.low >>> 16
|
|
, c = 65535 & obj.low
|
|
, h = t.high >>> 16
|
|
, v = 65535 & t.high
|
|
, y = t.low >>> 16
|
|
, w = 65535 & t.low
|
|
, _ = 0
|
|
, S = 0
|
|
, E = 0
|
|
, k = 0;
|
|
return E += (k += c * w) >>> 16,
|
|
S += (E += f * w) >>> 16,
|
|
E &= 65535,
|
|
S += (E += c * y) >>> 16,
|
|
_ += (S += r * w) >>> 16,
|
|
S &= 65535,
|
|
_ += (S += f * y) >>> 16,
|
|
S &= 65535,
|
|
_ += (S += c * v) >>> 16,
|
|
_ += e * w + r * y + f * v + c * h,
|
|
d((E &= 65535) << 16 | (k &= 65535), (_ &= 65535) << 16 | (S &= 65535), obj.unsigned)
|
|
}
|
|
|
|
|
|
function div(t, o){
|
|
let div_ = div_u_(o.low, o.high, t.low, t.high);
|
|
return o.unsigned || -2147483648 !== o.high || -1 !== t.low || -1 !== t.high ? d(div_["div_u"], div_["get_length"], o.unsigned) : o;
|
|
}
|
|
|
|
|
|
function sub(t, obj) {
|
|
return o(t) || (t = m(t)),
|
|
add(neg(t), obj)
|
|
}
|
|
|
|
function toInt(obj) {
|
|
return obj.unsigned ? obj.low >>> 0 : obj.low
|
|
}
|
|
|
|
|
|
function toS(t, obj){
|
|
for (var r = l(Math.pow(t, 6), obj.unsigned), o = obj, f = ""; ; ) {
|
|
var c = div(r, o)
|
|
|
|
h = (toInt(sub(mul(r, c), o)) >>> 0).toString(t),
|
|
h = (toInt(sub(mul(r, c), o)) >>> 0).toString(t);
|
|
if (isZero(o = c))
|
|
return h + f;
|
|
for (; h.length < 6; )
|
|
h = "0" + h;
|
|
f = "" + h + f
|
|
}
|
|
}
|
|
|
|
|
|
function add(t, obj) {
|
|
o(t) || (t = m(t));
|
|
var e = obj.high >>> 16
|
|
, n = 65535 & obj.high
|
|
, r = obj.low >>> 16
|
|
, f = 65535 & obj.low
|
|
, c = t.high >>> 16
|
|
, h = 65535 & t.high
|
|
, l = t.low >>> 16
|
|
, v = 0
|
|
, y = 0
|
|
, w = 0
|
|
, _ = 0;
|
|
return w += (_ += f + (65535 & t.low)) >>> 16,
|
|
y += (w += r + l) >>> 16,
|
|
v += (y += n + h) >>> 16,
|
|
v += e + c,
|
|
d((w &= 65535) << 16 | (_ &= 65535), (v &= 65535) << 16 | (y &= 65535), obj.unsigned)
|
|
}
|
|
|
|
function y(t, e, n) {
|
|
var p;
|
|
for (var r = l(Math.pow(n, 8)), o = M, i = 0; i < t.length; i += 8) {
|
|
var f = Math.min(8, t.length - i)
|
|
, c = parseInt(t.substring(i, i + f), n);
|
|
if (f < 8) {
|
|
var h = l(Math.pow(n, f));
|
|
o = add(l(c), mul(h, o));
|
|
} else{
|
|
o = add(l(c), mul(r, o));
|
|
}
|
|
|
|
}
|
|
return o.unsigned = e,
|
|
o
|
|
}
|
|
|
|
function getS(key){
|
|
return toS(10, toUnsigned(y(key, !0, 16)));
|
|
}
|
|
|
|
|
|
module.exports = {
|
|
getS
|
|
}
|
|
|
|
|