1 | import { factory } from '../../utils/factory.js';
|
2 | import { isBigNumber, isComplex, isFraction } from '../../utils/is.js';
|
3 | import { deepMap } from '../../utils/collection.js';
|
4 | import { cbrtNumber } from '../../plain/number/index.js';
|
5 | var name = 'cbrt';
|
6 | var dependencies = ['config', 'typed', 'isNegative', 'unaryMinus', 'matrix', 'Complex', 'BigNumber', 'Fraction'];
|
7 | export var createCbrt = /* #__PURE__ */factory(name, dependencies, (_ref) => {
|
8 | var {
|
9 | config,
|
10 | typed,
|
11 | isNegative,
|
12 | unaryMinus,
|
13 | matrix,
|
14 | Complex,
|
15 | BigNumber,
|
16 | Fraction
|
17 | } = _ref;
|
18 |
|
19 | /**
|
20 | * Calculate the cubic root of a value.
|
21 | *
|
22 | * For matrices, the function is evaluated element wise.
|
23 | *
|
24 | * Syntax:
|
25 | *
|
26 | * math.cbrt(x)
|
27 | * math.cbrt(x, allRoots)
|
28 | *
|
29 | * Examples:
|
30 | *
|
31 | * math.cbrt(27) // returns 3
|
32 | * math.cube(3) // returns 27
|
33 | * math.cbrt(-64) // returns -4
|
34 | * math.cbrt(math.unit('27 m^3')) // returns Unit 3 m
|
35 | * math.cbrt([27, 64, 125]) // returns [3, 4, 5]
|
36 | *
|
37 | * const x = math.complex('8i')
|
38 | * math.cbrt(x) // returns Complex 1.7320508075689 + i
|
39 | * math.cbrt(x, true) // returns Matrix [
|
40 | * // 1.7320508075689 + i
|
41 | * // -1.7320508075689 + i
|
42 | * // -2i
|
43 | * // ]
|
44 | *
|
45 | * See also:
|
46 | *
|
47 | * square, sqrt, cube
|
48 | *
|
49 | * @param {number | BigNumber | Complex | Unit | Array | Matrix} x
|
50 | * Value for which to calculate the cubic root.
|
51 | * @param {boolean} [allRoots] Optional, false by default. Only applicable
|
52 | * when `x` is a number or complex number. If true, all complex
|
53 | * roots are returned, if false (default) the principal root is
|
54 | * returned.
|
55 | * @return {number | BigNumber | Complex | Unit | Array | Matrix}
|
56 | * Returns the cubic root of `x`
|
57 | */
|
58 | return typed(name, {
|
59 | number: cbrtNumber,
|
60 | // note: signature 'number, boolean' is also supported,
|
61 | // created by typed as it knows how to convert number to Complex
|
62 | Complex: _cbrtComplex,
|
63 | 'Complex, boolean': _cbrtComplex,
|
64 | BigNumber: function BigNumber(x) {
|
65 | return x.cbrt();
|
66 | },
|
67 | Unit: _cbrtUnit,
|
68 | 'Array | Matrix': function ArrayMatrix(x) {
|
69 | // deep map collection, skip zeros since cbrt(0) = 0
|
70 | return deepMap(x, this, true);
|
71 | }
|
72 | });
|
73 | /**
|
74 | * Calculate the cubic root for a complex number
|
75 | * @param {Complex} x
|
76 | * @param {boolean} [allRoots] If true, the function will return an array
|
77 | * with all three roots. If false or undefined,
|
78 | * the principal root is returned.
|
79 | * @returns {Complex | Array.<Complex> | Matrix.<Complex>} Returns the cubic root(s) of x
|
80 | * @private
|
81 | */
|
82 |
|
83 | function _cbrtComplex(x, allRoots) {
|
84 | // https://www.wikiwand.com/en/Cube_root#/Complex_numbers
|
85 | var arg3 = x.arg() / 3;
|
86 | var abs = x.abs(); // principal root:
|
87 |
|
88 | var principal = new Complex(cbrtNumber(abs), 0).mul(new Complex(0, arg3).exp());
|
89 |
|
90 | if (allRoots) {
|
91 | var all = [principal, new Complex(cbrtNumber(abs), 0).mul(new Complex(0, arg3 + Math.PI * 2 / 3).exp()), new Complex(cbrtNumber(abs), 0).mul(new Complex(0, arg3 - Math.PI * 2 / 3).exp())];
|
92 | return config.matrix === 'Array' ? all : matrix(all);
|
93 | } else {
|
94 | return principal;
|
95 | }
|
96 | }
|
97 | /**
|
98 | * Calculate the cubic root for a Unit
|
99 | * @param {Unit} x
|
100 | * @return {Unit} Returns the cubic root of x
|
101 | * @private
|
102 | */
|
103 |
|
104 |
|
105 | function _cbrtUnit(x) {
|
106 | if (x.value && isComplex(x.value)) {
|
107 | var result = x.clone();
|
108 | result.value = 1.0;
|
109 | result = result.pow(1.0 / 3); // Compute the units
|
110 |
|
111 | result.value = _cbrtComplex(x.value); // Compute the value
|
112 |
|
113 | return result;
|
114 | } else {
|
115 | var negate = isNegative(x.value);
|
116 |
|
117 | if (negate) {
|
118 | x.value = unaryMinus(x.value);
|
119 | } // TODO: create a helper function for this
|
120 |
|
121 |
|
122 | var third;
|
123 |
|
124 | if (isBigNumber(x.value)) {
|
125 | third = new BigNumber(1).div(3);
|
126 | } else if (isFraction(x.value)) {
|
127 | third = new Fraction(1, 3);
|
128 | } else {
|
129 | third = 1 / 3;
|
130 | }
|
131 |
|
132 | var _result = x.pow(third);
|
133 |
|
134 | if (negate) {
|
135 | _result.value = unaryMinus(_result.value);
|
136 | }
|
137 |
|
138 | return _result;
|
139 | }
|
140 | }
|
141 | }); |
\ | No newline at end of file |