2009年1月20日火曜日

開平法

1月13日から15日, プログラミング・シンポジウムに参加してきた.

手回し計算機の話題で, 開平が出来るといったら, 怪訝な顔をする人がいたので, 大きなお世話かとも思うが, 私流に説明したい.

まず筆算の方法のおさらいから. 十進法で200000000の平方根を計算してみる.

開平は基本的には除算と似ている. 除算では被除数を最初の部分剰余とし, 部分剰余から除数の倍数を引いて次の部分剰余を作るというステップを繰り返す. 最後の部分剰余が剰余になる. 各ステップで商が1桁ずつ得られる.

除数の何倍を引けば次の部分剰余が除数より小さくなるかを決めるのが, 除数の難しい点である.

開平も被開平数(radicand)を部分剰余とし, 次々と部分剰余と平方根の1桁を求めながら進行するのは除算と同じである. しかし除数の倍数として商が得られるのでなく, 平方根が除数のような相手なしに徐々に決っていくところが除算と違う.

下の図が筆算の経過で, 左部分と中部分と「=」より右の右部分からなり, 平方根が10000, 14000, 14100, 14140, 14142と順に得られる様子を示す. 右部分は中部分の値の説明で, 筆算ではいらない. この図で, aの行の中部分の200000000が被開平数で, 最初の部分剰余である. 十進の開平には平方根の1桁は, 小数点を中心にした2桁ずつの部分剰余から決める. 最初に検討するのは, 小数点から2桁ずつ左に区切っていった最後の2桁(2だけの)部分である. 2を超えない最大の平方根は1なので, それが左のaとbにある1と1になる. その1と1を掛けた1を中部分の2から引く. cの中部分の10000000は右にあるように, 被開平数から最初の平方根を引いたものである.



最初の平方根1をxとする. 次の桁の平方根をyとすると, そこまでの平方根は10x+y. 部分剰余は被開平数から(10x+y)2=100x2+20xy+y2を引いたものになる. しかしすでに100x2は引いてあるので, 20xy+y2=(20x+y)*yを引くことになる.

cとdの行の左部分の24と4がこの20x+yyに相当する. cの行の2はaとの行の1と1(つまりxx)を足したものだ. (20x+y)*yで100を超えない最大のyを探すと4なので, cとdの左に24と4を書き, 中にその積96を書き,100から引いて次の部分剰余400が得られる.

これを繰り返すとkの行で最後の部分剰余3836が得られ, 平方根が14142となる.

以前このブログに書いた個人用電卓 Happy Hacking Calculatorの平方根は剰余も得られるが, この部分剰余がスタックの2段目に得られる.

ところで, 除算でもこの剰余と除数に対し商に何を立てるか決めるのは面倒である. 一方, 手回し計算機では, 除数を引けなくなるまで繰り返し引くことである桁の商がきまる.

手回し計算機での開平法は, 下の図がその説明である. 上の図で24掛ける4を決めた代りにyを1から順に増やすのである. それまでに得た平方根をxとし, まずy=1として(20x+1)*1を引く. 次にy=2として(20x+2)*2を引くのだが,(20x+1)*1はすでに引いてあるので, (20x+2)*2-(20x+1)*1=40x+4-(20x+1)=20x+3を引く. 更にy=3とすると20x+5を引くことになる.



かくして手回し計算機でも, 無事に開平が出来るのである.

0 件のコメント: