bn.js 4.12.0 → 4.12.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/bn.js +6 -5
- package/package.json +1 -1
- package/util/genCombMulTo.js +65 -0
- package/util/genCombMulTo10.js +65 -0
package/lib/bn.js
CHANGED
|
@@ -452,16 +452,16 @@
|
|
|
452
452
|
var w = this.words[i];
|
|
453
453
|
var word = (((w << off) | carry) & 0xffffff).toString(16);
|
|
454
454
|
carry = (w >>> (24 - off)) & 0xffffff;
|
|
455
|
-
if (carry !== 0 || i !== this.length - 1) {
|
|
456
|
-
out = zeros[6 - word.length] + word + out;
|
|
457
|
-
} else {
|
|
458
|
-
out = word + out;
|
|
459
|
-
}
|
|
460
455
|
off += 2;
|
|
461
456
|
if (off >= 26) {
|
|
462
457
|
off -= 26;
|
|
463
458
|
i--;
|
|
464
459
|
}
|
|
460
|
+
if (carry !== 0 || i !== this.length - 1) {
|
|
461
|
+
out = zeros[6 - word.length] + word + out;
|
|
462
|
+
} else {
|
|
463
|
+
out = word + out;
|
|
464
|
+
}
|
|
465
465
|
}
|
|
466
466
|
if (carry !== 0) {
|
|
467
467
|
out = carry.toString(16) + out;
|
|
@@ -1921,6 +1921,7 @@
|
|
|
1921
1921
|
this.words[i] = carry;
|
|
1922
1922
|
this.length++;
|
|
1923
1923
|
}
|
|
1924
|
+
this.length = num === 0 ? 1 : this.length;
|
|
1924
1925
|
|
|
1925
1926
|
return this;
|
|
1926
1927
|
};
|
package/package.json
CHANGED
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
// NOTE: This could be potentionally used to generate loop-less multiplications
|
|
4
|
+
function genCombMulTo (alen, blen) {
|
|
5
|
+
var len = alen + blen - 1;
|
|
6
|
+
var src = [
|
|
7
|
+
'var a = self.words;',
|
|
8
|
+
'var b = num.words;',
|
|
9
|
+
'var o = out.words;',
|
|
10
|
+
'var c = 0;',
|
|
11
|
+
'var lo;',
|
|
12
|
+
'var mid;',
|
|
13
|
+
'var hi;'
|
|
14
|
+
];
|
|
15
|
+
for (var i = 0; i < alen; i++) {
|
|
16
|
+
src.push('var a' + i + ' = a[' + i + '] | 0;');
|
|
17
|
+
src.push('var al' + i + ' = a' + i + ' & 0x1fff;');
|
|
18
|
+
src.push('var ah' + i + ' = a' + i + ' >>> 13;');
|
|
19
|
+
}
|
|
20
|
+
for (i = 0; i < blen; i++) {
|
|
21
|
+
src.push('var b' + i + ' = b[' + i + '] | 0;');
|
|
22
|
+
src.push('var bl' + i + ' = b' + i + ' & 0x1fff;');
|
|
23
|
+
src.push('var bh' + i + ' = b' + i + ' >>> 13;');
|
|
24
|
+
}
|
|
25
|
+
src.push('');
|
|
26
|
+
src.push('out.negative = self.negative ^ num.negative;');
|
|
27
|
+
src.push('out.length = ' + len + ';');
|
|
28
|
+
|
|
29
|
+
for (var k = 0; k < len; k++) {
|
|
30
|
+
var minJ = Math.max(0, k - alen + 1);
|
|
31
|
+
var maxJ = Math.min(k, blen - 1);
|
|
32
|
+
|
|
33
|
+
src.push('\/* k = ' + k + ' *\/');
|
|
34
|
+
src.push('var w' + k + ' = c;');
|
|
35
|
+
src.push('c = 0;');
|
|
36
|
+
for (var j = minJ; j <= maxJ; j++) {
|
|
37
|
+
i = k - j;
|
|
38
|
+
|
|
39
|
+
src.push('lo = Math.imul(al' + i + ', bl' + j + ');');
|
|
40
|
+
src.push('mid = Math.imul(al' + i + ', bh' + j + ');');
|
|
41
|
+
src.push('mid = (mid + Math.imul(ah' + i + ', bl' + j + ')) | 0;');
|
|
42
|
+
src.push('hi = Math.imul(ah' + i + ', bh' + j + ');');
|
|
43
|
+
|
|
44
|
+
src.push('w' + k + ' = (w' + k + ' + lo) | 0;');
|
|
45
|
+
src.push('w' + k + ' = (w' + k + ' + ((mid & 0x1fff) << 13)) | 0;');
|
|
46
|
+
src.push('c = (c + hi) | 0;');
|
|
47
|
+
src.push('c = (c + (mid >>> 13)) | 0;');
|
|
48
|
+
src.push('c = (c + (w' + k + ' >>> 26)) | 0;');
|
|
49
|
+
src.push('w' + k + ' &= 0x3ffffff;');
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
// Store in separate step for better memory access
|
|
53
|
+
for (k = 0; k < len; k++) {
|
|
54
|
+
src.push('o[' + k + '] = w' + k + ';');
|
|
55
|
+
}
|
|
56
|
+
src.push('if (c !== 0) {',
|
|
57
|
+
' o[' + k + '] = c;',
|
|
58
|
+
' out.length++;',
|
|
59
|
+
'}',
|
|
60
|
+
'return out;');
|
|
61
|
+
|
|
62
|
+
return src.join('\n');
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
console.log(genCombMulTo(10, 10));
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
function genCombMulTo (alen, blen) {
|
|
4
|
+
var len = alen + blen - 1;
|
|
5
|
+
var src = [
|
|
6
|
+
'var a = self.words;',
|
|
7
|
+
'var b = num.words;',
|
|
8
|
+
'var o = out.words;',
|
|
9
|
+
'var c = 0;',
|
|
10
|
+
'var lo;',
|
|
11
|
+
'var mid;',
|
|
12
|
+
'var hi;'
|
|
13
|
+
];
|
|
14
|
+
for (var i = 0; i < alen; i++) {
|
|
15
|
+
src.push('var a' + i + ' = a[' + i + '] | 0;');
|
|
16
|
+
src.push('var al' + i + ' = a' + i + ' & 0x1fff;');
|
|
17
|
+
src.push('var ah' + i + ' = a' + i + ' >>> 13;');
|
|
18
|
+
}
|
|
19
|
+
for (i = 0; i < blen; i++) {
|
|
20
|
+
src.push('var b' + i + ' = b[' + i + '] | 0;');
|
|
21
|
+
src.push('var bl' + i + ' = b' + i + ' & 0x1fff;');
|
|
22
|
+
src.push('var bh' + i + ' = b' + i + ' >>> 13;');
|
|
23
|
+
}
|
|
24
|
+
src.push('');
|
|
25
|
+
src.push('out.negative = self.negative ^ num.negative;');
|
|
26
|
+
src.push('out.length = ' + len + ';');
|
|
27
|
+
|
|
28
|
+
for (var k = 0; k < len; k++) {
|
|
29
|
+
var minJ = Math.max(0, k - alen + 1);
|
|
30
|
+
var maxJ = Math.min(k, blen - 1);
|
|
31
|
+
|
|
32
|
+
src.push('\/* k = ' + k + ' *\/');
|
|
33
|
+
src.push('lo = Math.imul(al' + (k - minJ) + ', bl' + minJ + ');');
|
|
34
|
+
src.push('mid = Math.imul(al' + (k - minJ) + ', bh' + minJ + ');');
|
|
35
|
+
src.push(
|
|
36
|
+
'mid = (mid + Math.imul(ah' + (k - minJ) + ', bl' + minJ + ')) | 0;');
|
|
37
|
+
src.push('hi = Math.imul(ah' + (k - minJ) + ', bh' + minJ + ');');
|
|
38
|
+
|
|
39
|
+
for (var j = minJ + 1; j <= maxJ; j++) {
|
|
40
|
+
i = k - j;
|
|
41
|
+
|
|
42
|
+
src.push('lo = (lo + Math.imul(al' + i + ', bl' + j + ')) | 0;');
|
|
43
|
+
src.push('mid = (mid + Math.imul(al' + i + ', bh' + j + ')) | 0;');
|
|
44
|
+
src.push('mid = (mid + Math.imul(ah' + i + ', bl' + j + ')) | 0;');
|
|
45
|
+
src.push('hi = (hi + Math.imul(ah' + i + ', bh' + j + ')) | 0;');
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
src.push('var w' + k + ' = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;');
|
|
49
|
+
src.push('c = (((hi + (mid >>> 13)) | 0) + (w' + k + ' >>> 26)) | 0;');
|
|
50
|
+
src.push('w' + k + ' &= 0x3ffffff;');
|
|
51
|
+
}
|
|
52
|
+
// Store in separate step for better memory access
|
|
53
|
+
for (k = 0; k < len; k++) {
|
|
54
|
+
src.push('o[' + k + '] = w' + k + ';');
|
|
55
|
+
}
|
|
56
|
+
src.push('if (c !== 0) {',
|
|
57
|
+
' o[' + k + '] = c;',
|
|
58
|
+
' out.length++;',
|
|
59
|
+
'}',
|
|
60
|
+
'return out;');
|
|
61
|
+
|
|
62
|
+
return src.join('\n');
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
console.log(genCombMulTo(10, 10));
|