Latexium
答えだけでなく、「どう解いたか」を返す数式エンジン。
LaTeX数式を解析・変形するTypeScriptライブラリ。
ひとことで言うと
Latexium は、(x+1)(x+2) のようなLaTeX数式の文字列を抽象構文木(AST)へ解析し、その上で展開・因数分解・評価を行うTypeScriptライブラリです。
最大の特徴は、計算過程を steps 配列として返すこと。多くの数式処理系が「答え」だけを返すのに対し、Latexiumは「どういう手順でその答えに至ったか」を構造化して吐き出します。デバッグにも、教育用途にも、計算の検証にも使える設計です。
import { parseLatex, analyze } from "latexium";
const ast = parseLatex("(x+1)(x+2)").ast;
const result = analyze(ast, { task: "distribute" });
result.value; // "x^2 + 3x + 2"
result.steps; // ["Expand: (x+1)(x+2)", "Step 1: x*(x+2) = x^2 + 2x", ...]
なぜ「過程」にこだわるのか
数式処理系をブラックボックスとして使うと、出てきた答えが正しいかは「信じる」しかありません。けれど学習の場面でも、自分の実装を検証する場面でも、本当に欲しいのは**「なぜその答えになるのか」**です。
Latexiumの steps は、その問いに答えます。因数分解なら、共通因数の抽出、パターン認識による二次式の分解、部分式への再帰的な適用 — その一段一段が、入れ子構造のログとして残ります。
"steps": [
"Starting factorization of: x^{2} + 2x - 3",
"PatternRecognitionStrategy: Applied pattern 'quadratic-factorization'.",
"✓ Applied pattern-recognition: (x - 1)(x + 3)",
"Final factored form: x(x - 1)(x + 3)"
]
これは、[[fluxa-webcp]] が「コードの実行過程を見せる」ことに賭けたのと同じ思想です。結果ではなく過程を観測可能にする — 私のツールに通底するテーマのひとつです。
何ができるのか
analyze(ast, { task }) で、現在サポートするタスク:
distribute— 積や累乗を展開((x+1)(x+2)→x^2 + 3x + 2)factor— 多項式の因数分解。パターン認識に加え、LLL・Berlekamp-Zassenhaus といった本格的な因数分解アルゴリズムの実装に取り組み中evaluate— 数値評価(2^3 + 1→9)
すべてのタスクが value(結果)と steps(過程)を返し、完全なTypeScript型定義を備えます。
開発中であることを隠さない: 微分・積分・極限(
\lim)・階乗簡約などは未対応で開発中。LLL/BZ因数分解も現状は完全には機能しません。tests/master.test.mjsに実際に通るケースを正直に記載しています。「できること」と「まだできないこと」の境界を明示するのは、ライブラリ作者の誠実さだと考えています。
技術的な裏側
- 言語 — TypeScript。LaTeX文字列 → AST → 解析、という一方向のパイプライン
- パーサ —
parseLatex(expression)がLaTeX数式をASTへ変換。x^{3} + 2x^{2} - 3xのような記法を構造として扱う - 因数分解戦略 — パターン認識(quadratic-factorization 等)を第一手とし、共通因数抽出・部分式への再帰適用を組み合わせる戦略パターン構成
- step出力 — 各変形を入れ子配列としてログ化。
overlapSimplifyのような統合簡約パスが、内部で何をしたかを階層的に記録 - 配布 —
npm install latexiumで利用可能。テストはtests/master.test.mjsにエッジケースを含めて集約
なぜ作ったか
数式を「計算するもの」ではなく「変形の過程を観測するもの」として扱いたい、という動機から始めました。とくに因数分解のような問題は、答えよりも**「どの戦略がなぜ効いたか」**の方が学びとして価値があります。
同時にこれは、LLLやBerlekamp-Zassenhausといった、計算機代数の古典的アルゴリズムを自分の手で実装するという、低レイヤ・アルゴリズムへの視野を広げる試みでもあります。フロントエンドの抽象化の外側にある「数学そのものの計算手続き」を、逃げずに実装し切ることを目指しているプロジェクトです。
リンク
数式の答えは一行。でも、過程には全部が書いてある。
MIT License
