bn.js 4.11.6 → 4.12.0
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/LICENSE +19 -0
- package/README.md +7 -26
- package/lib/bn.js +73 -54
- package/package.json +4 -1
- package/.npmignore +0 -6
- package/.travis.yml +0 -15
- package/test/arithmetic-test.js +0 -635
- package/test/binary-test.js +0 -233
- package/test/constructor-test.js +0 -149
- package/test/fixtures.js +0 -264
- package/test/pummel/dh-group-test.js +0 -23
- package/test/red-test.js +0 -263
- package/test/utils-test.js +0 -345
- package/util/genCombMulTo.js +0 -65
- package/util/genCombMulTo10.js +0 -65
package/test/arithmetic-test.js
DELETED
|
@@ -1,635 +0,0 @@
|
|
|
1
|
-
/* global describe, it */
|
|
2
|
-
|
|
3
|
-
var assert = require('assert');
|
|
4
|
-
var BN = require('../').BN;
|
|
5
|
-
var fixtures = require('./fixtures');
|
|
6
|
-
|
|
7
|
-
describe('BN.js/Arithmetic', function () {
|
|
8
|
-
describe('.add()', function () {
|
|
9
|
-
it('should add numbers', function () {
|
|
10
|
-
assert.equal(new BN(14).add(new BN(26)).toString(16), '28');
|
|
11
|
-
var k = new BN(0x1234);
|
|
12
|
-
var r = k;
|
|
13
|
-
|
|
14
|
-
for (var i = 0; i < 257; i++) {
|
|
15
|
-
r = r.add(k);
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
assert.equal(r.toString(16), '125868');
|
|
19
|
-
});
|
|
20
|
-
|
|
21
|
-
it('should handle carry properly (in-place)', function () {
|
|
22
|
-
var k = new BN('abcdefabcdefabcdef', 16);
|
|
23
|
-
var r = new BN('deadbeef', 16);
|
|
24
|
-
|
|
25
|
-
for (var i = 0; i < 257; i++) {
|
|
26
|
-
r.iadd(k);
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
assert.equal(r.toString(16), 'ac79bd9b79be7a277bde');
|
|
30
|
-
});
|
|
31
|
-
|
|
32
|
-
it('should properly do positive + negative', function () {
|
|
33
|
-
var a = new BN('abcd', 16);
|
|
34
|
-
var b = new BN('-abce', 16);
|
|
35
|
-
|
|
36
|
-
assert.equal(a.iadd(b).toString(16), '-1');
|
|
37
|
-
|
|
38
|
-
a = new BN('abcd', 16);
|
|
39
|
-
b = new BN('-abce', 16);
|
|
40
|
-
|
|
41
|
-
assert.equal(a.add(b).toString(16), '-1');
|
|
42
|
-
assert.equal(b.add(a).toString(16), '-1');
|
|
43
|
-
});
|
|
44
|
-
});
|
|
45
|
-
|
|
46
|
-
describe('.iaddn()', function () {
|
|
47
|
-
it('should allow a sign change', function () {
|
|
48
|
-
var a = new BN(-100);
|
|
49
|
-
assert.equal(a.negative, 1);
|
|
50
|
-
|
|
51
|
-
a.iaddn(200);
|
|
52
|
-
|
|
53
|
-
assert.equal(a.negative, 0);
|
|
54
|
-
assert.equal(a.toString(), '100');
|
|
55
|
-
});
|
|
56
|
-
|
|
57
|
-
it('should add negative number', function () {
|
|
58
|
-
var a = new BN(-100);
|
|
59
|
-
assert.equal(a.negative, 1);
|
|
60
|
-
|
|
61
|
-
a.iaddn(-200);
|
|
62
|
-
|
|
63
|
-
assert.equal(a.toString(), '-300');
|
|
64
|
-
});
|
|
65
|
-
|
|
66
|
-
it('should allow neg + pos with big number', function () {
|
|
67
|
-
var a = new BN('-1000000000', 10);
|
|
68
|
-
assert.equal(a.negative, 1);
|
|
69
|
-
|
|
70
|
-
a.iaddn(200);
|
|
71
|
-
|
|
72
|
-
assert.equal(a.toString(), '-999999800');
|
|
73
|
-
});
|
|
74
|
-
|
|
75
|
-
it('should carry limb', function () {
|
|
76
|
-
var a = new BN('3ffffff', 16);
|
|
77
|
-
|
|
78
|
-
assert.equal(a.iaddn(1).toString(16), '4000000');
|
|
79
|
-
});
|
|
80
|
-
|
|
81
|
-
it('should throw error with num eq 0x4000000', function () {
|
|
82
|
-
assert.throws(function () {
|
|
83
|
-
new BN(0).iaddn(0x4000000);
|
|
84
|
-
}, /^Error: Assertion failed$/);
|
|
85
|
-
});
|
|
86
|
-
});
|
|
87
|
-
|
|
88
|
-
describe('.sub()', function () {
|
|
89
|
-
it('should subtract small numbers', function () {
|
|
90
|
-
assert.equal(new BN(26).sub(new BN(14)).toString(16), 'c');
|
|
91
|
-
assert.equal(new BN(14).sub(new BN(26)).toString(16), '-c');
|
|
92
|
-
assert.equal(new BN(26).sub(new BN(26)).toString(16), '0');
|
|
93
|
-
assert.equal(new BN(-26).sub(new BN(26)).toString(16), '-34');
|
|
94
|
-
});
|
|
95
|
-
|
|
96
|
-
var a = new BN(
|
|
97
|
-
'31ff3c61db2db84b9823d320907a573f6ad37c437abe458b1802cda041d6384' +
|
|
98
|
-
'a7d8daef41395491e2',
|
|
99
|
-
16);
|
|
100
|
-
var b = new BN(
|
|
101
|
-
'6f0e4d9f1d6071c183677f601af9305721c91d31b0bbbae8fb790000',
|
|
102
|
-
16);
|
|
103
|
-
var r = new BN(
|
|
104
|
-
'31ff3c61db2db84b9823d3208989726578fd75276287cd9516533a9acfb9a67' +
|
|
105
|
-
'76281f34583ddb91e2',
|
|
106
|
-
16);
|
|
107
|
-
|
|
108
|
-
it('should subtract big numbers', function () {
|
|
109
|
-
assert.equal(a.sub(b).cmp(r), 0);
|
|
110
|
-
});
|
|
111
|
-
|
|
112
|
-
it('should subtract numbers in place', function () {
|
|
113
|
-
assert.equal(b.clone().isub(a).neg().cmp(r), 0);
|
|
114
|
-
});
|
|
115
|
-
|
|
116
|
-
it('should subtract with carry', function () {
|
|
117
|
-
// Carry and copy
|
|
118
|
-
var a = new BN('12345', 16);
|
|
119
|
-
var b = new BN('1000000000000', 16);
|
|
120
|
-
assert.equal(a.isub(b).toString(16), '-fffffffedcbb');
|
|
121
|
-
|
|
122
|
-
a = new BN('12345', 16);
|
|
123
|
-
b = new BN('1000000000000', 16);
|
|
124
|
-
assert.equal(b.isub(a).toString(16), 'fffffffedcbb');
|
|
125
|
-
});
|
|
126
|
-
});
|
|
127
|
-
|
|
128
|
-
describe('.isubn()', function () {
|
|
129
|
-
it('should subtract negative number', function () {
|
|
130
|
-
var r = new BN(
|
|
131
|
-
'7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b', 16);
|
|
132
|
-
assert.equal(r.isubn(-1).toString(16),
|
|
133
|
-
'7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681c');
|
|
134
|
-
});
|
|
135
|
-
|
|
136
|
-
it('should work for positive numbers', function () {
|
|
137
|
-
var a = new BN(-100);
|
|
138
|
-
assert.equal(a.negative, 1);
|
|
139
|
-
|
|
140
|
-
a.isubn(200);
|
|
141
|
-
assert.equal(a.negative, 1);
|
|
142
|
-
assert.equal(a.toString(), '-300');
|
|
143
|
-
});
|
|
144
|
-
|
|
145
|
-
it('should not allow a sign change', function () {
|
|
146
|
-
var a = new BN(-100);
|
|
147
|
-
assert.equal(a.negative, 1);
|
|
148
|
-
|
|
149
|
-
a.isubn(-200);
|
|
150
|
-
assert.equal(a.negative, 0);
|
|
151
|
-
assert.equal(a.toString(), '100');
|
|
152
|
-
});
|
|
153
|
-
|
|
154
|
-
it('should change sign on small numbers at 0', function () {
|
|
155
|
-
var a = new BN(0).subn(2);
|
|
156
|
-
assert.equal(a.toString(), '-2');
|
|
157
|
-
});
|
|
158
|
-
|
|
159
|
-
it('should change sign on small numbers at 1', function () {
|
|
160
|
-
var a = new BN(1).subn(2);
|
|
161
|
-
assert.equal(a.toString(), '-1');
|
|
162
|
-
});
|
|
163
|
-
|
|
164
|
-
it('should throw error with num eq 0x4000000', function () {
|
|
165
|
-
assert.throws(function () {
|
|
166
|
-
new BN(0).isubn(0x4000000);
|
|
167
|
-
}, /^Error: Assertion failed$/);
|
|
168
|
-
});
|
|
169
|
-
});
|
|
170
|
-
|
|
171
|
-
function testMethod (name, mul) {
|
|
172
|
-
describe(name, function () {
|
|
173
|
-
it('should multiply numbers of different signs', function () {
|
|
174
|
-
var offsets = [
|
|
175
|
-
1, // smallMulTo
|
|
176
|
-
250, // comb10MulTo
|
|
177
|
-
1000, // bigMulTo
|
|
178
|
-
15000 // jumboMulTo
|
|
179
|
-
];
|
|
180
|
-
|
|
181
|
-
for (var i = 0; i < offsets.length; ++i) {
|
|
182
|
-
var x = new BN(1).ishln(offsets[i]);
|
|
183
|
-
|
|
184
|
-
assert.equal(mul(x, x).isNeg(), false);
|
|
185
|
-
assert.equal(mul(x, x.neg()).isNeg(), true);
|
|
186
|
-
assert.equal(mul(x.neg(), x).isNeg(), true);
|
|
187
|
-
assert.equal(mul(x.neg(), x.neg()).isNeg(), false);
|
|
188
|
-
}
|
|
189
|
-
});
|
|
190
|
-
|
|
191
|
-
it('should multiply with carry', function () {
|
|
192
|
-
var n = new BN(0x1001);
|
|
193
|
-
var r = n;
|
|
194
|
-
|
|
195
|
-
for (var i = 0; i < 4; i++) {
|
|
196
|
-
r = mul(r, n);
|
|
197
|
-
}
|
|
198
|
-
|
|
199
|
-
assert.equal(r.toString(16), '100500a00a005001');
|
|
200
|
-
});
|
|
201
|
-
|
|
202
|
-
it('should correctly multiply big numbers', function () {
|
|
203
|
-
var n = new BN(
|
|
204
|
-
'79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798',
|
|
205
|
-
16
|
|
206
|
-
);
|
|
207
|
-
assert.equal(
|
|
208
|
-
mul(n, n).toString(16),
|
|
209
|
-
'39e58a8055b6fb264b75ec8c646509784204ac15a8c24e05babc9729ab9' +
|
|
210
|
-
'b055c3a9458e4ce3289560a38e08ba8175a9446ce14e608245ab3a9' +
|
|
211
|
-
'978a8bd8acaa40');
|
|
212
|
-
assert.equal(
|
|
213
|
-
mul(mul(n, n), n).toString(16),
|
|
214
|
-
'1b888e01a06e974017a28a5b4da436169761c9730b7aeedf75fc60f687b' +
|
|
215
|
-
'46e0cf2cb11667f795d5569482640fe5f628939467a01a612b02350' +
|
|
216
|
-
'0d0161e9730279a7561043af6197798e41b7432458463e64fa81158' +
|
|
217
|
-
'907322dc330562697d0d600');
|
|
218
|
-
});
|
|
219
|
-
|
|
220
|
-
it('should multiply neg number on 0', function () {
|
|
221
|
-
assert.equal(
|
|
222
|
-
mul(new BN('-100000000000'), new BN('3').div(new BN('4')))
|
|
223
|
-
.toString(16),
|
|
224
|
-
'0'
|
|
225
|
-
);
|
|
226
|
-
});
|
|
227
|
-
|
|
228
|
-
it('should regress mul big numbers', function () {
|
|
229
|
-
var q = fixtures.dhGroups.p17.q;
|
|
230
|
-
var qs = fixtures.dhGroups.p17.qs;
|
|
231
|
-
|
|
232
|
-
q = new BN(q, 16);
|
|
233
|
-
assert.equal(mul(q, q).toString(16), qs);
|
|
234
|
-
});
|
|
235
|
-
});
|
|
236
|
-
}
|
|
237
|
-
|
|
238
|
-
testMethod('.mul()', function (x, y) {
|
|
239
|
-
return BN.prototype.mul.apply(x, [ y ]);
|
|
240
|
-
});
|
|
241
|
-
|
|
242
|
-
testMethod('.mulf()', function (x, y) {
|
|
243
|
-
return BN.prototype.mulf.apply(x, [ y ]);
|
|
244
|
-
});
|
|
245
|
-
|
|
246
|
-
describe('.imul()', function () {
|
|
247
|
-
it('should multiply numbers in-place', function () {
|
|
248
|
-
var a = new BN('abcdef01234567890abcd', 16);
|
|
249
|
-
var b = new BN('deadbeefa551edebabba8', 16);
|
|
250
|
-
var c = a.mul(b);
|
|
251
|
-
|
|
252
|
-
assert.equal(a.imul(b).toString(16), c.toString(16));
|
|
253
|
-
|
|
254
|
-
a = new BN('abcdef01234567890abcd214a25123f512361e6d236', 16);
|
|
255
|
-
b = new BN('deadbeefa551edebabba8121234fd21bac0341324dd', 16);
|
|
256
|
-
c = a.mul(b);
|
|
257
|
-
|
|
258
|
-
assert.equal(a.imul(b).toString(16), c.toString(16));
|
|
259
|
-
});
|
|
260
|
-
|
|
261
|
-
it('should multiply by 0', function () {
|
|
262
|
-
var a = new BN('abcdef01234567890abcd', 16);
|
|
263
|
-
var b = new BN('0', 16);
|
|
264
|
-
var c = a.mul(b);
|
|
265
|
-
|
|
266
|
-
assert.equal(a.imul(b).toString(16), c.toString(16));
|
|
267
|
-
});
|
|
268
|
-
|
|
269
|
-
it('should regress mul big numbers in-place', function () {
|
|
270
|
-
var q = fixtures.dhGroups.p17.q;
|
|
271
|
-
var qs = fixtures.dhGroups.p17.qs;
|
|
272
|
-
|
|
273
|
-
q = new BN(q, 16);
|
|
274
|
-
|
|
275
|
-
assert.equal(q.isqr().toString(16), qs);
|
|
276
|
-
});
|
|
277
|
-
});
|
|
278
|
-
|
|
279
|
-
describe('.muln()', function () {
|
|
280
|
-
it('should multiply number by small number', function () {
|
|
281
|
-
var a = new BN('abcdef01234567890abcd', 16);
|
|
282
|
-
var b = new BN('dead', 16);
|
|
283
|
-
var c = a.mul(b);
|
|
284
|
-
|
|
285
|
-
assert.equal(a.muln(0xdead).toString(16), c.toString(16));
|
|
286
|
-
});
|
|
287
|
-
|
|
288
|
-
it('should throw error with num eq 0x4000000', function () {
|
|
289
|
-
assert.throws(function () {
|
|
290
|
-
new BN(0).imuln(0x4000000);
|
|
291
|
-
}, /^Error: Assertion failed$/);
|
|
292
|
-
});
|
|
293
|
-
});
|
|
294
|
-
|
|
295
|
-
describe('.pow()', function () {
|
|
296
|
-
it('should raise number to the power', function () {
|
|
297
|
-
var a = new BN('ab', 16);
|
|
298
|
-
var b = new BN('13', 10);
|
|
299
|
-
var c = a.pow(b);
|
|
300
|
-
|
|
301
|
-
assert.equal(c.toString(16), '15963da06977df51909c9ba5b');
|
|
302
|
-
});
|
|
303
|
-
});
|
|
304
|
-
|
|
305
|
-
describe('.div()', function () {
|
|
306
|
-
it('should divide small numbers (<=26 bits)', function () {
|
|
307
|
-
assert.equal(new BN('256').div(new BN(10)).toString(10),
|
|
308
|
-
'25');
|
|
309
|
-
assert.equal(new BN('-256').div(new BN(10)).toString(10),
|
|
310
|
-
'-25');
|
|
311
|
-
assert.equal(new BN('256').div(new BN(-10)).toString(10),
|
|
312
|
-
'-25');
|
|
313
|
-
assert.equal(new BN('-256').div(new BN(-10)).toString(10),
|
|
314
|
-
'25');
|
|
315
|
-
|
|
316
|
-
assert.equal(new BN('10').div(new BN(256)).toString(10),
|
|
317
|
-
'0');
|
|
318
|
-
assert.equal(new BN('-10').div(new BN(256)).toString(10),
|
|
319
|
-
'0');
|
|
320
|
-
assert.equal(new BN('10').div(new BN(-256)).toString(10),
|
|
321
|
-
'0');
|
|
322
|
-
assert.equal(new BN('-10').div(new BN(-256)).toString(10),
|
|
323
|
-
'0');
|
|
324
|
-
});
|
|
325
|
-
|
|
326
|
-
it('should divide large numbers (>53 bits)', function () {
|
|
327
|
-
assert.equal(new BN('1222222225255589').div(new BN('611111124969028'))
|
|
328
|
-
.toString(10), '1');
|
|
329
|
-
assert.equal(new BN('-1222222225255589').div(new BN('611111124969028'))
|
|
330
|
-
.toString(10), '-1');
|
|
331
|
-
assert.equal(new BN('1222222225255589').div(new BN('-611111124969028'))
|
|
332
|
-
.toString(10), '-1');
|
|
333
|
-
assert.equal(new BN('-1222222225255589').div(new BN('-611111124969028'))
|
|
334
|
-
.toString(10), '1');
|
|
335
|
-
|
|
336
|
-
assert.equal(new BN('611111124969028').div(new BN('1222222225255589'))
|
|
337
|
-
.toString(10), '0');
|
|
338
|
-
assert.equal(new BN('-611111124969028').div(new BN('1222222225255589'))
|
|
339
|
-
.toString(10), '0');
|
|
340
|
-
assert.equal(new BN('611111124969028').div(new BN('-1222222225255589'))
|
|
341
|
-
.toString(10), '0');
|
|
342
|
-
assert.equal(new BN('-611111124969028').div(new BN('-1222222225255589'))
|
|
343
|
-
.toString(10), '0');
|
|
344
|
-
});
|
|
345
|
-
|
|
346
|
-
it('should divide numbers', function () {
|
|
347
|
-
assert.equal(new BN('69527932928').div(new BN('16974594')).toString(16),
|
|
348
|
-
'fff');
|
|
349
|
-
assert.equal(new BN('-69527932928').div(new BN('16974594')).toString(16),
|
|
350
|
-
'-fff');
|
|
351
|
-
|
|
352
|
-
var b = new BN(
|
|
353
|
-
'39e58a8055b6fb264b75ec8c646509784204ac15a8c24e05babc9729ab9' +
|
|
354
|
-
'b055c3a9458e4ce3289560a38e08ba8175a9446ce14e608245ab3a9' +
|
|
355
|
-
'978a8bd8acaa40',
|
|
356
|
-
16);
|
|
357
|
-
var n = new BN(
|
|
358
|
-
'79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798',
|
|
359
|
-
16
|
|
360
|
-
);
|
|
361
|
-
assert.equal(b.div(n).toString(16), n.toString(16));
|
|
362
|
-
|
|
363
|
-
assert.equal(new BN('1').div(new BN('-5')).toString(10), '0');
|
|
364
|
-
});
|
|
365
|
-
|
|
366
|
-
it('should not fail on regression after moving to _wordDiv', function () {
|
|
367
|
-
// Regression after moving to word div
|
|
368
|
-
var p = new BN(
|
|
369
|
-
'fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f',
|
|
370
|
-
16);
|
|
371
|
-
var a = new BN(
|
|
372
|
-
'79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798',
|
|
373
|
-
16);
|
|
374
|
-
var as = a.sqr();
|
|
375
|
-
assert.equal(
|
|
376
|
-
as.div(p).toString(16),
|
|
377
|
-
'39e58a8055b6fb264b75ec8c646509784204ac15a8c24e05babc9729e58090b9');
|
|
378
|
-
|
|
379
|
-
p = new BN(
|
|
380
|
-
'ffffffff00000001000000000000000000000000ffffffffffffffffffffffff',
|
|
381
|
-
16);
|
|
382
|
-
a = new BN(
|
|
383
|
-
'fffffffe00000003fffffffd0000000200000001fffffffe00000002ffffffff' +
|
|
384
|
-
'ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff',
|
|
385
|
-
16);
|
|
386
|
-
assert.equal(
|
|
387
|
-
a.div(p).toString(16),
|
|
388
|
-
'ffffffff00000002000000000000000000000001000000000000000000000001');
|
|
389
|
-
});
|
|
390
|
-
});
|
|
391
|
-
|
|
392
|
-
describe('.idivn()', function () {
|
|
393
|
-
it('should divide numbers in-place', function () {
|
|
394
|
-
assert.equal(new BN('10', 16).idivn(3).toString(16), '5');
|
|
395
|
-
assert.equal(new BN('12', 16).idivn(3).toString(16), '6');
|
|
396
|
-
assert.equal(new BN('10000000000000000').idivn(3).toString(10),
|
|
397
|
-
'3333333333333333');
|
|
398
|
-
assert.equal(
|
|
399
|
-
new BN('100000000000000000000000000000').idivn(3).toString(10),
|
|
400
|
-
'33333333333333333333333333333');
|
|
401
|
-
|
|
402
|
-
var t = new BN(3);
|
|
403
|
-
assert.equal(
|
|
404
|
-
new BN('12345678901234567890123456', 16).idivn(3).toString(16),
|
|
405
|
-
new BN('12345678901234567890123456', 16).div(t).toString(16));
|
|
406
|
-
});
|
|
407
|
-
});
|
|
408
|
-
|
|
409
|
-
describe('.divRound()', function () {
|
|
410
|
-
it('should divide numbers with rounding', function () {
|
|
411
|
-
assert.equal(new BN(9).divRound(new BN(20)).toString(10),
|
|
412
|
-
'0');
|
|
413
|
-
assert.equal(new BN(10).divRound(new BN(20)).toString(10),
|
|
414
|
-
'1');
|
|
415
|
-
assert.equal(new BN(150).divRound(new BN(20)).toString(10),
|
|
416
|
-
'8');
|
|
417
|
-
assert.equal(new BN(149).divRound(new BN(20)).toString(10),
|
|
418
|
-
'7');
|
|
419
|
-
assert.equal(new BN(149).divRound(new BN(17)).toString(10),
|
|
420
|
-
'9');
|
|
421
|
-
assert.equal(new BN(144).divRound(new BN(17)).toString(10),
|
|
422
|
-
'8');
|
|
423
|
-
assert.equal(new BN(-144).divRound(new BN(17)).toString(10),
|
|
424
|
-
'-8');
|
|
425
|
-
});
|
|
426
|
-
|
|
427
|
-
it('should return 1 on exact division', function () {
|
|
428
|
-
assert.equal(new BN(144).divRound(new BN(144)).toString(10), '1');
|
|
429
|
-
});
|
|
430
|
-
});
|
|
431
|
-
|
|
432
|
-
describe('.mod()', function () {
|
|
433
|
-
it('should modulo small numbers (<=26 bits)', function () {
|
|
434
|
-
assert.equal(new BN('256').mod(new BN(10)).toString(10),
|
|
435
|
-
'6');
|
|
436
|
-
assert.equal(new BN('-256').mod(new BN(10)).toString(10),
|
|
437
|
-
'-6');
|
|
438
|
-
assert.equal(new BN('256').mod(new BN(-10)).toString(10),
|
|
439
|
-
'6');
|
|
440
|
-
assert.equal(new BN('-256').mod(new BN(-10)).toString(10),
|
|
441
|
-
'-6');
|
|
442
|
-
|
|
443
|
-
assert.equal(new BN('10').mod(new BN(256)).toString(10),
|
|
444
|
-
'10');
|
|
445
|
-
assert.equal(new BN('-10').mod(new BN(256)).toString(10),
|
|
446
|
-
'-10');
|
|
447
|
-
assert.equal(new BN('10').mod(new BN(-256)).toString(10),
|
|
448
|
-
'10');
|
|
449
|
-
assert.equal(new BN('-10').mod(new BN(-256)).toString(10),
|
|
450
|
-
'-10');
|
|
451
|
-
});
|
|
452
|
-
|
|
453
|
-
it('should modulo large numbers (>53 bits)', function () {
|
|
454
|
-
assert.equal(new BN('1222222225255589').mod(new BN('611111124969028'))
|
|
455
|
-
.toString(10), '611111100286561');
|
|
456
|
-
assert.equal(new BN('-1222222225255589').mod(new BN('611111124969028'))
|
|
457
|
-
.toString(10), '-611111100286561');
|
|
458
|
-
assert.equal(new BN('1222222225255589').mod(new BN('-611111124969028'))
|
|
459
|
-
.toString(10), '611111100286561');
|
|
460
|
-
assert.equal(new BN('-1222222225255589').mod(new BN('-611111124969028'))
|
|
461
|
-
.toString(10), '-611111100286561');
|
|
462
|
-
|
|
463
|
-
assert.equal(new BN('611111124969028').mod(new BN('1222222225255589'))
|
|
464
|
-
.toString(10), '611111124969028');
|
|
465
|
-
assert.equal(new BN('-611111124969028').mod(new BN('1222222225255589'))
|
|
466
|
-
.toString(10), '-611111124969028');
|
|
467
|
-
assert.equal(new BN('611111124969028').mod(new BN('-1222222225255589'))
|
|
468
|
-
.toString(10), '611111124969028');
|
|
469
|
-
assert.equal(new BN('-611111124969028').mod(new BN('-1222222225255589'))
|
|
470
|
-
.toString(10), '-611111124969028');
|
|
471
|
-
});
|
|
472
|
-
|
|
473
|
-
it('should mod numbers', function () {
|
|
474
|
-
assert.equal(new BN('10').mod(new BN(256)).toString(16),
|
|
475
|
-
'a');
|
|
476
|
-
assert.equal(new BN('69527932928').mod(new BN('16974594')).toString(16),
|
|
477
|
-
'102f302');
|
|
478
|
-
|
|
479
|
-
// 178 = 10 * 17 + 8
|
|
480
|
-
assert.equal(new BN(178).div(new BN(10)).toNumber(), 17);
|
|
481
|
-
assert.equal(new BN(178).mod(new BN(10)).toNumber(), 8);
|
|
482
|
-
assert.equal(new BN(178).umod(new BN(10)).toNumber(), 8);
|
|
483
|
-
|
|
484
|
-
// -178 = 10 * (-17) + (-8)
|
|
485
|
-
assert.equal(new BN(-178).div(new BN(10)).toNumber(), -17);
|
|
486
|
-
assert.equal(new BN(-178).mod(new BN(10)).toNumber(), -8);
|
|
487
|
-
assert.equal(new BN(-178).umod(new BN(10)).toNumber(), 2);
|
|
488
|
-
|
|
489
|
-
// 178 = -10 * (-17) + 8
|
|
490
|
-
assert.equal(new BN(178).div(new BN(-10)).toNumber(), -17);
|
|
491
|
-
assert.equal(new BN(178).mod(new BN(-10)).toNumber(), 8);
|
|
492
|
-
assert.equal(new BN(178).umod(new BN(-10)).toNumber(), 8);
|
|
493
|
-
|
|
494
|
-
// -178 = -10 * (17) + (-8)
|
|
495
|
-
assert.equal(new BN(-178).div(new BN(-10)).toNumber(), 17);
|
|
496
|
-
assert.equal(new BN(-178).mod(new BN(-10)).toNumber(), -8);
|
|
497
|
-
assert.equal(new BN(-178).umod(new BN(-10)).toNumber(), 2);
|
|
498
|
-
|
|
499
|
-
// -4 = 1 * (-3) + -1
|
|
500
|
-
assert.equal(new BN(-4).div(new BN(-3)).toNumber(), 1);
|
|
501
|
-
assert.equal(new BN(-4).mod(new BN(-3)).toNumber(), -1);
|
|
502
|
-
|
|
503
|
-
// -4 = -1 * (3) + -1
|
|
504
|
-
assert.equal(new BN(-4).mod(new BN(3)).toNumber(), -1);
|
|
505
|
-
// -4 = 1 * (-3) + (-1 + 3)
|
|
506
|
-
assert.equal(new BN(-4).umod(new BN(-3)).toNumber(), 2);
|
|
507
|
-
|
|
508
|
-
var p = new BN(
|
|
509
|
-
'ffffffff00000001000000000000000000000000ffffffffffffffffffffffff',
|
|
510
|
-
16);
|
|
511
|
-
var a = new BN(
|
|
512
|
-
'fffffffe00000003fffffffd0000000200000001fffffffe00000002ffffffff' +
|
|
513
|
-
'ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff',
|
|
514
|
-
16);
|
|
515
|
-
assert.equal(
|
|
516
|
-
a.mod(p).toString(16),
|
|
517
|
-
'0');
|
|
518
|
-
});
|
|
519
|
-
|
|
520
|
-
it('should properly carry the sign inside division', function () {
|
|
521
|
-
var a = new BN('945304eb96065b2a98b57a48a06ae28d285a71b5', 'hex');
|
|
522
|
-
var b = new BN(
|
|
523
|
-
'fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe',
|
|
524
|
-
'hex');
|
|
525
|
-
|
|
526
|
-
assert.equal(a.mul(b).mod(a).cmpn(0), 0);
|
|
527
|
-
});
|
|
528
|
-
});
|
|
529
|
-
|
|
530
|
-
describe('.modn()', function () {
|
|
531
|
-
it('should act like .mod() on small numbers', function () {
|
|
532
|
-
assert.equal(new BN('10', 16).modn(256).toString(16), '10');
|
|
533
|
-
assert.equal(new BN('100', 16).modn(256).toString(16), '0');
|
|
534
|
-
assert.equal(new BN('1001', 16).modn(256).toString(16), '1');
|
|
535
|
-
assert.equal(new BN('100000000001', 16).modn(256).toString(16), '1');
|
|
536
|
-
assert.equal(new BN('100000000001', 16).modn(257).toString(16),
|
|
537
|
-
new BN('100000000001', 16).mod(new BN(257)).toString(16));
|
|
538
|
-
assert.equal(new BN('123456789012', 16).modn(3).toString(16),
|
|
539
|
-
new BN('123456789012', 16).mod(new BN(3)).toString(16));
|
|
540
|
-
});
|
|
541
|
-
});
|
|
542
|
-
|
|
543
|
-
describe('.abs()', function () {
|
|
544
|
-
it('should return absolute value', function () {
|
|
545
|
-
assert.equal(new BN(0x1001).abs().toString(), '4097');
|
|
546
|
-
assert.equal(new BN(-0x1001).abs().toString(), '4097');
|
|
547
|
-
assert.equal(new BN('ffffffff', 16).abs().toString(), '4294967295');
|
|
548
|
-
});
|
|
549
|
-
});
|
|
550
|
-
|
|
551
|
-
describe('.invm()', function () {
|
|
552
|
-
it('should invert relatively-prime numbers', function () {
|
|
553
|
-
var p = new BN(257);
|
|
554
|
-
var a = new BN(3);
|
|
555
|
-
var b = a.invm(p);
|
|
556
|
-
assert.equal(a.mul(b).mod(p).toString(16), '1');
|
|
557
|
-
|
|
558
|
-
var p192 = new BN(
|
|
559
|
-
'fffffffffffffffffffffffffffffffeffffffffffffffff',
|
|
560
|
-
16);
|
|
561
|
-
a = new BN('deadbeef', 16);
|
|
562
|
-
b = a.invm(p192);
|
|
563
|
-
assert.equal(a.mul(b).mod(p192).toString(16), '1');
|
|
564
|
-
|
|
565
|
-
// Even base
|
|
566
|
-
var phi = new BN('872d9b030ba368706b68932cf07a0e0c', 16);
|
|
567
|
-
var e = new BN(65537);
|
|
568
|
-
var d = e.invm(phi);
|
|
569
|
-
assert.equal(e.mul(d).mod(phi).toString(16), '1');
|
|
570
|
-
|
|
571
|
-
// Even base (take #2)
|
|
572
|
-
a = new BN('5');
|
|
573
|
-
b = new BN('6');
|
|
574
|
-
var r = a.invm(b);
|
|
575
|
-
assert.equal(r.mul(a).mod(b).toString(16), '1');
|
|
576
|
-
});
|
|
577
|
-
});
|
|
578
|
-
|
|
579
|
-
describe('.gcd()', function () {
|
|
580
|
-
it('should return GCD', function () {
|
|
581
|
-
assert.equal(new BN(3).gcd(new BN(2)).toString(10), '1');
|
|
582
|
-
assert.equal(new BN(18).gcd(new BN(12)).toString(10), '6');
|
|
583
|
-
assert.equal(new BN(-18).gcd(new BN(12)).toString(10), '6');
|
|
584
|
-
assert.equal(new BN(-18).gcd(new BN(-12)).toString(10), '6');
|
|
585
|
-
assert.equal(new BN(-18).gcd(new BN(0)).toString(10), '18');
|
|
586
|
-
assert.equal(new BN(0).gcd(new BN(-18)).toString(10), '18');
|
|
587
|
-
assert.equal(new BN(2).gcd(new BN(0)).toString(10), '2');
|
|
588
|
-
assert.equal(new BN(0).gcd(new BN(3)).toString(10), '3');
|
|
589
|
-
assert.equal(new BN(0).gcd(new BN(0)).toString(10), '0');
|
|
590
|
-
});
|
|
591
|
-
});
|
|
592
|
-
|
|
593
|
-
describe('.egcd()', function () {
|
|
594
|
-
it('should return EGCD', function () {
|
|
595
|
-
assert.equal(new BN(3).egcd(new BN(2)).gcd.toString(10), '1');
|
|
596
|
-
assert.equal(new BN(18).egcd(new BN(12)).gcd.toString(10), '6');
|
|
597
|
-
assert.equal(new BN(-18).egcd(new BN(12)).gcd.toString(10), '6');
|
|
598
|
-
assert.equal(new BN(0).egcd(new BN(12)).gcd.toString(10), '12');
|
|
599
|
-
});
|
|
600
|
-
it('should not allow 0 input', function () {
|
|
601
|
-
assert.throws(function () {
|
|
602
|
-
new BN(1).egcd(0);
|
|
603
|
-
}, /^Error: Assertion failed$/);
|
|
604
|
-
});
|
|
605
|
-
it('should not allow negative input', function () {
|
|
606
|
-
assert.throws(function () {
|
|
607
|
-
new BN(1).egcd(-1);
|
|
608
|
-
}, /^Error: Assertion failed$/);
|
|
609
|
-
});
|
|
610
|
-
});
|
|
611
|
-
|
|
612
|
-
describe('BN.max(a, b)', function () {
|
|
613
|
-
it('should return maximum', function () {
|
|
614
|
-
assert.equal(BN.max(new BN(3), new BN(2)).toString(16), '3');
|
|
615
|
-
assert.equal(BN.max(new BN(2), new BN(3)).toString(16), '3');
|
|
616
|
-
assert.equal(BN.max(new BN(2), new BN(2)).toString(16), '2');
|
|
617
|
-
assert.equal(BN.max(new BN(2), new BN(-2)).toString(16), '2');
|
|
618
|
-
});
|
|
619
|
-
});
|
|
620
|
-
|
|
621
|
-
describe('BN.min(a, b)', function () {
|
|
622
|
-
it('should return minimum', function () {
|
|
623
|
-
assert.equal(BN.min(new BN(3), new BN(2)).toString(16), '2');
|
|
624
|
-
assert.equal(BN.min(new BN(2), new BN(3)).toString(16), '2');
|
|
625
|
-
assert.equal(BN.min(new BN(2), new BN(2)).toString(16), '2');
|
|
626
|
-
assert.equal(BN.min(new BN(2), new BN(-2)).toString(16), '-2');
|
|
627
|
-
});
|
|
628
|
-
});
|
|
629
|
-
|
|
630
|
-
describe('BN.ineg', function () {
|
|
631
|
-
it('shouldn\'t change sign for zero', function () {
|
|
632
|
-
assert.equal(new BN(0).ineg().toString(10), '0');
|
|
633
|
-
});
|
|
634
|
-
});
|
|
635
|
-
});
|