2011年3月15日火曜日

古い計算機

東京理科大学の近代科学資料館で見せて頂いた, もう1つの古い計算機はADALLというものだ. 丸いので変な向きに置いてあるが, 以下のである.



これは英国バーミンガムのTemple Courts, Temple RawにあるThe ADALL Co.製らしい. いうなれば百進法の計算機である. 気宇壮大だ.

いつものように自分で描き直したのが以下だ.



灰色の背景の手前にある白い歯車状なのが, 百進歯車である. その少し内側に00から99まで十進2桁の数字(内数字)が書いてあり, 中央右の窓の内側に見える数字が歯車の状態を示す. この図の状態は00である.

さて, これに0≤n<100を足すには, 外側の数字(外数字)のnのところにある, 歯車の窪みにスタイラス(最初の写真の箱の蓋に見える)を差し, 真横にあるストッパーまで右回転する. そうするとnステップだけ百進歯車が回転し, 状態がnだけ進む. 上の図で, 窪みの説明が差している先は, 11に対応するそれである. 0に対応する窪みはストッパーに接していて, もう回せない.

A足すBの計算には, 最初, 図のように状態を00にしておき, 外数字のAのところから, Aだけ回転; 次に外数字のBのところから, Bだけ回転すると, 窓に現れる内数字がA足すBになる. AもBも99まではOKだが, 足した結果が100を超えると, 状態はA+B mod 100 になる.

この計算機の秀逸なのは, 内側にある渦巻きである. レコードの溝状というか, 蚊取り線香状というか, 1本の溝の線で出来ている. 歯車を右回転すると, 渦巻きは順に内側に入るようになっている.

長窓の中で, この溝には, 3mmφくらいのボールが載っている. 加算の結果が増えると, ボールは徐々に内側に移動する. 長窓の上に, 右から1, 2, ..., 11 と書いてあり, ボールが1と2の間の下にあれば, 加算の結果の百の桁は1ということになる. だから, 2桁の数を何回も足しても, 総和が約1100になるまでは, この計算機は正確な答を示す. もちろん, 下の2桁が丁度00以外では, ボールは百の桁の数字の真下にはないが, 時計の短針が, 1時と2時の中間にあっても, 1時台の時刻が分かるように, この計算機でも百の桁は読み取れるはずである.

この計算機はいうなれば, 離散的円形計算尺である. 計算尺は普通は直線で, A尺とB尺が並び, A尺のa点にB尺の0を合わせると, B尺のbに対応するA尺はA尺の0からa足すbの距離になる. 従って, A尺とB尺を対数目盛にするとa掛けるbが計算できる.

ところで, 普通の計算尺では, A尺のaにB尺の左端を合わせるか右端を合わせるかが, 悩ましいところである.



上の計算尺は3掛ける2で, B尺は左の1をA尺の3に合わせ, B尺2のA尺には6がある. 下は3掛ける4で, 12になるので, B尺の右の10をA尺の3に合わせている.

この面倒を省いたのが下の円形計算尺である. ADALLの計算機は, 対数目盛の代りに等間隔に目盛をつけた加算用の計算尺である.

John Wolffさんのウェブページにも, この計算機の簡単な説明がある. 同ページによると, 理科大でこの計算機の箱に入っていた数表の説明もあった. 要は1シリングが12ペンスなので, sシリングpペンスを十進法にし, 12*s+pペンスに換算する表だったらしい.

2011年3月14日月曜日

古い計算機

東京理科大学の近代科学資料館には古い計算機の貴重な収集がある. なんども訪れて眺めているが, その中に使い方がわからない計算機があった.

先日お願いして, それをよく見せて頂き, 使用法が確認できた. 今回はそれを説明したい.

下の写真は, Calculatorという, なんの変哲もないない名前の計算機である. 会社もCalculator Corporationといい, 銘板からすると, ミシガン州のGrand Rapidsという町にあったらしい.



真ん中辺を拡大すると, ピントは甘いが,



のようだ. この4桁分を説明用にPostScriptで描いたのが次である. この方で話を進める.



まず1桁分を取り出したものを2個並べる.



こういう計算機の基本構造は, 10の状態を取りうる十進歯車を必要な桁数分用意し, 各桁の歯車を加算する数だけ回転し, 繰上げを次の桁に伝えることである.

