PHP WebShell

Текущая директория: /opt/BitGoJS/node_modules/asmcrypto.js/src/bignum

Просмотр файла: extgcd.js

import { BigNumber, BigNumber_ONE, BigNumber_ZERO, is_big_number } from './bignum';

/**
 * @param {number} a
 * @param {number} b
 * @return {{gcd: number, x: number, y: number}}
 * @constructor
 */
export 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,
  };
}

/**
 * @param a
 * @param b
 * @return {{gcd: BigNumber, x: BigNumber, y: BigNumber}}
 * @constructor
 */
export 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,
  };
}

Выполнить команду


Для локальной разработки. Не используйте в интернете!