2009年6月15日月曜日

手回し機械式計算機

手回し機械式計算機の話である. 手回し機械式計算機を知らない人も, 使ったことがない人も多いと思うので, まずその簡単な説明から.



この写真は東京理科大学の近代科学資料館で撮らせていただいた, 非常に古いBrunsvigaである. 上の筒状の右が置数レジスタ(S)で, レバーを動かして数値を置く. 手前の横長の部分(キャリッジという)には, 左に回転数レジスタ(M), 右に結果レジスタ(R)がある. 写真では見えないが, 筒状の向うにクランクハンドルがあり, 正方向に回転すると, 置数レジスタの数が結果レジスタに足され, 回転数レジスタが1増える. 負方向の回転では, 置数レジスタの数が引かれ, 回転数が1減る. 乗算をするには, 置数レジスタの数を, 1の桁, 10の桁, ...に足すので, キャリッジは左右に移動できる.

123に456を掛ける場合, 置数レジスタに456を置き, 結果レジスタを0にし, 1の桁に3回, 10の桁に2回, 100の桁に1回足す. 結果56088が得られる. これに更に789を掛ける場合, この古い機械では出来ないが, 後年の機械では結果レジスタの値を置数レジスタに移すback transferという機能があり, 56088が置数レジスタに置ける. 1000の桁に1回足し(1000倍が出来た), 100の桁で2回引き(800倍), 10の桁で1回引き(790倍), 1の桁で1回引く(789倍). これをshort cut乗算という

昔はこういうことをやっていたのもだ. 開平も出来ることは, 2009年1月21日のブログに書いた.

ところで, Brunsvigaには, もっと多機能な機械があった. それの使い方を考えたい.

その計算機はBrunsviga DuplaBrunsviga Doppelである.

これらの計算に1930年前後に登場した. 最初の写真の計算機と違うのは, 回転数レジスタが置数レジスタの上に来た; 置数レジスタの数値が良く見えるように, チェックレジスタが置数レバーの上に新設されたことである.

さてDuplaは, 置数レジスタと結果レジスタの間に, 第2結果レジスタ(R2)を置いた. ハンドルを回転すると, 置数レジスタの数値は, 第1結果レジスタ(R1)には加減されるが, 第2結果レジスタには, 加減算を止めることが出来る. また, どちらの結果レジスタからも, back transferが出来る. さらに第1結果レジスタの下に, thumb wheelという仕掛けがあり, 第1結果レジスタに, 直接数値を入れることが出来る. この機構は除算の時に便利で, これがないと, 非除数をR1に置くのに, 置数レジスタに一旦被除数を置き, 1回加算しなければならず, とくに長い被除数だとその加算が2回になる.

Duplaの使い方については, Comrieの書いた論文がウェブで見つかる. それによると, 第2階差まで使った数表が作れるというので, やってみよう.

y=x2+x+41の表と, その第1階差, 第2階差を示す. (これは素数生成(!!)の2次式である.)


x y Δ' Δ''
0 41
2
1 43 2
4
2 47 2
6
3 53 2
8
4 61 2
10
5 71 2
12
6 83 2
14
7 97 2
16
8 113 2
18
9 131

Comrieの方法によると,
初期設定
関数値41をR2に置く. 第1階差2をSに置く. 第2階差2をR1に置く. Mを0にする.

ステップの進め方
ハンドルを1回転する. するとR2に新しい関数が出来る. Mに引数が出来る. R1に第1階差が出来る.
従って, そこでR2を記録する. R1をSにback transferする. R1に第2階差2を置く.


次々と進めると

x y Δ' Δ''
1 43 4 2
2 47 6 2
. .. . .


となり, 上の表が出来る. R1に定数の第2階差を毎回置くのは面倒なような気もするが, 第2階差が規則的に変動しても計算に使えるので, これは意味がある.

一方, Doppelは大雑把にいうと, 計算機を2台, 横に連結したものである. クランクハンドルは1個だが, 回転数レジスタ, 置数レジスタ, 結果レジスタは左右に1個ずつあり, クランクハンドルを正方向に回転すると, 普通には, 右置数レジスタの値は右結果レジスタに足され, 左置数レジスタの値は左結果レジスタに足される. 負方向に回転すれば, 足す代りに引かれる. 中央に上向き矢印が2個並んでいる絵と, 上向きと下向きが並んでいる絵があり, そのクラッチを切り替えると右では足し, 左では引ける. さらに接続を切ることも出来る. またDuplaのように, 結果レジスタに直接設定も出来る.

では, こういう重連計算機はどういう時に使うか. あまり使い方を書いたものは知らないが, 1つの利用法を考えた.

十進法の1023を八進法ではどうなるか. もちろん1777である. 以下がBrunsviga Doppelによる計算法である. 左と右の回転は逆にする, つまりハンドルは正方向に回し, 右は加算, 左は減算する.


行 左S 左R 右R 右S
0 512 1023 0 1000
1 64 511 1000 100
2 447 1100
. .. ... .... ...
7 127 1600
8 8 63 1700 10
9 55 1710
. . .. .... ..
14 15 1760
15 1 7 1770 1
16 6 1771
.. . . .... .
21 1 1776
22 0 1777


とまぁこういう使い方もあるわけだ. もう少し詳しくいうと, 左置数レジスタ83, 右置数レジスタに103を置く. 左Rに1023を置き, 右Rを0にする. 左Rから左Sが引ける限りSを引く. 引けなくなったら(1行目), 左Rを82, 右Rを102にして, また引けなくなる(8行目)まで引く. これを左Rが0になるまで繰り返すと, 右Rに八進表現が出来ている.

0 件のコメント: