コンテンツにスキップ

この教材について

このページは、各章で見た数学とPythonの仕組みを、実ファイル単位で 見直すための索引です。基本構文ではなく、ライブラリの意味を支える データモデルとメタプログラミングも教材の対象に含めます。

教材の目的

このサイトは、数を完成品として使うだけでなく、 「数学上の定義を、どのデータ表現とメソッドで実行可能にするか」を 公開されたPythonコードで読み解く教材です。

扱う順番は次のとおりです。

  1. 0から自然数を作る
  2. 自然数の組から整数を作る
  3. 整数の組から有理数を作る
  4. 有理数を係数に持つ多項式を作る
  5. 多項式の根を含む区間を狭める

各章は、数学上の定義、データの表し方、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 から始めます。

  1. peano/utils.py
  2. peano/natural_number.py
  3. peano/integer.py
  4. peano/rational.py
  5. peano/polynomial.py
  6. peano/algebraic_root.py

対応する検証は、同じリポジトリの tests/ にあります。教材中の短いテスト断片は、ここにある実テストから抜き出しています。

ローカルで教材サイトを起動する手順も、開発者向けです。

uv sync
make docs-serve

uv sync は必要な開発道具をそろえ、make docs-serve は教材を組み立てて ローカルのプレビューを開始します。