UNPKG

mathsteps-experimental-fork

Version:

Step by step math solutions. Experimental Fork

56 lines (51 loc) 2.06 kB
'use strict'; 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;