2014-08-03

"連分数のふしぎ" 木村俊一 著

ピタゴラス教団は、整数では表せない数を忌み嫌い、隠蔽工作に走った。「万物は数である」を崇拝する者たちにとって、無理数は宇宙の理性に反する存在だったのである。自然数を分母と分子に配置する表記法に限界を感じるのは、現代人とて大して変わるまい。実際、あらゆるデジタルシステムは実数演算を近似値で誤魔化している。浮動小数点演算で答えが合わないと騒ぐ新人君を見かければ、IEEE754の意義を匂わせてやればいい。
ところが、だ!
ここに分数の底力を魅せつける一冊がある。連分数とやらを用いれば、無理数とて正体が暴けるというのだ。黄金比だろうが、超越数だろうが... はたまた、閏年も、12音階も、松ぼっくりも...
自然数、恐るべし!

連分数とは、分母の中に分数が含まれ、その分数の分母にさらに分数が含まれ... というように分数が階段状に連なったもの。こいつが本格的に活躍を始めたのは17世紀頃だが、古代ギリシア人はこれに近い思考法を知っていた。ユークリッドの互除法が、それだ。二つの数における最大公約数を求めるとは、約分しながら既約分数に迫ることであり、まさに連分数の発想である。もっともユークリッド原論では除算ではなく減算で示されるので、より厳密に言えば、互減法とするべきだという意見も耳にする。共通した線分の長さを除いていくという意味では、互除法でそれほど違和感はないけど。
それはさておき、問題は単純な操作の繰り返し回数にある。連分数における有理数と無理数の境界は、連なり方が有限か無限かだ。とはいえ、古代ギリシア人だって無限の連なり方を想像できなかったわけがなかろう。自然数が無限に連なることを数直線上で表せば、循環小数や循環連分数といったものも想像できそうなもの。幾何学表記の無限は神に崇められても、整数論表記の無限は悪魔とでもいうのか?神も、悪魔も、人間がこしらえた概念であることに違いはない。数が宗教の域に達すると、もう手に負えん...

ところで、平方根を語呂合わせで覚えたりする。一夜一夜に人見頃... 人並みにおごれや... 富士山麓オウム鳴く... 円周率は、30桁もあれば事足りる。産医師異国に向かう、産後厄なく産児、みやしろに虫さんさん闇に鳴く...
そういえば、この手の覚え歌で英語版をあまり聞かない。単語の文字数を割り当てる技は見かけるが、ゼロはどうするんだろう?なぁーに、心配はいらん。ゼロが登場するのは30桁より後ろだ。遥か果てにファインマン・ポイントという理性の配列があることを知らなくても、男性諸君のπ(オッパイ)好きは変わらんよ!

1. 初期値と周期性の原理
小数点以下を10進数で1から順に並べた数を、「チャンパーノウン数」と呼ぶそうな。

  0.1234567891011121314...

こうした規則性は連分数との相性の良さを予感させる。小数の循環パターンが見抜ければ、数値解析も容易となろう。問題となるのは、循環しないか、循環してもパターンが長すぎる場合だ。本書は、数の並びのパターンが見抜けなくても、連分数を用いれば数の正体が見抜ける可能性を匂わせてくれる。
数列の生成パターンで有名なものにフィボナッチ数列がある。最初の数を{1, 1}とし、{0, 1}でもええが、後は2つの数を足して次の数を作るということを繰り返す。

  {1, 1, 2, 3, 5, 8, 13, ...}

これに似たもので、「リュカ数列」というものがあるそうな。最初の数を{2, 1}とし、後の操作は同じ。

  {2, 1 ,3, 4 ,7, 11, 18, 29, ...}

このような数列の重要性は、初期値と繰り返される操作という二つで構成されるアルゴリズムの単純さにある。この事例では足し算されるが、引き算でも、剰余算でも、それこそどんな関数でもOK!思考原理は、等比数列や等差数列、はたまたユークリッドの互除法やニュートン法も同じだ。このような数列アルゴリズムは、デジタルシステムを設計する際の検証法において、システムの苦手とするパターン生成、ノイズ発生器、乱数生成などで重宝できる。分数は割り算であるが、具体的な処理では多項式に排他論理を組み合わせることで等価性が得られたりする。連分数は、ある種の循環アルゴリズムという見方はできそうである。
もしかしたら、あらゆる数は何らかの循環性に支配されているのかもしれない。フーリエ解析では、三角関数の直交性を利用して成分分解すれば、どんな数でも近似値を、それなりに得ることができる。フラクタル解析では、縮小拡大、回転、反転といった単純な幾何学操作によって、どんな図形にも相似パターンを、それなりに当てはめることができる。あらゆる物理現象は、初期値、境界条件と言ってもいいが、これと周期性で決定できそうな気がする。もしかしたら、素数の出現パターンにも周期性があるのかもしれん。しかも、初期値が変わるだけで、まったく様変わりするような... 実は、多様性の正体とは、初期値の違いだけなのかもしれん。これを社会では環境と呼んでいる...

2. 黄金比と松ぼっくり
縦横比が黄金比となる長方形が最も美しい図形という説があるが、それは本当だろうか?美とは、周辺との調和によって生じる概念であり、絶対的な概念ではあるまい。少なくとも、人間の感覚に絶対というものはない。正五角形が崇められるのは、辺と対角線の長さの関係が黄金比になるからであろうか。古来、五芒星に宗教的な意味が与えられてきた。真ん中に現れる正五角形に対角線を引けば、正五角形の無限地獄へ誘なう... という魂胆かはしらん。
さて、黄金比は、x2 - x - 1 = 0 の解である。x2 =  x + 1 ... つまり、2乗すると1増えるような数。もちろん、黄金比を2乗しても同じ結果が得られる。

  ( (1 + √5)/2 )2 = (1 + 2√5 + 5)/4 = 1 + (1 + √5)/2

フィボナッチ数が一際輝いているのは、隣り合う2項の比が黄金比に近づくことにある。松ぼっくりが、宇宙においてどんな役割を果たしているのかは知らん。ただ、松ぼっくりの鱗片にフィボナッチ数が現れれば、ここに宇宙法則を感じずにはいられない。葉っぱたちが複雑に混在すれば、平等に太陽の光を欲する。互いに重ならないように満遍なく太陽の光を浴びることができれば、究極の民主主義像が描ける。その答えが、フィボナッチ数なのか?
本書は、次のような配列シミュレーションををやってみせる。

まず、葉っぱの付け方は...
最初に、1本目の枝を右方向に出し、丸い葉を1枚つける。
次に、一定の角度θだけ回転した方向に枝を出し、2枚目の葉をつける。枝は1枚目より少し長めにする。
さらに、同じ角度θだけ回転した方向に枝を出し、3枚目の葉をつける。枝は2枚目よりさらに長めにする。
以下、繰り返し...

次に、長さのルールは...
円形の葉の半径を1とし、1枚目の葉の長さは1、2枚目の枝の長さは√2、3枚目は√3、4枚目は√4(= 2)...
回転角θは90度とし、螺旋を描く。

これを有理数回転で配置すると徐々に隙間ができていき、無理数回転で配置するとうまいこと隙間を埋めることができる。自然界は、無理数回転を要請しているのか?
「有理数による近似がもっとも悪い無理数は、黄金比である。もしかしたら植物はそのことを知っていて、黄金比回転で葉っぱや松ぼっくりの鱗片を配置しているので、植物の渦巻きの腕の本数にフィボナッチ数が出てくるのかもしれない。」

3. 12音階と53音階
1オクターブを12の半音に分けた音階理論は、ピタゴラスが構築したとされる。その正体を、本書は16世紀に考案された対数と連分数を組み合わせて解き明かそうとする。対数は、実に奇妙ながら便利な道具だ。なにしろ、掛け算の世界を足し算の世界に変えてくれるのだから。おかげで、指数関数的に増加する物理現象を比例関係で考察することができ、電気回路では利得の概念が単純化できる。
さて、人間の耳は対数耳になっているという。確かに、耳の周波数特性は、計算尺のように数字が大きいところで目盛の幅が詰まっている。人間が音程の違いを聞き取るのは、周波数の差ではなく周波数の比である。ピタゴラスはそのことに気づいていたことになる。そして、一弦琴で弦の長さと周波数の関係を示した。
「ピタゴラスが "簡単な整数比であらわされる2音がよく協和する" という原理から、ド : ソ = 2 : 3 という周波数比を繰り返し適用することでピタゴラス音律を作った。その後、より簡単な整数比を実現するように改良された純正律があらわれ、さらに転調しやすく改良された平均律があらわれた。」

12音階平均律とは、対数の世界で12等分するということ、すなわち、2の12乗根をとることである。


本書は、12音階平均律よりもっと美しくなりそうな53音階平均律を提示している。しかも、モーツァルトの父レオポルトが書いたバイオリンの教則本にも、これにピッタリ合う記述があるそうな!


4. 近似と精度
無理数を連分数で近似する場合、精度の見極めでは、程よい次数で連分数を打ち切ることになる。その次数は、偶数次において小さめの近似、奇数次において大きめの近似、この間を振動している。
「αの連分数近似として p/q という分数が出てきたら、その誤差、つまり |α - p/q| は、1/q2 以下である。... αが無理数であれば、|α - p/q| < 1/q2 を満たすような整数のペア {p, q} が無限組存在する。」
ただし、これは2次の場合。n次の有理数の場合では「リウビィユの定理」というものがあるという。
「実数αはn次の代数的、つまり有理数係数のn次方程式の解としてあらわされる数であるとする。このとき、αの近似分数 p/q で、誤差が 1/q(n + 1) 以下のものは有限個しかない。」
さて注目したいのは、幾何学的なアルゴリズムで「中間近似分数」というものを紹介してくれる。X-Y 平面上において、整数座標の格子状に釘を打ち付けた様子を考える。そして、原点と目的の点との間を糸で張り、原点側で最初にひっかかる釘(0, 1)と(1, 0)の間で糸を上下させる。糸がどの釘で折れ曲がるかの中間点を拾っていき、その中間点を連分数の要素とすれば、近似分数が得られるという発想だ。
例えば、5/7 の近似分数を求める場合、原点(0, 0)と座標(5,7)の間を糸で結ぶと、折れ曲がる釘が(0, 1), (1, 0), (1, 1), (3, 2)、通過する釘が(2, 1), (4, 3)となる様子が示される。これらの座標が、連分数の中間近似分数に対応する。しかも、糸が上下する様子がそのまま誤差として見える。誤差関数もまた連分数で記述できるというわけだ。

5. マハーラノービスの問題
ラマヌジャンがケンブリッジにいた頃、友人のインド人数学者マハーラノービスが雑誌の難問コーナーから、こんな問題を見つけてきたという。
「通りの家がずらっと並んでいて、端から順番に1番、2番、... と番地番号がつけられている。さて、ある家の左側に並んでいる番地番号を全て足した数と右側に並んでいる番地番号を全て足した数がちょうど同じになるという。この家の番地番号は何番で、通りには家が何軒あるか?ただし、通りの家の数は50軒以上、1500軒以下とする。」
ラマヌジャンは、即座に50軒未満の場合で、通りの数が8軒、家の番地番号は6番と答えたそうな。

  1 + 2 + 3 + 4 + 5 = 15 = 7 + 8

他の解は、通りの数が49軒、番地番号が35番の場合。

  1 + 2 + ... + 34 = 34 x 35 / 2 = 595
  = (36 + 49) x (49 - 35) / 2 = 36 + 37 + ... + 49

これを幾何学的に表すと、底辺が軒数の49、高さが存在する番地番号の49、の直角二等辺三角形の面積で表すことができる。番地番号35は、その斜辺の過程のどこかにあるはず。すると、底辺と高さの比は √2 であり、その思考法では、連分数による √2 の近似法に置き換えられる。代数的には、通りの軒数をn、番地番号をm とすると、次の方程式を満たすような自然数の組(n, m)を求める問題となる。

  1 + 2 + ... + (m - 1) = (m + 1) + (m + 2) + ... + n
  1 + 2 + ... + n = (1 + 2 + ... + (m - 1)) + m + ((m + 1) + (m + 2) + ... + n)

この二つの方程式から

  n(n + 1)/2 = m + 2m(m - 1)/2 = m + (m2 - m) = m2

そして、n(n + 1)/2 が平方数になるような n を求める問題に変えている。答えは、(n, m) = (288, 204)。

  1 + 2 + ... + 203 = 203 x 204 / 2 = 20706
  = (205 + 288) x (288 - 204) / 2 = 205 + 206 + ... + 288

尚、本書には具体的な解法が紹介される。ちと複雑だが、なかなか興味深い!

2014-07-27

"ガベージコレクションのアルゴリズムと実装" 中村成洋/相川光 著 竹内郁雄 監修

プログラムが深刻な問題を抱える時、動的メモリの管理に関するものが多い。メモリ系のバグが厄介なのは、バグが埋め込まれる箇所と、それが顕在化するタイミングが大きくズレていることにある。かつて、必要なデータ領域の確保と解放の問題は、プログラマの責任とされた。今でも、そうなんだろうけど...
整数型や文字型などプリミティブなデータ型を扱う分には、それほど目くじらを立てることもあるまい。だが、大量のデータ領域、あるいは、クラス型や構造体といった抽象化データを扱う場合には注意がいる。メモリ空間を相対アドレスで管理すれば、複雑なデータ構造にもアクセスしやすい。物理的には、参照という形で間接アドレッシングの構造を持つことになる。あの忌み嫌われるポインタってやつだ。こいつの危険性は、参照値をちょいと間違えたり改竄するだけで不正領域を指すことができることで、セキュリティ上の問題となる。あるいは、malloc/free, new/delete といった御呪いを疎かにするだけで、ヒープ領域には文字通りゴミが山積みされる。メモリ資源が豊富になればなるほどコードは複雑化し、バグの頻度が高まるは必定。不要になったゴミは長い間メモリ空間に居座り、メモリリークやらで他のプログラムと衝突したり、コールスタックに矛盾が紛れ込んでシステムを不安定にさせたり、最悪の場合メモリを喰い潰してシステムをダウンさせる。
そこで登場するのがゴミ収集係、そう、ガベージコレクションだ。人間社会においても、ゴミ清掃システムが破綻すると都市は崩壊する。地味な存在こそが、真の意味でシステムを支えている。本来、論理性だけに傾注したいプログラマとって、低水準な構造を意識させられることは思考の足かせとなる。動的空間を意識せずに済むというだけで、情報のゴミに翻弄される酔っ払いは幸せよ...

しかしながら、自動化という言葉は、心地よい響きがするだけに迷信となりやすい。厄介な機能を隠してくれるということは、その危険性までも隠蔽することになる。
近年、ポインタの概念を排除した多くの高水準言語を見かける。だが、むろんポインタがなくなったわけではなく、隠しているに過ぎない。トリッキーなキャストを要求するようなデータ定義が危険なことに変わりはない。ゴミ収集の仕掛けや癖を知っておくだけでも、危険なデータ構造を定義するリスクを避けることができよう。
ちなみに、おいらはプログラマではないが、メモリ管理やデータ構造の考え方はハードウェア設計でも参考になる。FIFO構造やスタック構造など物理構造の制限に因われなければ、思考も広がるだろう。おまけに、アルゴリズムを読むのが好きときた。コンパクトでエレガントに書かれる分野だけに、数学的で無味乾燥的なものと思われがちだが、そこには作者の思考物語が埋め込まれている。それが読み取れた時、感動を禁じ得ない...

本書に共感を覚えるのは、実装の解説をデータ型から始めてくれることである。おいらは、データ型やクラス型や構造体などの定義が、コンパクトな仕様書のようなものだと考えている。静的なデータ型を一通り定義するだけで、大方のプログラムイメージが出来上がっている。型の適切な定義は、そのプログラムが何をするものかについて、かなりの事を物語ってくれるはずだ。
実装編では、Python, DalvikVM(Android), Rubinius(Ruby), V8(JavaScript)におけるものが紹介され、言語システムを違った視点から眺められるのも興味深い。ただ、アルゴリズムではやや意外な印象を与える。それは、この技術分野が思ったより推論的で、確率論的であること。人間社会的とも言えようか。自分で明示的にやった方がマシかもしれない、と思わせるところもある。もう少しきちんと管理してくれると思ったのだが、保険の機能ぐらいに思った方がよさそうである。
ガベージコレクションは、大まかに「保守的GC」「正確なGC」の二つに分類される。保守的GCとは、「ポインタと非ポインタとを識別できないGC」のことだという。正確なGCとは、言うまでもなく確実にポインタを識別すること。それがポインタなのかも正確に判断できないとなれば、データ領域を勝手に移動すると本来の参照関係が崩れることになる。よって、フラグメーテーションの問題がつきまとう。
しかしながら、ポインタの識別は構文解析と関わり、言語処理系の支援なしで完璧な判別は困難となる。処理も重そうだし、本筋のプログラムが遅くなったり停止するのでは本末転倒。保守的GCを選択する方が、実用的なようである。
さらに、アルゴリズムが言語処理系に対して独立して設計できるかどうかも、実用性の指標となろう。結局、現実味のある実装は、互いのアルゴリズムの欠点を補い合うような複合的な用い方になる。いまや実用的の代名詞となった、妥協、適当、微妙... ってのが、この世にマッチしているのかもしれん。どうせ世界は不完全だし。現代社会は、何事も面倒なことを覆い隠し、利便性や自動化に邁進していくが、自動化に頼り過ぎる感は否めない。本書は、これを問うているようにも映る。プログラミングが庶民化すると、低品質のソフトウェアが大量に出回る。少なくとも、システムプログラムとアプリケーションプログラムでは、プログラマの意識にも雲泥の差が生じるだろう。高水準という基準も曖昧になっていく。かつて、C言語も高水準言語と呼ばれた。そりゃ、アセンブラ言語に比べれば、見た目からして高級だ。アセンブラ言語だって機械語に比べれば、はるかに抽象度が高い。所詮、相対的な価値観の問題か。今日、高水準と呼ばれるプログラミング言語の一つの指標として、言語システムが動的メモリを自動で管理してくれるかどうか、という見方はできそうである...

