bn.js 4.12.0 → 4.12.1

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 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;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "bn.js",
3
- "version": "4.12.0",
3
+ "version": "4.12.1",
4
4
  "description": "Big number implementation in pure javascript",
5
5
  "main": "lib/bn.js",
6
6
  "scripts": {
@@ -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));