aboutsummaryrefslogtreecommitdiff
path: root/node_modules/miller-rabin
diff options
context:
space:
mode:
Diffstat (limited to 'node_modules/miller-rabin')
-rw-r--r--node_modules/miller-rabin/1.js7
-rw-r--r--node_modules/miller-rabin/lib/mr.js30
-rw-r--r--node_modules/miller-rabin/package.json2
-rw-r--r--node_modules/miller-rabin/test.js25
4 files changed, 49 insertions, 15 deletions
diff --git a/node_modules/miller-rabin/1.js b/node_modules/miller-rabin/1.js
new file mode 100644
index 000000000..92953789e
--- /dev/null
+++ b/node_modules/miller-rabin/1.js
@@ -0,0 +1,7 @@
+'use strict';
+
+const BN = require('bn.js');
+
+const p = new BN('2e1b162f326430f5ac6af10f96b2a8350e01675d22324c9f', 'hex');
+
+console.log(p.bitLength());
diff --git a/node_modules/miller-rabin/lib/mr.js b/node_modules/miller-rabin/lib/mr.js
index a9e935b1b..60d2a8ef9 100644
--- a/node_modules/miller-rabin/lib/mr.js
+++ b/node_modules/miller-rabin/lib/mr.js
@@ -10,20 +10,24 @@ MillerRabin.create = function create(rand) {
return new MillerRabin(rand);
};
-MillerRabin.prototype._rand = function _rand(n) {
+MillerRabin.prototype._randbelow = function _randbelow(n) {
var len = n.bitLength();
- var buf = this.rand.generate(Math.ceil(len / 8));
+ var min_bytes = Math.ceil(len / 8);
- // Set low bits
- buf[0] |= 3;
+ // Generage random bytes until a number less than n is found.
+ // This ensures that 0..n-1 have an equal probability of being selected.
+ do
+ var a = new bn(this.rand.generate(min_bytes));
+ while (a.cmp(n) >= 0);
- // Mask high bits
- var mask = len & 0x7;
- if (mask !== 0)
- buf[buf.length - 1] >>= 7 - mask;
+ return a;
+};
- return new bn(buf);
-}
+MillerRabin.prototype._randrange = function _randrange(start, stop) {
+ // Generate a random number greater than or equal to start and less than stop.
+ var size = stop.sub(start);
+ return start.add(this._randbelow(size));
+};
MillerRabin.prototype.test = function test(n, k, cb) {
var len = n.bitLength();
@@ -35,7 +39,6 @@ MillerRabin.prototype.test = function test(n, k, cb) {
// Find d and s, (n - 1) = (2 ^ s) * d;
var n1 = n.subn(1);
- var n2 = n1.subn(1);
for (var s = 0; !n1.testn(s); s++) {}
var d = n.shrn(s);
@@ -43,7 +46,7 @@ MillerRabin.prototype.test = function test(n, k, cb) {
var prime = true;
for (; k > 0; k--) {
- var a = this._rand(n2);
+ var a = this._randrange(new bn(2), n1);
if (cb)
cb(a);
@@ -77,14 +80,13 @@ MillerRabin.prototype.getDivisor = function getDivisor(n, k) {
// Find d and s, (n - 1) = (2 ^ s) * d;
var n1 = n.subn(1);
- var n2 = n1.subn(1);
for (var s = 0; !n1.testn(s); s++) {}
var d = n.shrn(s);
var rn1 = n1.toRed(red);
for (; k > 0; k--) {
- var a = this._rand(n2);
+ var a = this._randrange(new bn(2), n1);
var g = n.gcd(a);
if (g.cmpn(1) !== 0)
diff --git a/node_modules/miller-rabin/package.json b/node_modules/miller-rabin/package.json
index 88a5a3829..af0f80573 100644
--- a/node_modules/miller-rabin/package.json
+++ b/node_modules/miller-rabin/package.json
@@ -1,6 +1,6 @@
{
"name": "miller-rabin",
- "version": "4.0.0",
+ "version": "4.0.1",
"description": "Miller Rabin algorithm for primality test",
"main": "lib/mr.js",
"bin": "bin/miller-rabin",
diff --git a/node_modules/miller-rabin/test.js b/node_modules/miller-rabin/test.js
new file mode 100644
index 000000000..74b2ccfe4
--- /dev/null
+++ b/node_modules/miller-rabin/test.js
@@ -0,0 +1,25 @@
+var mr = require('./').create();
+var BN = require('bn.js');
+
+var p = new BN(
+ `00:d3:99:af:83:02:de:91:f8:cc:1b:4e:2e:e0:18:
+ b3:0a:41:a4:77:98:d2:ad:66:0f:dc:17:85:ca:58:
+ b4:e4:88:55:c5:0a:82:08:7c:fb:70:a9:41:30:be:
+ af:50:d2:ce:93:cd:46:83:47:6e:c0:51:a7:10:e6:
+ 66:d1:08:e8:3d:b8:ce:fe:3e:4e:48:96:82:15:f7:
+ 2c:83:80:05:f2:14:3a:a4:5a:44:2b:22:22:67:e5:
+ 21:23:b7:cb:0f:71:5b:12:8b:3d:81:f6:5e:dc:99:
+ 8f:f9:80:38:75:57:c2:dd:9b:7a:b2:24:97:42:60:
+ 92:1f:1d:8a:68:c5:b8:7f:5d:c0:53:3d:15:f2:95:
+ b8:1d:8b:c2:e6:ca:a6:4c:bd:bf:88:9f:3e:d3:d7:
+ 24:18:27:62:6e:d0:52:75:68:9f:2a:c9:39:af:95:
+ 55:bb:11:08:dc:51:e9:8b:5a:38:e0:c0:e9:d8:a6:
+ 71:a5:03:f9:a7:2c:dd:1a:63:8e:7f:f0:36:68:a0:
+ 44:f8:09:48:3d:bd:de:b3:2d:3a:2f:73:88:8a:0c:
+ e2:7f:9b:dd:e8:c2:0e:ee:21:e4:a7:f9:4d:46:2f:
+ a7:f6:6d:fa:88:2e:95:60:ac:53:2e:45:a2:9d:9e:
+ c4:80:fc:c7:49:c9:42:bb:2b:66:f6:14:6d:7f:03:
+ 4e:f3`.replace(/[^a-f0-9]/g, ''), 16);
+console.time();
+mr.test(p);
+console.timeEnd();