ラベル 手回し機械式計算機 の投稿を表示しています。 すべての投稿を表示
ラベル 手回し機械式計算機 の投稿を表示しています。 すべての投稿を表示

2009年7月29日水曜日

手回し機械式計算機

6月15日のブログで, 階差による計算法を書いた時, y=x2+x+41を例に使った. もちろんこれはEulerが1777年に見つけた素数の式である. (xが0から39までに対してyは素数になる. x=40の時は, 402+40+40+12=(40+1)2となり, 素数ではない.)

最近入手した, IEEE Annals of the History of Computing (Vol.31, No.2, April-June 2009)に, Prototype Fragments from Babbage's First Difference Engineという記事があった. 1822年頃, Babbageは階差機関を開発していた. 結局これは, 複製が上野の科学博物館などに展示されている, 職人のJoseph Clementの作った加算器の模型だけが出来たようにいわれている.

それでも見栄えは結構いいので, 情報処理学会の論文賞のメダルなどには, この加算器がレリーフになっている.

その後, 階差機関No.2は, Babbage生誕200年記念で作られ, ロンドンの科学博物館と, カリフォルニアのComputer History Museumで展示されている.

ところで, 上述の記事によると, この加算器以外に, 加算器用に作られた部品が, あちこちの博物館に保存されているということである. 真偽いろいろあるらしく, 試作品のものなど, 怪しいものもあるらしい. そういうものを集める博物館も博物館だが, それを調べる人も調べる人だ.

実は, 私の気になったのは, 記事に引用されているBabbageによる解説である. 1822 年7月3 日に, BabbageがSir Humphry Davyに送った手紙の一節が示されており, 「it proceeded to make a table from the formula x2+x+41.」と書いてあるのだ.

Eulerが発見してから, 半世紀も経っているので, Babbageもこの式を知っていたのであろう. やはりこれは特別な式なのだ.

2009年7月2日木曜日

手回し機械式計算機

6月15日のブログで触れたComrieの論文には, Duplaを使った第2階差をとる方法が書いてある. それは次のようだ.

等間隔の引数に対する関数値が, a, b, c, d, ...だったとする.
第1階差は, b-a, c-b, d-c, ...だから,
第2階差は(c-b)-(b-a)=a-2b+c, (d-c)-(c-b)=b-2c+d, ... である.

この種の計算機では, 数値を入力するのが厄介(というより, 操作ミスの原因)なので, 入力回数を極力少なくするのに気を使った. 以下の方法では, 「なにを置く」は, 各値について1回だけだ. 第2階差は「記録」のところで得られる.

S R1 R2
aを置く a 0 0
1回転 a a a
bを置く b a a
-3回転 b a-3b a-3b
R2帰零 b a-3b 0
1回転 b a-2b b
1 cを置く c a-2b b
2 1回転 c a-2b+c b+c
3 記録 c 階差 b+c
4 -4回転 c a-2b-3c b-3c
5 R1帰零 c 0 b-3c
6 1回転 c c b-2c
1 dを置く d c b-2c
...

この「cを置く」から, 「dを置く」の直前までが1サイクルである. ここから, R1とR2の仕事を交換し, R2に次の階差が得られる. 以下同じ.

実に見事な方法だ. 次の入力数を置数レジスタに置いたまま, 2つのレジスタを使い, 次の階差と次の次の階差の準備を進めている. Duplaでは, 一方に足しながら, 他方から引くことも出来るが, そのようにしていないのは, 操作ミスを心配したからと思われる.

これは今の言葉でいえば, プログラムを作ったようなものである. 手順を書き下し, 後はこの通りに手を動かすだけでよい. 最初に書いたように, それぞれの値が1回しか, 入力されないのが, 最大のメリットである.

Leslie John Comrie(1893-1950)は, 化学を専攻したが, 後に天文学者になり, 各種の計算機を使って数表を作る仕事に尽力した. 計算機も単に手回し機にとどまらず, パンチカードを使った会計機等も利用した. 「A Computer Perspective計算機創造の歴史」には, Comrieは何回も登場する.

Comrieの写真はここにある.

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に八進表現が出来ている.