UNPKG

btm-expressions

Version:

BTM (bowtie-math) is a math object model to enable parsing of mathematical expressions into a tree structure that can be manipulated, evaluated, and compared.

151 lines (126 loc) 4.22 kB
/*! * BTM JavaScript Library v@VERSION * https://github.com/dbrianwalton/BTM * * Copyright D. Brian Walton * Released under the MIT license (https://opensource.org/licenses/MIT) * * Date: @DATE */ /* **************************************************** * A class for dealing with polynomials with rational coefficients * in a convenient way. * **************************************************** */ import rational_number from "./rational_number.js"; class monomial { constructor(coef, power) { this.coef = (coef instanceof rational_number) ? coef : new rational_number(coef); this.power = (power instanceof rational_number) ? power : new rational_number(power); } toString(leadSign, showZero) { var str, coefValue, powerValue, powerString; if (typeof leadSign == 'undefined') { leadSign = false; } if (typeof showZero == 'undefined') { showZero = false; } coefValue = this.coef.value(); if (coefValue == 0) { if (showZero) { str = "0"; } else { str = ""; } } else { powerValue = this.power.value(); if (powerValue != 0 && coefValue == 1) { str = leadSign ? '+' : ''; } else if (powerValue != 0 && coefValue == -1) { str = '-'; } else { str = this.coef.toString(leadSign); } powerString = this.power.toString(); if (powerValue != 0) { str = str + 'x' + ((powerValue == 1) ? '' : ('^(' + powerString + ')')); } } return(str); } toPosPowerString(leadSign) { var str, powerValue, powerString; if (typeof leadSign == 'undefined') { leadSign = false; } powerValue = this.power.value(); if (powerValue < 0) { var denom, denomStr; denom = new monomial(this.coef.q, this.power.multiply(-1)); denomStr = denom.toString(); str = (leadSign && this.coef.p >= 0 ? '+' : '') + this.coef.p + '/(' + denomStr + ')'; } else { str = this.toString(); } return(str); } toTeX(leadSign) { var str, coefValue, powerValue, powerString; if (leadSign == undefined) { leadSign = false; } coefValue = this.coef.value(); powerValue = this.power.value(); if (powerValue != 0 && coefValue == 1) { str = leadSign ? '+' : ''; } else if (powerValue != 0 && coefValue == -1) { str = '-'; } else { str = this.coef.toTeX(leadSign); } powerString = this.power.toString(); if (powerValue != 0) { str = str + 'x' + ((powerValue == 1) ? '' : ('^{' + powerString + '}')); } return(str); } toPosPowerTeX(leadSign) { var str, powerValue, powerString; if (typeof leadSign == 'undefined') { leadSign = false; } powerValue = this.power.value(); if (powerValue < 0) { var denom, denomStr; denom = new monomial(this.coef.q, this.power.multiply(-1)); denomStr = denom.toTeX(); str = ((this.coef.p < 0) ? '-' : (leadSign ? '+' : '')) + '\\frac{' + this.coef.p + '}{' + denomStr + '}'; } else { str = this.toString(); } return(str); } } export function polyTeX(coefs) { var n = coefs.length; var i,p = n-1; var term = new monomial(coefs[0], p); var str = term.toTeX(false); for (i=1; i<n; i++) { term = new monomial(coefs[i], p-i); str = str + term.toTeX(true); } return(str); } export function polyString(coefs) { var n = coefs.length; var i,p = n-1; var term = new monomial(coefs[0], p); var str = term.toString(false); for (i=1; i<n; i++) { term = new monomial(coefs[i], p-i); str = str + term.toString(true); } return(str); }