1. ガベージコレクションの世界と三つの基本アルゴリズム
1995年、Javaの発表以来、ガベージコレクション技術の有り難さが広く認知されるようになった。しかし、その歴史は古く、1959年、Lispの設計で、D.Edwards が実装したという。
本書は、基本的なアルゴリズムに、「マークスイープGC」「参照カウント」「コピーGC」の三つを挙げ、他は派生型や組合せとしている。マークスイープGCは1960年、John McCarthy が発表... 参照カウントは1960年、George E. Collins が発表... コピーGCは1963年、Marvin L. Minsky が発表... と、この分野の基礎技術は半世紀前にほぼ確立しているようである。いずれにせよ、完璧なガベージコレクションの方法はない。マシン、言語、アプリケーションなどの設計思想に応じて、アルゴリズムの組合せや用い方も変わる。
全般的な印象として気になるのが、GCの起動タイミングが先送りなところである。具体的には、メモリアロケーションに失敗した時。おいらは、ゴミが発生したら即掃除しないと気が済まないタチだ。もちろん、先駆けてメモリ状態を健全に保とうとするアルゴリズムもあるが...
また、同じソフトウェア業界でありながら、用語のニュアンスもだいぶ違うようである。
例えば...
「オブジェクト」とは、オブジェクト指向で言うところの属性や振る舞いを持ったサービス群という意味合いでなく、データの塊を意味するという。ガベージコレクションは、この塊を基本単位とし、メモリ上での移動や破棄といった操作を行う。
「ミューテータ(mutator)」という用語も紹介してくれる。Dijkstra によって考案された用語だそうで、「変化させるもの」という意味。オブジェクト指向的なオブジェクトへのアクセスメソッドは、基本的に set/get 系で済むと思っているが、ガベージコレクションでは参照関係を重視するため、ゴミ収集ではミューテータのタイミングが鍵となりそうだ。つまり、参照関係は時間とともに変化するが、その監視の手がかりになるというわけである。
「チャンク(chunk)」という用語も聞き慣れない。「かたまり」という意味で、将来的にオブジェクトを利用するための空き領域のこと。ガベージコレクションは、死んだオブジェクトを回収して、チャンクとして次に備える。
... こうした用語がデータ構造にだけ着目している点に、いかにもゴミ収集の世界という印象を与える。要するに、問題は死んだオブジェクトをいかに判別するかということ。過去の実績や栄光などに構っちゃいない。そして、ガベージコレクションの役割は、死んだオブジェクトを本当の意味で葬り去ることにある。

2. マークスイープGC(Mark Sweep GC)
保守的GCの代表的な存在のようで、その名のとおり、マークフェーズとスイープフェーズからなる。マークフェーズは、生きているオブジェクトにマークをつけるステップ。スイープフェーズは、マークのついていないオブジェクトを回収するステップ。その機構は極めて単純で、ルートから階層的に参照関係を再帰的に辿ってマークすれば、すべてのオブジェクトがマークできるという発想。
オブジェクト探索には、その階層から「深さ優先探索」と、その広がりから「幅優先探索」とが考えられる。GCはすべてを探索する必要があるので、どちらを優先しても探索するステップ数はあまり変わらない。だが、メモリ消費量を比較すると、深さ優先探索の方が少なく抑えられる傾向にあるという。アロケーションのタイミングは、ミューテータからチャンクが要求されると、その適切なサイズのチャンクを返す。
チャンクには、「First-fit, Best-fit, Worst-fit」の三つの戦略があるという。First-fit は要求されたサイズを返す。Best-fit は要求サイズ以上で最小のチャンクを返す。Worst-fit は最大のチャンクを見つけ、要求されたサイズとその残りに分割する。戦略によっては、細かなチャンクが多くなってしまう問題がある。そこで、連続したチャンクをつないでおいて、フリーリストとして持っておく手もある。
また、マークスイープGCは、Copy-On-Write との相性が悪いという。Copy-On-Write とは、unix系の仮想記憶で使用されている高速化手法で、プロセスのコピー(fork)を行う時など、大半のメモリ領域でコピーしたふりをして、実際にはメモリを共有するといった仕掛けである。だが、書き込みが発生した場合、他のプロセスとの不整合が生じるため、共有メモリを勝手に書き換えるわけにはいかない。書き込む場合は私有領域にコピーしておき、その領域上でデータ操作を行えばいいのだけど。マークスイープGCは、生きている可能性のあるオブジェクトすべてにマークビットを立ててしまうため、本来発生しないコピーが頻発してメモリを圧迫するという。確かに、マークビットを立てるだけで、オブジェクトに書き換えが生じたと勘違いされては困る。この問題に対処する方法が、「ビットマップマーキング」だという。ガベージコレクション用のヘッダをビットマップテーブルとして別管理するわけか...

3. 参照カウント
すべてのオブジェクトに参照の数を記憶させるという考え方で、各オブジェクトは自分の人気度を知っていて、人気がなければ自然消滅させる。マークスイープGCでは、チャンクがなくなった時にミューテータがGCに空き領域を要求するが、参照カウントでは、ミューテータが明示的にGCを起動することはなく、ミューテータの処理とともにカウンタの増減を行う。カウンタの増減のタイミングは、ミューテータが新たなオブジェクトを生成する時やポインタの参照状態を更新した時で、カウンタ値がゼロになると破棄される。参照カウントは、メモリ管理をミューテータと並行して行うという特徴がある。しかしながら、カウンタ値のビット幅が大きくなり、処理が重たそう。
また、循環参照が回収できないという大きな欠点を抱えているという。カウンタのビット幅を減らす方法では、「Sticky参照カウント法」を紹介してくれる。その極端な例では、1bitしか割り当てない「1ビット参照カウント」という方法もあるという。すぐにオーバーフローするわけで、簡易的な判別ぐらいにしか使えないような...
カウンタの増減処理を軽減する方法では、「遅延参照カウント法」という改良版が紹介される。
さらに、循環参照が回収できるように、マークスイープGCと組み合わせた「部分マークスイープ法」を紹介してくれる。循環参照が回収できないのは、参照カウントの特有の問題とすれば、通常は参照カウントをやっておき、必要な時にマークスイープGCを呼び出すという戦略である。しかし、効率が悪いようだ。一般的に、循環参照をもつゴミは滅多に生じないのだとか。循環参照を持つかもしれないオブジェクト群に対してのみ、マークスイープGCを適用するとなると、循環参照であるかもしれないという推定が必要になる。再帰的にアロケーションを試すといった機構が必要か。これはこれで、オーバーヘッドが大きそうである。滅多に生じないのであれば、最初のキューが空かどうかだけでも、かなりの判別ができそうな気もする。

4. コピーGC(Copying GC)
生きているオブジェクトだけを集めて別の領域にコピーし、連続した領域を確保するという考え方。むかーし、メインフレームでコンデンスによる最適化といった処理を明示的にやっていたような... おっと、年齡がバレそう!ユーザが明示的にデフラグをやる某OSの思想もどうか?と思うが...
それはさおき、コピーGCはフラグメンテーションの抑止に非常に良く、メモリ状態を常に健全に保てるという特徴がある。全領域をコピーするので、保守的GCと相反する。参照関係にあるオブジェクト同士が隣り合わせにあるので、キャッシュメモリの恩恵を受けやすい。しかし、ヒープ領域を常に二等分して、片方をバックアップ用に開けておく必要があるため、メモリの使用効率が悪い。
また、再帰的関数の呼び出しでは、子オブジェクトが再帰的にコピーを行うため、オーバーヘッドが大きいという。再帰的コピーの対処では、固有の反復コピー関数で置き換える「CheneyのコピーGC」を紹介してくれる。キャッシュとの相性を犠牲にするが...
あるいは、全体を二等分するのではなく、細かく空間を分けて、マークスイープGCなどの他のアルゴリズムに割り当てる「複数空間コピー法」も紹介してくれる。フラグメンテーションの問題が再浮上するけど...

5. 世代別GC(Generational GC)
三つのアルゴリズムとは、ちと違う視点だが、考え方としては興味深い。注意したいのは、このアルゴリズムは単独なものではなく、他のGCと組み合わせることである。
ほとんどのオブジェクトは生成されてすぐゴミになり、長く生き残るのは稀、という研究報告があるそうな。そこで、オブジェクトに年齡の概念を導入する。GCを一回経て、生き残ったオブジェクトは、1歳となる。そして、オブジェクトを世代別に分類し、一定の年齡を超えると旧世代オブジェクトとし、新世代オブジェクトを重点的にGCの対象とすることで時間を短縮する。
とはいえ、旧世代から新世代への参照を考慮する必要がある。その対処では、記憶集合(Remembered set)を使って、新世代への参照を効率よく見つけることができるという。そして、「ライトバリア」という旧世代から新世代への参照を記録するための機構を紹介してくれる。ヒープ領域が圧迫された時の非常手段として、旧世代オブジェクトから排除するというのはありかもしれん。楢山節考やなぁ...

6. Python
Python のメモリ確保は、単純に malloc/free を使うだけでなく、その上に3階層の独自レイヤを重ねて、効率的なアロケーションを行う戦略をとっているという。

  レイヤ3: PyList_New(), PyTuplet_New(), PyDict_New(),...
  レイヤ2: PyObject_GC_New(), PyObject_Malloc(), ...
  レイヤ1: new_arena()
  レイヤ0: malloc()

しかも、オブジェクトの生成時に、割り当てるメモリのサイズによって、アロケーション方法を変えている。要求サイズが 256byte を超えると素直に malloc を呼び、それ以下だとレイヤ順に登っていく。オブジェクトのほとんどが、256byte 以下で、しかも、すぐに捨てられる傾向にある。例えば、forループ文では一時的な文字列や数値列を大量に使い捨てるので、malloc/free 構造を使うのはあまりにも酷。
その構造は、細かい方からブロック、プール、アリーナの3階層になっているという。アリーナオブジェクトはプールで分割され、プールサイズは 4Kbyte 固定。このサイズは、大抵のOSの仮想メモリのページサイズ 4K と合う。OSがプール単位でメモリ管理してくれることを期待してのことか。それで、OSとの相性が良くなるかは知らんが...
また、アルゴリズムは参照カウントをベースとし、「参照の所有権」という構造を紹介してくれる。所有権はオブジェクトに対するものではなく、参照に対してのもの。尚、オブジェクト自体には所有権はない。参照の所有権は、関数の戻り値と引数に大きな意味を持つという。関数側は、呼び出し側に戻り値と一緒に参照の所有権を渡す。参照の所有権を持つものが、同時に破棄する権利を持つという考え方か。他から参照ができるのは、参照の所有権を借りている状態とするわけだが、借り手が勝手に破棄するわけにはいかない。ただ、カウンタをデクリメントする権利はある。貸出時にインクリメントして、返却時にデクリメントするという仕掛けか。まるで図書館の仕組み。しかし、すべてのデータのやりとりにおいて、参照の所有権がつきまとうとなれば、言語処理系に仕様変更や機能追加をする度に、GCの構造に振り回されそう。
また、参照カウントの欠点である循環参照の問題は、マークスイープGCの改良版との組合せで対処しているという。循環参照は、すべてのオブジェクトで起こるのではなく、コンテナオブジェクトによって引き起こされるという。コンテナオブジェクトとは、他のオブジェクトへの参照を保持することが可能なオブジェクトのこと。尚、Pythonのオブジェクト構造には、リスト型、タプル型、辞書型といったコンテナオブジェクトが用意されている。
なんと!コンテナオブジェクトは三世代あって、世代別コンテナオブジェクト構造だという。言語設計者は、こんなデータ構造までも考慮しながら設計しなければならんのかぁ... 足を向けて寝られん!

7. DalvikVM
DalvikVM は、Androidプラットフォームに搭載される仮想マシン。Android のアーキテクチャは、Linuxカーネルやそのライブラリ(libc, SQlite, ...)で構成されるが、その上位階層に位置づけられる。尚、Dalvik(谷間の入江) という名は、開発者Dan Bornstein の祖先が住んだアイスランドのフィヨルドにある漁村に因んでいるそうな。
Androidを起動すると、最初に Zygote というプロセスが立ち上がるという。Zygote はすべての親プロセスとなる。アプリケーションを立ち上げる際は、Zygote から fork してプロセスを作る。Zygote は多くのライブラリを抱えるために起動は遅いが、その後の子プロセスは起動が高速に行える。また、子プロセスは親プロセスの共有メモリ領域を使用するため、メモリ消費量も軽減できるという。
ちなみに、Android には、bionic という独自のCライブラリが搭載されているという。bionic は、glibc malloc から派生した独自の dlmalloc を持っているとか。glibc が大きすぎるということか。BSD libc を改良したものらしい...
共有メモリ用のデバイスには、ashmem(Anonymous Shared Memory Subsystem) というものが組み込まれているという。こいつが、mmap の機構を持っているらしい。mmap とは unix系のシステムコールで、ファイルのランダムアクセスなどを可能にするライブラリ。通常のアロケーションには、brk というシステムコールを使うという。これは、Cのヒープ領域を拡張するシステムコールだとか。だが、Cのヒープ領域はプロセスによってサイズの上限が決まっていて、mmap は、brk より制限が少なく、大きなメモリサイズを取得できる。ただし、mmap はページサイズ 4KByte 単位でしか割り当てない。
dlmalloc のアロケーションは、小さなサイズには brk を、大きなサイズには mmap を使うという。mmap 機構からして、Copy-On-Write との相性が良さそうだが、DalvikVMでは、これを苦手とするマークスイープGCを採用しているという。もっとも、この問題に対処したビットマップマーキングのようだが...
ところで、仮想マシンの世界は、大まかにレジスタマシンとスタックマシンの二つに分類される。スタックマシンは、レジスタを使わずにスタックを使って計算し、結果をスタックに積み上げる。一方、レジスタマシンは、数値を固有のレジスタにロードして、計算結果をレジスタに格納する。CPUの設計経験を持つおいらには、後者の方がイメージしやすい。それも古代人の感覚かもしれん。実際、固有レジスタで機能を差別化するよりも、スタックだけで抽象化した方がすっきりしている。スタックマシンのメリットは、オブジェクトコードのコンパクト化、コンパイルの単純さなどが挙げられるが、なによりもプロセッサの状態数が少なくて済む。ただ、メモリ参照をスタックで管理すればアクセスがそこに集中するわけだし、GCにとっては辛そうな気もするけど...
多くの JVM(Java Virtual Machine )でスタックマシンが採用される。しかし、DalvikVM はレジスタマシンを採用しているという。それも、Android 特有の事情があるようだ。Android端末のプロセッサが、レジスタマシンアーキテクチャだからであろう。ハードウェア思想をそのまま受け継いで、最大限の高速化を狙っているのだろう。これを仮想マシンと言うのか?は知らん。実際、ARMに特化したアセンブラコードもたくさん置かれているらしい。Androidマシンには、ARMが採用され、Android-x86 も進行中という事情もある。

8. Rubinius
Rubyの処理系で有名なのは、C言語で記述される CRuby の方だが、本書はあえて Rubinius を扱っている。Rubiniusは、Evan Phoenix を中心に進められ、その象徴的なポリシーに「Ruby で Ruby を実装」というのがあるそうな。思想では、Rubinius の方がエレガントに映るが、実用性では、CRuby の方であろうか。Rubinius が興味深いのは、本書で扱われる数少ない「正確なGC」の事例だということ。尚、CRuby の方は「保守的GC」だという。
Rubinius は世代別GCを採用し、マイナーGCとメジャーGCの二段階で構成されるという。マイナーGCでは、コピーGC(CheneyのコピーGC)を、メジャーGCでは、マークスイープGCとマークコンパクトGC(ImmixGC)を。メモリ空間も、それぞれ三つの領域に割り当てられる。シーケンスは、閾値を超える大きなサイズの場合はマークスイープGCアロケータを呼び出し、閾値を越えない場合は、コピーGC空間用に割り当て可能な場合はコピーGCアロケータを呼び出し、それ以外はマークコンパクトGC用アロケータを呼び出すといった具合。コピーGCでは、ライトバリアが実装されているようだ。
やはり、Rubiniusも、CRuby用に書かれたC拡張ライブラリをサポートしているようだ。では、Cのコールスタックやレジスタをどうやって走査するのか?保守的GCであれば、オブジェクトへのポインタがC拡張ライブラリのコールスタックやレジスタに漏れたとしても、とりあえず生きているオブジェクトとみなす。しかし、正確なGCではそうはいかない。その対処として、C拡張ライブラリに渡すすべてのオブジェクトへのポインタをハンドラに格納し、ルートで扱うという。そして、参照カウントに似た形でハンドラの生死を管理するとか。こりゃ、いくらなんでも Ruby じゃ書けんやろ。どうやら、C++ で書いてギャップを埋めているようだ。あれ、ポリシーに反しないのか?
保守的GCのメリットは、ミューテータでGCを意識する必要がない。デメリットは、使用できるGCアルゴリズムが制限される。対して、正確なGCのメリットは、GCアルゴリズムが制限されない。デメリットは、ミューテータを意識する必要がある。保守的なGCを採用している CRuby は、驚くほど簡単にC拡張ライブラリを記述することができるという。対して、正確なGCを採用している Rubinius は、アルゴリズムの制限がないために、比較的簡単にGCを改良することができるという。GCの作りやすさを優先しているという見方もできそうか...

9. V8
Google Chrome の特徴は、Google社が独自に開発した高速な JavaScript エンジンを搭載していること。そう、V8 JavaScript Enjine ってやつだ。名前の由来は、V型8気筒エンジンからきているらしい。高速なパワフルエンジンの代名詞だとか。コードは、80%以上が C++でグルグルしそうだけど...
V8 は正確なGCが採用され、世代別GCが使用されるという。構成は、Rubinius のGCに似ていて、これも正確なGCの事例。マイナーGCでは、コピーGC(CheneyのコピーGC)を、メジャーGCでは、マークスイープGCとマークコンパクトGCを採用している。ハンドラでリストを持つという考え方も、Rubinius と同じか。もっとも、こちらは最初から C++ で書こうとしているので、なんでもありだけど...
そもそも、GCをどう位置づけるか?システムプログラムなのだから、わざわざスクリプト言語で書く必要があるのか?あるいは、言語システムはアプリケーションプログラムなのか?OSの境界も曖昧になっている。ユーザの立場では、ポインタから解放してくれることはありがたい。だからといって、ポインタの概念を知らなくて、本当にいいのか?将来はガベージコレクションも独り一人歩きを始めるのかもしれん...
ところで、むかーしから、ファイナライザってやつの意義がよく分かっていない。ソフト屋さんに、いろいろ説明してもらうのだけど、いまいちしっくりこない。ファイナライズとは、オブジェクトの解放処理にフックをかけて、何らかの処理をする機能である。何らかの処理というのが微妙で、メッセージを発行するぐらいしか思いつかない。デバッグの手がかりにはなりそうだが、パフォーマンスを落とすだけのような気もする。GCを装備していない言語システムでは、直接デストラクタをやればいいだろう。だが、自動化システムではファイナライザにオブジェクトの解放まで期待していいのか?
案の定、V8 にはファイナライザがないという。ファイナライザに関する問題は、GCの実装において厄介なものらしい。もしかして、いらねぇってかぁ?変に操作をやると怖いから、触らぬ神に祟りなし!

2014-07-20

"Emacs Lisp テクニックバイブル" るびきち 著

