mathsteps-experimental-fork
Version:
Step by step math solutions. Experimental Fork
56 lines (51 loc) • 2.06 kB
JavaScript
;
const config = require('../../config.js');
const clone = require('../../newServices/nodeServices/clone.js');
const index = require('../../node/index.js');
const ChangeTypes = require('../../types/changeType/ChangeTypes.js');
function sqrtFromPow(node, simplifyCtx) {
let rv = null;
// eslint-disable-next-line eqeqeq
if (index.default.Type.isFunction(node, 'sqrt') && node.args[0].op == '^') {
const root = node.args[0].args[0];
const exponent = node.args[0].args[1];
if (index.default.Type.isConstant(exponent)) {
const exponentValue = exponent.value;
const exponentMod2 = config.default.mod(exponentValue, 2);
const exponentMod4 = config.default.mod(exponentValue, 4);
if (config.default.equal(exponentMod2, 0)) {
// sqrt(x^2) gives |x| or x
// sqrt(x^(2*n)) gives |x|^n or x^n
let newNode = null;
let rootIsNonNegative = false;
if (simplifyCtx.expressionCtx)
rootIsNonNegative = simplifyCtx.expressionCtx.isNodeNonNegative(root);
if (config.default.equal(exponentValue, 2)) {
// sqrt(x^2)
if (rootIsNonNegative) {
// sqrt(x^2) gives x if x>=0
newNode = clone(root);
}
else {
// sqrt(x^2) gives |x| if x can be negative
newNode = index.default.Creator.kemuCreateAbs(root);
}
}
else if (rootIsNonNegative || config.default.equal(exponentMod4, 0)) {
// sqrt(x^2n) gives x^n if x>=0
// sqrt(x^4n) gives x^2n for any x
const newExponent = index.default.Creator.operator('/', [clone(exponent), index.default.Creator.constant(2)]);
newNode = index.default.Creator.operator('^', [clone(root), newExponent]);
}
if (newNode) {
rv = {
changeType: ChangeTypes.ChangeTypes.KEMU_SQRT_FROM_POW,
rootNode: newNode,
};
}
}
}
}
return rv
}
module.exports = sqrtFromPow;