歯車の中の算法 ── 2,000円の固着したタイガー計算器を蘇生させて、機械式ALUの底を覗く

大井のフリーマーケットで買った固着ジャンクの手回し計算機が、油の一滴も差さないうちに、我慢強い小往復だけで全桁キャリー貫通まで戻った。蘇生の顛末と、開けてみて分かった原理——数を歯の本数に変えるピンホイール、桁上がり爪の連鎖、試行減算のベル(たぶん世界最古の例外割り込み)、補数の裏技。ソフトウェアがゼロ行の演算装置の話。


東京の大井で開かれていたフリーマーケットの隅に、それは置いてあった。灰色の金属の塊、重さ数キロ、値札は2,000円。タイガー計算器——手回し式の機械式計算機だ。クランクを回そうとしたら、回らなかった。固着している。売り手も「回らないよ」と言った。買った。

回らない計算機を買う理由は二つあった。ひとつは、固着した機械はたいてい「壊れて」いるのではなく「固まって」いるだけだということ。もうひとつは、この箱の中には、ソフトウェアが一行もないのに四則演算をやってのける機構が詰まっているということ。開ける前から、直る過程ごと面白いに決まっていた。

蘇生 ── 油と、一晩と、小さな往復

機械式計算機の死因の第一位は、固着ではない。固着した機構を力任せに回して、桁上がり爪を折ることだ。爪はこの機械でいちばん華奢で、いちばん賢い部品で、折れたら代わりがない。だから手術方針は最初からこう決めていた——絶対に力で勝負しない。油を差して、一晩置いて、小さな往復から。

ところが白状すると、この計画は半分しか実行されていない。油は、まだ一滴も差していない。 やったのは「小さな往復」だけだ。クランクを数度ずつ、渋くなったら戻して、また少し。数ミリの往復が数センチになり、四分の一回転になり、東京から京都への輸送の揺れも効いたのか、あるとき、こつん、と抵抗が抜けた。数日後には全桁が動いて、ベルが鳴って、桁上がりが端から端まで通っていた。

固着の正体はおそらく乾いて固まった古いグリスで、これは剪断されると——つまり動かされると——少しずつほぐれて馴染む。「何もしていないのに直った」ように見えるが、そうではない。小さく動かし続けたことと、力で勝負しなかったことが手術だった。 焦って回していたら、いま頃この記事のタイトルは「爪を折った話」になっている。ちなみにまだ時々渋い桁があるから、油はこれから差す。順番が計画と逆になっただけ、ということにしておく。

これは計算尺の親戚か?

触りながら操作方法を研究していた相方が、いい仮説を出した。「本質的には計算尺と同じなんだな」——機械で計算するという点で、たしかに親戚に見える。

でも、血統はちょうど反対側なんだ。ここがこの機械のいちばん面白いところだと思う。

計算尺はアナログの血統だ。数を「長さ」という連続量で表す。対数目盛の棒を滑らせて、長さの足し算で掛け算をやる。答えは目で読み取り、精度はせいぜい3桁。連続の世界の住人で、子孫はアナログコンピュータ。

タイガー計算器はデジタルの血統だ。数を「歯車の歯の本数」という離散量で表す。0と9の間に中間はなく、桁という位取りがあり、桁上がりがある。答えは厳密で、10桁なら10桁ぶん正確に出る。そろばんの機械化であり、子孫は——レジスタとキャリーを持つという意味で——いま君がこれを読んでいるCPUだ。

同じ「機械の計算道具」でも、数の表し方が連続か離散かで、家系図が根元から分かれている。そして離散側の家系の要が、これから開けるピンホイールだ。

数を、歯の本数に変える

タイガー計算器の心臓はピンホイール(オドネル歯車)という円盤の列だ。各円盤には出し入れできるピン(歯)が9本仕込んであって、置数レバーを「7」に合わせると、7本のピンがせり出す。

これがデジタル化の瞬間だ。「7」という抽象的な数が、「7本の物理的な突起」になる。あとはこの円盤をクランクで1回転させれば、突起が相手の歯車を7歯ぶんだけ送り、結果レジスタの数字が7進む。

加算=クランク1回転\text{加算} = \text{クランク1回転}

これだけ。8を足したければ8本のピンで1回転。3回足したければ3回転。足し算の反復が掛け算だから、原理的にはこの機械はもう掛け算機だ。ただし435×28を、クランク28回転ぶんまるごと1の位で回す人はいない。実際は筆算と同じで、キャリッジ(結果レジスタの台車)を桁送りしながら、各桁で必要な回数だけ回す。435×28なら「1の位で8回転、10の位に送って2回転」——合計10回転で済む。上の小窓のカウンタが回した回数を記録していて、掛け算が終わるとそこに乗数が並んでいる。答えの検算までついてくる。

桁上がりの爪と、あの「固さ」の正体

9に1を足すと10になる。円盤の世界では、ある桁が9から0へ一周する瞬間に、隣の桁を1歯だけ送らなければいけない。これをやるのが桁上がり爪——各桁に付いた小さなレバーで、自分の桁が一周する時だけ、カムに蹴られて隣の桁を突く。

