gcd.js 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", {
  3. value: true
  4. });
  5. exports.createGcd = void 0;
  6. var _factory = require("../../utils/factory.js");
  7. var _matAlgo01xDSid = require("../../type/matrix/utils/matAlgo01xDSid.js");
  8. var _matAlgo04xSidSid = require("../../type/matrix/utils/matAlgo04xSidSid.js");
  9. var _matAlgo10xSids = require("../../type/matrix/utils/matAlgo10xSids.js");
  10. var _matrixAlgorithmSuite = require("../../type/matrix/utils/matrixAlgorithmSuite.js");
  11. var _index = require("../../plain/number/index.js");
  12. var name = 'gcd';
  13. var dependencies = ['typed', 'matrix', 'equalScalar', 'BigNumber', 'DenseMatrix'];
  14. var createGcd = /* #__PURE__ */(0, _factory.factory)(name, dependencies, function (_ref) {
  15. var typed = _ref.typed,
  16. matrix = _ref.matrix,
  17. equalScalar = _ref.equalScalar,
  18. BigNumber = _ref.BigNumber,
  19. DenseMatrix = _ref.DenseMatrix;
  20. var matAlgo01xDSid = (0, _matAlgo01xDSid.createMatAlgo01xDSid)({
  21. typed: typed
  22. });
  23. var matAlgo04xSidSid = (0, _matAlgo04xSidSid.createMatAlgo04xSidSid)({
  24. typed: typed,
  25. equalScalar: equalScalar
  26. });
  27. var matAlgo10xSids = (0, _matAlgo10xSids.createMatAlgo10xSids)({
  28. typed: typed,
  29. DenseMatrix: DenseMatrix
  30. });
  31. var matrixAlgorithmSuite = (0, _matrixAlgorithmSuite.createMatrixAlgorithmSuite)({
  32. typed: typed,
  33. matrix: matrix
  34. });
  35. var gcdTypes = 'number | BigNumber | Fraction | Matrix | Array';
  36. var gcdManySignature = {};
  37. gcdManySignature["".concat(gcdTypes, ", ").concat(gcdTypes, ", ...").concat(gcdTypes)] = typed.referToSelf(function (self) {
  38. return function (a, b, args) {
  39. var res = self(a, b);
  40. for (var i = 0; i < args.length; i++) {
  41. res = self(res, args[i]);
  42. }
  43. return res;
  44. };
  45. });
  46. /**
  47. * Calculate the greatest common divisor for two or more values or arrays.
  48. *
  49. * For matrices, the function is evaluated element wise.
  50. *
  51. * Syntax:
  52. *
  53. * math.gcd(a, b)
  54. * math.gcd(a, b, c, ...)
  55. *
  56. * Examples:
  57. *
  58. * math.gcd(8, 12) // returns 4
  59. * math.gcd(-4, 6) // returns 2
  60. * math.gcd(25, 15, -10) // returns 5
  61. *
  62. * math.gcd([8, -4], [12, 6]) // returns [4, 2]
  63. *
  64. * See also:
  65. *
  66. * lcm, xgcd
  67. *
  68. * @param {... number | BigNumber | Fraction | Array | Matrix} args Two or more integer numbers
  69. * @return {number | BigNumber | Fraction | Array | Matrix} The greatest common divisor
  70. */
  71. return typed(name, {
  72. 'number, number': _index.gcdNumber,
  73. 'BigNumber, BigNumber': _gcdBigNumber,
  74. 'Fraction, Fraction': function FractionFraction(x, y) {
  75. return x.gcd(y);
  76. }
  77. }, matrixAlgorithmSuite({
  78. SS: matAlgo04xSidSid,
  79. DS: matAlgo01xDSid,
  80. Ss: matAlgo10xSids
  81. }), gcdManySignature);
  82. /**
  83. * Calculate gcd for BigNumbers
  84. * @param {BigNumber} a
  85. * @param {BigNumber} b
  86. * @returns {BigNumber} Returns greatest common denominator of a and b
  87. * @private
  88. */
  89. function _gcdBigNumber(a, b) {
  90. if (!a.isInt() || !b.isInt()) {
  91. throw new Error('Parameters in function gcd must be integer numbers');
  92. }
  93. // https://en.wikipedia.org/wiki/Euclidean_algorithm
  94. var zero = new BigNumber(0);
  95. while (!b.isZero()) {
  96. var r = a.mod(b);
  97. a = b;
  98. b = r;
  99. }
  100. return a.lt(zero) ? a.neg() : a;
  101. }
  102. });
  103. exports.createGcd = createGcd;