UNPKG

cnum

Version:

Represent rational numbers in comfortably numeric way.

1 lines 48.1 kB
{"version":3,"file":"index.cjs","sources":["../src/version.ts","../src/Token.ts","../src/Lexer.ts","../src/Parser.ts","../src/bigint.ts","../src/SternBrocotTree.ts","../src/config.ts","../src/Rat.ts","../src/Symbolizer.ts","../src/Polyrat.ts","../src/cnum.ts"],"sourcesContent":["export default '0.1.3'\n","export const enum TokenType {\n identifier,\n keyword,\n separator,\n operator,\n literal,\n comment,\n}\n\n/**\n * @class Token\n * @name Token\n */\nexport class Token {\n type: TokenType\n s: string\n\n /**\n * Initialize a token.\n */\n constructor(type: TokenType, s: string) {\n this.type = type\n this.s = s\n }\n\n /**\n * The text representation.\n */\n toString(): string {\n return `${this.type}(${this.s})`\n }\n}\n\nexport default Token\n","import Token, { TokenType } from './Token'\n\nconst OPERATORS = {\n '+': 'add',\n '-': 'sub',\n '*': 'mul',\n '/': 'div',\n '**': 'pow',\n '^': 'pow',\n '=': 'set',\n '==': 'equals',\n '<': 'isLessThan',\n '>': 'isGreaterThan',\n}\n\n/**\n * @class Lexer\n * @name Lexer\n */\nexport class Lexer {\n s: string\n\n /**\n * Initialize a lexer.\n */\n constructor(input: string) {\n this.s = input\n }\n\n /**\n * Yields tokens as they are lexed.\n *\n */\n *lex(): Generator<Token> {\n let onSpace = false\n let onInteger = false\n let onWord = false\n let onOperator = false\n let buffer = ''\n\n // for each character\n for (let i = 0; i < this.s.length; i++) {\n const char = this.s[i] ?? '?'\n\n // if a space, combine with subsequent spaces into a separator\n if (/^\\s$/.exec(char)) {\n if (onInteger) {\n yield new Token(TokenType.literal, buffer)\n onInteger = false\n buffer = ''\n } else if (onWord) {\n yield new Token(TokenType.identifier, buffer)\n onWord = false\n buffer = ''\n }\n onSpace = true\n buffer += char\n continue\n } else if (onSpace) {\n yield new Token(TokenType.separator, '')\n onSpace = false\n buffer = ''\n }\n\n // if a digit, combine with subsequent digits into a literal\n if (/^\\d$/.exec(char)) {\n if (!onWord) {\n onInteger = true\n }\n buffer += char\n continue\n } else if (onInteger) {\n yield new Token(TokenType.literal, buffer)\n onInteger = false\n buffer = ''\n }\n\n // if a letter, combine with subsequent letters/numbers into an identifier\n if (/^[a-z]$/.exec(char) || (onWord && /^\\d$/.exec(char))) {\n onWord = true\n buffer += char\n continue\n } else if (onWord) {\n yield new Token(TokenType.identifier, buffer)\n onWord = false\n buffer = ''\n }\n\n // if another char, combine with subsequent char and match an operator\n buffer += char\n if (buffer in OPERATORS) {\n yield new Token(TokenType.operator, buffer)\n onOperator = false\n buffer = ''\n continue\n }\n if (onOperator) {\n throw `Invalid operator \"${buffer}\"`\n }\n onOperator = true\n }\n\n if (onSpace) {\n yield new Token(TokenType.separator, '')\n }\n\n if (onInteger) {\n yield new Token(TokenType.literal, buffer)\n }\n\n if (onWord) {\n yield new Token(TokenType.identifier, buffer)\n }\n }\n}\n\nexport default Lexer\n","import { Token, TokenType } from './Token'\n\ninterface Identifiers<T> {\n [Key: string]: T\n}\n\n/**\n * @class Parser\n * @name Parser\n */\nexport class Parser {\n tokens: Generator<Token>\n identifiers: Identifiers<string> = {}\n\n /**\n * Initialize a parser from a token generator.\n */\n constructor(tokens: Generator<Token>) {\n this.tokens = tokens\n }\n\n /**\n * Evaluate the result.\n */\n evaluate(): bigint {\n let n = 0n\n for (const x of this.tokens) {\n if (x.type === TokenType.identifier) {\n if (!(x.s in this.identifiers)) {\n throw `\"${x.s}\" is undefined`\n }\n n += BigInt(this.identifiers[x.s] ?? -1)\n }\n // else if (x.type === TokenType.separator) {\n // }\n // else if (x.type === TokenType.operator) {\n // if (x.s === '=') {\n // }\n // }\n else if (x.type === TokenType.literal) {\n n += BigInt(x.s)\n }\n }\n return n\n }\n\n /**\n * The text representation.\n */\n toString(): string {\n return this.evaluate().toString()\n }\n}\n\nexport default Parser\n","/**\n * Find the greatest common denominator of the two numbers.\n */\nexport const gcd = (a: bigint, b: bigint): bigint => {\n if (b === 1n || a === 1n) {\n return 1n\n }\n while (b !== 0n) {\n //[a, b] = [b, a % b] // not pretty???\n const t = a % b\n a = b\n b = t\n }\n return a < 0n ? -a : a\n}\n\n/**\n * Returns true if the number is prime.\n */\nexport const isPrime = (n: bigint): boolean => {\n if (n === 1n) return false\n for (let i = 2n; i * i <= n; i++) {\n if (n % i === 0n) return false\n }\n return true\n}\n\n/**\n * Yields the prime numbers.\n */\nexport function* primes(): Generator<bigint> {\n for (let n = 2n; true; n++) {\n if (isPrime(n)) {\n yield n\n }\n }\n}\n\n/**\n * Finds the prime factors, returning them in ascending order as arrays with their exponent as the second element.\n */\nexport const primeFactors = (n: bigint): Array<[bigint, bigint]> => {\n const f: Array<[bigint, bigint]> = []\n for (const p of primes()) {\n let e = 0n\n while (n % p === 0n) {\n e++\n n /= p\n }\n if (e) f.push([p, e])\n if (n === 1n) break\n }\n return f\n}\n","import { MAX_LOOPS } from './config'\nimport Rat from './Rat'\n\n/**\n * Find the rational number that best approximates the floating point number.\n */\nexport function rationalApproximation(n: number): Rat {\n let m0 = 1n,\n m1 = 0n,\n m2 = 0n,\n m3 = 1n\n const r = new Rat(1n)\n for (let i = 0; i < MAX_LOOPS; i++) {\n if (r.approximates(n)) break\n if (+r > n) {\n m0 += m1\n m2 += m3\n } else {\n m1 += m0\n m3 += m2\n }\n r.n = m0 + m1\n r.d = m2 + m3\n }\n return r\n}\n\n/**\n * Yield false for each left and true for each right.\n */\nexport function* pathToValue(n: number): Generator<boolean> {\n let m0 = 1n,\n m1 = 0n,\n m2 = 0n,\n m3 = 1n\n const r = new Rat(1n)\n for (let i = 0; i < MAX_LOOPS; i++) {\n if (r.approximates(n)) break\n const direction = n > +r\n yield direction\n if (!direction) {\n m0 += m1\n m2 += m3\n } else {\n m1 += m0\n m3 += m2\n }\n r.n = m0 + m1\n r.d = m2 + m3\n }\n}\n\n/**\n * Yield the values of the continued fraction, ie. the length of runs left/right.\n */\nexport function* continuedFraction(n: number): Generator<number> {\n let last = true\n let run = 0\n for (const direction of pathToValue(n)) {\n if (direction === last) {\n run++\n } else {\n yield run\n run = 1\n last = direction\n }\n }\n yield run + 1\n}\n","/**\n * Machine epsilon gives an upper bound on the relative error due to rounding in floating point arithmetic.\n */\nexport const EPSILON = 1e-16\n// @todo why not Number.EPSILON?\n\n/**\n * Limit on the number of loops in algorithms.\n */\nexport const MAX_LOOPS = 512\n","import { EPSILON } from './config'\nimport { gcd, primeFactors } from './bigint'\nimport { rationalApproximation, continuedFraction } from './SternBrocotTree'\n\n/**\n * @class Rational Number\n * @name Rat\n */\nexport class Rat {\n n: bigint\n d: bigint\n\n /**\n * Initialize a rational number.\n */\n constructor(\n numerator: bigint | number = 0n,\n denominator: bigint | number = 1n,\n ) {\n this.n = BigInt(numerator)\n this.d = BigInt(denominator)\n this.normalize()\n }\n\n /**\n * The decimal approximation.\n */\n valueOf(): number {\n return Number(this.n) / Number(this.d)\n }\n\n /**\n * The text representation.\n */\n toString(): string {\n return this.n.toString() + (this.d === 1n ? '' : `/${ this.d.toString()}`)\n }\n\n /**\n * Returns a text profile of the number in various formats and it's value after common transformations.\n */\n public get profile(): string {\n const p = [`Rat: ${this.toString()} (≈${+this})`]\n p.push(`Mixed: ${this.mixedFractionString()}`)\n p.push(`Continued: ${this.continuedFractionString()}`)\n p.push(`Factorization: ${this.primeFactorizationString()}`)\n p.push(`Egyptian: ${this.egyptianFractionString()}`)\n p.push(`Babylonian: ${this.babylonianFractionString()}`)\n p.push(`psin(t): ${this.psin().toString()}`)\n p.push(`pcos(t): ${this.pcos().toString()}`)\n p.push(`ptan(t): ${this.ptan().toString()}`)\n return p.join('\\n')\n }\n\n /**\n * Clone this.\n */\n clone(): Rat {\n return new Rat(this.n, this.d)\n }\n\n /**\n * Normalize the numerator and denominator by factoring out the common denominators.\n */\n normalize(): void {\n // normalize 0/±1, ±1/0, 0/0\n if (this.n === 0n) {\n if (this.d !== 0n) {\n this.d = 1n\n }\n return\n }\n if (this.d === 0n) {\n this.n = this.n > 0n ? 1n : -1n\n return\n }\n\n // normalize 1/1\n if (this.n === this.d) {\n this.n = this.d = 1n\n return\n }\n\n // remove negative denominator\n if (this.d < 0n) {\n this.n = -this.n\n this.d = -this.d\n }\n\n // reduce numerator and denomitator by the greatest common divisor\n const divisor = gcd(this.n, this.d)\n this.n /= divisor\n this.d /= divisor\n }\n\n /**\n * Add this to that.\n */\n add(that: Rat): Rat {\n const r = new Rat(this.n * that.d + that.n * this.d, this.d * that.d)\n r.normalize()\n return r\n }\n\n /**\n * Subtract this from that.\n */\n sub(that: Rat): Rat {\n return this.add(that.neg())\n }\n\n /**\n * Multiply that by this.\n */\n mul(that: Rat): Rat {\n const r = new Rat(this.n * that.n, this.d * that.d)\n r.normalize()\n return r\n }\n\n /**\n * Divide this by that.\n */\n div(that: Rat): Rat {\n const r = new Rat(this.n * that.d, this.d * that.n)\n r.normalize()\n return r\n }\n\n /**\n * Mediant of this and that.\n */\n mediant(that: Rat): Rat {\n const r = new Rat(this.n + that.n, this.d + that.d)\n r.normalize()\n return r\n }\n\n /**\n * Minimum of this and that.\n */\n min(that: Rat): Rat {\n return this.isLessThan(that) ? this : that\n }\n\n /**\n * Maximum of this and that.\n */\n max(that: Rat): Rat {\n return this.isGreaterThan(that) ? this : that\n }\n\n /**\n * Raise this to the power of that.\n */\n pow(that: Rat): Rat {\n // zero\n if (that.n === 0n) {\n return new Rat(1n)\n }\n // integer\n if (that.d === 1n) {\n return new Rat(Number(this.n) ** Number(that.n), Number(this.d) ** Number(that.n))\n }\n // fraction\n const estimate = Math.pow(+this, +that)\n return floatToRat(estimate)\n }\n\n /**\n * Returns the dot product of this and that.\n */\n dot(that: Rat): bigint {\n return this.n * that.n + this.d * that.d\n }\n\n /**\n * Returns true if this equals that.\n */\n equals(that: Rat): boolean {\n return this.n === that.n && this.d === that.d\n }\n\n /**\n * Returns true if this approximates the number.\n */\n approximates(n: number): boolean {\n return Math.abs(+this - n) < EPSILON\n }\n\n /**\n * Returns true if this is greater than that.\n */\n isGreaterThan(that: Rat): boolean {\n return this.n * that.d > that.n * this.d\n }\n\n /**\n * Returns true if this is less than that.\n */\n isLessThan(that: Rat): boolean {\n return this.n * that.d < that.n * this.d\n }\n\n /**\n * Absolute value of this.\n */\n abs(): Rat {\n const r = this.clone()\n if (r.n < 0) r.n = -r.n\n return r\n }\n\n /**\n * Opposite (negative) of this.\n */\n neg(): Rat {\n const r = this.clone()\n r.n = -r.n\n return r\n }\n\n /**\n * Returns true if this is less than zero.\n */\n isNegative(): boolean {\n return this.n < 0\n }\n\n /**\n * Returns true if this is a finite number.\n */\n isFinite(): boolean {\n return this.d !== 0n\n }\n\n /**\n * The reciprocal, or multiplicative inverse, of this.\n */\n inv(): Rat {\n return new Rat(this.d, this.n)\n }\n\n /**\n * Square root of this.\n */\n sqrt(): Rat {\n return this.root(2)\n }\n\n /**\n * Returns the nth root, a number which approximates this when multiplied by itself n times.\n */\n root(n: number): Rat {\n // Handle 0/±1, ±1/0, 0/0, ±1/1\n if (this.n === 0n || this.d === 0n || this.n === this.d) {\n return this.clone()\n }\n\n if (this.isNegative()) {\n throw `Roots of negative numbers like ${this.toString()} are too complex for this basic library`\n }\n\n return floatToRat(Math.pow(+this, 1 / n))\n // return functionToRat(r => r.pow(n), +this)\n }\n\n /**\n * Return the closest integer approximation.\n */\n round(): bigint {\n return BigInt(Math.round(+this))\n }\n\n /**\n * Returns the largest integer equal to or smaller than.\n */\n floor(): bigint {\n return BigInt(Math.floor(+this))\n }\n\n /**\n * Returns the smallest integer equal to or greater than.\n */\n ceil(): bigint {\n return BigInt(Math.ceil(+this))\n }\n\n /**\n * Parametric sine: 2t / (1 + t²)\n * @see https://youtu.be/Ui8OvmzDn7o?t=245\n */\n psin(): Rat {\n if (this.d === 0n) return new Rat(0n)\n const one = new Rat(1)\n const two = new Rat(2)\n const n = two.mul(this)\n const d = one.add(this.pow(two))\n return n.div(d)\n }\n\n /**\n * Parametric cosine: (1 - t²) / (1 + t²)\n */\n pcos(): Rat {\n if (this.d === 0n) return new Rat(-1n)\n const one = new Rat(1)\n const two = new Rat(2)\n const t2 = this.pow(two)\n const n = one.sub(t2)\n const d = one.add(t2)\n return n.div(d)\n }\n\n /**\n * Parametric tangent: psin() / pcos()\n */\n ptan(): Rat {\n return this.psin().div(this.pcos())\n }\n\n /**\n * Mixed fraction as a string.\n */\n mixedFractionString(): string {\n const integerPart = this.isNegative() ? this.ceil() : this.floor()\n const fractionPart = this.sub(new Rat(integerPart)).toString()\n return integerPart ? `${integerPart} + ${fractionPart}` : fractionPart\n }\n\n /**\n * Returns the integers representing the continued fraction.\n */\n *continuedFraction(): Generator<number> {\n if (this.n === 0n || this.d === 0n) {\n yield +this\n } else {\n for (const n of continuedFraction(+this)) {\n yield n\n }\n }\n }\n\n /**\n * Continued fraction as a string.\n */\n continuedFractionString(): string {\n const a: string[] = []\n for (const r of this.continuedFraction()) {\n a.push(r.toString())\n }\n const n = a.shift()\n if (n !== undefined && this.d !== 0n) {\n let s = n.toString()\n if (a.length) {\n s += `; ${ a.join(', ')}`\n }\n return `[${s}]`\n }\n return '[]'\n }\n\n /**\n * Returns an array of the prime factors with their exponents.\n */\n primeFactorization(): Array<[bigint, bigint]> {\n const f: Array<[bigint, bigint]> = []\n if (this.n !== 1n) {\n f.push(...primeFactors(this.n))\n }\n if (this.d !== 1n) {\n f.push(\n ...primeFactors(this.d).map((f) => {\n f[1] = -f[1]\n return f\n }),\n )\n }\n return f.sort((a, b) => {\n return Number(a[0] - b[0])\n })\n }\n\n /**\n * Prime factorization as a calc string.\n */\n primeFactorizationString(): string {\n const a: string[] = []\n for (const p of this.primeFactorization()) {\n a.push(p[1] === 1n ? p[0].toString() : `${p[0]}^${p[1]}`)\n }\n return a.join(' * ')\n }\n\n /**\n * A list of unit fractions which add up to this number.\n */\n egyptianFraction(): Array<Rat> {\n const r: Rat[] = []\n const f = new Rat(1n)\n let t = this.clone()\n\n // start with the integer part if non-zero\n const integerPart = this.floor()\n if (integerPart) {\n const integerRat = new Rat(integerPart)\n r.push(integerRat)\n t = t.sub(integerRat)\n }\n\n if (t.n === 0n) {\n return r\n }\n\n // increment the denominator of f, substracting it from t when bigger, until t has a numerator of 1\n while (t.n !== 1n) {\n f.d++\n if (t.isGreaterThan(f)) {\n r.push(f.clone())\n t = t.sub(f)\n }\n }\n\n // include the final t\n r.push(t)\n\n return r\n }\n\n /**\n * Egyptian fraction as a calc string.\n */\n egyptianFractionString(): string {\n return this.egyptianFraction().join(' + ')\n }\n\n /**\n * A dictionary with the exponents of 60 and their coefficents, which add up to this number.\n */\n babylonianFraction(): Array<string> {\n const a: string[] = []\n let n = Number(this.floor())\n let r = Math.abs(+this - n)\n let d = 0\n // consume increasing powers until the integer part is divided\n for (let p = 0; n > 0; p++) {\n d = n % 60\n if (d !== 0) {\n a.unshift(`${d} * 60^${p}`)\n }\n n = (n - d) / 60\n }\n // consume decreasing powers until the remainder is accumulated\n // @todo use a more precise calculation to get rid of this abhorrent epsilon\n for (let p = -1; r > 1e-10; p--) {\n r *= 60\n d = Math.floor(r)\n r -= d\n if (d !== 0) {\n a.push(`${d} * 60^${p}`)\n }\n n = (n - d) / 60\n }\n return a\n }\n\n /**\n * Babylonian fraction as a calc string.\n */\n babylonianFractionString(): string {\n const a: string[] = []\n const f = this.babylonianFraction()\n for (const i of f) {\n a.push(`${i}`)\n }\n return a.join(' + ')\n }\n}\n\n/**\n * Find a Rat approximation of the floating point number.\n */\nexport const floatToRat = (n: number): Rat => {\n // Handle special values: 0/0, 1/0, -1/0\n if (isNaN(n)) return new Rat(0, 0)\n if (n === Infinity) return new Rat(1, 0)\n if (n === -Infinity) return new Rat(-1, 0)\n\n // Shortcut for numbers close to an integer or 1/integer\n if (Math.abs(n % 1) < EPSILON) return new Rat(Math.round(n))\n if (Math.abs((1 / n) % 1) < EPSILON) return new Rat(1, Math.round(1 / n))\n\n // Traverse the Stern–Brocot tree until a good approximation is found\n // If negative, search for the positive value and negate the result\n const negative = n < 1\n const r = rationalApproximation(Math.abs(n))\n return negative ? r.neg() : r\n}\n\n/**\n * Parse the string for a numeric value and return it as a Rat.\n */\nexport const parseRat = (s: string): Rat => {\n // Handle special values: 0/0, 1/0, -1/0\n if (s === 'NaN') return new Rat(0, 0)\n if (s === 'Infinity') return new Rat(1, 0)\n if (s === '-Infinity') return new Rat(-1, 0)\n\n const [n, d] = s.split('/', 2)\n if (d === undefined) {\n return floatToRat(Number(n))\n }\n return new Rat(BigInt(n ?? 1), BigInt(d))\n}\n\n/**\n * Pi, an approximation of the ratio between a circle's circumference and it's diameter.\n */\n// export const π = new Rat(3141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825342117067982148086513282306647093844609550582231725359408128481117450284102701938521105559644622948954930381964428810975665933446128475648233786783165271201909145648566923460348610454326648213393607260249141273724587n, 1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000n)\n\nexport default Rat\n","/**\n * @class Symbolizer\n * @name Symbolizer\n */\nexport class Symbolizer {\n symbols: string[] = []\n\n /**\n * Initialize a symbolizer.\n */\n constructor(symbols?: string) {\n if (symbols) this.symbols = symbols.split('')\n }\n\n /**\n * Symbol generator.\n */\n *generator(): Generator<string> {\n for (let i = 0; ; i++) {\n if (i < this.symbols.length) {\n yield this.symbols[i] ?? '?'\n } else {\n yield String.fromCharCode(945 + i - this.symbols.length)\n }\n }\n }\n}\n\nexport default Symbolizer\n","import { Rat } from './Rat'\nimport Symbolizer from './Symbolizer'\n\nexport interface Coefficents {\n [Key: string]: bigint\n}\n\n/**\n * @class Rational polynumber\n * @name Polyrat\n */\nexport class Polyrat {\n // coefficent values are indexed with their the exponents in each dimension, comma-separated, as the key\n coefficents: Coefficents = {}\n\n // the dimension is how many params there are, defined by the length of the exponent keys\n dimension = 0\n\n // unique symbols for each dimension\n latinSymbols = ''\n greekSymbols = ''\n\n /**\n * Initialize a rational polynumber.\n */\n constructor(coefficents?: Coefficents) {\n if (coefficents) {\n this.coefficents = coefficents\n }\n if (Object.keys(this.coefficents).length) {\n const ck = Object.keys(this.coefficents)\n this.dimension = ck[0] ? ck[0].split(',').length : 0\n }\n const lsg = new Symbolizer('xyzw').generator()\n for (let i = 0; i < this.dimension; i++) {\n this.latinSymbols += lsg.next().value\n }\n const gsg = new Symbolizer().generator()\n for (let i = 0; i < this.dimension; i++) {\n this.greekSymbols += gsg.next().value\n }\n }\n\n /**\n * Evaluate the result given the parameters for each dimension.\n */\n evaluate(parameters: Rat[]): Rat {\n let result: Rat = new Rat()\n for (const [exponents, coefficent] of Object.entries(this.coefficents)) {\n let value: Rat = new Rat(coefficent)\n const dimensions = exponents.split(',')\n for (let i = 0; i < dimensions.length; i++) {\n if (i in parameters) {\n const base = parameters[i] ?? new Rat(1)\n const dimension = parseInt(dimensions[i] ?? '1', 10)\n value = value.mul(base.pow(new Rat(dimension)))\n }\n }\n result = result.add(value)\n }\n return result\n }\n\n /**s\n * The text representation.\n */\n toString(): string {\n return `${this.constructor.name}(${this.toJSON()})`\n }\n\n /**\n * The JSON representation.\n */\n toJSON(): string {\n // return JSON.stringify(this.coefficents)\n const r = []\n for (const [exponents, coefficent] of Object.entries(this.coefficents)) {\n r.push(`\"${exponents}\":\"${coefficent.toString()}\"`)\n }\n return `{${r.join(',')}}`\n }\n\n /**\n * The formula in the human way with exponents as HTML sups.\n */\n toHTMLFormula(): string {\n const r: string[] = []\n for (const [exponents, coefficent] of Object.entries(this.coefficents)) {\n const t: string[] = []\n const f = coefficent.toString()\n if (f !== '1') t.push(f)\n const dimensions = exponents.split(',')\n for (let i = 0; i < dimensions.length; i++) {\n if (dimensions[i] !== '0') {\n if (dimensions[i] === '1') {\n t.push(this.latinSymbols[i] ?? '?')\n } else {\n t.push(\n `${this.latinSymbols[i] ?? '?'}<sup>${parseInt(\n dimensions[i] ?? '?',\n 10,\n )}</sup>`,\n )\n }\n }\n }\n if (t) r.push(t.join(''))\n }\n if (r.length === 0) return '0'\n return r.join(' + ')\n }\n\n /**\n * The formula in the standard alpha form as HTML.\n */\n toStandardAlphaFormHTML(): string {\n const rn: string[] = []\n const rd: string[] = []\n if (!Object.keys(this.coefficents).length) return '0'\n for (const [exponents, coefficent] of Object.entries(this.coefficents)) {\n const tn: string[] = []\n const td: string[] = []\n const f = coefficent.toString()\n if (f !== '1') tn.push(f)\n const dimensions = exponents.split(',')\n for (let i = 0; i < dimensions.length; i++) {\n if (dimensions[i] !== '0') {\n if (dimensions[i] === '1') {\n tn.push(this.greekSymbols[i] ?? '?')\n } else {\n const exponent = parseInt(dimensions[i] ?? '0', 10)\n if (exponent > 0) {\n tn.push(`${this.greekSymbols[i] ?? '?'}<sup>${exponent}</sup>`)\n } else if (exponent === -1) {\n td.push(this.greekSymbols[i] ?? '?')\n } else {\n td.push(`${this.greekSymbols[i] ?? '?'}<sup>${-exponent}</sup>`)\n }\n }\n }\n }\n if (tn.length) rn.push(tn.join(''))\n if (td.length) rd.push(td.join(''))\n }\n if (rn.length === 0) rn.push('1')\n if (rd.length === 0) return rn.join(' + ')\n return `${rn.join(' + ') } / ${ rd.join(' + ')}`\n }\n\n /**\n * The \"calc\" code for evaluating the value.\n */\n toCalcFormula(): string {\n const r: string[] = []\n for (const [exponents, coefficent] of Object.entries(this.coefficents)) {\n const t: string[] = []\n const f = coefficent.toString()\n if (f !== '1') t.push(f)\n const dimensions = exponents.split(',')\n for (let i = 0; i < dimensions.length; i++) {\n if (dimensions[i] !== '0') {\n if (dimensions[i] === '1') {\n t.push(this.latinSymbols[i] ?? '?')\n } else {\n t.push(\n `${this.latinSymbols[i] ?? '?'}^${parseInt(\n dimensions[i] ?? '0',\n 10,\n )}`,\n )\n }\n }\n }\n if (t.length) r.push(t.join('*'))\n }\n if (r.length === 0) return '0'\n return r.join(' + ')\n }\n\n /**\n * The GLSL code for evaluating the value.\n */\n toGLSLFormula(): string {\n const r: string[] = []\n for (const [exponents, coefficent] of Object.entries(this.coefficents)) {\n const t: string[] = []\n const f = coefficent.toString()\n if (f !== '1') t.push(`${f }.0`)\n const dimensions = exponents.split(',')\n for (let i = 0; i < dimensions.length; i++) {\n if (dimensions[i] !== '0') {\n let exponent = parseInt(dimensions[i] ?? '0', 10)\n const recipricol = exponent < 0\n // pow doesn't work for < 0\n // t.push(`pow(${this.symbols[i]},${exponent}.0)`)\n // muliply instead\n if (recipricol) {\n t.push('1.0/(1.0')\n exponent = -exponent\n }\n t.push(\n (this.latinSymbols[i] ?? '?').repeat(exponent).split('').join('*'),\n )\n if (recipricol) {\n t.push('1.0)')\n }\n }\n }\n if (t.length) r.push(t.join('*'))\n }\n if (r.length === 0) return '0.0'\n return r.join('+')\n }\n\n /**\n * Clone this.\n */\n clone(): Polyrat {\n return new Polyrat(this.coefficents)\n }\n}\n\n/**\n * Parse the string and return it as a Polyrat.\n */\nexport const stringToPolyrat = (s: string): Polyrat => {\n return new Polyrat(JSON.parse(s) as Coefficents)\n}\n\nexport default Polyrat\n","import VERSION from './version'\nimport Lexer from './Lexer'\nimport Parser from './Parser'\n\nclass cnum {\n static get version(): string {\n return VERSION\n }\n static evaluate(expression: string): string {\n const lexer = new Lexer(expression)\n const parser = new Parser(lexer.lex())\n return parser.toString()\n }\n}\n\nexport default cnum\nexport { Rat, floatToRat, parseRat } from './Rat'\nexport { Polyrat } from './Polyrat'\n"],"names":["Token","type","s","this","prototype","toString","Lexer","input","lex","onSpace","onInteger","onWord","onOperator","buffer","i","length","_context","next","char","_this$s$i","exec","abrupt","OPERATORS","stop","Parser","tokens","identifiers","evaluate","_step","n","_iterator","_createForOfIteratorHelperLoose","done","x","_this$identifiers$x$s","BigInt","_proto","primes","isPrime","_regeneratorRuntime","wrap","prev","_marked","primeFactors","f","p","value","e","push","pathToValue","continuedFraction","m0","m1","m2","m3","r","direction","Rat","approximates","d","last","run","_context2","_marked2","numerator","denominator","normalize","valueOf","Number","clone","divisor","a","b","t","gcd","add","that","sub","neg","mul","div","mediant","min","isLessThan","max","isGreaterThan","pow","Math","estimate","floatToRat","dot","equals","abs","isNegative","isFinite","inv","sqrt","root","round","floor","ceil","psin","one","two","pcos","t2","ptan","mixedFractionString","integerPart","fractionPart","mark","continuedFractionString","_step2","_iterator2","shift","undefined","join","primeFactorization","apply","map","sort","primeFactorizationString","_step3","_iterator3","egyptianFraction","integerRat","egyptianFractionString","babylonianFraction","unshift","babylonianFractionString","_step4","_iterator4","_createClass","key","get","isNaN","Infinity","negative","rationalApproximation","Symbolizer","symbols","split","generator","_this$symbols$i","fromCharCode","Polyrat","coefficents","dimension","latinSymbols","greekSymbols","Object","keys","ck","lsg","gsg","parameters","result","entries","_i2","_Object$entries","_Object$entries$_i","exponents","coefficent","dimensions","_parameters$i","_dimensions$i","base","parseInt","constructor","name","toJSON","_i3","_Object$entries2","_Object$entries2$_i","toHTMLFormula","_i4","_Object$entries3","_Object$entries3$_i","_this$latinSymbols$i","_this$latinSymbols$i2","_dimensions$i2","toStandardAlphaFormHTML","rn","rd","_Object$entries4$_i","_Object$entries4","_i5","tn","td","_this$greekSymbols$i","_this$greekSymbols$i2","exponent","_this$greekSymbols$i3","_this$greekSymbols$i4","toCalcFormula","_i6","_Object$entries5","_this$latinSymbols$i3","_this$latinSymbols$i4","_dimensions$i4","toGLSLFormula","_i7","_Object$entries6","_dimensions$i5","_this$latinSymbols$i5","recipricol","repeat","expression","lexer","cnum","_s$split","JSON","parse"],"mappings":"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"}