aureooms-js-integer
Version:
integer code bricks for JavaScript
299 lines (245 loc) • 7.53 kB
JavaScript
import test from 'ava' ;
import array from 'aureooms-js-array' ;
import * as integer from '../../../src' ;
test('integer.bkaratsuba 16 big endian', function(assert){
var ia2a = function(a) {
var o = [];
var i = a.length;
while(i--){
o[i] = a[i];
}
return o;
};
var r = Math.pow(2, 16);
var add = integer.badd_t(r);
var sub = integer.bsub_t(r);
var calloc = function(n){ return new Uint16Array(n); };
var mov = array.copy;
var fill = array.fill;
var _bkaratsuba = integer.bkaratsuba_t(add, sub, undefined, calloc, mov, r);
var bkaratsuba = integer.bkaratsuba_t(add, sub, _bkaratsuba, calloc, mov, r);
var a = calloc(4), b = calloc(4), c = calloc(8);
a[3] = 4;
b[3] = 4;
bkaratsuba(a, 0, 4, b, 0, 4, c, 0, 8);
assert.deepEqual(ia2a(c), [0, 0, 0, 0, 0, 0, 0, 16], '4 * 4');
fill(c, 0, 8, 0);
a[3] = 16;
b[3] = 16;
bkaratsuba(a, 0, 4, b, 0, 4, c, 0, 8);
assert.deepEqual(ia2a(c), [0, 0, 0, 0, 0, 0, 0, 256], '16 * 16');
fill(c, 0, 8, 0);
a[3] = 32;
b[3] = 16;
bkaratsuba(a, 0, 4, b, 0, 4, c, 0, 8);
assert.deepEqual(ia2a(c), [0, 0, 0, 0, 0, 0, 0, 512], '32 * 16');
fill(c, 0, 8, 0);
a[3] = 16;
b[3] = 64;
bkaratsuba(a, 0, 4, b, 0, 4, c, 0, 8);
assert.deepEqual(ia2a(c), [0, 0, 0, 0, 0, 0, 0, 1024], '16 * 64');
fill(c, 0, 8, 0);
});
test('integer.bkaratsuba 8 big endian', function(assert){
var ia2a = function(a) {
var o = [];
var i = a.length;
while(i--){
o[i] = a[i];
}
return o;
};
var r = Math.pow(2, 8);
var add = integer.badd_t(r);
var sub = integer.bsub_t(r);
var calloc = function(n){ return new Uint8Array(n); };
var mov = array.copy;
var fill = array.fill;
var _bkaratsuba = integer.bkaratsuba_t(add, sub, undefined, calloc, mov, r);
var bkaratsuba = integer.bkaratsuba_t(add, sub, _bkaratsuba, calloc, mov, r);
var a = calloc(4), b = calloc(4), c = calloc(8);
a[3] = 4;
b[3] = 4;
bkaratsuba(a, 0, 4, b, 0, 4, c, 0, 8);
assert.deepEqual(ia2a(c), [0, 0, 0, 0, 0, 0, 0, 16], '4 * 4');
fill(c, 0, 8, 0);
a[3] = 16;
b[3] = 16;
bkaratsuba(a, 0, 4, b, 0, 4, c, 0, 8);
assert.deepEqual(ia2a(c), [0, 0, 0, 0, 0, 0, 1, 0], '16 * 16');
fill(c, 0, 8, 0);
a[3] = 32;
b[3] = 16;
bkaratsuba(a, 0, 4, b, 0, 4, c, 0, 8);
assert.deepEqual(ia2a(c), [0, 0, 0, 0, 0, 0, 2, 0], '32 * 16');
fill(c, 0, 8, 0);
a[3] = 16;
b[3] = 64;
bkaratsuba(a, 0, 4, b, 0, 4, c, 0, 8);
assert.deepEqual(ia2a(c), [0, 0, 0, 0, 0, 0, 4, 0], '16 * 64');
fill(c, 0, 8, 0);
a[3] = 255;
b[3] = 255;
bkaratsuba(a, 0, 4, b, 0, 4, c, 0, 8);
assert.deepEqual(ia2a(c), [0, 0, 0, 0, 0, 0, 254, 1], '255 * 255');
mov(c, 4, 8, a, 0, 4);
fill(c, 0, 8, 0);
b[3] = 0;
b[2] = 1;
bkaratsuba(a, 0, 4, b, 0, 4, c, 0, 8);
assert.deepEqual(ia2a(c), [0, 0, 0, 0, 0, 254, 1, 0], '255 * 255 * 256');
fill(c, 0, 8, 0);
b[3] = 200;
b[2] = 100;
a[3] = 200;
a[2] = 100;
bkaratsuba(a, 0, 4, b, 0, 4, c, 0, 8);
assert.deepEqual(ia2a(c), [0, 0, 0, 0, 39, 172, 220, 64], '25800 * 25800');
fill(c, 0, 8, 0);
b[3] = 200;
b[2] = 100;
a[3] = 200;
a[2] = 100;
bkaratsuba(a, 2, 4, b, 2, 4, c, 0, 2);
assert.deepEqual(ia2a(c), [220, 64, 0, 0, 0, 0, 0, 0], '25800 * 25800 c[0:2]');
fill(c, 0, 8, 0);
b[3] = 200;
b[2] = 100;
a[3] = 200;
a[2] = 100;
bkaratsuba(a, 2, 4, b, 2, 4, c, 0, 1);
assert.deepEqual(ia2a(c), [64, 0, 0, 0, 0, 0, 0, 0], '25800 * 25800 c[0:1]');
fill(c, 0, 8, 0);
b[3] = 200;
b[2] = 100;
a[3] = 200;
a[2] = 100;
bkaratsuba(a, 3, 4, b, 3, 4, c, 0, 1);
assert.deepEqual(ia2a(c), [64, 0, 0, 0, 0, 0, 0, 0], '200 * 200 c[0:1]');
fill(c, 0, 8, 0);
b[3] = 200;
b[2] = 100;
a[3] = 200;
a[2] = 100;
bkaratsuba(a, 0, 4, b, 0, 4, c, 0, 0);
assert.deepEqual(ia2a(c), [0, 0, 0, 0, 0, 0, 0, 0], '200 * 200 c[0:0]');
fill(c, 0, 8, 0);
});
test('integer.bkaratsuba 8 big endian bound checks', function(assert){
var ia2a = function(a) {
var o = [];
var i = a.length;
while(i--){
o[i] = a[i];
}
return o;
};
var sanebounds = function(a) {
for(var i = -8; i < 0; ++i){
if(a[i] !== undefined) return false;
}
return true;
};
var r = Math.pow(2, 8);
var add = integer.wrapbin(integer.badd_t(r));
var sub = integer.wrapbin(integer.bsub_t(r));
var calloc = function(n){ return new Uint8Array(n); };
var mov = integer.wrapmov(array.copy);
var fill = array.fill;
var _bkaratsuba = integer.bkaratsuba_t(add, sub, undefined, calloc, mov, r, integer.wrapbin);
var bkaratsuba = integer.bkaratsuba_t(add, sub, _bkaratsuba, calloc, mov, r, integer.wrapbin);
var a = calloc(4), b = calloc(4), c = calloc(8);
a[3] = 4;
b[3] = 4;
bkaratsuba(a, 0, 4, b, 0, 4, c, 0, 8);
assert.deepEqual(ia2a(c), [0, 0, 0, 0, 0, 0, 0, 16], '4 * 4');
assert.true(sanebounds(c), 'sanebounds 4 * 4');
fill(c, 0, 8, 0);
a[3] = 16;
b[3] = 16;
bkaratsuba(a, 0, 4, b, 0, 4, c, 0, 8);
assert.deepEqual(ia2a(c), [0, 0, 0, 0, 0, 0, 1, 0], '16 * 16');
assert.true(sanebounds(c), 'sanebounds 16 * 16');
fill(c, 0, 8, 0);
a[3] = 32;
b[3] = 16;
bkaratsuba(a, 0, 4, b, 0, 4, c, 0, 8);
assert.deepEqual(ia2a(c), [0, 0, 0, 0, 0, 0, 2, 0], '32 * 16');
assert.true(sanebounds(c), 'sanebounds 32 * 16');
fill(c, 0, 8, 0);
a[3] = 16;
b[3] = 64;
bkaratsuba(a, 0, 4, b, 0, 4, c, 0, 8);
assert.deepEqual(ia2a(c), [0, 0, 0, 0, 0, 0, 4, 0], '16 * 64');
assert.true(sanebounds(c), 'sanebounds 16 * 64');
fill(c, 0, 8, 0);
a[3] = 255;
b[3] = 255;
bkaratsuba(a, 0, 4, b, 0, 4, c, 0, 8);
assert.deepEqual(ia2a(c), [0, 0, 0, 0, 0, 0, 254, 1], '255 * 255');
assert.true(sanebounds(c), 'sanebounds 255 * 255');
mov(c, 4, 8, a, 0, 4);
fill(c, 0, 8, 0);
b[3] = 0;
b[2] = 1;
bkaratsuba(a, 0, 4, b, 0, 4, c, 0, 8);
assert.deepEqual(ia2a(c), [0, 0, 0, 0, 0, 254, 1, 0], '255 * 255 * 256');
assert.true(sanebounds(c), 'sanebounds 255 * 255 * 256');
fill(c, 0, 8, 0);
b[3] = 200;
b[2] = 100;
a[3] = 200;
a[2] = 100;
bkaratsuba(a, 0, 4, b, 0, 4, c, 0, 8);
assert.deepEqual(ia2a(c), [0, 0, 0, 0, 39, 172, 220, 64], '25800 * 25800');
assert.true(sanebounds(c), 'sanebounds 25800 * 25800');
fill(c, 0, 8, 0);
b[3] = 200;
b[2] = 100;
a[3] = 200;
a[2] = 100;
bkaratsuba(a, 2, 4, b, 2, 4, c, 0, 2);
assert.deepEqual(ia2a(c), [220, 64, 0, 0, 0, 0, 0, 0], '25800 * 25800 c[0:2]');
assert.true(sanebounds(c), 'sanebounds 25800 * 25800 c[0:2]');
fill(c, 0, 8, 0);
b[3] = 200;
b[2] = 100;
a[3] = 200;
a[2] = 100;
bkaratsuba(a, 2, 4, b, 2, 4, c, 0, 1);
assert.deepEqual(ia2a(c), [64, 0, 0, 0, 0, 0, 0, 0], '25800 * 25800 c[0:1]');
assert.true(sanebounds(c), 'sanebounds 25800 * 25800 c[0:1]');
fill(c, 0, 8, 0);
b[3] = 200;
b[2] = 100;
a[3] = 200;
a[2] = 100;
bkaratsuba(a, 3, 4, b, 3, 4, c, 0, 1);
assert.deepEqual(ia2a(c), [64, 0, 0, 0, 0, 0, 0, 0], '200 * 200 c[0:1]');
assert.true(sanebounds(c), 'sanebounds 200 * 200 c[0:1]');
fill(c, 0, 8, 0);
b[3] = 200;
b[2] = 100;
a[3] = 200;
a[2] = 100;
bkaratsuba(a, 0, 4, b, 0, 4, c, 0, 0);
assert.deepEqual(ia2a(c), [0, 0, 0, 0, 0, 0, 0, 0], '200 * 200 c[0:0]');
assert.true(sanebounds(c), 'sanebounds 200 * 200 c[0:0]');
fill(c, 0, 8, 0);
b[3] = 200;
b[2] = 100;
a[3] = 200;
a[2] = 100;
bkaratsuba(a, -1, 4, b, 0, 4, c, 0, 3);
assert.deepEqual(ia2a(c), [172, 220, 64, 0, 0, 0, 0, 0], '25800 * 25800 c[0:3]');
assert.true(sanebounds(c), 'sanebounds 25800 * 25800 c[0:3]');
fill(c, 0, 8, 0);
b[3] = 200;
b[2] = 100;
a[3] = 200;
a[2] = 100;
mov(a, -1, 4, c, 0);
assert.deepEqual(ia2a(c), [0, 0, 0, 100, 200, 0, 0, 0], 'mov(a, -1, 4, c, 0);');
assert.true(sanebounds(c), 'sanebounds mov(a, -1, 4, c, 0);');
fill(c, 0, 8, 0);
});