diff options
Diffstat (limited to 'node_modules/miller-rabin')
-rw-r--r-- | node_modules/miller-rabin/1.js | 7 | ||||
-rw-r--r-- | node_modules/miller-rabin/lib/mr.js | 30 | ||||
-rw-r--r-- | node_modules/miller-rabin/package.json | 2 | ||||
-rw-r--r-- | node_modules/miller-rabin/test.js | 25 |
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(); |