
2025/12/12 3:00
Show HN: I made a spreadsheet where formulas also update backwards
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
Bidicalc は、ユーザーが数式または結果のいずれかを編集できる双方向スプレッドシートです。片方が変更されると、ツールは自動的にもう一方を再計算し、関連するすべてのセルを整合性のある状態に保ちます。これを実現するために、カスタムルート探索ソルバーを使用して制約をシート全体に伝播させます。アルゴリズムは、区間算術(可能な値の範囲を追跡)、方向付きニュートン法(効率的に解へ収束)および二分探索(バイナリスプリット)を組み合わせて、数式が複雑であっても不定形でも目的の結果を見つけます。
このスプレッドシートは、変数・定数・テキストセル・数式セルなど標準的なセルタイプをサポートし、一般的な数学関数を含みます。TypeScript で実装され、勾配計算に TensorFlow.js を組み込んでおり、ブラウザのメインスレッド上で直接動作します。AGPL の下でオープンソースとして公開されています。
将来の計画では、変数範囲の制限(ドメイン制約)を追加し、複数解を持つシステムに対する精度を向上させ、64‑ビット浮動小数点勾配への切替え、重い処理を Web ワーカーへ移行してパフォーマンスを改善し、ユーザーインターフェイスを洗練させることが目標です。これらの拡張により、Bidicalc は既知のスプレッドシート形式で方程式を解くための強力なツールとなり、開発者が Web アプリケーションへ組み込むことを促し、オープンソースライセンスを通じてコミュニティからの貢献を歓迎します。
本文
Bidicalc – 双方向スプレッドシート
概要
式が「前方」だけでなく「逆向き」にも更新できるスプレッドシートです。
- 通常の表計算は入力が変わると出力を再計算します。
- Bidicalc は 逆方向ソルバー を追加し、式を評価した後に結果を変更すると、式が成立するように入力値を自動調整します。
仕組み
- 前方更新 – 入力セルを変えると依存関係のある式が自動で再計算されます(従来通り)。
- 逆方向更新 – 式を評価した後、表示値を編集するとソルバーが新しい結果になるように変数を探します。
この逆操作は根探索問題です:
F(x) = G を満たす x を求めます。
- F はセル式で定義される関数、G はユーザー入力の目標値です。
ソルバー
- 区間算術・方向付きニュートン法・二分探索を組み合わせた独自アルゴリズム。
- 連続(ほぼ全域)で定義され、構文式が既知ならどんな関数にも対応。
- TypeScript で実装し AGPL オープンソースです。
セルの種類
| 種類 | 構文 | 説明 |
|---|---|---|
| 変数 | | ソルバーが変更できる数値。 |
| 定数 | | 付きで、ソルバーは変更しません。 |
| テキスト | | ダブルクォートで囲む文字列モード。 |
| 式 | 任意に先頭に を付ける | 例:, 等 |
サポート関数
- 四則演算:
+ - * / ^ sqrt(x)
(べき乗)pow(a,b)
– π定数pi()abs(x)
/log(x)
– 自然対数ln(x)exp(x)- 三角関数:
,cos
,sintan
ユーザーインターフェース
| 操作 | ショートカット |
|---|---|
| グリッド移動 | |
| 下へ移動 | |
| 上へ移動 | |
| 右へ移動 | |
| 左へ移動 | |
式の結果ではなく式自体を編集したいときは F アイコンをクリックします。
ソルバーの挙動
- 成功 – 方程式を満たす値が見つかりました。
- 不正解 – バグです。GitHub で報告してください。
- 解なしと報告 – 根が見つからない場合があります。こちらも報告を。
- 予期せぬが正しい – 変数が多いときに頻繁に起こります(例:
)。a*b*c = 1
対策
- 一部の変数を定数 (
) にして自由度を減らす。#50 - 問題を再構築し、自由変数を少なくする。
- 将来リリースでドメイン制限を追加予定。
作者について
- Victor Poughon – 数学愛好家・オープンソース開発者。
- プロジェクト: Bidicalc (TypeScript, AGPL)。
- スポンサーやコーヒー寄付歓迎。
サポート / 貢献
- Issue、Pull Request、機能要望は GitHub リポジトリへ。
- 商用利用の場合は別ライセンスを希望する方は連絡ください。
双方向スプレッドシートで実験を楽しんでください! ❤️