この計算機の十進歯車は, 中央の灰色の部分で, これが回転する. ラチェットがあるのか, 離散的な位置に止るみたいである. 周囲に白い窪みが10個見えるが, その内1つが他より大きく窪み, 下に書いてある赤字の数字が読める. その数字がその桁の歯車の状態である. 左は0, 右は5を示している.

この調子で, 上の4桁の状態を読んだのが, それぞれの右下の0000, 1234, 6912である.

次は加算の仕方. タイガー計算機などでは, 十進歯車に噛み合う出入りピンの数を調整して, 0から9までの数を足す. この計算機ははるかに簡単で, ひと様がスタイラスという棒を窪みに差し込み, 昔の電話器のダイアルのように, 右下に飛び出したフックに当るまで, 右回転をするのである. 加算すべき数は外側に白抜きで書いてある.

白い窪みにある, 青い点は, スタイラスを差す場所で, 一番上は左から順に1, 2, 3, 4である. それぞれ回転すると, 最初0, 0, 0, 0であった歯車は, その数だけ状態が進み, 中央の図のようになる.

中央の図になったところで, 再び5, 6, 7, 8にスタイラスを差し込み, 回転すると, 下のように, 加算が出来て, 6, 9, 1, 2になるのである.

極めて簡単だ. 加算では歯車は電話のダイアルのように右にしか回さない. このままでは減算には対応していない.

そうそう, 加算の前に, 各桁を0にリセットしておく必要がある. それには大きい窪みにスタイラスを差して, フックまで左回転する. (と書いたウェブページがあるが, 左に回転出来るのだろうか.)

問題は繰上げだ. 最初のズームの写真を見ると, 下の桁の7と8の間から, 上の桁の0と9の間にかけて, 盛り上がっている形がある. ここに繰上げの仕掛けが隠れているらしい. いろいろ想像しているが, こんなに簡単な仕掛けはまだ思いつかない.

なお, 古い計算機を収集している, オーストラリアのJohn Wolffさんのウェブページにも, この計算機の簡単な説明があった.

2011年3月11日金曜日

二進乗算

仕事がら二進法の乗算の機会は多い. 二進だから十進の九々の代りに一々だけが必要だが, 逆に足す数が多い. 11111(被乗数)に111(乗数)を掛ける例を下の左に示す. 被乗数を乗数に1がある場所に書き移し(今はすべての場所)て部分積を積み重ね, 各桁を二進法で縦に足す. 足すというのは1を数えるだけ. その和が奇数なら, その桁は1; 偶数なら0だ. 和を2で割った商が繰上げで, 次の桁は繰上げから1を足し始める.




つまり, 積の1の桁は, 1が1個だから1で, 繰上げは0; 10の桁は, 0に1,2と数え, 和が2だから積は0, 繰上げは1, 100の桁はその1に3を足し, 積は0で繰上げは2. これを繰り返す. 最後の繰上げは高々1だが, 1ならそれを書いて終る.

右のDCBAなどの図は, 部分積がどのビットの積かを示したものだ. 1の桁はA掛けるa; 10の桁はB掛けるaとA掛けるbの和; 100の桁はC掛けるaとB掛けるbとA掛けるcの和のように見る.

そこで次の図のように, 被乗数DCBAと, 乗数を逆にabcdと書いたカードを作り, 上下に合わせ, 下のカードを順に左へずらしながら, 重なった部分を見ると, その桁で部分積の足し合わせる位置が分かる.



だから, 例えば3番ではCBAとabcで上下がともに1の場所を数えると和が得られる仕掛けである.

11101掛ける1011を, カード方式でやってみると, このようになる.



tはそのカード位置での, 上下が1の場所の数(十進). sはその桁の積(二進). cはその桁からの繰上げ(十進)である.

一番上はtが1. 従って, (その前のcは0なので,) その1からs=1, c=0となる.

2段目, 3段目も繰上げなしなので, 簡単だ. 4段目で繰上げ1が出た. 従って5段目はt=2と4段目のc=1を足して, 3になり, この段のs=1とc=1となる.

cを一瞬だけ記憶し, tを足し, sを書き出し, cを次へ送る. これで乗算が出来るわけだ. 最後のcが1なら, それを書くのも上と同じである.

実際に計算した積, 100111111と同じものが得られている.



ところで最初の計算のように, 1が何個が並んだもの同士の積は簡単である. 2p-1掛ける2q-1で考えると, 1かp個と1がq個並んだものを書けるので, (2p-1)(2q-1)=2p+q-2p-2q+1.

