私が開発している Makarov Math Suite から、いくつかのモジュールをご紹介します。条件を変え、動きを観察し、仕組みを考えることで、数学のアイデアを体験できるインタラクティブな実験集です。
ベジェ曲線とスプライン — 滑らかな線を操る
曲線上のすべての点を指定せずに、滑らかな形を描くにはどうすればよいでしょうか。文字のデザイン、自動車の形状、アニメーション、コンピューターグラフィックスで登場する問題です。その答えの一つがベジェ曲線です。少数の制御点だけで曲線全体を定められます。両端の点が始点と終点を決め、中間の点が曲がり方を導きます。ただし、曲線が中間の制御点を通る必要はありません。
このモジュールでは、曲線ができる過程を見ることができます。ド・カステリョのアルゴリズムは、線分上に点を取り、その点同士を新しい線分で結びます。これを繰り返して最後に残る一点が、曲線上の点です。一つのパラメーターを変えると、その点が移動して曲線を描きます。立体的な製図板の上で、計算が目に見える幾何学的な仕組みになります。
制御点を移動して、形がどう変わるか確かめてみてください。続いて三次Bスプラインに切り替えると、滑らかにつながる複数の区間から線ができていることが分かります。端に近い制御点を動かし、曲線の一部は変わっても、別の部分は形を保つことを確かめましょう。一つの曲がりを作る場合と、長い輪郭を部分ごとに調整する場合で、適した道具が違う理由を実感できます。
凸包 — 点の集まりを輪ゴムで囲む
板に何本もの釘を打ち、その全体を輪ゴムで囲んでみましょう。手を離すと、輪ゴムはいちばん外側の釘に沿って縮まります。この輪郭が凸包です。すべての点を含む、最小の凸な領域を表します。「凸」とは、領域内のどの二点を選んで線分で結んでも、その線分が外にはみ出さないという意味です。
人間には外側の輪郭がすぐ見えることもありますが、コンピューターには手順が必要です。ジャービスの行進法は、次の頂点を選びながら外周をたどります。グラハムスキャンは点を並べ、凸性を壊す曲がりを取り除きます。QuickHullは遠く離れた点を利用して問題を分割します。同じ輪郭に到達しても、向きを判定する回数はアルゴリズムによって異なります。
モジュールでは点が金属のピン、輪郭がそれらを囲む帯として表示されます。内側や外側に点を追加し、アルゴリズムを切り替えて、面積と判定回数を比べてみてください。内側の一点は輪郭を変えないことがありますが、外側の一点は境界の大きな部分を作り直します。座標の集まりから形を見つける、計算幾何学の基本的な考え方が見えてきます。
遺伝的アルゴリズム — 選択と偶然による探索
山頂がいくつもある地形で、最も高い場所を探すにはどうすればよいでしょうか。ただ上り坂を進むだけでは、近くの山頂に着いたところで止まり、もっと高い山を見逃すかもしれません。遺伝的アルゴリズムは、選択、遺伝、突然変異という考え方を借りて、多数の候補を使って答えを探します。
このモデルでは、一つの候補がビット列で表され、その位置での地形の高さが解の良さ、つまり適応度を示します。成績の良い候補ほど親に選ばれやすくなり、交叉によって親のビット列の一部が組み合わされます。突然変異は、個々のビットを確率的に変えます。画面上の小さな探検家たちが各世代の候補を表し、エリート保存を有効にすると、最良の候補が次世代に引き継がれます。
突然変異率を変え、最良の成績だけでなく集団の多様性にも注目してください。変化が少なすぎると、一つの山の近くに早く集まりすぎます。多すぎると、有望な組み合わせが壊れやすくなります。この方法は最高峰への到達を保証するものではありません。しかし、見つけた良い解を磨くことと、まだ知らない可能性を探ること、その両方が探索に必要だと教えてくれます。
蔵本モデルの同期 — ばらばらのリズムがそろうとき
ホタルがそろって光ったり、相互作用する振動系が互いのリズムに近づいたりすることがあります。指揮者がいないのに、なぜ全体の動きがそろうのでしょうか。蔵本モデルは、この問題の一面を取り出します。それぞれの振動子は固有の振動数と位相を持ち、ほかの振動子との相互作用によって位相の進む速さが変わります。
モジュールでは、四十個の振動子を光と円形の目盛り上を動く印で表しています。結合が弱いと、固有振動数の違いによって位相がばらけます。相互作用が十分に強くなると、まとまった動きが生まれることがあります。中央の針は秩序変数Rを示します。位相がほぼ一致すると一に近づき、位相を表す向きが互いに打ち消し合うと小さくなります。
結合を強くしてから、固有振動数のばらつきを広げてみてください。いつ光り方がそろい始め、その状態がどれほど保たれるでしょうか。平均的な進み方がそろっても、位相まで完全に一致するとは限りません。一定の位相差を保ちながら動くこともあります。単純化したモデルを通して、多数の個別の調整から共通のリズムが生まれる様子を観察できます。
ラングトンのアリ — 二つの規則から生まれる複雑さ
このアリには地図も目的地も、歩いてきた道の記憶もありません。古典的な設定では、白いマスなら右、黒いマスなら左へ向きを変えます。そしてマスの色を反転し、一歩進みます。これほど短い規則なのに、その足跡は驚くほど複雑な模様を作ります。
何も描かれていない格子から始めると、最初は小さな模様が現れ、やがて長い間、不規則に見える動きが続きます。その後、アリは「ハイウェイ」と呼ばれる道を作り始めます。百四ステップの動きが繰り返され、そのたびに模様が先へ伸びていくのです。繰り返すのは移動と道の作り方であり、成長する格子全体が元の状態に戻るわけではありません。これは古典的な空白の格子からの出発で知られる振る舞いで、どんな初期配置や規則でも同じになるとは限りません。
動きを加速したり、数千ステップ先へ進めたり、多色のマスに対応する左右の規則を変えたりしてみてください。小さくまとまる模様と、広がり続ける足跡を比べられます。単純な行動が環境を変え、その環境が次の行動を決める。この繰り返しだけで、豊かなパターンが生まれることを体験できます。
最小二乗法と過学習 — よく合う曲線が良いとは限らない
測定値が理想的な曲線の上にぴったり並ぶことは、ほとんどありません。データには雑音や偶然のずれが含まれます。最小二乗法は、曲線の値と観測値の差を二乗し、その合計が小さくなるように曲線を当てはめます。二乗することで誤差の符号が消えるだけでなく、大きなずれほど強く評価されます。
モジュールでは、データを点、当てはめた曲線とのずれをばねで表します。多項式の次数を上げるほど、曲線は複雑な形を取れます。しかし柔軟すぎる曲線は、偶然の雑音まで追いかけてしまいます。元のデータ点での誤差は小さくなるのに、本来の関係からは離れることがあります。これが過学習です。一つの標本の細部に合わせすぎて、その背後の仕組みをうまく表せなくなります。
この実験ではデータを作った元の関数が分かっているため、当てはめの誤差と、点と点の間も含めた元の関数からのずれを比較できます。雑音を増やし、一点を動かして外れ値を作り、リッジ正則化を試してみてください。大きな係数に罰則を加えることで、過剰な柔軟性を抑えます。最も入り組んだ曲線が最も役立つとは限らない理由が、目で見て分かります。
論理ゲート — 「はい」と「いいえ」から計算を作る
デジタル計算の出発点は、零と一という二つの値を扱う操作です。ANDは両方の入力が一のとき、ORは少なくとも一方が一のときに、一を出力します。排他的論理和XORは、二つの入力が異なるときに一になります。こうした単純な規則を組み合わせると、数を足したり情報を保存したりする装置が作れます。
モジュールでは、論理をスイッチ、配線、発光する出力を備えた卓上の基板として表しています。半加算器は二つのビットを足し、和のビットと桁上がりを出します。全加算器は、下の桁から来る桁上がりも受け取ります。これをつなぐと四ビットの加算器になり、筆算のように下位の桁から上位の桁へ繰り上がりが伝わります。
別のモードでは、一ビットの記憶を観察できます。クロックが立ち上がる瞬間に入力を取り込み、その後は入力が変わっても次の更新まで値を保ちます。入力を切り替え、組み合わせを試し、手動でクロックを進めてください。今の入力から答えを出す回路と、以前の状態を覚えている回路の違いが見えてきます。論理と記憶を組み合わせることが、デジタルの機械を支えています。
迷路の生成と探索 — 問題を作る方法、解く方法
迷路は通路の絵として見ることも、グラフとして見ることもできます。部屋を頂点、部屋同士を結ぶ通路を辺と考えると、出口探しは数学の問題になります。ただし、迷路を作ることと、その迷路を解くことは別の仕事で、それぞれに異なるアルゴリズムがあります。
モジュールでは、深さ優先法、プリム法、ウィルソン法を用いて、すべてのマスがつながり、閉路のない迷路を作ります。このような迷路では、どの二つのマスの間にも、同じ場所を繰り返し通らない経路が一つだけ存在します。それでも、通路や行き止まりの配置は生成方法によって変わります。立体の模型で、壁が開かれ、探索済みのマスが増え、経路が現れる過程を観察できます。
幅優先探索、A*、壁伝いの方法を比べてみましょう。幅優先探索は距離ごとに範囲を広げ、A*は目的地までの距離の見積もりも利用します。壁伝いの方法は、近くの壁に沿って進みます。目的地を変え、調べたマスの数や経路の長さを比較してください。最終的な経路が一つでも、それを見つけるための手間は同じとは限りません。答えと、答えを得る手順の違いが分かります。
群としてのルービックキューブ — 操作の順序を考える数学
ルービックキューブは、色をそろえるパズルとしてだけでなく、数学の対象としても楽しめます。一回の回転は要素の位置を入れ替える置換であり、回転を続けて行うと別の置換になります。これらの変換は群を作ります。操作を合成でき、何も変えない恒等変換があり、それぞれの変換には元に戻す逆変換があります。
面白いのは、操作の順序が結果に影響することです。右面を回してから上面を回すのと、上面を回してから右面を回すのとでは、一般に結果が異なります。R U R⁻¹ U⁻¹という交換子の列は、その違いを目に見える形にします。回転と逆回転が両方含まれていても、間に別の操作が入るため、必ずしも打ち消し合いません。
モジュールは回転をアニメーションで示し、置換のサイクルと、選んだ変換の位数を表示します。位数とは、その操作列全体を何回繰り返せば、追跡している各要素が元の位置に戻るかを表す数です。一面だけの回転、二面の組み合わせ、交換子を比べてみてください。色の付いた小さな正方形の背後に、計算して確かめられる精密な構造が見えてきます。
ナブラ演算子 — 場を読み解く四つの方法
地図上の各点に、高さや温度、流れの向きが与えられているとします。ある点の近くで何が起きているかを、どう表せばよいでしょうか。勾配は、スカラー量が最も速く増える向きを示します。発散はベクトル場の局所的な流出と流入の差を、回転は局所的な循環を表します。ラプラシアンは勾配の発散で、その点の値と、ごく近くの平均値との差に関係します。
モジュールでは、これらの考え方を起伏のある地形、矢印、動く粒子で示します。探針を移動し、その場所での値を比べてみてください。選んだモードに応じて、急な斜面、外へ広がる場、回る場を調べられます。立体表示は、平面上に定義された場の性質を読み取りやすくするためのものです。
表面に描かれた輪は、局所的な性質と領域全体の結果を結びます。閉じた境界を通る流束は、内部の発散の面積分と比較されます。境界に沿う循環は、内部の回転の面積分と比較されます。両側は独立に計算されます。領域の大きさや場の形を変え、数値誤差の範囲で結果が一致する様子を見てください。記号が、増加、湧き出し、回転、部分と全体の関係を語る言葉になります。
ハノイの塔 — 単純な規則と指数関数的な増加
三本の棒と、大きさの異なる円盤の塔があります。円盤を一枚ずつ動かし、大きい円盤を小さい円盤の上に置かずに、塔全体を別の棒へ移してください。規則は一文で説明できますが、必要な手数は驚くほど速く増えていきます。
最大の円盤を動かすには、その上の小さい円盤をすべて補助の棒へ移さなければなりません。最大の円盤を一回動かしたら、小さい塔をもう一度移します。つまり、一つの問題が、同じ形をした二つの小さな問題に分かれます。これが再帰です。必要な最小手数はT(n) = 2T(n − 1) + 1を満たし、2ⁿ − 1になります。円盤が三枚なら七手ですが、八枚では二百五十五手が必要です。
モジュールでは手動で円盤を動かすことも、自動の手順を眺めることもできます。自分の手数を最小値と比べ、まずは小さな塔の中に繰り返し現れる問題を探してください。その後で円盤を増やすと、規則は同じなのに作業が急に増えることを実感できます。アルゴリズムの説明が短いことと、実行に必要な操作が少ないことは、別の話なのです。