Browse Source

Added new bigint library

See more details on performance here:
https://github.com/zhukov/prime-factorization-benchmark

Closes #18
Closes #351
master
Igor Zhukov 11 years ago
parent
commit
7ed79e99d0
  1. 94
      app/js/lib/bin_utils.js
  2. 1
      app/js/lib/pq_worker.js
  3. 1507
      app/vendor/leemon_bigint/bigint.js

94
app/js/lib/bin_utils.js

@ -144,6 +144,12 @@ function bytesFromBigInt (bigInt, len) {
return bytes; return bytes;
} }
function bytesFromLeemonBigInt (bigInt, len) {
var str = bigInt2str(bigInt, 16);
return bytesFromHex(str);
}
function bytesToArrayBuffer (b) { function bytesToArrayBuffer (b) {
return (new Uint8Array(b)).buffer; return (new Uint8Array(b)).buffer;
} }
@ -277,7 +283,14 @@ function pqPrimeFactorization (pqBytes) {
console.log('PQ start', pqBytes, what.bitLength()); console.log('PQ start', pqBytes, what.bitLength());
if (what.bitLength() <= 64) { try {
result = pqPrimeLeemon(str2bigInt(what.toString(16), 16, Math.ceil(64 / bpe) + 1))
} catch (e) {
console.error(e);
console.error('Pq leemon Exception', e);
}
if (result === false && what.bitLength() <= 64) {
// console.time('PQ long'); // console.time('PQ long');
try { try {
result = pqPrimeLong(goog.math.Long.fromString(what.toString(16), 16)); result = pqPrimeLong(goog.math.Long.fromString(what.toString(16), 16));
@ -374,7 +387,6 @@ function gcdLong(a, b) {
} }
function pqPrimeLong(what) { function pqPrimeLong(what) {
// console.log('start long');
var it = 0, var it = 0,
g; g;
for (var i = 0; i < 3; i++) { for (var i = 0; i < 3; i++) {
@ -385,9 +397,6 @@ function pqPrimeLong(what) {
for (var j = 1; j < lim; j++) { for (var j = 1; j < lim; j++) {
++it; ++it;
// if (!(it % 100)) {
// console.log(dT(), 'it', it, i, j, x.toString());
// }
var a = x, var a = x,
b = x, b = x,
c = q; c = q;
@ -433,3 +442,78 @@ function pqPrimeLong(what) {
return [bytesFromHex(P.toString(16)), bytesFromHex(Q.toString(16))]; return [bytesFromHex(P.toString(16)), bytesFromHex(Q.toString(16))];
} }
function pqPrimeLeemon (what) {
var minBits = 64,
minLen = Math.ceil(minBits / bpe) + 1,
it = 0, i, q, j, lim, g, P, Q,
a = new Array(minLen),
b = new Array(minLen),
c = new Array(minLen),
g = new Array(minLen),
z = new Array(minLen),
x = new Array(minLen),
y = new Array(minLen);
for (i = 0; i < 3; i++) {
q = (nextRandomInt(128) & 15) + 17;
copyInt_(x, nextRandomInt(1000000000) + 1);
copy_(y, x);
lim = 1 << (i + 18);
for (j = 1; j < lim; j++) {
++it;
copy_(a, x);
copy_(b, x);
copyInt_(c, q);
while (!isZero(b)) {
if (b[0] & 1) {
add_(c, a);
if (greater(c, what)) {
sub_(c, what);
}
}
add_(a, a);
if (greater(a, what)) {
sub_(a, what);
}
rightShift_(b, 1);
}
copy_(x, c);
if (greater(x,y)) {
copy_(z, x);
sub_(z, y);
} else {
copy_(z, y);
sub_(z, x);
}
eGCD_(z, what, g, a, b);
if (!equalsInt(g, 1)) {
break;
}
if ((j & (j - 1)) == 0) {
copy_(y, x);
}
}
if (greater(g, one)) {
break;
}
}
divide_(what, g, x, y);
if (greater(g, x)) {
P = x;
Q = g;
} else {
P = g;
Q = x;
}
// console.log(dT(), 'done', bigInt2str(what, 10), bigInt2str(P, 10), bigInt2str(Q, 10));
return [bytesFromLeemonBigInt(P), bytesFromLeemonBigInt(Q)];
}

1
app/js/lib/pq_worker.js

@ -8,6 +8,7 @@
importScripts( importScripts(
'../../vendor/console-polyfill/console-polyfill.js', '../../vendor/console-polyfill/console-polyfill.js',
'bin_utils.js', 'bin_utils.js',
'../../vendor/leemon_bigint/bigint.js',
'../../vendor/closure/long.js', '../../vendor/closure/long.js',
'../../vendor/jsbn/jsbn_combined.js' '../../vendor/jsbn/jsbn_combined.js'
); );

1507
app/vendor/leemon_bigint/bigint.js vendored

File diff suppressed because it is too large Load Diff
Loading…
Cancel
Save