つまり, p≥qとし, 1の桁を0桁目というと, p+q-1桁目からq桁目まで1を並べ, q-1桁目から1桁目まで0を並べ, 0桁目に1を書き, 最後にp桁目の1を0にする.

p=q=4の場合は, 上の伝で書くと, 1111掛ける1111は11100001だが, これは十六進の九々に相当する, ffe1である. ELIS風ではフフテイだ.

2011年2月24日木曜日

対称関数

対称関数の続きである. そのブログの中程にある図に示すように, 2変数対称関数は8個, 3変数対称関数は16個ある.

n変数のBoole関数は, 定数関数も含めて22n(2の2のn乗乗)あるが, n変数の対称関数は2n+1しかない.



3変数対称関数の図を眺めると, 各立方体で, 同じ色の対称同士の点は, 000の(赤の)点から, 等距離にあることが分かる. 距離の計測法は, 000から立方体の稜にそって目的地まで進む最短距離, いわゆるマンハッタン距離である.



改めて眺めると, 赤までの距離は0, 緑までは1, 橙までは2, 青までは3である.

つまり対称の要素は4個あり, その要素を採用するか, しないかの問題であった. n変数は000...0の点から111...1まで行く辺の種類はn個なので, 要素の数は両端を含めてn+1, 従って2n+1になるのであった.

2011年2月21日月曜日

乗算表

「昔のウクライナの人たちはこうやって計算した」と話し出したのはMike Williamsさんだ.



指を出し, 小指の外から指の間を順に0,1,2,...と数える. 親指を飛び越えると5になる. そこで折り返し, 6,7,...と続ける. 小指を過ぎると10になる.

さて, 7×8をウクライナの人はどう計算するか. 片手(左とする)の指をさっき7と数えたところで, 上下に開く. 反対の手(右とする)でも, 8と数えたところで, 上下に開く. 左の上の指が2本. 右の上の指が3本. 左の下の指が3本. 右の下の指が2本となる.

10×(上+上)+(下×下)と計算する. つまり 10×(2+3)+(3×2)=56 が答だ.

下の指は最大で5だから, 5×5までを知っていれば良いのだ.

これで5<M,N≤10について, M×Nが計算出来る理由を, 下の色付きの図で説明する.




まず上左の図. 縦軸がMで, 中央に5があるから, Mは中央より上にある. 横軸がNで, Nも中央より右にある. この場合, Mの上(upper) MuとMの下(lower) Ml, Nの上(upper) NuとNの下(lower) Nlはそれぞれ図に示す範囲だ. 従ってMu×10は, 途中で色が変っているが, 横ハッチの部分である. 一方, Nu×10は, 縦ハッチの部分だ. そしてMl×Nlは, 斜めハッチの赤い部分である.

ところで, この図の右上の4半分は, 図の中心で180度回転すると, 左下に移すことが出来て, 右の図のようになる. Dと書いてある縦ハッチと横ハッチが重なっている部分は, 面積の計算で2回足しているが, 右上のD'のところへ移動することが出来, 全体がちょうどM×Nになるのである.

下の, 白黒の淋しい図は, 乗算の一方が≤5の時の方法である. 今, Mの方が5より小さいとする. M×Nは, 図では, ハッチに囲まれた左下の小さい白い部分である. この場合は 50−(10×Mu+Ml×Nl)と計算することになるが, これは面倒な気もする.


昔のウクライナ人に聞いてみたい.

2011年2月14日月曜日

水計算器

計算機にディジタルとアナログがあるのは周知のことだ.

アナログは計算尺のように物理量を使うといわれるが, 殆んどの機械は長さが基本である. しかし, もっと違う物理量を使うものはないか.

小学校のとき, 曲線で囲まれた面積を計測しようという課題があった. 私は, その形を厚紙から切抜き, 重さを測ればよいと考えたが, 先生の用意した解は方眼紙にコピーして, 桝目を数えるのだった.

面積計の話題は, このブログに何回も登場したが, 毛色が違うのは, ボストンの科学博物館にあった, 液体を使うPithagorasの定理の証明である.

ガラスで被われた一様な厚さの正方形の箱が3個, 3:4:5のPithagoras三角形の形においてあり, 色のついた水がはいっている. 箱の繋ぎ目は水が通れる. 全体の装置は垂直面になっていて, 中央あたりの水平の軸で回転できる.




