この教材について¶
このページは、各章で見た数学とPythonの仕組みを、実ファイル単位で 見直すための索引です。基本構文ではなく、ライブラリの意味を支える データモデルとメタプログラミングも教材の対象に含めます。
教材の目的¶
このサイトは、数を完成品として使うだけでなく、 「数学上の定義を、どのデータ表現とメソッドで実行可能にするか」を 公開されたPythonコードで読み解く教材です。
扱う順番は次のとおりです。
- 0から自然数を作る
- 自然数の組から整数を作る
- 整数の組から有理数を作る
- 有理数を係数に持つ多項式を作る
- 多項式の根を含む区間を狭める
各章は、数学上の定義、データの表し方、Pythonでの実装、実行結果、 テスト、この実装で扱う範囲の順に進みます。 ログを眺めて理解したことにせず、ログの各部分を実装へ戻して説明できることを 学習の到達点にしています。 必要な実装は各章内へ抜粋し、完全なソースとテストは 実装リファレンスから参照できます。
実際のコードは
pythonic-peano-arithmetic
として公開しています。
章と実装の対応¶
教材で扱う中心的な規則と、実ファイルの対応です。章を読み終えたあと、 同じ名前をソースコードとテストで探せます。
| 章 | 保存するもの | 中心となる実装 | 主な検証 |
|---|---|---|---|
| 自然数 | 一つ前の自然数 pre |
successor, structural_str, __eq__, __add__ |
0と後者、後者の単射性、加法の再帰式 |
| 整数 | 自然数の組 a, b |
__eq__, __add__, normalize |
同値な代表元、演算結果 |
| 有理数 | 整数の組 p, q |
__post_init__, __eq__, reduction |
分母0、交差積、約分 |
| 多項式 | 有理数係数の列 | __init__, evaluate, sturm_sequence |
正規化、代入、根数 |
| 代数的実根 | 多項式と有理区間 | __post_init__, _bisect, trace |
幅、符号、無効な区間 |
ここでいう「主な検証」は一般の場合の証明ではありません。実装が期待する性質を 具体的な入力で継続的に確かめ、変更による破損を検出するテストです。
メタプログラミングの対応表¶
このライブラリでは、Pythonの仕組みが単なる記述量の削減ではなく、 数学上の表現や公開APIの契約を担っています。
| Pythonの仕組み | 実ファイルでの使い方 | 数学・API上の役割 |
|---|---|---|
| 特殊メソッド | __add__, __eq__, __repr__ |
数式の演算、同値関係、構成の表示をPython構文へ接続 |
@dataclass |
各数体系のフィールドと、自動生成される__init__ |
数を構成する最小データを宣言 |
frozen, slots |
作成後の代入と未宣言属性を制限 | 表現を途中で変えない |
eq=False, repr=False |
自動生成を止めて手書き | 属性一致ではない等値関係と教材用表示を実装 |
init=False |
Polynomial.__init__ を手書き |
係数を正規化してから保存 |
__post_init__ |
型、分母、分離区間を検査 | 作成に成功した値の不変条件を保証 |
@property |
区間の幅・中点・一点判定 | 端点から導ける状態を重複保存しない |
@total_ordering |
核となる比較から残りを生成 | 比較規則の重複を避ける |
型をそろえる処理とNotImplemented |
下位の数を上位へ揃える | 混合演算の責務と未対応型を明示 |
@log と @wraps |
演算本体をラッパーで包む | 必要なときだけ説明文を作り、公開結果と関数のメタデータを保つ |
特に @log の元関数は (result, message_factory) を返しますが、利用者が呼ぶ
デコレータ適用後の関数は result だけを返します。@wraps で元関数への参照を保ち、
公開されるシグネチャの戻り型も result の型へ書き換えます。
ログが有効なときだけ説明文を作り、公開戻り値から分離するこの仕組みが、
自然数から有理数まで共通する実装パターンです。
ブラウザだけで動く仕組み¶
実行ボタンを押すと、教材のサーバーではなく、いま開いているブラウザの中で Pythonコードが動きます。そのために、次の道具を組み合わせています。
| 名前 | この教材での役割 |
|---|---|
| Zensical | 文章から、この章立てとWebページを作る |
| Pyodide | ブラウザの中でPythonを動かす |
| WebAssembly | ブラウザでさまざまな言語のプログラムを動かすための形式 |
| Web Worker | Pythonの計算を、画面を表示する仕事とは別に動かす |
| wheel | Pythonライブラリを配るためのファイル形式 |
ここでいう「ライブラリ」は、別のPythonコードから読み込んで使える道具の集まりです。
教材のコードに出てくる peano が、このサイト専用のライブラリ名です。
入力したコードと制限¶
実行セルへ入力したコードは、教材サイトのサーバーへ送信されず、 そのブラウザ内で処理されます。ただし、ブラウザのPython環境は、 自分のコンピューターへ直接インストールしたPythonと完全に同じではありません。
また、このライブラリは高速な数値計算を目的としていません。 小さな数で、数学の定義とコードの対応を一行ずつ見ることを優先しています。 教材セルではログを200件までに制限し、計算が5秒を超えた場合は Web Workerを停止します。 どちらも別の高速な計算規則へ切り替えるものではなく、入力を小さくして 同じ実装を読み直せる状態へ戻すための、教材画面上の制限です。
ライブラリの設計上の選択¶
教材では、数学上の定義と実装上の選択を区別して読みます。
| 選択 | 学習上の目的 |
|---|---|
| 数の値を作成後に変更できなくする | 一度作った数学的対象が途中で別の値にならないようにする |
+ や == を __add__、__eq__ に対応させる |
普通の数式と実装メソッドを結び付ける |
| 整数と有理数の入力表現を自動で正規化しない | 同じ数に複数の代表元があることを観察する |
| 多項式の末尾の0係数は取り除く | 同じ多項式の保存形式を一つにそろえる |
| 演算結果と遅延生成する説明文を分け、戻り時にログを記録する | 再帰のどの規則を通ったかを、不要な表示コストなしで検査できるようにする |
| 根の符号判定ではPythonの任意精度整数も使う | 構成の見通しを残しつつ、二分法を現実的な時間で動かす |
ログは数学的な証明でも、紙の式変形を上から再現したものでもありません。 実装の関数が戻るときに、適用した定義を記録する実装トレースです。 各章では、データ表現とメソッドを読んだあとにログを検証します。
ログレベルは、自然数1〜6、整数11〜16、有理数21〜26、多項式31、
根の二分41という範囲に分かれます。config_log の値は表示する最小レベルです。
したがって、値を上げると上位層だけに絞られ、下げると内部で再利用される
下位の演算も見えるようになります。数値は絞り込みのための内部情報なので、
通常のログ本文には表示しません。調査時だけ
fmt="Level %(levelno)s: %(message)s"を指定すると確認できます。
ソースコードを続けて読みたい方へ¶
教材を最後まで読んだあと、次の順番で実装を読むと、章立てと対応します。
デコレータの実体を先に確認したい場合は peano/utils.py から始めます。
peano/utils.pypeano/natural_number.pypeano/integer.pypeano/rational.pypeano/polynomial.pypeano/algebraic_root.py
対応する検証は、同じリポジトリの
tests/
にあります。教材中の短いテスト断片は、ここにある実テストから抜き出しています。
ローカルで教材サイトを起動する手順も、開発者向けです。
uv sync は必要な開発道具をそろえ、make docs-serve は教材を組み立てて
ローカルのプレビューを開始します。