本書は、Lisp を手軽に学ぶために手にしたのだが、仕事仲間に話題を振ると、エディタ談義で盛り上がってしまった。プログラミング言語とエディタには相関関係があるという説もあるが、無理に法則性を見出すこともあるまい。開発環境は開発者の思考の場であり、テキストエディタは思考プロセスを書きとめる上で最も単純で根幹的な道具となる。それだけに使い手の思い入れは強く、プログラミング言語同様、宗教的ですらある。むかーし、出張先で困らないように、最低でも vi ぐらいは使えないといけないよ!と指摘されたことがある。もうそんな時代でもあるまいが、どんな環境でも対応できるような身体にはしておきたい。
本格的にエディタの選択に迫られたのは、20年前になろうか。Emacs に近寄り難いと感じたのは、当時のデフォルトのキーバインドが酷かったこと。vi の方がましだと思ったぐらい。現在でも、Emacs のキーバインドにうろたえる人は少なくあるまい。ネット社会ともなれば、カスタマイズした設定ファイルを公開してくれる方々がいて、非常に助かる。shell環境もそうだが、この手の設定環境は伝承される傾向があり、情報不足に陥ることはなさそうだ。
とはいえ、デフォルトで使いづらいというだけで、ヤル気が失せる。編集作業において、キーワードの補完や色分けといった機能は必須だ。コーディング中に、変数名の綴りを間違うだけで大きなストレスとなる。ちなみに、Emacs では、テキストの色分け機能がデフォルトで無効になっているという。(require 'generic-x)ってやれば済む話だが。著者は、これだけで Emacs ユーザの損失だと嘆いている。そうだろう!そうだろう!てなわけで、おいらは秀丸エディタ派となった。なんにせよ、テキストエディタってやつは、料理人でいうところの包丁一本... の存在だ!

しかしながら、プラットフォームに依存しない作業環境という観点から、Emacs も捨てがたい。たまには、Emacs + Mew を使うし、TRAMP というリモートアクセス用のパッケージにも興味がある。Windows版や Mac版もあるにはあるが、一昔前はバージョンや OS の違いで互換性が保たれないという印象があった。現在ではそうでもないらしい。
Emacs のマクロ機能は、秀丸エディタのそれとは比べ物にならないのも確か。一つのエディタの中に作業環境を押し込むのもどうか?という疑問もあるが、Emacs はエディタの概念をも超越している。実際、エディタの外に、gcc, Ruby, HTML & JavaScript などの環境を並行して構築しているが、プラットフォームを Emacs で吸収するという考え方もあるだろう。それを実現させるものが、バッファの概念だ。初めて触れた時、そのエレガントな思想に感動したものである。ファイルから独立したバッファの抽象度は高く、作業領域やアプリケーション領域に割り当てることができる。
ざっと眺めるだけでも... コマンドや関数の補完では、Completions バッファが自動で開いて候補が表示される。Help を開けば、そこに表示用バッファが生成される。ファイルを探す時(find-file)、カーソルでディレクトリ階層を辿ることができる。shell との相性がよく、端末として使える。本書は、eshellってやつを紹介してくれるが、病みつきになるらしい。なによりも驚くべきは、一時的な作業領域の scratch バッファが、lisp式を評価する機構を具えていることだ。あるいは、Lisp用対話型インタプリタも用意されている。本書では、これらよりもっといいやり方を教えてくれるけど...
それにしても、秀丸エディタのタブモードは捨てられん!と思いきや、Emacs にもあった。tabbar.elってやつが...

さて、Emacs Lisp の方はというと、ちと印象が違う。多少の方言は覚悟しても、Common Lisp の簡易版ぐらいに思っていたのだが、本書は決定的な違いがあることを教えてくれる。その違いとは、グローバル変数やクロージャの思想、そして、Common Lisp がレキシカルスコープであるのに対し、Emacs Lisp はダイナミックスコープだということ。
例えば... 関数もどきの let ってやつは、Common Lisp ではレキシカルスコープだが、Emacs Lisp ではダイナミックスコープになるんだとか... おいおい!!!
Common Lisp の機能を提供するパッケージ(cl.el)ってやつもあるが、禁止事項があって制限が設けられているという。著者は、そんな無駄なことを... と愚痴を語ってくれる。ソフトウェアを使う上で、達人の愚痴ほど参考になるものはあるまい。Emacs Lisp の進化過程では、Common Lisp の機能から派生したものが多い。昔は、when すらなかったとか。徐々に Common Lisp に近づいていくとすれば、制限することになんの意味があるのか、と疑問を持つのも当然であろう。実際、cl.el は標準装備され、(require 'cl)ってやるだけで使える。Lispユーザは当たり前のように使っているそうな。いくら制限を設けても、民主主義によって淘汰されていくだろう。
また、Emacs lisp はシングルスレッドだが、emacs 自体はマルチスレッドで、擬似マルチスレッドプログラミングのための deferred.el というライブラリも紹介してくれる。

1. Emacs Lisp のためのパッケージ... auto-install.el
auto-install.el は、URLを指定するだけでネット上の Emacs Lisp プログラムをインストールできるようになるという。尚、EmacsWiki(http://www.emacswiki.org/)には、様々なパッケージが集められている。

$ mkdir -p ~/.emacs.d/auto-install
$ cd ~/.emacs.d/auto-install/
$ wget http://www.emacswiki.org/emacs/download/auto-install.el
$ emacs --batch -Q -f batch-byte-compile auto-install.el

.emacs.el
(add-to-list 'load-path "~/.emacs.d/auto-install/")
(require 'auto-install)
(auto-install-update-emacswiki-package-name t)
(auto-install-compatibility-setup)
(setq ediff-window-setup-function 'ediff-setup-windows-plain)

他にも、Lisp 使いに便利そうな5つのパッケージを紹介してくれる。
  open-junk-file.el          (試行錯誤用ファイルを開く)
  lispxmp.el                 (式の評価結果を注釈する)
  paredit.el                 (括弧の対応を保持して編集する)
  auto-async-byte-compile.el (保存時に自動バイトコンパイル)
  package.el                 (ELPA/Marmaladeインストーラ emacs24で標準)

ダウンロードは...
M-x install-elisp-from-emacswiki open-junk-file.el
M-x install-elisp-from-emacswiki lispxmp.el
M-x install-elisp http://mumble.net/~campbell/emacs/paredit.el
M-x install-elisp-from-emacswiki auto-async-byte-compile.el

ついでに、tabbar.el も...
M-x install-elisp-from-emacswiki tabbar.el
それぞれダウンロード後にファイルがポップアップするので、C-c C-c とすればインストール完了。

2. Lisp式の評価方法
対話的に評価できる方法が二つあるという。一つは、scratch バッファを使う方法。二つは、ielm(Interactive Emacs Lisp Mode)を使う方法。
scratch バッファでは、eval-print-last-sexp コマンドで直下に評価結果が出力される。eval-last-sexp でも評価できるが、出力場所がコマンドライン上で少し遠い。尚、eval-print-last-sexp には C-j が、eval-last-sexp には C-x C-e がキーバインドされている。
ielm は対話型インタプリタで、Rubyで言うところの irb(Interactive Ruby)か。M-x ielm とやれば起動する。
この二つだけでも感動しているというのに、本書はもっといいやり方を教えてくれる。上記の方法は、Emacs を終了すると結果が消える。そこで、open-junk-file.el パッケージを用いれば、ジャンクファイル上で評価して自動保存できる。ジャンクファイルとは、日時を元にしたファイル名をもつファイルのことで、M-x open-junk-file ってやれば起動する。惚れっぽい酔っ払いは、ジャンクにイチコロよ!

3. Common Lispパッケージ... cl.el
関数の名前空間は、Common Lisp と Emacs Lisp に違いがあって、衝突の可能性がある。なので、cl.el の禁止事項は、eval-when-compile でバイトコンパイル時にロードしてマクロを使う分には許可するが、Common Lisp の関数は使うな!ということらしい。つまり、(require 'cl) が禁止ということか?
本書は、(eval-when-compile (require 'cl)) ってやれば、Common Lisp のマクロを合法的に使えるとしている。ランタイムに cl.el のロードが禁止となれば関数は使えないが、コンパイル時に展開されるマクロならOKってか?ん~... 解釈の問題のような気もするが...
今となっては、Common Lisp に総入れ替えするわけにもいかないだろう。古い資産が誤動作しそうだし。Common Lisp と Emacs Lisp で、レキシカルスコープとダイナミックスコープの違いがあるのも、関数の変数をめぐって大きな問題となりそうだ。ならば、(require 'cl)を許可して、Common Lisp でオーバライドさせることを明示すれば良さそうな気もするが...
それはともかく、本書で紹介されるマクロは、なかなか便利そうである。リスト構造を分解して変数に代入する時、car, nth が冗長的なので、destructure-bind を使うとすっきりする。汎変数を使うと、代入の概念を拡張できる。setq は、その拡張版の setf が使える。汎変数には、car, nth といったリスト要素だけでなく、buffer-substring, point といったバッファ関連もあるようだ。
let/let* のレキシカルスコープ版は、lexical-let/lexical-let* があるという。ん~、これは微妙だなぁ!他には構造体が使えたり...
本書は、loop マクロをかなり丁寧に解説してくれる。こいつは、Common Lisp が提供するモンスターマクロだという。リストやベクタの要素の合計/最大値/最小値を与えたり、各要素に関数を適用したり、条件を満たす要素を抽出して演算を施したり... などの演算節が豊富で、統計情報を処理するのに強力なツールとなる。連想リストやハッシュテーブルのキーを求めたり、フィボナッチ数列を求めたりするのも、エレガントに書けるという。
また、非局所脱出メカニズムには二つあるという。Emacs Lisp 本来の catch/throw と Common Lisp の block/return-from。Common Lisp には block の概念があり、明示しなくても暗黙に block が形成される。この block がレキシカルスコープを実現している。block からは、return-from で脱出できる。一方、catch はダイナミックスコープの場合で、脱出時には、throw を呼び出す。cl.el のおかげで、Emacs Lisp でも block/return-from の仕掛けが使えるというわけか。

4. eshell のすゝめ
eshell は、Emacs Lisp で書かれているために、プラットフォームに依存しないという。zsh ライクで、使い勝手もよさそう。普通のシェルはC言語などで書かれているため、シェルスクリプトの範囲でしか拡張できないが、eshell はコマンド解釈の部分ですら乗っ取ることが可能で、コマンドラインを丸ごと zsh や Ruby に渡して実行することができるという。おぉ~...

2014-07-13

"実践 Common Lisp" Peter Seibel 著

本書を購入したのは、三年ぐらい前になろうか。時々横目で追い... 辞書代りにし... これを読破するには気が重い。ところが、改めて目を通してみると、意外とストーリー性があって、おもろいんでないかい!
それは、音楽ファイル(MP3)からタグ情報(ID3)を抽出し、曲情報をweb上で管理するという物語で、最終的に、曲の検索、プレイリストの追加、ストリーミングといった機能を備えるMP3ブラウザを作成することにある。
ここに含まれる技術要素は... 単語の頻度を調べるために、スパムフィルタでよく見かけるベイジアンフィルタを用いて学習する仕掛け。バイナリファイルのためのパーサの作成。リスト型言語らしいデータベースの構築。WebアプリケーションのためのWebサーバ(AllegroServe)の導入。HTMLライブラリの生成。ストリーミング再生のための、Shoutcastプロトコルの実装など...
実践と言うには、ちと話題がづれていそうだが、試してみると、なかなか役に立ちそうではないかい。もちろん、Common Lisp の処理系や、CLOS(Common Lisp Object System)といった話題も豊富!満腹すぎて吐きそうなほどに...

Lispは、FORTRANの時代を思い出させる言語で、その歴史は1950年代に遡る。だが、改良を重ね重ね、いまだ輝きを失っていない。オブジェクト指向の機能をもたらす CLOS は、もはや Common Lisp と分けて論じることができないほど馴染んでやがる。
今日のコンピューティングは、メモリ容量やCPU性能、あるいは、表示システムの高精細化や入力システムの操作性向上など、リソースは格段と進化している。プログラミングにおいても、ハードウェアをほとんど意識しなくて済み、本来の目的に傾注できる高水準言語が続々と登場する。おそらく万能な言語は存在しないだろうし、ドメイン固有言語という発想はますます広がるだろう。
そんな時代にあってもなお、Lisp が生き残ってこられたのは、言語自体に柔軟性があるのも確かであろうが、チューリング等価の記法という意味では、ソフトウェアはあまり進化していないのかもしれない。いずれにせよ、チューリングマシンが考案されて一世紀にも満たず、コンピューティングの歴史はいまだ過渡期にある。実際、新しい技術が品質やユーザビリティを落とすケースも珍しくないし、登場時期が早すぎたために廃れていくアイデアも少なくない。この手の書に触れる時は、新しいとか、古いとか、そうした意識は捨ててかかった方がよさそうである。引退間際の古代人には、なんでも真新しく映るけど...

Lisp信者は、こんなことを言う。Lispを学べば、もっとましなプログラマになれると。言語に対する思いは宗教的なところがあり、その座右の銘は禅問答に似たものがある。Lispの場合はこれだ。
「プログラム可能なプログラミング言語」
彼らは、マクロ機能の強力さをこわだかに話す。まるで万能言語であるかのように。だが、手続き型言語に慣れ親しんできた者にとっては、まるで宇宙人の文化だ。S式とかいうヘンテコな宣教師が、カッコカッコ... コッカコッカ... と呪文を唱えれば、カッコの奥から let とかいう控えめな教職者が lambda とかいう名もない浮浪者に見返り(返り値)をねだってやがる。実に、鬱陶しい奴らだ!
しかしながら、異質の言語に触れることにも意義がある。当たり前と思い込んでいる事でも、疑問を持つ機会を与えてくれる。最近、気に入っている感覚は、リスト型データ構造である。Lispが記号処理のために設計され、list processing を得意とすることは、その名が示している。
「リストは不均質で階層的なあらゆるデータを表すための格好のデータ構造だ。」
仕事では数学のアルゴリズムを検討することが多く、関数で多次元空間を記述する場合、返り値には多値を用いたい。例えば、C言語などの return変数は基本的に一つで、多値を返したければポインタ参照の形をとる。これが副作用の原因となりやすい。わざと副作用を利用することもあるので、一概に悪いとは言えないのだが。一方、リスト型データはもともと多値が想定されているので、そんな気遣いはいらない。尚、ここで言う「多値」とは、群論で言うところの集合体を意味し、論理学のそれとは意味が違うので注意されたし...
「関数プログラミングの真髄は、与えられた引数のみに依存して演算を行う副作用を持たない関数のみでプログラムを構成されることにある。」
本書は、リスト構造が柔軟であるがために、その弊害で、ユーザがリストに特化しすぎる傾向があると指摘している。そして、もっと効率的な方法として、コレクションの概念を用いたベクタやハッシュテーブルの事例を紹介してくれる。また、リスト型が複素数に対応してくれるのもありがたい。尚、今日では多くの言語で複素数型がサポートされている。C99ライブラリのように...

1. コレクションの概念
「リストを理解する手がかりは、そのほとんどがより基本的なデータ型のインスタンスであるオブジェクトの上に構築された幻想だと理解することにある。その単純なオブジェクトはコンスセルと呼ばれる値のペアであり、関数 CONS を呼び出すことによって作り出される。」
リスト型データ構造を効率的に用いる方法として、コレクションが紹介されるが、明確な違いがよく分からん!コレクションを操作する方法として、シーケンスというサブタイプがあるが、その多くはリストでも使えそうだし。ただ、シーケンスは非常に強力なために、リスト操作とは抽象度の違いを感じるのも確かで、コレクションという用語を新たに生み出すだけのことはありそうか。

例えば、ベクタでは...
固定サイズに vector関数、固定サイズと可変サイズの両方に make-array関数が用意される。要素の追加と削除には、vector-push, vector-pop があり、シーケンスのレベルでベクタとリストが区別されるかに見える。反復関数には、count, find, position, remove, substitute などがあり、これらの関数の末尾に、-if を付けて条件式として使える。count-if, find-if... といった具合に。
シーケンス全体の操作では、copy-seq, reverse、あるいは、連結に、concatenate がある。ソートには、sort, stable-sort。尚、stable- 述語で順番が入れ替わらないことを保証する。部分シーケンス操作には、subseq。尚、範囲は開始と終了インデックスで指定。他には、marge, search, mismatch など。
また、シーケンス述語に、every, some, notany, notevery がある。
 every    : すべての述語が満たされれば t、それ以外 nil。
 some     : 1つでも満たすものがあれば t、すべて満たさないとき nil。
 notany   : 1つでも満たされれば nil、1つも満たさない場合 t。
 notevery : 1つでも満たされれば t、1つも満たされない場合 nil。

複数のシーケンスに対して関数を施したい時は、map, map-into といったマッピング関数が使える。
また、一つのシーケンスに対しては、reduce が便利。
合計を求めるには...

  (reduce #'+ #(1 2 3 4 5 6 7 8 9 10))  => 55

最大値を見つけるには...

  (setf numbers '(10 12 14 16))
  (reduce #'max numbers)  => 16

キーワード引数には、:key, :from-end, :start, :end がある。
固有の引数には :initial-value があり、シーケンスの初期値が設定できる。

ハッシュテーブルでは...
生成に、make-hash-table。要素にアクセスするには、gethash。gethashに複数の返り値がある場合は、 multiple-value-bind マクロが用意される。
反復処理は、maphash でこんな感じ...

  (maphash #'(lambda (k v) (format t "~a => ~a~%" k v)) *hash*)

2. 例外処理とコンディションシステム
Lispの偉大な機能の一つにコンディションシステムがあるという。Java や Python や C++ における例外処理と似た目的で提供されるが、もっと柔軟でエラー処理にとどまらないという。プログラムの実行中に起こる出来事を記述できるので、例外よりも汎用性が高いということらしい。例外処理においては、エラーの捕捉とその通知が鍵となるが、Lispでは更に再起動という機能が付加される。
ところで、エラー処理とは、なんであろうか?プログラムは関数の階層によって組み立てられる。低位の関数の上に高位の関数が構築されれば、実行中の実体はコールスタックという形で現れる。低位のプロセスは、高位のプロセスのコールスタック上にあるということだ。
したがって、エラーを捕捉する格好の場所は、関数の境界ということになろう。実際、低位と高位の依存関係において問題が発生しやすい。例えば、呼び先のファイルが存在しないとか、メモリの空き容量が足りないとか、ネットワークが落ちているといった原因で。関数単体から見て、想定外の条件への対処とも言えよう。一方で、関数内で起こるエラーはそれこそバグであり、ここで扱う問題ではない。
例外機構を備えていないシステムでは、エラー通知は関数の呼び出し元に送ることになろうか。そして、復帰のための処理をするか、失敗を放置するかは、呼び出し元が決定することになる。単純にスキップするだけで何事も起こらなければいいが、現実はそう甘くない。
しかし、例外機構が具わっていれば、コンディションを監視することによって、何らかの対処をシステムレベルで可能にする。復帰処理において、スタックを巻き戻して関数の再起動を試みたり、保険処理のようなものも定義できそうだ。ただ、あくまでも想定外の条件に対処するわけで、却って仇となることもあろう。
Common Lispでは、エラーを回復するコードと、どうやって回復するかを決めるコードが分離されているという。戦略的には、どうやって回復するかは高位の関数に委ね、回復のためのコードを低位の関数に記述できるという仕掛けか。しかも、コンディションは一般オブジェクトと同等な扱いで定義できるようである。再起動によって効果をもたらすには、明確にコードを呼びださなければなるまい。復帰条件も異なろうが、複数の再起動が定義できるようである。コンディションハンドラは、警告をエラーに昇格させることも、その逆もできそうだ。
通知の基本関数は、signal 。なんとなく馴染みのある名前だ。これだけでプログラムのコンディションというよりは、システムコールレベルを想定していることが分かる。コンディションを理解する鍵は、コンディションを通知しただけでは制御フローに影響しないことを理解することだという。
「エラー処理には、プログラミングの教科書であっさりとしか説明されないという残念な宿命がある。エラー処理が適切かどうかは、解説用のコードと製品レベルの品質コードの最も大きな違いだといえる。後者を書くコツは、特定のプログラミング言語の構文の詳細ではなく、ソフトウェアについて特別な厳しい考え方を身につけることにある。」
ただ、あまり柔軟すぎると例外処理と通常処理の境界が曖昧になりそうだ。最もコードのセンスが問われるところでもあろうか。いずれにせよ、最悪の場合、リセットすべきか?再起動すべきか?あるいは、他の処理をすべきか?それはシステムによっても違ってくるし、ソフトウェアだけの問題ではない。
ちなみに、某原発事故では、あろうことか!電源を供給する電力会社が、電源を失うことを想定していなかったと平然と語られた。多くのシステム屋さんにとって、戒めの言葉に聞こえたことだろう...

3. loopマクロ
「皮肉なことだが、マクロを正確に理解する最大の障壁は、おそらくマクロがあまりにうまく言語に統合されてしまっていることにある。」
Lispを使っていると、まずもって不思議な感覚に見舞われるのは、マクロと関数の違いが曖昧にさせられることである。引数も取れば、値も返すし、ちょっと風変わりな関数にしか見えない。だが、実装は全く違う。マクロは単純に展開されるだけに、ローカル変数の束縛で悩ましい。だが、変数名が重複しないように、with-gensyms が用意される。
関数は言語の構文に従うが、マクロはそんな制約を受けないと言えばそうだが。あるいは、マクロはある種の翻訳機とも言えるわけだが...
「言語を"コアに標準ライブラリを追加したもの"と定義する利点のひとつに、理解や実装が容易になることがある。しかし本当のメリットは、言語が容易に拡張できる表現力にある。なにせ、言語だと思っているものの大半はただのライブラリなのだ。」
この感覚を味わうには、loopマクロがうってつけである。ループ構文には、do, dolist, dotimes とったものがある。ただ、これらの表現力は大げさ過ぎる。Lispで書かれていながら、using などの副節でカッコが省略されるところは、実にLispらしくない。
「なぜ LOOP の作者がこの副節で括弧なしスタイルに怖気づいたのか、私に訊かないでほしい。」

loopマクロの主な機能部品は、ざっとこんな感じ...
  • ローカル変数の生成とループ変数の自動更新。
  • 値の収集(collect)、計数(count)、合計(sum)、最小化(minimaize)、最大化(maxmize)。
  • 任意のLisp式の実行。
  • 条件付き終了。
などなど...
おまけに、前処理(initially)と後処理(finally)の節を用いて、ループの前後に任意の処理が指定できる。このあたりの実装は、unix上で動く awk の思想を感じる。

4. format関数
「Common Lisp の FORMAT関数は、LOOPマクロと並んで人々を感情的にさせる機能だ。信者もいればアンチもいる。」
format関数の複雑な制御文字は、電話のノイズに似ているという。確かに、printf風でありながらまったく違うし、正規表現とも違う。短く書けることが最善とするならば、あらゆる文書は暗号文となろう。いや、呪文か!
ただ、暗号ってやつは、解き明かせば恐れるに足らん。まず、すべての指示子は、~(チルダ)で始まる。指示子によっては、前置パラメータをとる場合がある。前置パラメータは、チルダのすぐ後に書き、複数ある場合はコンマで区切る。最も汎用な指示子は、~a で、人間の読める形に出力する。これだけ押さえれば、大概のことは解読できそうである。
改行を出力するには、~%。新しい行を出力するには、~&。尚、~% は常に改行するのに対して、~&は行頭でないときのみ改行する。

  (format t "~a~%" list)
  (format t "~5$" pi)  => 3.14159  ($ は小数点表示、デフォルトは2桁)
  (format t "~d" 1000000)  => 1000000 (d は10進数表示、他に、~x, ~o, ~b がある)
  (format t "~@d" 1000000) => +1000000 (符号付き)
  (format t "~:d" 1000000) => 1,000,000 (3桁ごとに区切る)
  (format t "$~:d" 1000000) => $1,000,000 (通貨単位ドル)

条件による整形には...
~[, ~] で囲んで、条件分岐を指示する。

  (format t "~[cero~;uno~;dos~]" 1)  => uno (~; で区切ってインデックスで指定)

~{, ~} で囲んで、反復を指示する。

  (format t "~{~a, ~}" (list 1 2 3)) => 1, 2, 3,

最も驚かされるのは英文制御が凝っていることだ。使うかどうかは別にして...
~r は、英語の指示子。

  (format t "~r" 1234)  => one thousand, two hundred and thirty-four
  (format t "~@r" 1234)  => MCCXXXIV (@ はローマ数字)
  (format t "~:@r" 1234)  => MCCXXXIIII (:@ は古いローマ数字)

単数形と複数形の制御に、~p を用いると、複数形の時、sを付加する。

  (format t "~r file~:p" 1)  => one file
  (format t "~r file~:p" 10)  => ten files

さらに、@ は単数形の時 y、複数形の時 ies を付加する。

  (format t "~r famil~:@p" 1)  => one family
  (format t "~r famil~:@p" 10)  => ten families

大文字と小文字制御では、~(, ~) で囲んで、その間の制御文字列を小文字で出力する。
@ は文字列の最初の文字が大文字。: はすべての単語の頭が大文字。両方つけると、すべて大文字。

  (format t "~(~a~)" "THE QUICK BROWN FOX")  => the quick brown fox
  (format t "~@(~a~)" "THE QUICK BROWN FOX")  => The quick brown fox
  (format t "~:(~a~)" "THE QUICK BROWN FOX")  => The Quick Brown Fox
  (format t "~:@(~a~)" "THE QUICK BROWN FOX") => THE QUICK BROWN FOX

5. Lisp in a BOX
REPL(read-eval-print loop)とは、読み取り(read)、評価(evaluate)、印字(print)の終りのないサイクル、すなわち、対話式機構のこと。この環境を手っ取り早く提供してくれるものに、「Lisp in a BOX」というものがあるそうな。それは、Emacsと Common Lisp開発環境 SLIME をパッケージ化したものだという。elispにはかなり方言があるようで、やはり SLIME がよさそうである。Emacs風のIDEといったところか...

6. AllegroServe
最近のブラウザは余計な機能が多すぎる。核となる機能は、Webサーバからページをリクエストし、それをレンダリングすること、これだけでもかなり遊べる。
仕事では、ドキュメント関連を、XMLで書け!って要求されることがある。閲覧するだけなら pdf でもよかろうが、検索機能や入力フォームなどが欲しいというわけだ。そのくせ向こうからは、word や excel の文書が提供されるけど。この手の自動生成ツールは、スペックが大げさで、しかもろくなコードを吐かない。結局、機能を限定したXML生成ライブラリを書く羽目に...
そこで、コードのテスト用に、簡易的なサーバが立ち上げられるとありがたい。本書は、そんな時にうってつけのWebサーバを紹介してくれる。AllegroServe と PortableAllegroServe だ。Rubyで言うところの、WEBrick のようなものか。ちなみに、Hunchentoot ってのもよさそう。

パッケージを導入するには...
Allegro Common LIsp ならば、AllegroServe に対して、require する。

  (require :aserve)

他のLispシステムでは、PortableAllegroServe に対して、require の代りに loadする。

  (load "./portableaserve/INSTALL.lisp")

localhostサーバを定義するには...(例えば、ポート2001の時)

  (net.aserve:start :port 2001)

ファイルやディレクトリを公開するには...

  (publish-file :path "/hello.html" :file "/tmp/html/hello.html")
  (publish-directory :prefix "/" :destination "/tmp/html/")

後はブラウザで、http://localhost:2001/hello.html にアクセスすればいい。

2014-07-06

"Coders at Work" Peter Seibel 著

この手の書は、なにやら忘れかけているものを思い出させてくれるような気がする。それは、好奇心や探究心といったものだ。同時に、むか~しの愚痴も甦るけど...
人は皆、面倒臭がり屋である反面、純粋な好奇心に対しては真摯になれる面がある。そして、探究心の持続こそが才能を覚醒させるのであろう。
本書は、ピーター・サイベルが、いまや伝説となった15人のプログラマからコード哲学を聞き出すインタビュー集である。尚、サイベル自身がプログラマであり、教科書的な存在である「実践Common Lisp」の著者でもある。
その15人とは...
Netscape の実装者ジェイミー・ザウィンスキー。ソーシャルネットワークの概念を広めたブラッド・フィッツパトリック。JSON(JavaScript Object Notation) の生みの親ダグラス・クロックフォード。JavaScript の設計者ブレンダン・アイク。Java プログラマの尊敬を集めるジョシュア・ブロック。並行処理指向言語 Erlang の設計者ジョー・アームストロング。先進的言語 Haskell の設計と実装の中心人物サイモン・ペイトン・ジョーンズ。NASA と Google という対照的な開発グループを率いたピーター・ノーヴィグ。Scheme と Fortress を作り、数々の主要言語の標準化に携わった多言語話者ガイ・スティール。Smalltalk の実装者ダン・インガルス。実行時コンパイラ技術を生み、Ghostscript を作ったL・ピーター・ドイチュ。Unix の開発者ケン・トンプソン。最適化コンパイラ技術で女性初のチューリング賞受賞者となったフラン・アレン。ARPANET の実装者バーニー・コーセル。そして真打ち登場、コンピュータ科学者ドナルド・クヌースである。

ノイマン型アーキテクチャが提唱されて半世紀余り、インタネット世代を代表するフィッツパトリックを除いて、ネアンデルタール人に属す世代になろうか。共感できる点が多いということは、おいらも古代人ってか?ちとショック!しかしながら、いまだに情熱を持ち続け、趣味の境地でコードを書き続けているのには頭が下がる。
ちなみに、おいらはプログラマではない。むか~し組込システムのOSを書いていた時期もあるが、今では回路設計の経験の方が長い。これといった専門はなく、ずーっと雑用係と称してきた。最近はアルゴリズムの検証ばかりで、実装から遠ざかり気味。それでも思考のスケッチのためにプログラムを書く。いや、電子機器の開発設計に携われば、プログラミングを避けることの方が難しいだろう。回路設計においてもハードウェア記述言語を用いるし、その検証ではコンピュータ言語と協調させて効率を図る。画像処理アルゴリズムの検討では、ImageMagick やスクリプト言語と組み合わせるのも悪くないし、数学の落ちこぼれには、Octave のような数値演算言語の存在もありがたい。
おそらく万能なプログラミング言語は存在しないだろうし、ドメイン固有言語という思想はますます広がるだろう。ハードウェアの進化がムーアの法則に従い、ソフトウェアも大規模化していく中で、プログラミング言語の進化が比較的遅いのは救いである。言語システムには、多くの本質が内包されているように映るからだ。その傾向は、人間社会の変化に対する自然言語の変化にも顕れている。エドガー・ダイクストラは、こう言ったとか。
「母国語で満足に書けないようなら、プログラミングはあきらめることだ!」
プログラムとは、クヌースが言うように本質的に文芸作品なのかもしれん。尚、「The Art of Computer Programming」は数学的に濃い内容だけど、いつか挑戦してやると思いつつ、既に20年が過ぎた...

プログラミング言語がどうあるべきか、その意見が様々であることは驚くに値しない。設計の立場が違えば、設計哲学も思考法も変わる。本書でもその傾向が見られる。コードの取っ掛かり方だけを見ても...
ザウィンスキーやインガルスが、プロトタイプのようにすぐ動くようにすることの重要性を唱えるのに対して、ブロックは、実装前の段階で要求分析の重要性を強調しすぎることはないとし、クヌースに至っては、TEX プログラムをコンピュータに一言も入力せずに紙と鉛筆で書き上げた!と言っている。
デバッグの流儀では、デバッガ派、print 文派、あるいは、assertion 派に色分けされる。あるいは、C や C++ の普及の善悪や、言語システムがどこまで機能を具えるべきか、などでも意見が分かれる。
もちろん共通点も多い。誰もが読めるコードを書くことの重要性を唱え、無条件にシステムが巨大化する昨今、無謀なプログラムが増殖していることを懸念し、過剰なブラックボックス化についても議論される。確かに、Web アプリケーションに触れると、何年も放置された些細なバグが目立つ。情報が溢れればノイズが増殖し、プログラミングが庶民化すれば質の低い作品が氾濫する。高度な情報化社会では、鈍感さがより一層求められるようだ。
ソフトウェア業界は、全体的に良い方向に進んでいるのかもしれないが、回り道をしていることも否めない。ここに登場する偉人たちもまた、誰一人としてプログラミングが解決済みの問題だとは考えていない。ドイチュに至っては、今日のプログラミング言語で SIMULA-67 や Smalltalk より質的に優れたものはないと断言している。なるほど世間では、進歩や進化という言葉が迷信化しているところがある。インターネット世代のフィッツパトリックまでも、こう釘を刺す。
「新しいものが最低でないことを願っているのかもしれません。新しいプログラミング言語でやりたいことができるようになると期待するみたいに、でもユーザだって同じことです。ユーザはいつもバージョン番号の高いものを手に入れようとします。たとえそれがよりひどいものであっても。」
また、マルチコアというCPU構造の複雑化が、コードを書く方法を大きく変えていることも見逃せない。多くの人が最も厄介なバグに並行プログラミングにおけるものを挙げており、STM(Software Transactional Memory) の是非にまで議論が及ぶのは、なかなかの見モノ!

1. C と C++ の善悪論議
C++ の善悪については一般的に論じられているが、偉人たちの意見は、C の普及の段階から真っ二つに分かれる。アレンはコンピュータサイエンスの研究を大きく損なったと難じ、コーセルは最大のセキュリティ問題と批判する一方で、トンプソンはセキュリティはプログラマの問題であって言語システムの問題ではないと主張し、クヌースはポインタを「記法における最も目覚ましい進歩」と言っている。
プログラムで、大きな問題となるのは動的メモリの管理である。メモリリークや残骸の蓄積は、自身のプログラムだけでなく、他プログラムにも影響を与える。そこで、ポインタ機能は直にメモリにアクセスできるために忌み嫌われる。尤も昔は高級言語扱いされたが、今ではアセンブラのような低級扱いされる。しかし、参照で用いる分には便利な面がある。大量のデータ領域を関数の引数で渡すような場合だ。
そもそも、アプリケーション設計者が触れるべき領域なのか?という疑問もある。当たり前のことだが... バッファの境界を越えないことを明示的に確認せずにバッファを読んではいけないし、メモリブロックを不適切なタイミングで解放して他のポインタを不安定にしてはいけないし、サイズの合わないものを格納して他の値とかぶってはいけない。だが、そうした問題を見つけることが意外と難しい。
だからといって昔は、システムをアセンブラで書いて、アプリケーションを Pascal で書くというのも抵抗があった。C はシステムプログラムに大きな恩恵をもたらしたが、その利便性からアプリケーションの領域にも入り込んだ。アメリカ政府は、C の危険性を回避するために、Ada を強制しようとして、Ada 以外での契約を拒否した。だが、C の勢いは政府の思惑までも潰した。システム用言語とアプリケーション用言語を分けるべきだというのも、もっともな意見である。コーセルは、こう言っている。
「C が有用性を超えて長生きしすぎたと言いたくはありませんが、あまりに多くの良いプログラマに使われた結果として、今では十分よくないプログラマがアプリケーションを作るのに使うようになり、結論を言うと彼らは十分な能力がなく、ちゃんとやることができないのです。C は本当に優れたシステムプログラマには完璧な言語なのかもしれませんが、あいにくとあまり優れていないシステムプログラマやアプリケーションプログラマが、使うべきでないのに使っているのです。」
現在、高機能化したスクリプト言語が普及しているのは、よい傾向なのかもしれない。例えば、ガベージコレクションのような機能があるだけで、つまらないストレスから解放される。
一方で、C++ の普及はどうであろうか?多くの大学で C++ を採用したオブジェクト指向を教える講義がある。そもそも、こいつはオブジェクト指向言語なのか?C++ の実装の特異性や奇妙さを、いったいどうやって区別させるのか?クラスベースの言語は、ちと静的過ぎる感がある。大きなクラス階層があると、わざわざ分解してまで使う気はしない。だからといって、動的な言語を用いると、至る箇所でその場しのぎをやってしまうのだけど...
ザウィンスキーは、C++ テンプレートが大好きというような人には近づかないようにしていると言っている。フィッツパトリックは、C++ を少し擁護しているが、なるほど...
「個人的には、少なくとも C++ で scoped_ptr みたいなものを使っている限りでは、自分でメモリ管理することも特に煩わしいとは思いません。new も delete も書くことなく何日も C++ を書いていることができます。」
志の高いプログラマにしか手を出してはいけない領域というものがあるのだろう。思想に優れた者しが踏み込んではいけないシャングリ・ラのような聖地が...

2. デバッグの流儀
最近のスクリプト言語は、動的メモリまで言語システムが管理してくれるので、print 文で大方の現象は掴めるだろう。だが、システムに近い領域ほど、実際に何が起こっているかを知る必要がある。言語システムが十分優れたデバッグ機能を具えているとすれば、わざわざ余計なコードを埋め込む必要はあるまい。よって、用いる言語系と、システムとの距離によって、デバッガ派と print 文派に分かれることになりそうだ。実際は、いろんな手法を組み合わせるのであろうが...
テストにおいては、誰もが怠け者になりがちである。最も厄介なのは微妙に動いているように見える現象で、おまけに放置されがち。そこで、assertion を埋め込んで、不変条件を自動チェックするといった考え方も有効である。おいらはこの思想が好きだ。
print 文派のアームストロングは、こう言っている。
「プログラミングの偉い神様が言っています。汝プログラムの間違っていると思われる部分に printf 文を置いて再コンパイルし実行せよ...
"ジョーのデバッグの法則"というものがあります。それは、すべてのバグは最後にプログラムを修正した箇所からプラスマイナス3ステートメント以内にある、というものです。」
そもそも、デバッガの吐き出す情報が正しいのか?という問題もある。デバッガが関与する時点で、物理的なタイミングのズレが生じ、不安定な動きをすることもある。したがって、検証においては、検証環境をも含めたデバッグを心掛けるようにと、おいらは周りの連中に指示している。そのためには、必然的にシステムを理解する必要があり、それが真の意図だけど...

3. 純粋関数型と静的型付け
関数プログラミングとオブジェクト指向プログラミングでは、どちらが生産的か?という議論をよく見かけるが、宗教論争に映る。ここでは、ジョーンズがもう少し突っ込んだ観点から純粋関数型言語の魅力を語ってくれる...
関数型言語の始まりが、ギーク的で数学的であることは想像に易い。尚、ここで言う関数とは、多くの手続き型言語が採用している関数とはかなりイメージが違う。少なくとも副作用がない。アーサー・ノーマンは、副作用のまったくない二重連結リストを構築する方法を示したという。二重連結リストを作ろうとすれば、セルを割り当てて互いに指すような仕組みが必要で、どこかに副作用が生じそうなもの。だが、純粋関数型言語ならば、副作用なしにそれを実現できるという。デビット・ターナーという人の論文に、SK コンビネータについてのものがあるそうな。SKI なら聞いたことがあるが。ラムダ計算を変換して実行する一つの方法で、I は SKK と等価で取り除くことができるらしい。任意の複雑なラムダ項を、なんらかの変換ステップによって、S と K の項に置き換えられるのだとか。この得たいの知れない S や K のコンビネータが実装できれば、任意の演算モデルが実装できるってか。にわかに信じがたい、まるで魔法のような抽象化演算モデル。純粋関数型言語とは、純粋数学言語のようなものであろうか?数学も言語であることに違いはない。この発想は、まだノイマン型アーキテクチャの領域に留まっているのだろうか?純粋な関数にできることは、答えを返すことがすべて。根本的に呼び出すというプロセスは必要ないってか。だから、カッコだけでつなぐ Lisp のような構造も可能となる。だが、Haskell はそんな次元ではなさそうである。
とはいえ、評価するプロセスは必要だし、評価した結果を出力するのがコードのすべてだ。つまり、応答した遅延評価を扱うことが、入出力の問題となる。ここで言う「純粋」というのはどういう意味であろうか?極めて強い静的な型ということらしいが... ん~、難しい!
ところで、プログラミング言語には、データ型というものがある。これが言語の本質だと思うから、言語リファレンスを読む時は必ず型の章から始める。ちなみに、Perl のような言語に触れると、型なんかお構いなしって感じで、やはりクレイジーに映る。むかーしは型が厳密でない言語を扱う気がしなかったものだが、近年は適度に融通が利く言語を好む。ジョーンズは、ほとんどのプログラムは静的型で書けると主張する。保守の面で素晴らしい恩恵があると。
「依存型プログラミングをやっている人たちは言うでしょう。型システムは究極的にはすべてを表現可能にすべきだと。しかし型というのは奇妙なところがあって、コンパクトな仕様言語のようなものです。型は関数についてなにがしかのことを言いますが、頭の中に一度に入れられないほどたくさんのことは言いません。だから型について重要なのはそれが明快なことです。」
なるほど、型が関数の抽象化をなしているという見方はできそうか。データ型を適切に定義するだけで、そのプログラムが何をするものかについて、かなりの事を語ってくれる。全体像として型を書いて、型が済んだから次はコードを考える、という2段階のプロセスではない。整理する順番は二段階だとしても、型の検討中にスケッチ用のコードを同時に書いている。型設計そのものがプログラム設計であるという発想は、まったく同感である。

4. 並行プログラミングとソフトウェアトランザクショナルメモリ
ジョーンズは、STM が世界を救うほどのものではないが、ロックや条件変数を使う方法よりマシだと言っている。複数のプログラムカウンタ、マルチスレッド、マルチコア上で共有メモリを使うぐらいなら、STM の方が優れていると。
ロックベースのプログラムは、競合を最小化するためにロックを保持する期間を最小限にしようとするだろう。だが、細かい粒度のロックはうまくやる事が難しい。この点で STM が大きく優っているらしい。非常に細かいロック並みの粒度を、シンプルな原則で手に入れられるという。STM の推論原理では、トップの不変条件を設定すれば、後は逐次処理で推論できるらしい。例えば、銀行口座の残高を管理する場合、取引トランザクションの開始時と終了時で不変条件が成り立つようにすれば、推論では逐次的であっても、引き出そうが、預けようが、トランザクションは分離できるという考え方である。
となれば、トップレベルの不変条件の設定が鍵となりそうである。トランザクションの前後を矛盾なく設定する必要がある。また、トランザクションの途中で例外が生じても、それを破棄して不変条件は絶対に破壊されないようにする必要がある。並行処理にもかかわらず、命令型のコードに対してシーケンシャルに推論できると言っているようだが、ほんまかいな?やはり用途によりそうだ。
いずれにせよ、ロックマネージャのようなヤツが、データベースの中で最も物々しい存在となりそうだし、あるデータがロックされて、アクセス不能になるといった現象は、STM でも生じそうな気がするけど...

5. 文芸的プログラミング
文芸的プログラミングの提唱者といえばクヌースだが、当人は趣味みたいなものだと言っている。いずれにせよ、これが最高のものという証明はできまい。考え方のセンスだから、うまくやる人とそうでない人もいるだろう。
クヌースは、文章を書くためのルールを二つ挙げている。一つは、読者を理解すること。二つは、技術的な文書という条件付きで、すべてを二通りの仕方で補うように書くこと。だから、通常の技術文章は冗長性があるという。へー...
確かに、一つの事を違った視点から語るだけで、頭の中に入ってきやすい。文芸的プログラミングは、コードを書いた後にドキュメントを書くといったものではなく、両方を同時に書くようなもので、そこにはコードがあるだけでなく、ドキュメントが共存することになる。優れたコードを読む楽しさは、優れた小説を読む喜びに似ている。
スティールは、C の欠陥は文芸的プログラミングツールをもってしても克服するのは難しいことだと言っている。Common Lisp 用の文芸的プログラミングツールがあれば、きっと早く飛びつくだろうと。
しかし、文芸的プログラミングの魅力を認めつつも、現実にコードに反映することは難しいという意見もある。トンプソンは、二つの書き方があるなら、片方は間違っていると指摘している。正しいのはマシンが実行する方だけと。ノーヴィグは、こう言っている。
「クヌースのオリジナルの"文芸的プログラミング"の論文を読むと、彼が本当に言おうとしているのは、"本を書くための最良の順序は何か"ということで、本全体が読まれることを前提としており、それが論理的な順序になるようにしようと考えています。みんな今ではそのようにはしていません。本を読みたいとは思っていなくて、インデックスを求めているのです。"読まなければならない最小限の部分はどこだろう?必要な3段落だけを見つけたい。それを示してくれ!"これは大きな変化だと思います。」
圧倒的多数はそうだろうが、中には一冊を隅々まで目を通したいという貧乏性の読者もいる。ここに。やはり好みの問題であろう。逆に、上辺だけを拾って回る読者を締め出すには良い方法とも言えそうか。実際、技術文書ってやつは、読者の理解よりも数学的な厳密性が優先されるもの、という見方をする人が多い。だから、なるべくコンパクトに書きなさい!とよく叱られる。誤解されないように意識すると、どうしても補足的な記述を加えずにはいられない。おまけに、酔っ払いはお喋りときた。なによりも自分に分からせようと書いている。このブログにしても、対象読者は十年後の自分だ。ただ、数ヶ月後に読み返すと既にチンプンカンプン!文芸的プログラミングへの道は遠すぎる。はぁ~...

6. 過剰なブラックボックス化
ライブラリを自分で書けないなら、やることはライブラリを呼び出すだけになる。ライブラリの使い方を丸暗記することが仕事になるのでは、寂しい!数学書には証明がいっぱい詰まっているが、用途にピッタリとはまる定理がなかなか見つからない。ライブラリにも似たような事情がある。
おまけに、お偉いさんには、とんでもないライブラリを強制する性癖がある。黒幕の潜むブラックボックスは、いつも悪臭が漂う。根拠のないスケジュールの短縮という思想に憑かれると、マイルストーン上に何かが埋まっているだけで仕事をした気になれるらしい。再利用の効果を過剰に強調すれば、なんでもブラックボックスに頼ろうとする。それで責任転嫁できればOKってか?設計哲学の合わないライブラリやブラックボックスを組み合わせれば、奇妙な設計資産を量産させるだろうに...

7. 民主主義の在り方
スティールの言葉は興味深い。
「Lisp は容易に成長してきた言語の例だと思います。そのマクロ機能の柔軟性のためです。またある程度までは、それを作ったグループの社会的な姿勢のためでもあります。
それと対照的に、Scheme はもっと苦難の道をたどっています。そのある部分は、Scheme コミュニティが初期において全員、ないしはほとんどの人が同意するのでない限り何も言語に付け加えないという文化を発展させたためです。反対投票の文化なのです。
一方で、Common Lisp のほうは多数であればみんなを満足させるに十分という文化です。人はほかのものを手に入れるためなら、そう熱烈に好きでないものも受け入れるのです。」

2014-06-29

"数について" Richard Dedekind 著

かつて、数(かず)というものに対して、ここまで率直に考えさせられたことがあったであろうか?その最も単純な概念は、「より大きい、より小さい」という関係で言い尽くせる。リヒャルト・デーデキントは、有理数の最も重要な性質をこう述べる。
「順序よく整った集合体で、二つの相反する向きに無限に延びた一次元の領域を作っていること。」
そして、「切断」の概念を用いて数の連続性を規定し、無理数の正体に迫ろうとする。連続性を規定できる便利な道具といえば、微積分であろう。微積分の導入時に幾何学的な直観に助けを借りるのは、幾何学と連続性の相性の良さを示している。だが、デーデキントは、連続性に対する科学的見地が甘いと指摘する。
「科学においては証明なしに信頼すべきではない。この要請がこんなにも明白であるように思われるのに、私の信ずるところでは、最も単純な科学、すなわち数の理論を取り扱う論理学の部分の基礎を研究するに当ってさえも、最近の叙述によってさえも決して満たされているとは見なせないのである。」
彼の言う科学とは、ユークリッド原論が幾何学の公理と証明を示したように、代数学にも同様な要請をすることであろう。実際、本書は集合の観点から公理的に語り、集合論こそが数の概念の抽象化した姿であることを実感させてくれる。集合論の創始者と言えばカントールであるが、デーデキントの貢献が大きいことは言うまでもあるまい。
尚、本書には「連続性と無理数」と「数とは何か」の二篇が収録される。

数論とは、「数える」という最も単純な行為から発する必然的な結果であろう。だから、整数論とも呼ばれる。人間が思考する数の性質は、極めて離散的である。しかし、数を図形で表そうとすれば、直線や曲線などの連続性に支配される。はたして精神空間において、離散性と連続性のどちらが居心地良いであろうか?おそらく適度な連続性ということになろう。忌々しい出来事にはアルコール濃度で忘却の渦に連続性を絶ち、小悪魔とのひとときには永遠の連続性の中で夢想を続ける。
ピュタゴラス教団は「万物は数である」という思想を崇拝し、すべての数を自然数で規定しようとした。分数を定義すれば、分子と分母を限りない自然数で規定でき、どんな二つの有理数の間にも第三の有理数を埋めることができる。二つの有理数の間には必ず大小関係が生じ、これを数学者は「全順序集合」と呼ぶ。そうなると、有理数で数直線上のすべての隙間を埋め尽くすことができる、と信じたのもうなずける。だが、聖なる正方形の対角線に √2 という異様な成分が紛れ込んでいることを知ると、彼らを動揺させた。
一方で近代数学が、このような数の信仰に憑かれていないと言い切れるだろうか?最新鋭のコンピュータをもってしても、実数演算には冪乗の壁が立ちはだかり、実際、分子と分母の関係から便宜上の近似値を与えているではないか。アルキメデスは、円に内接する多角形と外接する多角形の関係を考察し、円周率が 22/7 と 223/71 の間にあることを見出した。もっと良い近似値では、355/113 で代用される。
確かに、数学は有理数では表せない数があることを証明した。だがそれで、無理数の意義まで知ったことになるのだろうか?無理数とは、ピュタゴラス教団が唱えたように理性を失った状態なのだろうか?自然数によって世界のすべてを表そうとする古代人たちの野望は途絶えた。自然数の欠点は、減算や除算を行うと答えが自然数の系からはみ出すことにある。算術によって系が閉じられない現象は、数の概念を整数、有理数、実数、複素数へと拡張させてきた。そこに集合論が結びつくと多項式までも呑み込まれ、体、群、環、イデアルへと抽象度を高めてきた。
しかしながら、どんなに数の概念が高度化しようとも、すべての数が大小関係によって規定されることに変わりはない。相対的な認識能力しか発揮できない知的生命体は、何かを認識しようとすれば何かと比較せずにはいられない。人間社会では、数の大小関係はそのまま地位の上下関係と結びつき、収入や資産や知識の量で競い合う。人間ってやつは、大小関係という意識に幽閉された存在というだけのことかもしれん...

そして、読み終えると、いつもの愚痴が蘇る...
現代数学では、実に多くの微分方程式が解けないという事情から、大小関係によって迫る方法が編み出された。ε-δ論法が、まさにそれだ。このヘンテコな理論が大学初等教育で扱われるのは、数学の偉大さに屈服させようという魂胆か。やはり、酔っ払いを落ちこぼれにするための陰謀であったか...

1. 無理数と称すべきか?無比数と称すべきか?
連続性の問題は古代からある。尤も、離散性という意識があったかは知らん。自然数を理性の象徴として崇めれば、数では表せない存在に困惑する。神は不完全な世界を創出したことになるのだから。古代人は、1 + 2 + 3 + 4 個の順に並んだ点の正三角形の配列を崇め、10 を宇宙秩序を表す完全な数とした。テトラクテュスってやつだ。尚、今日で言う完全数とは違う。
1 から 10 までの自然数には奇数と偶数が同数ある。ついでに、素数 {1, 2, 3 , 5 ,7} と合成数 {4, 6, 8, 9, 10} も同数ある。ちなみに、鏡の向こうには「十の時が流れる」という名を持つ野郎がいると聞く。ヤツはテトラクテュスの申し子か?いや!単に顔が赤いだけらしい。
それはさておき、{1, 3, 5, 7, ...} を平方に配列したものを四角数と呼び、{1, 4, 7, 10, ...} を五角形に配列したものを五角数と呼ぶ。そして、六角数、七角数... と続く。これらの配列の組は、三角数では自然数、四角数では奇数、五角数では初項 1, 公差 3 の等差数列となり、図形との関係を表す重要な数とされた。こうした発想から、無限級数が考察されるようになる。オイラーが解いたバーゼル問題を眺めれば、無限和が固定値に収束することに数論の神秘を感じる。その答えに円周率という無理数が含まれることがミソだ。
ピュタゴラスの和音理論による視覚と聴覚の調和は、数の哲学の真髄である。そして、宇宙は音響調和の元で構築されていると考え、真円の下で正多角形が崇められ、真球の下でプラトン立体が崇められた。そういえば、無理数という用語は邦訳の誤りという意見を耳にする。比で表せないから無比数とすべきだと。なるほど...

2. 代数学の意義
方程式の解を求めようとすれば、有理数に頼るだけではすぐに限界に達する。数学者たちの野望は、2次方程式、3次方程式、...、n次方程式へと向けられた。直線定規とコンパスによる作図法は、代数学では2次方程式の解に相当する。言い換えれば、3次方程式以上の解は幾何学的には求められない。それを人類が知ったのは17世紀頃。代数学には、直線定規とコンパスだけでは作図できない領域があり、その本質は、数では表せない数を探求することにある。もし円周率が有理数ならば、すべての図形は四角形に帰することになり、古代人は幸せを謳歌できたであろうに...
自然数にしても、実数にしても、特定の数の体系を崇めたところで、それは人間のご都合主義というもの。神は数の概念を区別しないはずだ。人間のできることと言えば、十分に大きいか、十分に小さいか、それを規定するぐらいであろうか...
「無理数の理論は、有理数の領域に生ずる現象に基づくもので、それに私は"切断"という名をつけてはじめて精密に研究したし、実数の新たな領域の連続性の証明でその頂点に達した。」

2014-06-22

"ピタゴラスの定理" Eli Maor 著

いまさら感のあるピタゴラスだが、あらゆる建築術の礎がここにあることに変わりはない。定理そのものの美しさは誰もが認めるところであろう。ただ、あくまでも直角三角形という特殊ケースを扱ったに過ぎない。
ところが、ちょいと変形してみると、何かの呪縛から解き放たれるかのように拡張性を発揮しやがる。三平方の定理や斜辺定理、はたまた鉤股弦の法など様々な呼び名があるように、内包される意味や解釈はいまだ広がりを見せる。幾何学だけでなく、代数的な解釈も豊富で、三角関数といった周期性と結びつくと、公式が無限にあると揶揄される。幾何センスがゼロの泥酔者には、対数螺旋やサイクロイドと結びつくだけで崇高な気分になれる。いや、目が回る。幾何学のバイブル「ユークリッド原論」I47(第I巻、命題47)にも記載される。尚、原論はあくまでも証明集であって、ユークリッド自身がどこまで証明をやってのけたかは不明だが...
証明法に至っては実に400を超えるとされ、本書は、幾何学的証明と代数的証明の分類や、最も短い証明と最も長い証明などの観点から、いくつかを紹介してくれる。ルジャンドルやアインシュタインによる証明、あるいは、プトレマイオス、ダ・ヴィンチ、アメリカ大統領J.A.ガーフィールド... など。無名少女アン・コンディットに至っては、大数学者たちが誰一人としてやらなかったことをやってのけた。定理が単純ならば、解釈も多く、乱用もしばしば。数学的な思考に、アマとプロの境界がないことを改めて意識させてくれる。
「答が宇宙なら質問は何か?はい、それは a2 + b2 = c2。それを証明する方法はおよそ400通りある。それでは他に何かいうことがあるか?たくさんある。なぜだかはよく分からないが、ピタゴラスの定理ほど多くの注釈、変種、応用、珍本を作り出した定理はかつてない。」

ピタゴラスの定理を言葉で表すと... 直角三角形において、直角をなす二辺の平方和は斜辺の平方に等しい... となる。お馴染みの代数的な記述は極めて単純!ちょいと見方を変えるだけで、こうなる。

  d = √(x2 + y2)

喫煙 x と深酒 y といった不摂生が平方で祟ると、寿命ディスタンス d は平方根で縮むという寸法よ。だが、このような形で表されるようになったのは16世紀頃で、ピタゴラスの意図したものではない。代数学には、これに似た恒等式が亡霊のようにつきまとい、ちょいと次元を増やしてみようかという衝動に駆られる。n次元に抽象化された「フェルマーの最終定理」が問題提起されたのは17世紀。オイラーは3次元に憑かれ、ワイルズによって解決されたのはほんの1994年のこと。既に2500年もの歴史がある。
しかしながら、ピタゴラスが最初の発見者ではない。少なくとも千年前にバビロニア人は知っていたし、中国人も知っていたと推測されている。インドにも証明の痕跡が見つかっているそうな。エジプト人も知っていたかもしれない。でないと、あれほどの精度でピラミッドを作るのは難しいはず。となると、実に4000年も遡ることに...
紀元前1800年頃のメソポタミア文明の遺跡は、一辺を 1 とする正方形の対角線の値 √2 のかなり高い精度の近似値を得ていたことを示しているという。「YBC7289(イエール大学のバビロニア・コレクション銘板番号7289)」には、傾いた正方形に2本の対角線の図形が描かれ、d = a√2 の関係を60進法の楔形文字で刻まれているとか。中国最古の数学書「周髀算経」にも、柱と影の長さに関する記述があるという。三辺(3, 4, 5)の説明図とともに。古代ギリシア人のお好きな「グノーモン」ってやつか。やはり人間は、自分の影を引きずりながら生きる運命にあるようだ...

結局のところ、数学とは思考の産物であろうか?自然の産物であろうか?人間とは独立した存在だとすれば、その記述は人間のご都合主義によって編み出されることになる。
ゲーテ曰く、「数学者に何を言っても、彼らは自分自身の言葉に書き換える。そしてそれは直ちに何かまったく違ったものになる。」
数学そのものが信仰や哲学から派生したものであっても、やがて純粋客観へ近づこうとする。ヒルベルトの時代になると、すべての現象は数学で完全に説明できるかに見えた。しかし、不完全性定理の登場で人間の野望は打ち砕かれ、哲学に引き戻された感がある。著者エリ・マオールはこう語る。
「私が考えるには、数学の本質は、型を探し、構成と規則性を探し、一見何の関係もないように見えるものの間の関係を探すこと、現実的であろうと抽象的であろうと問題ではない。この意味で芸術とまったく同質である。とくに音楽に近い。音楽では、ある主題の型、リズムの型が繰り返し繰り返し現れるが、それと同じように、ある代数式が数学のいろいろな分野で繰り返し現れる。」

1. ピタゴラス教団
若きピタゴラスが老師タレスに学んだ可能性は十分に考えられる。ただ、数学が極めて宗教に近い時代、いや占いの類いか。ピタゴラス学派は「万物は数である」という信仰を崇め、古代ギリシア哲学には数を幾何的に記述する伝統が育まれた。プラトンのアカデメイアの門には、「幾何学に精通せざる者、我が門に入るべからず!」と刻まれる。
さて、ピタゴラスの発見に音響学に関するものがある。弦の長さを半分にすると1オクターブ高い音が生じ、元の音と調和することに気づくと、和音の理論が構築された。音楽が数の法則に従うとすれば、宇宙もまた数に支配されると考える。天体運動を数学で説明できれば、天空の音楽理論が構築できる。彼らの数への執念が整数論を育んできた。調和平均、調和級数、調和関数なども、ピタゴラス思想の継承を感じる。
しかしながら、妥協のない数至上主義は、狂信的ですらある。対称美や調和を崇めるあまりに、物理学の進化を妨げた。天文学はあまりにも真円を崇めたために、現実世界が見えなかった。ピタゴラス学派は五芒星形の美しさに魅せられて紋章とし、古代ギリシア人はすべての算術を幾何的操作に頼る。積は面積で代替でき、平方根は対角線で代替できる。言い換えれば、作図不能な算術はできないことになる。ユークリッド原論もこの原則に従う。アルキメデスのような現実主義者は、あまり重要視されなかったのだろう。完全を崇めれば、不完全が見えなくなる。プラトン立体の美しさに憑かれ、やはり人間は美人に目がない。
ところが、聖なる正方形の対角線に √2 という無理数が存在すると知ると、整数にこそ理性の存在を認めていたピタゴラス学派を動揺させた。彼らは秘密主義を誓うが、ヒッパソスが世間に暴露しようとすると仲間たちに船から放り出された、という逸話が伝えられる。やはり、宇宙は... 社会は... 人間は... 適度に不完全とする方が健全なようである。

2. ピタゴラスの亡霊たち
ピタゴラスの定理の源泉を遡れば、バビロニア、中国、インドなど、実に多くの地で見かけることができる。しかし、ピタゴラスが一際輝いているのは、厳密な証明が残されるからであろう。ここに客観性の威力を魅せつける。
ちなみに、イライシャ・スコット・ルーミスという人が、著作「ピタゴラスの命題」で371個もの証明法を分類しているという。数学界では、あまり知られていない人物らしい。大まかに代数的証明と幾何的証明の二つに分け、さらに、四元数的証明と力学的証明に分けているとか。四元数とは、何のことはない。複素数(i)を三次元(i, j, k)に拡張した概念で、その特徴は乗法の交換法則が成り立たないこと。ハミルトンによって提唱されたが、今ではベクトル空間で抽象化される。非可換という性質が、物理現象を扱う上で都合がいいのだ。
さて、ピタゴラスの定理は、無限や微積分といった概念とも結びついてきた。無限級数といえば、リーマンのゼータ関数を思い浮かべる。

  ζ(x) = Σ(1/ns)

オイラーは、ζ(2) = π2/6 に収束すると宣言した。いわゆる、バーゼル問題である。無限和がある数に収束する上に、πという無理数が絡むところに神秘がある。だが、最初に無限積で表す公式を編み出したのは、16世紀のフランソワ・ヴィエトという人だそうな。

  2/π = Π xn, (1 ≦ n < ∞)
  ただし、x1 = √(1/2), xn+1 = √{(1 + xn)/2 }

本書は、これを導出する過程で、円周上を移動する直角三角形の頂点との関係を示してくれる。ピタゴラスの定理は、真円上で振る舞うと周期性と相性がいい。平方根は周期性と調和させるための概念、とするのは言い過ぎだろうか...

また、点(x1, x2)と、点(y1, y2)の間の線分の長さ s はこうなる。

  s = √{(x1 - x2)2 + (y1 - y2)2}

そして、ピタゴラスの定理の微分版がこれだ。

  ds2 = dx2 + dy2

さらに、対数螺旋やサイクロイドとも相性がよく、ちょいと座標系の視点を変えて、半径 r と角度θの関係からも規定できる。

  ds = √{(dr)2 + (rdθ)2}

双曲線正弦(ハイボリックサイン)や双曲線余弦(ハイボリックコサイン)など、実に多くの曲線で応用できる。ユークリッド言論、VI31(第VI巻、命題31)には、こう記されるという。
「任意の直角三角形において、二つの辺の上に立てられた円の面積の和は外接円の面積に等しい。」
つまり、直角三角形の辺の上に立てる図形は、正方形である必要はないということだ。相似形にさえなれば、多角形でも、円でも、それ以外の任意の図形でもいい。図における、面積Aa, Ab, Ac の関係は、こうなる。

  Aa + Ab = Ac






「ヒポクラテスの月」と呼ばれる図形も、ピタゴラスの亡霊に憑かれている(下図)。中心O、半径OA(= OB)の円の4半分OABにおいて、ABを直径とする半円を描くと、外側に三日月の領域ができる。そして、その面積は三角形AOBと同じになる。円周率と関係しそうな面積が、二等辺直角三角形で代替できるとは...




ピタゴラスが周期性に囚われると、平方根 √1, √2, √3,... もまた螺旋状に幽閉される(下図)。





3. ピタゴラスと相対性理論
三次元座標系の原点にある光源から球面波が放出され、光速 c で伝播して時間 t 後に点(x, y, z)へ達するとすると、

 x2 + y2 + z2 = c2t2

これは、観測者が点(x, y, z)にいる場合で、別の観測者が一定の速度 v で動きながら点(x', y', z')にいるとすると、空間次元 + 時間の座標系において以下の関係がある。

  x2 + y2 + z2 - c2t2 = x'2 + y'2 + z'2 - c2t'2

ここで注意すべきは、c にはダッシュがつかないこと。光速はどんな観測系でも一定だから。相対性理論は、なんといってもローレンツ変換が基本!座標系(x, y, z, t)と座標系(x', y', z', t')への変換はこうなる。

  x' = (x - vt)/√(1 - v2/c2)
  y' = y
  z' = z
  t' = (t - (v/c2)x)/√(1 - v2/c2)

ここで、√(1 - v2/c2) は特殊相対性理論の中核をなしている。アインシュタインの有名な公式は、E = mc2 の形で知られるが、実はこうなるわけだ。

  E = {m/√(1 - v2/c2)}c2

4. ピタゴラスの3数
ピタゴラスの3数とは、直角三角形の三辺が(3, 4, 5)になるような整数の組のこと。二つの整数(u, v)において、u > v で、 u と v が互いに素(共通因数を持たない)で、偶奇が逆である時、整数 a, b, c において、

  a = 2uv, b = u2 - v2, c = u2 + v2

が成り立つならば、既約なピタゴラス3数をなす。
また、二つの平方数の和にも不思議な関係があることを紹介してくれる。二つの平方数の和とは、こういうもの。

  2 = 12 + 12, 5 = 12 + 22

そして、次の定理が成り立つという。
「正の整数 a が二つの平方数の和となるのは、a ≡ 3 (mod 4) でないときだけである。すなわち、a を 4 で割った時のあまりが 3 にならないときだけである。」
もっとも、これが与えられるのは、1つの数が二つの平方数の和であるための必要条件で、十分条件ではないとしているが。
3 という数に何か意味があるのか?それとも、mod 4 の方に意味があるのか?必要十分条件の方は、こうなるという。
「ある整数 a が二つの平方和であるための必要十分条件は、a の素因数分解の中に 3 に mod 4 で合同な素数が偶数回登場することである。」
そして、完全平方数が二つの平方数の和である時、ピタゴラスの3数(a, b, c)が得られるという。

2014-06-15

"天秤の魔術師 アルキメデスの数学 " 林栄治, 斎藤憲 著

前記事「解読! アルキメデス写本」では、歴史の面から数学の醍醐味を味わった。今宵は、もう少し専門的に突っ込んで、アルキメデスの考え方や意図といったものを味わうことにしよう。ギリシア数学は、一般的に命題と証明という形で書かれ、その代表に「ユークリッド原論」がある。証明に至った思考プロセスについては、ほとんど触れられないために、数学は無味乾燥な学問とされがちである。
ところが、アルキメデスの著作の中でも「方法」だけは異質で、思考プロセスが記述されるという。彼の著作群が残される写本は、ヨハン・ルーズヴィー・ハイベアによってA写本、B写本、C写本と名付けられ、9世紀から11世紀頃、東ローマ帝国(ビザンチン帝国)のコンスタンティノープルで作成されたとされる。A写本とB写本は、古くから発見され、ルネサンス期の巨匠たちの目にも触れたようである。
一方、C写本が発見されたのは、1906年と新しい。おまけに、一度行方不明になりながら、1998年クリスティーズのオークションに再出現したという謎めいた経緯がある。アルキメデスの「パリンプセスト」と呼ばれるが、あくまでも中身は再利用された祈祷書であって、C写本は上書きされた中に埋もれていた。そのために当初、貴重なものとは見なされなかったようである。著作「方法」は、このC写本にのみ記載されるという。本書は、この「方法」の解説を中心に据えながら、アルキメデスの思考原理がニュートンやライプニッツより二千年も先んじていた可能性を匂わせてくれる。

人間の叡智は、いかに無駄なプロセスを辿ってきたことか。その多くは宗教戦争や政治紛争の類いで抹殺されてきた。古代知識の宝庫であったアレクサンドリア図書館は何度焼かれたことか。あるいは、結論だけ知っていても、それを存分に使いこなせなければ、無駄な知識に終わる。知識とは、なんらかの目的や欲望から生じるものであろう。それを編み出す過程の奥に秘められた哲学を学ぶことは、知識を深遠なものにするとともに、応用力を高めることになる。
しかしながら、発見や思考のプロセスが疎かにされるのは、いつの時代も同じ。現在とて、管理職にある者は結果ばかりを求め、目先の解決策を示さなければ発想力がないと愚痴を垂れる。人の考えを発展させて自分で具体化しようとしないとなれば、どちらが発想力がないのやら?人は皆、面倒臭さがり屋よ。近道をしようとすれば、却って遠回りをする。しかも、そのことに気づかなければ幸せになれるという寸法よ。それでも、いつも道草ばかりで、はしご酒する酔っ払いよりはマシか。
それはさておき、アルキメデスが既知の理論の発見法を残してくれるのは、学問に対する姿勢が伺える。研究者の中には、この時代、純粋に真理を探求するのではなく、相手を蹴落とすために論理武装し、成果を最大限に見せることにしのぎを削っていた、とする意見もあるらしい。今もあまり変わらんような...
肝心な箇所の記述が欠落していることが、「アルキメデス意地悪説」をくすぶらせる。「方法」の序文には、挑戦的な一文があるという。
「アレクサンドリアにいる君たちや将来の学者に、私の方法を利用するだけの能力がありますかな。」
これは、皮肉であろうか?あるいは、次世代の研究者に託した言葉であろうか?

注目したい思考法は、比例関係を重視していることである。ギリシア数学の理論体系は、面積や体積を表す公式を導くことではなく、既知の身近な図形との比較によって大きさの関係を明らかにすることだった。実際、ユークリッド原論やアルキメデスの著作の中に、三角形の面積が底辺掛ける高さ割る2、などというお馴染みの公式を見つけることはできない。せいぜい、平行四辺形は三角形の2倍、といった定理を見つけることぐらい。そこで、相似形や等積定理といった概念が鍵となる。
最も重要な概念は、図形の切り口とその総和の関係を、つり合いの原理に持ち込んでいることである。細かく刻んだ図形を足し合わせとして眺めれば、自ずと重心が計測でき、物事の関係が見えてくる。本書は、この思考法を「仮想天秤」と呼んでいる。面積の切り口は直線となり、体積の切り口は面となり、アルキメデスは次元を落とす術を知っていたことになる。次元という意識があったかどうかは知らんが、おそらく比を問うことで代替しているのだろう。積分的思考とは、総和という思考で代替できる統計的観測というわけだ。
「方法」の対象では、放物線、楕円、双曲線といった円錐曲線の議論を避けることはできない。やはり、基本図形は三角形であろうか。もっと言うなら、底辺と高さの関係、すなわち対象までの距離の考察である。三角形の一辺を軸に回転させれば円錐ができる。いきなり命題1には、放物線の回転体と円錐の関係が示される。
「放物線のすべての切片は、同じ底辺と等しい高さをもつ三角形を3分の1だけ超過する。」
ところで、物理学にはモーメントってやつがある。支点からの距離と重さの積で表される物理量だ。モーメントの和が支点の左右で等しくなれば、物体はつり合うと考えることができる。対して、アルキメデスが利用しているのは、距離と重さの逆比例関係であり、まさに天秤の原理だ。立体の重さの比を、天秤の支点との距離という直線の比で測る。つまり、求積問題が、一次関数の問題に置き換えられている。なんと、導関数という概念を自然に取り入れているではないか。重心を求めることが、回転体の体積比を求めることになるという寸法よ。なんでも吊るしちゃえ!なんでも回転させちゃえ!という思考実験こそが、アルキメデスの思考原理であろうか...

1. 「方法」という表題
「方法」と呼ばれるのは、ハイベアが校訂版を出版する時、ラテン語のタイトルを「Methodus」としたからだそうな。ギリシア語の「メトドス」に由来し、英語の method に相当。ギリシア語写本の表題は「エフォドス」というらしい。どちらも「道」を意味する「ホドス」に前置詞がついた語だという。ただ、微妙なニュアンスの違いがあって、エフォドスは、アプローチ、入り口、攻略といった意味があって、メトドスは、体系的方法という意味があるとか。デカルトの「方法序説」を真似て、体系的方法を好んだ時代でもあろうか。
しかも、エフォドスという語は、標題にあるだけで、本文中には一度も出てこないという。アルキメデスは、「トロポス」という語を使っているそうな。英語では、way と訳される。なるほど、「方法」というより、「やり方」あるいは「道」と言った方がよさそうである。現代風に言えば、攻略本といったところであろうか...

2. アルキメデスの比例論、いや、つり合い論
「方法」の導入部は、序文と、その後に続く11個の補助定理で構成されるという。その記述は、重心とつり合いの関係がかなり意識されていることが伺える。
例えば、円錐や円柱や角柱といった図形の重心と中点の関係を述べたり、二つの量に対して合計の重心と各々単独の重心の関係を述べたり、任意の個数の重心が同一直線上にあるならば、合計量の重心も同一直線上にあるとしたり... 複数の比例関係から対応する項の和をとっても比例関係が成り立つ条件を述べるという形で、記述が始まる。
そして、最初の命題1には、アルキメデスの基本的な思考が表れている。まず、放物線の切片ABGをとる(下図)。AGは、必ずしも軸に垂直である必要はない。Gにおける接線GZを引き、Aを通って放物線の軸DEに平行な直線AZを引く。そして、AG間の任意の点Cを通って軸DEに平行な直線COMを引く。




すると、以下の比例関係が成り立つという。

  CM : CO = AG : AC

この関係は直観的に想像できる。アルキメデスはこの証明のために以下の図形を設定しているという。放物線の性質より、DB = BE となる。直線GBを延長して、GK = KQ となるようなQをとる。そして、三角形AGZと、三角形ABGのつり合い関係を観察する。
「放物線の切片ABGを点Qに移すと、もとの位置に残した三角形GZAと点Kに関してつり合う。」




3. 球の切片
命題2で現れる球の体積は、アルキメデスが最も誇りをもった成果であろうか。というのも、墓に刻まれた。

  V = (4/3)πr3

アルキメデスは、これを二つの表現で示しているという。
「球は、その大円を底面としその半径を高さにもつ円錐の4倍である。」
「球の外接円柱は、この球の1倍半に等しい。」
内接円錐、半球、外接円柱の体積比を眺めるだけで、アルキメデスがこれらの図形に魅了された気持ちが分かる。

  円錐 : 半球 : 円柱 = 1 : 2 : 3

さて、おいらを魅了するのは命題7の方だ。この法則を眺めるだけで、本書に出会った甲斐があるというもの...
命題7の主張は、こうだ。
「球の半径r、切片の軸をh、切り取られた切片の軸をh'とすると、球の切片ABDは、これに内接する円錐ABDに対して、次のような比例関係を満たす。」

  切片ABD : 円錐ABD = (r + h') : h'




直観的にはもっともらしいが、ほんまかいな???
これを積分法で計算してみる。球の切片軸上の任意の点Sにおいて切断する(下図)。




この時、円の方程式は中心点O(r, 0) において、

  (x - r)2 + y2 = r2
  y2 = 2rx -x2

切断面の面積S(x)は、

  S(x) = π(2rx - x2)

切片ABDの体積Vは、

  V = ∫S(x)dx
    = π∫(2rx - x2)dx = (1/3)πh2(3r - h), ただし、(0 ≦ x ≦ h)

次に、内接円錐ABDの体積をV'、底辺の半径をRとすると、

  R2 = 2rh - h2

であるから、

  V' = (1/3)πR2h = (1/3)πh2(2r - h)

よって、

  V : V' = (1/3)πh2(3r - h) : (1/3)πh2(2r - h)
         = (3r - h) : (2r - h)

さらに、2r - h = h' だから、

  V : V' = (r + h') : h'

なるほど、安心して眠れそうだ!

4. 爪形と交差円柱
アルキメデスが扱った図形で、もう一つ興味深いものがある。しかも、主役のような扱い。
正方形を底面とする角柱とこれに内接する円柱において、下底面の直径と上底面の一辺を通る斜めの平面で円柱を切断すると、半円、半楕円、円柱の側面に囲まれた爪形図形が切り取られる。




アルキメデスの主張はこうだ。
「爪形の体積は、外接する四角柱の6分の1に等しい。」
なぜ、こんなヘンテコな図形に憑かれたのだろうか?この図の摩訶不思議なところは、縦にスライスすると、直角二等辺三角形が大きさを変えながら移動することだ。つまり、縦横の比が常に同じということ。その求積手順は、まず命題12と13で仮想天秤によって決定され、命題14では天秤を利用せず、無限個の平面の切り口から同じ結果を得て、ようやく命題15で外接図形と内接図形の関係から厳密な証明が与えられる。命題14には、無限小という概念が用いられ、それを正当化しようとする工夫が見られるという。ただし、欠落部分が多いとか。んー、残念!

命題12では爪形と半円柱のつり合いが、命題13では半円柱と三角柱のつり合いが論じられる。垂直にスライスしながら、三角形の集合体として捉えて重心を求めるといった具合に。この際スライス方向は、平行だろうが垂直だろうが、どっちでもよかろう。思考法の問題なのだから。
さらに、本書は球との関係を指摘している。この関係は、今まで見落とされてきたと指摘している。
「爪形と球は、同じ相対質量分布をもつ。」
また、命題14では、「不可分者」という用語を用いて解説される。この用語は、17世紀、カヴァリエーリが名づけたものだそうで、著作「不可分者による連続体の幾何学」で使った言葉だという。ここでは、三角形の面積を求める時、底辺に平行な直線で上から下までスライスするようなイメージで、直線の比を議論の対象とする。無限分割の連続体として捉えている。
では、無限個の切り口を、どうやって足し合わせたのか?アルキメデスの求積の議論では、体積や面積をいくら細分化したところで質量のある物理的イメージは残される。
ところが、命題14だけは、厚みや幅のない切り口によって思考される。2001年に明らかになったことは、なんと無限個の切片に対して「個数が等しい」という言葉を用いているとか。そのために、古代ギリシア数学において、実無限という概念を使用していたという可能性が注目されているという。二次元の面積を、直線の比という1次元関数に置き換え、三次元の体積を、三角形の比という2次関数に置き換えているとすれば、被積分関数を変形して積分するというイメージが出来上がっている。
しかしながら、補助定理では有限個の項に適用され、無限個の項に利用するのには、ちと無理がありそうだ。アルキメデスが、無限を正当化しようとした努力は想像できても、厳密な水準に達しているとは言い難いようである。命題14の意義は、つり合いの原理だけでは、無限個の項を扱うことに限界を感じたということであろうか?
では、なぜ、ここだけ都合よく情報が欠落しているのか?わざとか?序文の皮肉が甦る。

また、命題15で紹介される思考法は、ちと抵抗がある。というのも、あの忌々しいε-δ論法に映るからだ。そのイメージは、三角柱P、爪形Uとすると、次の三つのパターンで最初の二つが矛盾し、3つ目が成り立たざるを得ない、という具合に議論される。

  U > (2/3)P, U < (2/3)P, U = (2/3)P

本書は、これを「二重帰謬法」と呼んでいる。残念ながら、命題15も途中で終わっているらしい。既知の情報から比較関係によって迫ろうとする思考法は、解けない微分方程式の前で大小関係によって迫る考えにも似ている。おいらを数学の落ちこぼれにした野郎だが、その幾何学版にも映るわけだ。
さらに、球、交差円柱、爪形の共通性へと議論が進む。そこで、ちょいと三つの図形を重ねて描いてみると...




爪形の図形は円柱からも描けるし、交差円柱の交差する部分の球からも描ける。爪形の図形とは、差分の考察に用いようとしたのだろうか?残念ながら、交差円柱の証明も失われているそうな。

2014-06-08

"解読! アルキメデス写本" William Noel & Reviel Netz 著

TED.comを散歩していると、ウィリアム・ノエルという人物の講演を見かけた。それは、アルキメデスの写本に関するもの。アルキメデスの偉大な著作群は辛うじて三つの写本によって伝えられ、学術的に、A写本、B写本、C写本と呼ばれる。A写本とB写本は、ダ・ヴィンチやガリレオといったルネサンス時代の巨匠たちの目にも触れたようである。
しかし、この二冊は姿を消した。B写本は、1311年ローマ北のヴィテルボ市の教皇図書館で確認されたっきり、A写本は、1564年イタリアのとある人文主義者の蔵書として記載されていたのが最後だそうな。
そして、歴史の舞台に新たに登場したのが、C写本。1906年ヨハン・ルーズヴィー・ハイベアによって見出された。アルキメデスの「パリンプセスト」と呼ばれるヤツだ。ハイベアという名はユークリッドの「原論」でも見かけたが、ギリシア数学のほとんどの文献を校訂した人物。1988年、ニューヨークでクリスティーズの競売にかけられ時には、ハイベアがほぼ解読済で新たな発見はないだろうと目されていたようである。220万ドルで落札した匿名の人物は、引退しつつあるIT長者で「ミスター・B」という名で紹介される。ちなみに、ビル・ゲイツではないらしい。なぜかホッ!
早々、ウォルターズ美術館の学芸員ノエルが代理人を通じて接触すると、この大富豪も学術調査を依頼するつもりだったらしく、大乗り気だったという。しかも、惜しみなく資金を提供したとか。多くの偉大な著作が、政治的思惑や宗教的活動によって抹殺されてきたというのに、歴史の役割をよく心得た方の手元に渡るのは幸運この上ない。
ノエルは、まずスタンフォード大学のギリシア数学研究者リヴィエル・ネッツを迎え、世界中から様々な分野の専門家を動員し、解読プロジェクトを結成する。だが、20世紀の研究者たちは薬品を使いまくり、既に状態は最悪。21世紀の光学技術、情報工学、画像処理アルゴリズムなどを駆使することに。本書は、プロジェクトの視点からノエルが、数学の視点からネッツが、章ごとに交互に綴る冒険物語である。一つの目的のために結集する様子は、これぞプロ集団!ボランティアの真髄を感じずにはいられない...

尚、アルキメデスのパリンプセストについては、一年前にも記事にした。斎藤憲著「よみがえる天才アルキメデス」で。立ち読みしていると、飄々とした文面と妙に波長が合い、つい買ってしまったことを覚えている。本書でもケンと呼ばれ、当代きっての数学史家の一人として紹介される。これほどの権威者だったとは知らなんだ。改めて座り直し、心して読み直さなければ...
そもそも、世界中のギリシア数学研究者は20数人ぐらいしかいないそうな。業界で認められた人物という意味であろうが。この分野では、現代西洋語はもちろんギリシア語やラテン語といった古代語まで造詣の深さが求められる。おまけに、歴史の意義を知り、数学の専門知識を要するとなれば、数が絞られるのも当然であろう。斎藤氏は本書の解説も手がけており、照れくさそうに語る文面が、またいい...

さて、アルキメデスの功績は枚挙にいとまがない。
まずは、重心の意義について綴ってみよう...
長らく古代人たちを悩ませてきた問題に、重力の謎がある。地上の物体が地面に落ちるのに、星々は落ちてこない。それどころか、天空で永遠に円軌道を描いてやがる。大地には、何か隠れ住んでいるヤツがいて、落ちるものを選りすぐっているとでも?哲学は大地と対話し、天文学は天空に問いかけ、数学は神の仕業を説明する道具とされた。
しかしながら、アルキメデスの数学は異質だ。神の仕業を問うどころか、人間の実用的な道具とした。アルキメデスがシラクサの戦いで用いた投石機は、ローマ軍の度肝を抜いた。投石機の原理はもっと古くからあったが、ローマ軍が面食らったのは、正確な照準と射程調整にあったという。まさに応用数学の威力というわけだ。人間が地上で実用的な科学をもたらすには、重力と対話しなければならない。アルキメデスの功績の中心は、重力をめぐってのものと言ってもいいだろう。
そこで、三角形の重心が基本的な思考を組み立てる。あらゆる図形は、三角形で分割できる。曲線も、底辺と高さという属性を持った丸みと捉えれば、永遠に三角形で埋め尽くせる。そして、一つの三角形の重心が求まれば、これらの総和によってどんな図形でも、重力と釣り合う点が得られるという寸法よ。ここには造船技術の基礎がある。有限総和の思考こそが無限数学の扉を開き、無限数学こそが実世界を記述する応用数学へと導く。
さらに、円錐の意義についても綴ってみよう...
円錐に魔力を感じる人も少なくないだろう。一点から全世界を見下ろす、神の視界のようなものを感じないではない。ここにはすべての世界が内包されている。切り口次第で、真円にも、楕円にも、放物線にもなり、円も、円柱も、球もすべて円錐からの派生形という見方ができよう。やはり、宇宙は曲率に支配されているようだ。アルキメデスもまた、この魔力に憑かれた一人だったに違いない。その証拠に、あらゆる曲線を含んだ図形の求積を試みている。アルキメデス以前の数学者たちは、あまりに真円を崇め過ぎたために実世界を記述することが苦手だった。だが、世界はちょっと歪んでいるとした方が人間には居心地がよい。アルキメデスは、数学を信仰から解放し、科学の道を切り開いた、究極の現実主義者と言えるかもしれない。円周率をπなどと理想化するより、3.1415... とした方がずっと現実的なのだ。
それにしても、科学や数学の偉大な古典が、科学の光学技術と数学のアルゴリズムで甦るとは。アルゴリズムとは、コンピューティングによって定式化した算法を繰り返して解を求めることであり、まさにアルキメデスのやった可能な限り三角形を詰めて近似するのと同じ思考法だ。アルキメデスの知識もまたアルキメデスの知識によって甦る。すべては、アルキメデスによって仕組まれていたのだろうか。人類は、自ら編み出した謎掛けを自ら解き明かすような、いわば、自己循環の宿命を背負わされているのだろうか...

1. 失われてきた偉大な書群
アテネ大主教の弟ニキタス・ホニアテスは、1204年に起きた大虐殺の光景を書き残しているという。エルサレム解放へ向かうはずの第4回十字軍は、その使命を忘れ、栄華を誇る都市コンスタンティノープルを襲った。聖地パレスチナへ向かうはずだったが、問題はどうやってエジプトへ渡るか?船団はヴェネチア総督が用意したが、十字軍は資金不足。ヴェネチアのために属領を略奪したり、行きがかり上コンスタンティノープルのカトリック教への改宗を約束したりで、余計な残虐行為に及ぶ。コンスタンティヌス帝によって築かれた町は、古代知識の最後の砦であったのだが...
こうした光景は、女性数学者ヒュパティアの運命を思い浮かべる。映画「アレクサンドリア」の主人公だ。アレクサンドリア図書館といえば、古代知識の中心。彼女もまたアルキメデスの知識に触れる幸運に恵まれたことだろう。しかし415年、八つ裂きにされた。彼女の書き記した知識は、現代人の目に触れることはできない。ギリシアの叡智は、ローマ・カトリックにとって異教徒の知識。その古典の多くは不適切とされた。
とはいえ、修辞学のためのホメロスや幾何学のためのユークリッドなどの価値は認めた。アルキメデスの数学は実践的な科学であって、神を記述しようとしたものではない。そのために興味も薄かったのだろう。写字生たちはキリスト教典を書き写すのに大忙し。満遍なく古典を書き写したのが、唯一コンスタンティノープルだったという。
真の価値を見出せる権威者が一人いると、その時代は救われる。アルキメデスの知識がどういう経緯で生き残ってきたかは分からない。A写本とB写本は、ヴァチカンに流れ着く。ダ・ヴィンチもガリレオも、はるか昔、自分を超えた数学者がいたことに驚かされたことだろう。
一方、パリンプセストが発見された地は、、コンスタンティノープル(現イスタンブール)の修道院だった。ただ誤解がないように、こいつは祈祷書だ。なんの祈祷書かは、この際どうでもええ。尚、パリンプセストとは、ギリシア語のpalin(再び)と、psan(こする)から派生した語だという。文字を上書きするために羊皮の表面が削られ、何度も再利用される。当時、パピルスよりも長持ちする山羊皮紙が用いられる。現在でも、長期間残したい証明書や表彰状などは、羊皮紙が使われることがあると聞く。アルキメデスの知識を見るということは、この祈祷書の下に眠るインクを叩き起こすということである。
ちなみに、羊皮紙は、小アジアのペルガモンで発明されたと言われている。国王エウメネス2世がアレクサンドリアに比肩する図書館を作ろうとしたために、紀元前2世紀の初め、プトレマイオス朝はエジプトからのパピルスの輸出を禁止したという。辛うじて、山羊皮によって偉大な知識が伝播されたということらしい。
そして、結果的に一個人の手元へ渡ることに。ノエルは、落札者の考えを代弁している。
「アルキメデスのパリンプセストが落札されたとき、写本が個人の所有物に返ることに憤慨する研究者もいた。しかし、アルキメデスが公のものとして価値があるなら、公の学術研究機関が競り落としたはずだ。そこまでの価値があるとは見なされなかったのである。公の機関は実際に競売で落札された額よりも低い価格を提示し、弾かれた。それが恥ずべきことだと考える人は、あまんじて恥を受け入れるほかない。わたしたちは価値を金額で量る世界に暮らしている。世界的遺産の行く末を案じて政治的にどうこう言いたいのなら、申し訳ないがそれなりの金を出すつもりでどうぞ、というわけだ。」

2. アルキメデスの人物像
古代における第二次ポエニ戦争は、現代における第二次世界大戦になぞらえられる。科学の進化は、皮肉にも歴史に深い傷跡を残してきた。第二次大戦でアインシュタインの科学が原爆を生んだように、第二次ポエニ戦争ではアルキメデスの応用数学が強力な兵器を生んだ、という見方もできるかもしれない。一時、ハンニバルがローマを征服したかに見えたが、ローマは危機を乗り越え、終戦時には地中海全体を制圧する。シラクサの戦いではアルキメデスの知識が活躍するものの、カルタゴと手を結んだために陥落し、ギリシアの都市国家群は自治を奪われる。アルキメデスは、そんな時代を生きた。
さて、アルキメデスという名は非常に珍しく、しかも、奇妙なほど相応しい名だという。ギリシャ語で、原理、規則、最高を意味する「arche (アルケー)」と、知性、英知、機知を意味する「medos(メードス)」からなる。似たような系統に、デイオメデスという名もあるらしい。「dio(ディオ)」はゼウスの異形だとか。
アルキメデスの人物像は、著作「螺旋について」の序文に顕れるという。その序文は数学者仲間ドシテオスに宛てた手紙になっているとか。しかも、アレクサンドリア図書館宛てに、わざと間違った定理を送っているらしい。そのことから、本書は、温厚な人柄でもなければ生真面目でもなく、いたずら好きで狡猾だったと評している。糞真面目な科学者らしくないというわけだ。
しかし、シラクサはアレクサンドリアから見ればド田舎。研究者の熱意は、孤独と矜持によって支えられるところがある。あるいは、少しぐらい妬みもあったかもしれない。なによりも、科学では子供心が大切だ。これを狡猾と言うのはどうだろうか?
また、著作のなかで、エウドクソスに二度の賛辞を送っているという。エウドクソスを最も偉大な先達と考えていたようだ。ユークリッドの方は主に基礎数学を扱っていたので、それほど高く評価していなかったようである。アルキメデスの哲学には、実践してなんぼ... というのがあるのかもしれん。

3. 史上初の組合せ論?
アルキメデスの遊び心がよく顕れている著作といえば、「ストマキオン」であろう。ストマキオンとは腹痛の意味で、腹が痛くなるほど難しい問題というわけだ。彼は、このパズルで何をしようとしたのか?
本書の解釈はこうだ。決められた十四片で何通りの正方形が作れるかを計算しようとしたのではないか。つまり、人類史上初の「組み合せ論」というわけである。組み合わせという概念は、直感的に分かりやすいが、要素数がちょっと増えるだけで指数関数的にパターンが増える。しかも答えを求める近道があまりない。確率論の先駆けという見方もできそうか。しかし、数字の組み合わせだけならまだしも、図形の組み合わせとなると反転や回転といった作用まで加わり、極端に複雑化する。そして、群論的な思考が求められる。実際、この組み合わせは、17,152通りにもなるという。
「ニュートン科学はきまじめだ。アルキメデスの科学はちがう。アルキメデスは、引っかけや謎掛けやまわり道で知られていた。これは表面的な論述の特徴ではなく、アルキメデス自身の科学的な個性を表している。科学は... 数学は... 人間味のない無味乾燥なものではない。想像力を自由にめぐらせることのできる場だ。アルキメデスも想像力をめぐらせて、ストマキオンと呼ばれる子供の遊びを思いついた。ストマキオンとは、"腹痛"の意味で、十四片を並べ換えて正方形にするタングラム(知恵の板)を言う。アルキメデスは、このパズルにどんな数学が隠されているだろうと考えた。」
同じく遊び心を誘うものに、ホメロス著「オデュッセイア」に因んだ「ヘリオスの牛の問題」がある。オデュッセウスの部下たちは、ヘリオス神に捧げられたトリナキエ島に上陸する。彼らは、オデュッセウスの忠告を聞かず、ヘリオスの牛を殺して七日間も派手に食いまくったために、恐ろしい罰を受ける。この島は昔からシケリア島とされ、ちょっかいをかけない方がいいという警告の物語にも作り換えられたとか。
ちなみに、現在のシチリア島はマフィアの町というイメージがあるが、映画の見過ぎであろうか?
それはさておき、アルキメデスは、計算問題に詩を綴る。黒、白、黄、まだらの四つの群れを、それぞれ牡牛と牝牛に分け、8つの未知数からなる7つの方程式と、2つの追加方程式からなる算術問題をこしらえた。最小の解でも、20万桁を超える。無限数学を思考できるほどの知識があれば、組合せ論ぐらい編み出すことができるかもしれんが...

4. 異質な「方法」の命題14
「方法」の序文には、挑戦的な言葉が綴られるという。
「偉大な数学者のあなたなら、わたしの方法に真の評価をくだせるでしょう...」
ギリシア数学は、厳密性を崇めるがゆえに、パラドックスを避け、無限の落とし穴までも避けてきた。そもそも無理数を忌み嫌う。円周率が無理数だというのに。
本書は、数を好きなだけ大きくしたり小さくしたりすることを「可能無限」と呼び、実無限と区別している。無限の抽象化は、ガリレオやニュートンらによって進められた。だが、代償もある。無限にはパラドックスがつきもの。数学は、強力にはなったが、昔ほど厳密ではなくなった。
古代ギリシア数学は、都合のよい範囲で、無限と戯れていたと考えられてきた。命題1から13には無限個の線分の足しあわせが記述されるが、物理イメージできるような実世界的な思考が見られる。
対して、命題14は違うようである。物理学との組み合わせに頼るのではなく、無限和だけを拠り所にしているという。純粋数学だけで無限を扱っているらしい。尚、ハイベアは命題14を解読できなかったという。
命題14では、円柱の切片の体積を求めようとしている。その図形は奇妙な爪形をしている。正方形を底面とする角柱とこれに内接する円柱において、下底面の直径と上底面の一辺を通る斜めの平面で円柱を切断する。すると、その切片は、半円、半楕円、円柱の側面に囲まれた爪形に切り取られる。しかも、この問題を一般化して、あらゆる平行六面体に当てはめているという。


ここで紹介される思考方法は、実に興味深い。まず、立方体の垂直面に平行な任意の平面を考え、この爪形の図形に対して、縦にスライスする。まるでCTスキャンのように。そして、任意の切り口でスライスした平面を足し合わせるという考え方だ。結論は、円柱の切片の体積が、それを囲む立法体の 1/6 になるとしている。どうやって、この結論に達したのだろうか?ただの直感であろうか?
爪形の図形を縦にスライスすると、底辺と高さが連続に変化していく三角形の集合となる。この様子を上から眺めると、放物線、すなわち半円の内接する長方形を横切る線分でスキャンするように見える。三角形の断面は、点かだんだん大きくなり円柱の高さまでくると、そこをピークにしてだんだん小さくなって点に戻る。ここで重要となるのが、スライスされた三角形と、垂直に長方形上をスキャンする線分との比だ。アルキメデスは、こう書いているという。
「三角柱の三角形の面積が円柱の三角形に対するように、長方形の線分は放物線の線分に対する。」
なんと、二次元図形の比が一次元図形の比と同じになるという比例関係を述べているではないか!これは、幾何学的な直角を数学的な直交性に応用していると解釈するのは、行き過ぎであろうか?何かの正体を知ろうとすれば、その構成要素を探る。分解とは、解析学の基本思考であり、近代数学は直交性を重視する。直交性とは、幾何学の直角を代数学で抽象化した概念だ。例えば、フーリエ変換は正弦波と余弦波の直交性を利用して、現象の成分を分解しようとする。こうした直交性を持った成分によって限りなく分解しようとする試みは、微積分学とすこぶる相性がいい。
さらに、こう書いているという。
「三角柱の体積が円柱の切片の体積に対するように、長方形全体の面積は放物線の切片全体の面積に対する。」
つまり、三次元の図形同士の比が二次元の図形同士の比と同じになると言っている。これは、放物線の求積に対する拡張版という見方もできそうだ。
ところで、科学界の有名な醜い功績争いの一つに、ニュートンとライプニッツによる微積分学をめぐってのものがある。彼らはアルキメデスの「方法」に触れることはできなかった。ここにアルキメデスが割って入れば、二人を黙らせたかもしれん。いくらなんでも二千年前の功績にケチはつけられまい...

2014-06-01

"不思議宇宙のトムキンス" George Gamow, Russell Stannard 著

懐かしやトムキンス!物理学を専攻した者で、トムキンス冒険物語の存在を知らぬ者はいないだろう。たとえ読んだことがなくても... 定常宇宙説と膨張宇宙説の論争が旺盛な時代、物理学者ジョージ・ガモフは、時空の歪曲や膨張宇宙といった難解な物語を、初心者向けに書き下ろした。近年、この手の科学啓蒙書は当たり前のように書かれ、おいらも学生時代、ブルーバックス教の信者であった。しかし、その先駆者の存在感は衰えるどころか、むしろ輝きを増してやがる。
本書は、ラッセル・スタナードによる新版で、時代に即してオリジナル版からかなり改訂されている。尚、主人公C.G.H.トムキンスは物理学に興味を持つ平凡な銀行員、イニシャルは光速c, 重力g, プランク定数hに由来する。

さて、相対性理論に触れると、最初にぶつかる疑問がこれであろうか。すべての運動が相対的と言っておきながら、光速だけは絶対速度とは、これいかに?やはり神は存在するのか?なぁーに、心配はいらない!光速が不変ならば、時間や空間の方を可変にすればいい。神だって、ご都合主義よ。
人間は、3次元 + 時間という認識空間を生きている。だが、時間次元だけは明らかに異質だ。こいつだけは逆戻りできない。これを説明するために、アインシュタインは時間と空間を区別しない時空という概念を持ちだした。時間と空間は光速に対して数学的に対称性がある、ということにすれば、双方を入れ替えても物理法則が成り立つという寸法よ。そもそも時間が一定などというのは疑わしい。心地よい事は瞬く間に過ぎ去るくせに、忌わしい事はいつまでも居座ってやがる。死に際には走馬灯を見ると言うではないか。時計なんぞで一定に刻まれるとするから、時間依存症で苛む。
人間が何かを認識するには、なんらかの比較の対象を必要とし、その対象を一時的にスタックする機能が求められる。格納された情報は前後関係で結びつけられ、情報を取り出す順番が時の流れを作る。これが記憶のメカニズムだ。人間ってやつは、事象をなんらかの関係で結び付けないと、思考することすらできない。つまり、時間なんてものは、関係によってもたらされる概念であって、認識の産物に過ぎないとでもしておこうか。物事を時系列で秩序立てると、自己存在の瞬間が確認できて、心が落ち着くわけだ。ならば、何も認識しなければ、人間は自然物のままでいられるのか?と問うても、そんなことは知らん。ただ言えることは、質量を持つものはみな、相対性に幽閉された存在だということぐらいであろうか...

まさに、ニュートン力学は質量を持った物体を対象とする。この世界においては、空間と時間は完全に独立した物理量で定義され、すべての運動は時間の関数で記述される。つまり、あらゆる現象は連続性で説明できるという仕掛けだ。対して、量子力学では質量ゼロの素粒子が登場しやがる。光子やら電子やらがそれで、宇宙空間を自由に飛び回ることができる。電子が気の毒なのは、原子核に縛られることである。いや、M性が病みつきになって、自ら自由を放棄したのかもしれん。もともと自由電子と呼ばれたはずだが...
量子の存在は統計的にしか扱えない。不確定性原理は、位置と運動量といった同時に二つの物理量を決定できないという制約を課す。光が絶対速度で決定されるなら、光子の位置ぐらい決定できそうなものだが、そうもいかないらしい。素粒子などと呼んでいるが、本当に粒子なのか?質量もなければ、まるで霊感のような存在。人体が量子で構成されるからには、霊感の強いヤツがいても不思議はあるまい。
また、アインシュタインのあの有名な公式は、エネルギーと質量の等価性を示している。つまり、無から物質を作ることはできないが、エネルギーからは物質を作ることができると言っているのだ。おまけに、エネルギー状態への移行は、プランク定数の定義で離散的にしか行えないことになっている。つまり、宇宙空間のどこでも、何かが突然湧いて出るかもしれないと言っているのだ。物心がつくとは、そんな状態であろうか?実存観念の本質とは、物質よりもエネルギーの方にあるのかもしれん...

1. 同時性の問題
特殊相対性理論は、一様で一定の運動をする系における、時間と空間の関係を論じている。すなわち、等速運動を唱えている。一般相対性理論は、これに重力の作用を加えて抽象度をあげている。すなわち、重力場と加速度運動との等価性を唱えている。重力場とは、空間が曲がっていることの物理的現れであり、その曲率は光線の曲がり具合を観察すればいい。絶対速度が歪めば、時間も歪む。つまり、二点における時間差は、双方の重力ポテンシャルの差で決まることになる。太陽表面上の出来事は、重力ポテンシャルの違いにより、地球表面上よりもゆっくりと進行するだろう。象さんのように体重が大きくて動作が鈍そうに見えても、時間の長さは同じように感じているのかもしれん。
さて、絶対速度が存在するとは、何を意味するだろうか?光速を超えられないとすれば、宇宙現象の同時性なんぞに意味がないということか?少なくとも時間に幽閉された生命体には、そんな気がする。そもそも運動しているかどうかなど、どうでもいいのでは?いくら生に意義を求めてもいずれ無に帰するし、どんなに足掻いても絶対静止には敵わんよ。しかし、生に意義を求めなければ、人生なんて退屈でしょうがない。なるほど、暇つぶしに意義を与えるとは、絶対速度恐るべし!
宇宙年齢が計測できるのも、絶対速度のおかげである。ビッグバン宇宙論が正しければ、絶対速度を物差しとしながら宇宙の果てから届く光を観測すればいい。観測するということは、認識するということ。もし、完全な同時性が成立すれば、宇宙年齡どころか、自分の年齡すら認識できないかもしれない。
しかし、同時性が成立すれば、後悔せずに済みそうな気もする。何事を知るにも、直接経験しない限り、事後報告によってもたらされるのだから。実際、人間社会では既成事実を作った者が勝つ。事実よりも風説流布の方が、はるかに波動エネルギーは巨大だ。光速を絶対速度に崇めれば、それが神となりうるだろうか?いや、いつも一緒だよ!なんて神の前で誓っても当てにはならない。人間社会にとって、絶対的な同時性なんてものは邪魔な存在かもしれん。あるいは、同時性という自由を放棄したからこそ、認識能力というものが成り立つのかもしれん。

2. マクスウェルの魔物
第一種永久機関は、外部からエネルギーを受けることなく、仕事を外部に取り出す機関で、エネルギー保存則に矛盾して実現できないとされる。
一方、第二種永久機関は、何もないところからエネルギーを取り出すのではなく、大地や海や大気といった周囲の熱源からエネルギーを取り出すので、理論的にはイケそうな気もしなくはない。例えば、石油や石炭を燃やす代わりに、水から熱を取り出すといったことが。とはいえ、冷たいものから熱いものへ自然に熱が移動するのも考えにくい。案の定、量子力学は、確率が思いっきり低いというだけで、不可能とまでは言わない。それが、マクスウェルの悪魔ってやつだ。本書は「魔物」と呼んでいるが、物語にはこちらの方がしっくりくる。
個々の分子を観察すると、中にはすばしこいヤツがいる。運動方向を自在に変えられるような。熱力学の第二法則、すなわちエントロピーの法則に逆らうようなヤツが、原子や分子レベルで確率的に存在する可能性がないと言い切れるか?という問題提起である。この魔物にかかれば、瞬間的に熱を移動させ、平坦なところにも温度勾配を作ることだってできるかもしれない。宇宙が138億年も存在してきたなら、そんな現象が一度ぐらいあっても不思議ではあるまい。
なるほど、市場原理は、しばしばエントロピーの呪縛を破って、ブラックホールに吸収される。魔物を見たければ、メフィストフェレスがうようよしてそうな人間社会を観察すればよかろう。そういえば、目の前のウィスキーがいつの間にか無くなっている。突然、魔物が蒸発熱を発したからに違いない。

3. M性な電子たち
「偉大なる建築家ニールス・ボーアが建立(こんりゅう)された美しき原子構造の内部には、さまざまな量子部屋がありましてな、遊び好きの電子たちをそれぞれの部屋に正しく住まわせておくことがわたしの務めというわけです。秩序と規律を保つために、同じ軌道には二つの電子しか飛ぶことを許しておりません。三角関係はトラブルのもとですからな。おたがいに逆のスピンをするもの同士がカップルになっているのがおわかりでしょう。性格が正反対の夫婦のようなものですな。部屋がそうしたカップルで占められてしまえば、第三者の乱入は許されません。これは良くできたルールでして、破られたことはただの一度もありません。電子たちも、これが健全なルールだということはわかってくれているのです。」
良くできたルールかもしれんが、自由を謳歌したい者には甚だ迷惑!一般的に、電子殻にはエネルギー準位の低い方から、K殻, L殻, M殻, ... という居場所が用意されている。ナトリウム原子の価電子となったからには、運命を受け入れるしかない。ナトリウム原子核は、電子を11個抱えており、そこに塩素原子が近づくと、M殻に空きを見つけて穴を埋める。そう、心の隙間を埋めるのだ。電子が不足して原子核がカッカしてくれば、マイナスイオンのひとときを差し上げますわ!って。M性同士がM殻で同居するとは、よくできたものよ。
しかも、パウリの排他原理によって、一つの軌道に同じスピン状態の電子が同居できないときた。M性のくせしやがって、独占欲だけは強い。原子核が負担になる余分な電子を抱えれば、移り気が激しく精神が不安定となる。電子はいつも安定社会への引っ越しを求め、数千個に及ぶ原子が結合したりする。中にはDNAってヤツも居て、昔の思い出に縋りながら必至に忘れまいと、二重螺旋構造というバックアップ機構まで具えてやがる。男性諸君もまた女王様を囲む電子のような存在よ。どうりで、簡単には楕円軌道から逃れられないわけだ。だが、心配はいらない。強烈なオーラを放射する小悪魔が近づけば、簡単にスピンアウトできる。ただ、結婚は恐ろしい!と経験者は愚痴っている。法律という紙切れ一つで、生涯の軌道が運命づけると聞いた。
ところで、電子の寿命は永遠ではないらしい。突然消滅したり。物質とは、役目を終えれば果敢ないものよ。光子にしても光を伝え終えれば消滅する。電子の死は、衝突によって生じるという。問題は衝突の激しさではなく、衝突する相手だ。負電荷を持つ者同士であれば問題ないが、中には正電荷を持つヤツがいる。陽電子ってやつだ。ポジトロンなんてニックネームがあるが、まったくポジティブに見えない。普段は粒子として振る舞いながら、電子と出会った途端に「対消滅」を起こす。無理心中か!同じ電子同士だと思って油断していると、えらい目にあう。合体でもしようものなら身の破滅よ。

4. 素粒子はどこまで素粒子なのか?
物質はこれ以上分割できない基本要素から構成されるという考え方は、古代ギリシアの哲学者デモクリトスまで遡る。atomには、ギリシア語で「分割できないもの」という意味がある。また、物理学では、同じ原子構造を持ちながらアイソトープ(同位体)で区別する。原子核における陽子の数が同じでも、中性子の数が違えば質量も違ってくるので、もっともな見方である。
「中性子だけで置いておくと、たしかに不安定なんじゃがの。原子核内にきっちりと詰め込んで周囲を他の粒子で固めておけば、きゃつらもずいぶん安定するんじゃよ。それもまあ、原子核内の陽子の数にくらべて中性子の数が多すぎなければの話じゃが。もしそうなると、中性子は余分な塗料をマイナス電荷の電子として原子核外に放出して陽子に変わってしまうんじゃ。同様に、陽子の数が多すぎる場合には、陽子は余分な塗料をプラス電荷の電子として放出し、中性子に変わってしまう。こうした調節を、わしらはベータ崩壊と呼んどるんじゃがの。ベータというのはこうした放射性崩壊によって放出される電子につけられた古い呼び名じゃ。」
宇宙は広大なのだから、なにも原子核なんてちっぽけな住まいに、ひしめき合わなくてもいいのに。質量あるものは、満員電車を好むらしい。
さらに、陽子や中性子を構成する物質にクォークが発見されると、アイソスピンという回転の仕方で種別される。本当にスピンしているのかも疑わしいが、物理的にスピンしているような性質を持っているということであろうか。少なくとも、量子状態として見ることはできそうである。この状態を「フレーバー(香り)」と呼び、アップ、ダウン、ストレンジ、チャーム、トップ、ボトムの6種類で区別される。なぜ香り(flavor)と言うかは知らんが、気配のようなものであろうか?霊感のような...
ただ、すべてに物質が、クォークからできているわけではない。クォークからできているのは重粒子と中間子で、ハドロンと呼ばれるやつ。ハドロンは強い核力を感じるが、軽粒子と呼ばれるレプトンは感じないという。レプトンもスピンの仕方で種別される。
ところで、スピンのパターンには、驚くべき対称性の法則がある。
「自然界にはSU(3)の対称性が成り立っている」
数学には、対称性を観察するのに、群論という便利な道具がある。中でも角運動量にピッタリなのが、ユニタリってやつだ。数学オンチは、こいつで随分と悩まされてきたのだが...
SU(Special Unitary)群とはユニタリ群の部分群で、(3)とは3回転対称性を表す。つまり、±1/3(120度)、±2/3(240度)、±1(360度)で同じ状態になることを意味する。そして、アップクォーク(u)とダウンクォーク(d)で構成される陽子は(u, u, d)、中性子は(u, d, d)と表記される。スピン状態が離散的であるのは、電子軌道が離散的であるのと同様に、プランクエネルギーの介在を想像させる。もっと言うと、スピン状態の離散性が、量子コンピュータの記憶素子としての可能性を匂わせるわけだ。ただ、状態遷移ではかなりのエネルギーを消費するだろう。量子の世界では、なにかと「ポテンシャル障壁」と呼ばれるエネルギー障壁がつきまとう。
また、人間の対称性への思いは、留まるところを知らない。粒子には必ず対となる反粒子が存在するとされる。質量とスピンを同じとし、電荷を逆転させて存在を相殺させるわけだ。粒子と反粒子が衝突すれば、エネルギー保存則に矛盾なく、丸く収まるという寸法よ。こんな仕掛けで、質量の存在を説明できるのかは知らん。確かに、反粒子だけ消滅すれば、質量が残りそうな気がするが、反粒子の方が残るってことはないのか?いや、あるだろう。人間の認識空間に見当たらないだけで。いずれにせよ、素粒子レベルともなると、スピンの仕方の違いだけで物質の存在を抽象化できてしまう。
さらに、話題が超ひも理論にまで及ぶと、物質の存在は単なる振動でしかないってか。いくら人間の個性や人間社会の多様性を強調したとこで、しょぼい存在よ。人間ってやつは、ヒモという背後霊に憑かれた存在というだけのことかもしれん。社会がヒモになり、組織がヒモになり、家族がヒモになるとなれば、女のヒモになるのを夢見る男性諸君で溢れてやがる...