blocktrail-sdk
Version:
BlockTrail's Developer Friendly API binding for NodeJS
93 lines (70 loc) • 1.79 kB
JavaScript
function Number_extGCD ( a, b ) {
var sa = ( a < 0 ) ? -1 : 1,
sb = ( b < 0 ) ? -1 : 1,
xi = 1, xj = 0,
yi = 0, yj = 1,
r, q, t, a_cmp_b;
a *= sa;
b *= sb;
a_cmp_b = ( a < b );
if ( a_cmp_b ) {
t = a; a = b, b = t;
t = sa; sa = sb; sb = t;
}
q = Math.floor( a / b ), r = a - q*b;
while ( r ) {
t = xi - q*xj, xi = xj, xj = t;
t = yi - q*yj, yi = yj, yj = t;
a = b, b = r;
q = Math.floor( a / b ), r = a - q*b;
}
xj *= sa;
yj *= sb;
if ( a_cmp_b ) {
t = xj; xj = yj, yj = t;
}
return {
gcd: b,
x: xj,
y: yj
};
}
function BigNumber_extGCD ( a, b ) {
if ( !is_big_number(a) )
a = new BigNumber(a);
if ( !is_big_number(b) )
b = new BigNumber(b);
var sa = a.sign, sb = b.sign;
if ( sa < 0 )
a = a.negate();
if ( sb < 0 )
b = b.negate();
var a_cmp_b = a.compare(b);
if ( a_cmp_b < 0 ) {
var t = a; a = b, b = t;
t = sa; sa = sb; sb = t;
}
var xi = BigNumber_ONE, xj = BigNumber_ZERO, lx = b.bitLength,
yi = BigNumber_ZERO, yj = BigNumber_ONE, ly = a.bitLength,
z, r, q;
z = a.divide(b);
while ( (r = z.remainder) !== BigNumber_ZERO ) {
q = z.quotient;
z = xi.subtract( q.multiply(xj).clamp(lx) ).clamp(lx), xi = xj, xj = z;
z = yi.subtract( q.multiply(yj).clamp(ly) ).clamp(ly), yi = yj, yj = z;
a = b, b = r;
z = a.divide(b);
}
if ( sa < 0 )
xj = xj.negate();
if ( sb < 0 )
yj = yj.negate();
if ( a_cmp_b < 0 ) {
var t = xj; xj = yj, yj = t;
}
return {
gcd: b,
x: xj,
y: yj
};
}