UNPKG

mathsteps-experimental-fork

Version:

Step by step math solutions. Experimental Fork

197 lines (192 loc) 12.1 kB
'use strict'; Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: 'Module' } }); const config = require('../../config.js'); const ruleHelper = require('../../newServices/ruleHelper.js'); const ChangeTypes = require('../../types/changeType/ChangeTypes.js'); const index = require('../../node/index.js'); const simplifyCore = require('../simplifyCore.js'); const poolOfRules = [ // Distribute minus. { l: ' - (c n)', r: ' - c n', id: ChangeTypes.ChangeTypes.DISTRIBUTE_NEGATIVE_ONE }, { l: 'n1 - (c n)', r: 'n1 - c n', id: ChangeTypes.ChangeTypes.DISTRIBUTE_NEGATIVE_ONE }, // TODO: Review it. { l: '1/c * const.pi', r: 'const.pi/c', id: ChangeTypes.ChangeTypes.REARRANGE_COEFF }, { l: '-1/c * const.pi', r: '-const.pi/c', id: ChangeTypes.ChangeTypes.REARRANGE_COEFF }, { l: 'c1 * v / c2', r: 'c1/c2*v', id: ChangeTypes.ChangeTypes.REARRANGE_COEFF }, // Common sin(x) values. { l: 'sin(0)', r: '0', id: ChangeTypes.ChangeTypes.KEMU_FUNCTION_VALUE }, { l: 'sin(const.pi/6)', r: '1/2', id: ChangeTypes.ChangeTypes.KEMU_FUNCTION_VALUE }, { l: 'sin(const.pi/4)', r: 'sqrt(2)/2', id: ChangeTypes.ChangeTypes.KEMU_FUNCTION_VALUE }, { l: 'sin(const.pi/3)', r: 'sqrt(3)/2', id: ChangeTypes.ChangeTypes.KEMU_FUNCTION_VALUE }, { l: 'sin(const.pi/2)', r: '1', id: ChangeTypes.ChangeTypes.KEMU_FUNCTION_VALUE }, { l: 'sin(const.pi)', r: '0', id: ChangeTypes.ChangeTypes.KEMU_FUNCTION_VALUE }, // Common asin(x) values. { l: 'asin(0)', r: '0', id: ChangeTypes.ChangeTypes.KEMU_FUNCTION_VALUE }, { l: 'asin(1/2)', r: 'const.pi/6', id: ChangeTypes.ChangeTypes.KEMU_FUNCTION_VALUE }, { l: 'asin(sqrt(2)/2)', r: 'const.pi/4', id: ChangeTypes.ChangeTypes.KEMU_FUNCTION_VALUE }, { l: 'asin(sqrt(3)/2)', r: 'const.pi/3', id: ChangeTypes.ChangeTypes.KEMU_FUNCTION_VALUE }, { l: 'asin(1)', r: 'const.pi/2', id: ChangeTypes.ChangeTypes.KEMU_FUNCTION_VALUE }, { l: 'asin(0)', r: 'const.pi', id: ChangeTypes.ChangeTypes.KEMU_FUNCTION_VALUE }, // Common cos(x) values. { l: 'cos(0)', r: '1', id: ChangeTypes.ChangeTypes.KEMU_FUNCTION_VALUE }, { l: 'cos(const.pi/6)', r: 'sqrt(3)/2', id: ChangeTypes.ChangeTypes.KEMU_FUNCTION_VALUE }, { l: 'cos(const.pi/4)', r: 'sqrt(2)/2', id: ChangeTypes.ChangeTypes.KEMU_FUNCTION_VALUE }, { l: 'cos(const.pi/3)', r: '1/2', id: ChangeTypes.ChangeTypes.KEMU_FUNCTION_VALUE }, { l: 'cos(const.pi/2)', r: '0', id: ChangeTypes.ChangeTypes.KEMU_FUNCTION_VALUE }, { l: 'cos(const.pi)', r: '-1', id: ChangeTypes.ChangeTypes.KEMU_FUNCTION_VALUE }, // Common acos(x) values. { l: 'acos(1)', r: '0', id: ChangeTypes.ChangeTypes.KEMU_FUNCTION_VALUE }, { l: 'acos(sqrt(3)/2)', r: 'const.pi/6', id: ChangeTypes.ChangeTypes.KEMU_FUNCTION_VALUE }, { l: 'acos(sqrt(2)/2)', r: 'const.pi/4', id: ChangeTypes.ChangeTypes.KEMU_FUNCTION_VALUE }, { l: 'acos(1/2)', r: 'const.pi/3', id: ChangeTypes.ChangeTypes.KEMU_FUNCTION_VALUE }, { l: 'acos(0)', r: 'const.pi/2', id: ChangeTypes.ChangeTypes.KEMU_FUNCTION_VALUE }, { l: 'acos(-1)', r: 'const.pi', id: ChangeTypes.ChangeTypes.KEMU_FUNCTION_VALUE }, // Common tg(x) values. { l: 'tg(0)', r: '0', id: ChangeTypes.ChangeTypes.KEMU_FUNCTION_VALUE }, { l: 'tg(const.pi/6)', r: 'sqrt(3)/3', id: ChangeTypes.ChangeTypes.KEMU_FUNCTION_VALUE }, { l: 'tg(const.pi/4)', r: '1', id: ChangeTypes.ChangeTypes.KEMU_FUNCTION_VALUE }, { l: 'tg(const.pi/3)', r: 'sqrt(3)', id: ChangeTypes.ChangeTypes.KEMU_FUNCTION_VALUE }, // Common arctg(x) values. { l: 'atan(0)', r: '0', id: ChangeTypes.ChangeTypes.KEMU_FUNCTION_VALUE }, { l: 'atan(sqrt(3)/3)', r: 'const.pi/6', id: ChangeTypes.ChangeTypes.KEMU_FUNCTION_VALUE }, { l: 'atan(1)', r: 'const.pi/4', id: ChangeTypes.ChangeTypes.KEMU_FUNCTION_VALUE }, { l: 'atan(sqrt(3))', r: 'const.pi/3', id: ChangeTypes.ChangeTypes.KEMU_FUNCTION_VALUE }, // Common ctg(x) values. { l: 'ctg(const.pi/6)', r: 'sqrt(3)', id: ChangeTypes.ChangeTypes.KEMU_FUNCTION_VALUE }, { l: 'ctg(const.pi/4)', r: '1', id: ChangeTypes.ChangeTypes.KEMU_FUNCTION_VALUE }, { l: 'ctg(const.pi/3)', r: 'sqrt(3)/3', id: ChangeTypes.ChangeTypes.KEMU_FUNCTION_VALUE }, { l: 'ctg(const.pi/2)', r: '0', id: ChangeTypes.ChangeTypes.KEMU_FUNCTION_VALUE }, // Common arcctg(x) values. { l: 'acot(sqrt(3))', r: 'const.pi/6', id: ChangeTypes.ChangeTypes.KEMU_FUNCTION_VALUE }, { l: 'acot(1)', r: 'const.pi/4', id: ChangeTypes.ChangeTypes.KEMU_FUNCTION_VALUE }, { l: 'acot(sqrt(3)/3)', r: 'const.pi/3', id: ChangeTypes.ChangeTypes.KEMU_FUNCTION_VALUE }, { l: 'acot(0)', r: 'const.pi/2', id: ChangeTypes.ChangeTypes.KEMU_FUNCTION_VALUE }, // Common laws for trigonometry functions. { l: 'sin(n1)^2 + cos(n1)^2', r: '1', id: ChangeTypes.ChangeTypes.KEMU_PYTHAGOREAN_IDENTITY }, { l: 'sin(-n)', r: '-sin(n)', id: ChangeTypes.ChangeTypes.KEMU_ODD_FUNCTION_OF_NEGATIVE }, { l: 'sin(-n1/n2)', r: '-sin(n1/n2)', id: ChangeTypes.ChangeTypes.KEMU_ODD_FUNCTION_OF_NEGATIVE }, { l: 'cos(-n)', r: 'cos(n)', id: ChangeTypes.ChangeTypes.KEMU_EVEN_FUNCTION_OF_NEGATIVE }, { l: 'cos(-n1/n2)', r: 'cos(n1/n2)', id: ChangeTypes.ChangeTypes.KEMU_EVEN_FUNCTION_OF_NEGATIVE }, { l: 'tg(-n)', r: '-tg(n)', id: ChangeTypes.ChangeTypes.KEMU_ODD_FUNCTION_OF_NEGATIVE }, { l: 'tg(-n1/n2)', r: '-tg(n1/n2)', id: ChangeTypes.ChangeTypes.KEMU_ODD_FUNCTION_OF_NEGATIVE }, { l: 'ctg(-n)', r: '-ctg(n)', id: ChangeTypes.ChangeTypes.KEMU_ODD_FUNCTION_OF_NEGATIVE }, { l: 'ctg(-n1/n2)', r: '-ctg(n1/n2)', id: ChangeTypes.ChangeTypes.KEMU_ODD_FUNCTION_OF_NEGATIVE }, { l: 'atan(sin(n)/cos(n))', r: 'atan(tg(n))', id: ChangeTypes.ChangeTypes.KEMU_CONVERT_SIN_PER_COS_TO_TAN }, { l: 'acot(cos(n)/sin(n))', r: 'acot(ctg(n))', id: ChangeTypes.ChangeTypes.KEMU_CONVERT_COS_PER_SIN_TO_COT }, { l: 'atan(tg(n))', r: 'n', id: ChangeTypes.ChangeTypes.KEMU_CANCEL_INVERSE_FUNCTION }, { l: 'acot(ctg(n))', r: 'n', id: ChangeTypes.ChangeTypes.KEMU_CANCEL_INVERSE_FUNCTION }, { l: 'asin(sin(n))', r: 'n', id: ChangeTypes.ChangeTypes.KEMU_CANCEL_INVERSE_FUNCTION }, { l: 'acos(cos(n))', r: 'n', id: ChangeTypes.ChangeTypes.KEMU_CANCEL_INVERSE_FUNCTION }, // Common fraction rules. { l: 'c1/n3 + c2/n3', r: '(c1 + c2) / n3', id: `${ChangeTypes.ChangeTypes.ADD_FRACTIONS}__CASE_3` }, // --------------------------------------------------------------------------- // Power and root related // --------------------------------------------------------------------------- // Common sqrt values. // More complex arguments are handled in sqrtFromConst extension. { l: 'sqrt(0)', r: '0', id: ChangeTypes.ChangeTypes.KEMU_SQRT_FROM_ZERO }, { l: 'sqrt(1)', r: '1', id: ChangeTypes.ChangeTypes.KEMU_SQRT_FROM_ONE }, { l: 'sqrt(1/n)', r: '1/sqrt(n)', id: ChangeTypes.ChangeTypes.KEMU_SQRT_FROM_ONE }, // Common n-th root values. { l: 'nthRoot(0, n1)', r: '0', id: ChangeTypes.ChangeTypes.KEMU_SQRT_FROM_ZERO }, { l: 'nthRoot(1, n1)', r: '1', id: ChangeTypes.ChangeTypes.KEMU_SQRT_FROM_ONE }, // Common n-th root rules. { l: 'nthRoot(n1^n2, n3)', r: 'n1^(n2/n3)', id: ChangeTypes.ChangeTypes.KEMU_SQRT_FROM_POW }, { l: 'nthRoot(n1, n2)^n3', r: 'n1^(n3/n2)', id: ChangeTypes.ChangeTypes.KEMU_POWER_SQRT }, { l: 'sqrt(n1^n2)', r: 'n1^(n2/2)', id: ChangeTypes.ChangeTypes.KEMU_SQRT_FROM_POW }, { l: 'sqrt(n * n1^n2)', r: 'n1^(n2/2) * sqrt(n)', id: ChangeTypes.ChangeTypes.KEMU_SQRT_FROM_POW }, // Root-root multiplication. { l: 'nthRoot(n1, n2) * nthRoot(n1, n3)', r: 'n1^(1/n2 + 1/n3)', id: ChangeTypes.ChangeTypes.MULTIPLY_NTH_ROOTS, }, { l: 'sqrt(n1) * nthRoot(n1, n2)', r: 'n1^(1/2 + 1/n2)', id: ChangeTypes.ChangeTypes.MULTIPLY_NTH_ROOTS, }, // Root-power multiplication. { l: 'nthRoot(v1, n2) * v1', r: 'v1^(1 + 1/n2)', id: ChangeTypes.ChangeTypes.MULTIPLY_NTH_ROOTS, }, { l: 'nthRoot(v1, n2) * v1^n3', r: 'v1^(n3 + 1/n2)', id: ChangeTypes.ChangeTypes.MULTIPLY_NTH_ROOTS, }, // Common power rules. { l: 'v * v', r: 'v^2', id: ChangeTypes.ChangeTypes.KEMU_MULTIPLY_POWERS_WITH_COMMON_BASE }, { l: 'v * v^n', r: 'v^(1+n)', id: ChangeTypes.ChangeTypes.KEMU_MULTIPLY_POWERS_WITH_COMMON_BASE }, { l: 'v^n * v', r: 'v^(n+1)', id: ChangeTypes.ChangeTypes.KEMU_MULTIPLY_POWERS_WITH_COMMON_BASE }, { l: 'n1^n2 * n1^n3', r: 'n1^(n2+n3)', id: ChangeTypes.ChangeTypes.KEMU_MULTIPLY_POWERS_WITH_COMMON_BASE }, { l: 'n1^n2 / n1^n3', r: 'n1^(n2-n3)', id: ChangeTypes.ChangeTypes.KEMU_DIVIDE_POWERS_WITH_COMMON_BASE }, // Negative exponents: // x^-a gives 1/x^a { l: '(n1/n2)^(-1)', r: 'n2/n1', id: ChangeTypes.ChangeTypes.KEMU_POWER_TO_MINUS_ONE }, { l: 'n1^(-1)', r: '1/n1', id: ChangeTypes.ChangeTypes.KEMU_POWER_TO_MINUS_ONE }, { l: 'n1^(-c)', r: '1/(n1^c)', id: ChangeTypes.ChangeTypes.KEMU_POWER_TO_NEGATIVE_EXPONENT }, { l: 'n1^(-c*n2)', r: '1/(n1^(c*n2))', id: ChangeTypes.ChangeTypes.KEMU_POWER_TO_NEGATIVE_EXPONENT }, { l: 'n1^(-n2)', r: '1/(n1^n2)', id: ChangeTypes.ChangeTypes.KEMU_POWER_TO_NEGATIVE_EXPONENT }, { l: 'n1^(-n2/n3)', r: '1/(n1^(n2/n3))', id: ChangeTypes.ChangeTypes.KEMU_POWER_TO_NEGATIVE_EXPONENT }, // Calculate constant power. { l: 'c1^(c2/c3)', r: 'nthRoot(c1^c2, c3)', id: ChangeTypes.ChangeTypes.KEMU_CONVERT_POWER_TO_ROOT }, // Common power-root rules. { l: 'v1 * nthRoot(v1,n2)', r: 'v1 * v1^(1/n2)', id: ChangeTypes.ChangeTypes.KEMU_CONVERT_ROOT_TO_POWER }, // sqrtMultiplication // sqrt(x)*sqrt(x) gives x // sqrt(a)*sqrt(b) gives sqrt(a b) { l: 'sqrt(n1) * sqrt(n1)', r: 'n1', id: ChangeTypes.ChangeTypes.KEMU_MULTIPLY_SQRTS_WITH_COMMON_ROOT }, { l: 'sqrt(n1) * sqrt(n2)', r: 'sqrt(n1*n2)', id: ChangeTypes.ChangeTypes.KEMU_MULTIPLY_SQRTS }, // powOfPow. // (x^a)^b gives x^(a*b) { l: '(n1^n2)^n3', r: 'n1^(n2*n3)', id: ChangeTypes.ChangeTypes.KEMU_MULTIPLY_EXPONENTS }, { l: 'n1^(n2^n3)', r: 'n1^(n2*n3)', id: ChangeTypes.ChangeTypes.KEMU_MULTIPLY_EXPONENTS }, // powOfSqrt. // sqrt(a)^n gives a^(n/2) { l: 'sqrt(n1)^2', r: 'n1', id: ChangeTypes.ChangeTypes.KEMU_POWER_SQRT }, { l: 'sqrt(n1)^n2', r: 'n1^(n2/2)', id: ChangeTypes.ChangeTypes.KEMU_POWER_SQRT }, // powFraction. // (a/b)^x gives a^x / b^x { l: '(n1/n2)^n3', r: '(n1^n3)/(n2^n3)', id: ChangeTypes.ChangeTypes.KEMU_POWER_FRACTION }, // a*1/x gives a/x { l: 'n1 * 1/n2', r: 'n1/n2', id: ChangeTypes.ChangeTypes.KEMU_REMOVE_FRACTION_WITH_UNIT_NUMERATOR }, { l: '1/v2 * n1', r: 'n1/v2', id: ChangeTypes.ChangeTypes.KEMU_REMOVE_FRACTION_WITH_UNIT_NUMERATOR }, // --------------------------------------------------------------------------- // Absolute value // --------------------------------------------------------------------------- // absolute value: |c| (evaluate) // absolute value: |c1/c2| gives |c1|/|c2| // absolute value: |-x| gives |x| { l: 'abs(c)', id: ChangeTypes.ChangeTypes.ABSOLUTE_VALUE, replaceFct(node, vars) { return index.default.Creator.constant(config.default.abs(vars.c.value)) }, }, { l: 'abs(c1/c2)', r: 'abs(c1) / abs(c2)', id: ChangeTypes.ChangeTypes.ABSOLUTE_VALUE }, { l: 'abs(-v)', r: 'abs(v)', id: ChangeTypes.ChangeTypes.ABSOLUTE_VALUE }, ]; function commonFunctions(node, rules) { let rv = null; // Possible improvement: catch many steps at once. const steps = simplifyCore(node, rules, null, { stopOnFirstStep: true }); if (steps.length > 0) { const oneStep = steps[0]; rv = { changeType: oneStep.ruleApplied.id, rootNode: oneStep.nodeAfter, }; } return rv } const commonFunctionsPooledTogether = node => commonFunctions(node, poolOfRules); const commonFunctions$0 = { commonFunctions: ruleHelper.createFunctionForEveryRule(poolOfRules, commonFunctions), commonFunctionsPooledTogether, }; exports.commonFunctionsPooledTogether = commonFunctionsPooledTogether; exports.default = commonFunctions$0;