nthRoot.js 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", {
  3. value: true
  4. });
  5. exports.createNthRootNumber = exports.createNthRoot = void 0;
  6. var _factory = require("../../utils/factory.js");
  7. var _matAlgo01xDSid = require("../../type/matrix/utils/matAlgo01xDSid.js");
  8. var _matAlgo02xDS = require("../../type/matrix/utils/matAlgo02xDS0.js");
  9. var _matAlgo06xS0S = require("../../type/matrix/utils/matAlgo06xS0S0.js");
  10. var _matAlgo11xS0s = require("../../type/matrix/utils/matAlgo11xS0s.js");
  11. var _matrixAlgorithmSuite = require("../../type/matrix/utils/matrixAlgorithmSuite.js");
  12. var _index = require("../../plain/number/index.js");
  13. var name = 'nthRoot';
  14. var dependencies = ['typed', 'matrix', 'equalScalar', 'BigNumber', 'concat'];
  15. var createNthRoot = /* #__PURE__ */(0, _factory.factory)(name, dependencies, function (_ref) {
  16. var typed = _ref.typed,
  17. matrix = _ref.matrix,
  18. equalScalar = _ref.equalScalar,
  19. _BigNumber = _ref.BigNumber,
  20. concat = _ref.concat;
  21. var matAlgo01xDSid = (0, _matAlgo01xDSid.createMatAlgo01xDSid)({
  22. typed: typed
  23. });
  24. var matAlgo02xDS0 = (0, _matAlgo02xDS.createMatAlgo02xDS0)({
  25. typed: typed,
  26. equalScalar: equalScalar
  27. });
  28. var matAlgo06xS0S0 = (0, _matAlgo06xS0S.createMatAlgo06xS0S0)({
  29. typed: typed,
  30. equalScalar: equalScalar
  31. });
  32. var matAlgo11xS0s = (0, _matAlgo11xS0s.createMatAlgo11xS0s)({
  33. typed: typed,
  34. equalScalar: equalScalar
  35. });
  36. var matrixAlgorithmSuite = (0, _matrixAlgorithmSuite.createMatrixAlgorithmSuite)({
  37. typed: typed,
  38. matrix: matrix,
  39. concat: concat
  40. });
  41. /**
  42. * Calculate the nth root of a value.
  43. * The principal nth root of a positive real number A, is the positive real
  44. * solution of the equation
  45. *
  46. * x^root = A
  47. *
  48. * For matrices, the function is evaluated element wise.
  49. *
  50. * Syntax:
  51. *
  52. * math.nthRoot(a)
  53. * math.nthRoot(a, root)
  54. *
  55. * Examples:
  56. *
  57. * math.nthRoot(9, 2) // returns 3 (since 3^2 == 9)
  58. * math.sqrt(9) // returns 3 (since 3^2 == 9)
  59. * math.nthRoot(64, 3) // returns 4 (since 4^3 == 64)
  60. *
  61. * See also:
  62. *
  63. * sqrt, pow
  64. *
  65. * @param {number | BigNumber | Array | Matrix | Complex} a
  66. * Value for which to calculate the nth root
  67. * @param {number | BigNumber} [root=2] The root.
  68. * @return {number | Complex | Array | Matrix} Returns the nth root of `a`
  69. */
  70. function complexErr() {
  71. throw new Error('Complex number not supported in function nthRoot. Use nthRoots instead.');
  72. }
  73. return typed(name, {
  74. number: _index.nthRootNumber,
  75. 'number, number': _index.nthRootNumber,
  76. BigNumber: function BigNumber(x) {
  77. return _bigNthRoot(x, new _BigNumber(2));
  78. },
  79. 'BigNumber, BigNumber': _bigNthRoot,
  80. Complex: complexErr,
  81. 'Complex, number': complexErr,
  82. Array: typed.referTo('DenseMatrix,number', function (selfDn) {
  83. return function (x) {
  84. return selfDn(matrix(x), 2).valueOf();
  85. };
  86. }),
  87. DenseMatrix: typed.referTo('DenseMatrix,number', function (selfDn) {
  88. return function (x) {
  89. return selfDn(x, 2);
  90. };
  91. }),
  92. SparseMatrix: typed.referTo('SparseMatrix,number', function (selfSn) {
  93. return function (x) {
  94. return selfSn(x, 2);
  95. };
  96. }),
  97. 'SparseMatrix, SparseMatrix': typed.referToSelf(function (self) {
  98. return function (x, y) {
  99. // density must be one (no zeros in matrix)
  100. if (y.density() === 1) {
  101. // sparse + sparse
  102. return matAlgo06xS0S0(x, y, self);
  103. } else {
  104. // throw exception
  105. throw new Error('Root must be non-zero');
  106. }
  107. };
  108. }),
  109. 'DenseMatrix, SparseMatrix': typed.referToSelf(function (self) {
  110. return function (x, y) {
  111. // density must be one (no zeros in matrix)
  112. if (y.density() === 1) {
  113. // dense + sparse
  114. return matAlgo01xDSid(x, y, self, false);
  115. } else {
  116. // throw exception
  117. throw new Error('Root must be non-zero');
  118. }
  119. };
  120. }),
  121. 'Array, SparseMatrix': typed.referTo('DenseMatrix,SparseMatrix', function (selfDS) {
  122. return function (x, y) {
  123. return selfDS(matrix(x), y);
  124. };
  125. }),
  126. 'number | BigNumber, SparseMatrix': typed.referToSelf(function (self) {
  127. return function (x, y) {
  128. // density must be one (no zeros in matrix)
  129. if (y.density() === 1) {
  130. // sparse - scalar
  131. return matAlgo11xS0s(y, x, self, true);
  132. } else {
  133. // throw exception
  134. throw new Error('Root must be non-zero');
  135. }
  136. };
  137. })
  138. }, matrixAlgorithmSuite({
  139. scalar: 'number | BigNumber',
  140. SD: matAlgo02xDS0,
  141. Ss: matAlgo11xS0s,
  142. sS: false
  143. }));
  144. /**
  145. * Calculate the nth root of a for BigNumbers, solve x^root == a
  146. * https://rosettacode.org/wiki/Nth_root#JavaScript
  147. * @param {BigNumber} a
  148. * @param {BigNumber} root
  149. * @private
  150. */
  151. function _bigNthRoot(a, root) {
  152. var precision = _BigNumber.precision;
  153. var Big = _BigNumber.clone({
  154. precision: precision + 2
  155. });
  156. var zero = new _BigNumber(0);
  157. var one = new Big(1);
  158. var inv = root.isNegative();
  159. if (inv) {
  160. root = root.neg();
  161. }
  162. if (root.isZero()) {
  163. throw new Error('Root must be non-zero');
  164. }
  165. if (a.isNegative() && !root.abs().mod(2).equals(1)) {
  166. throw new Error('Root must be odd when a is negative.');
  167. }
  168. // edge cases zero and infinity
  169. if (a.isZero()) {
  170. return inv ? new Big(Infinity) : 0;
  171. }
  172. if (!a.isFinite()) {
  173. return inv ? zero : a;
  174. }
  175. var x = a.abs().pow(one.div(root));
  176. // If a < 0, we require that root is an odd integer,
  177. // so (-1) ^ (1/root) = -1
  178. x = a.isNeg() ? x.neg() : x;
  179. return new _BigNumber((inv ? one.div(x) : x).toPrecision(precision));
  180. }
  181. });
  182. exports.createNthRoot = createNthRoot;
  183. var createNthRootNumber = /* #__PURE__ */(0, _factory.factory)(name, ['typed'], function (_ref2) {
  184. var typed = _ref2.typed;
  185. return typed(name, {
  186. number: _index.nthRootNumber,
  187. 'number, number': _index.nthRootNumber
  188. });
  189. });
  190. exports.createNthRootNumber = createNthRootNumber;