まず3と4の箱が下に来るようにすると, その2つの箱に丁度いっぱいに水が入る. 次にそれを180度回転すると, 水はすべて5の箱に収まる.

「水は器に従いて」の歌の通り, 面積を保ちながら, 形が変えられるのを利用したものだ.

それなら体積は使えないかと考えたのが, 次の立方根計算器である.





右の円筒の途中まで水が入っている. 上まで満杯の時, 水面の高さを1とする. 図では0.5になっている. この水をそのまま, 左の円錐へ移す. そうすると円錐の母線に沿った目盛で, 先ほどの量の立方根0.79が読める仕掛けである.

しかしびしょびしょして, 実用にはなりそうもない. 粉体も無理だが, 微小な球の粒を, Pitagorasの機械のように, 閉じ込めて使うことなら出来そうである.

体積2倍の立方体をつくるのに, 使えたかもしれない.

2011年2月13日日曜日

対称関数

TAOCP V4F1にきれいな絵があった. 元の絵はもちろん白黒である.



これは3変数対称関数のBDD(二分決定図)ベースの図である.

そもそも対称関数とは, 変数をとりかえても値が変らないものである.

以下に2変数(xとy), 3変数(xとyとz)の対称関数を示す. 頂点にある色つきの丸は関数値が1の点で, 同じ色は対称の相手を表わす.



上の方の2変数対称関数は, それぞれの図で, 左下がx=0, y=0. 右上がx=1, y=1の点で, 破線は対称軸. 従って対称関数は, 同じ色の丸が対称軸について対称であるものである.

2変数関数が16あるうち, 対称なのはここにある0番から7番の8個である.

3変数のx, y, zは, 左上の0番の図に示す通りで, 3変数の場合も, 同じ色の丸は対称軸について3回対称である.

3変数関数は全部で256あり, 対称なのは0番から15番の16個である.

Boole関数は, こういう図の他, その真理値表で表わすことも出来る. x, y, zの各値に対し, 関数値を並べて書く. 例えば3番は多数決関数で


x 00001111
y 00110011
z 01010101
f 00010111


である. 図からは右下の経路で頂点をたどり1と0を書き取ればよい.


ところで, TAOCP 7.1.4項は, BDDが話題であった. BDDは下に示すような図で, 変数を調べる節点を実線と破線で繋げたものである.

一番上の入口(根)から出発し, 丸で示す変数の値を調べ, 値が1なら実線方向へ, 0なら破線方向へ進み, 次の変数をチェックする. 四角に⊥は, 関数の値が0で確定する, 四角にTは, 1で確定し, BDDの出口である.

下の図は, 3変数の16個の対称関数のうち16個のBDDで, 0番のオール0, 15番のオール1は定数関数なので, 省いてある.




最上段の右端の3番が, 話題の多数決関数で, 根の1番変数(xのこと)の脇に先ほどの真理値表が書いてある. xが0なら左下の2番変数へ進み, yを調べる. ここでyも0ならzと無関係に0なので, 0の出口になる. yが1なら, 決定はzによる. そこで3番へ進む. 上へもどり, xが1なら右下の2番変数へ進み, 2も1なら1の出口. 2が0なら3番の変数をしらべる. BDDはこのような図である.


ところでそれぞれの図の節点の数は, 0と1の出口は1個と数えるので, 1番から順に, 5, 7, 6, 7, 7, 7, 5, 5, 7, 7, 7, 6, 7, 5 で合計88個ある. 1の節点は14個あるが, 1段下の2の節点は6種類, 3の節点は2種類しかない. 同じものをまとめてメモリーにいれれば節約になるといってまとめたのが最初に掲げたBDDベースである. ここには節点は24しかない.

1の節点の左下の青の番号は, 対称関数の3変数の番号と一致している. 一番上の3番は, 実線で左の2へ, 破線で右の2に進むが, それぞれの2の左に青で1と3とあるのは, BDDの2の添字に合っている.

もう一度対称関数の絵で3番をみると, xが1の手前の四角の丸は, 直ぐ上の2変数の3番と同じ. xが0の向こうの四角は, 2変数の1番と同じであり, さきほどの添字はそれを表わしている.

変数の図はyの値で1変数の図に分解できる. 下の図が1変数の(対称)関数の図と, その右が0変数の図である.