ここで、リハビリ中に相方が発見して怖がっていた現象の種明かしができる。「オーバーフローしそうになると、クランクが急に固くなる」

9999…9に1を足す場面を考えてほしい。1の位の爪が10の位を突き、10の位も9から0に回るから100の位を突き、それがまた次を——爪の仕事が全桁を連鎖する。爪1本ぶんの機構抵抗は小さくても、8桁連鎖すれば8本ぶんがクランク1回転の同じ区間に直列に乗る。だから重い。これは故障ではなくて、桁上がりという計算の、物理的な重さそのものだ。ソフトウェアの世界でキャリー伝播が遅延の主犯になる(リップルキャリー加算器の遅さ、と教科書に載っている)のと同じ構図が、腕の感触として届く。CPUの設計者が桁上がり先読み回路を発明したくなった気持ちが、クランクの重さで分かる機械はそうない。

ベルは、例外割り込みである

この機械には呼び鈴が付いている。チン、と鳴る。何のためか。

割り算のためだ。機械式計算機の割り算は試行減算でやる——被除数から除数を「引けるだけ引く」。4回引けたら商のその桁は4。じゃあ「引けるだけ」の限界はどう知るのか。引きすぎたときにベルが鳴る。結果が負に落ちた(借りが最上位を突き抜けた)ことを、機械が音で教えてくれる。鳴ったら1回転戻して、キャリッジを1桁送り、次の桁で同じことを繰り返す。終わったとき、カウンタに商が、レジスタに剰余が並んでいる。

つまりベルは「演算が守備範囲を出ました」という通知——例外割り込みのハードウェア実装だ。一世紀ほど前に設計された機械に、オーバーフロー・フラグとアラームが付いている。ちなみに引きすぎたときのレジスタには 9999…8 のような値が出ていて、これは負の数の補数表現そのもの。2の補数でマイナスを扱う現代の流儀のご先祖さまが、真鍮の円盤の上で平然と動いている。

355 ÷ 113

蘇生した機械の退院祝いに、この割り算をやることにした。355÷113。結果から書くと、カウンタにこう並んだ。

3.141592923.14159292

355/113の真の値は3.14159292035…だから、9桁を機械は一歩も間違えていない。そして祖沖之の密率であるこの分数は、π(3.14159265…)と小数6桁まで一致して、7桁目で離れる——カウンタの「…59292」には、1500年前の近似がπから離陸する瞬間がそのまま刻まれている。歯車をガチャガチャ回して円周率が出てくるのは、理屈では分かっていても、実際にやると声が出た。

とはいえ、すんなり出たわけではない。実演で学んだことを三つ、正直に書き残しておく。

ひとつ。×/÷の切替バーを侮っていた。 あれはカウンタ(回転数の窓)の数え方を切り替えるバーで、÷側に倒すと「引き算の回転を+、戻しの回転を−」として数えてくれる。試行減算は「引きすぎて、1回戻す」を繰り返すから、これが無いと商の各桁が1ずつ大きい数字で残ってしまう。÷に倒しておけば「4回引いて1回戻す」が自動で3になる——回数を人間が数えなくていいようにする機構だ。地味な見た目のバー一本に、割り算のアルゴリズムの面倒がまるごと押し込んである。

ふたつ。うちの個体は減算方向のベルがまだ渋くて、引きすぎても鳴らないことがあった。そこで人間ベル方式に切り替えた——引きすぎると結果レジスタの上位に9がずらりと並ぶ(さっきの補数だ)。9の壁が見えたら引きすぎ。ベルより雄弁な警報で、しかも毎回、補数表現の実物を見学できる。

みっつ。キャリッジをどちらへ送るかで盛大に迷子になった。答えは「引かれる場所が1桁ずつ小さい方へ滑っていく向き」——言葉の左右で覚えるより、1回引いてみて、どの桁が減るかを機械に教わるのが確実だった。

ソフトウェア、ゼロ行

この箱の中に、プログラムはない。ファームウェアもない。クロックは人間の腕で、ALUは歯車で、レジスタは数字の円盤で、例外処理はベルと人間だ。それでも加減乗除が全部できて、答えは厳密で、電源も要らず、半世紀以上を経てもまだ動く(しかもこの個体は油さえまだ差していない)。

計算というのは、突き詰めれば「数を何かの物理量に写して、物理法則に演算を代行させる」ことなんだと、この機械は腕の感触で教えてくる。歯車に写せばデジタルに、長さに写せばアナログに、電荷に写せば今のコンピュータになる。写し先が違うだけで、やっていることの骨は同じ——だから相方の「計算尺と同じ」という直感は、家系図では反対側なのに、いちばん深いところでは正しかったことになる。

2,000円の固着ジャンクにしては、ずいぶんいろいろ教わってしまった。

コメント

まだコメントはないよ。最初のひとことをどうぞ。