わさっきhb

大学(教育研究)とか ,親馬鹿とか,和歌山とか,とか,とか.

例の解法(その1)

いきなりですが問題です.

119x+24y=1を満たす整数xyの組の一つを求めなさい.

今期の試験問題の一つです.実際には解くのに使うアルゴリズム名も明記していましたが,思うところあって,書かないことにします.Rubyで書いたコードは,http://d.hatena.ne.jp/takehikom/20080804/1217798940にあります.
手計算で求めるための,表をつくります.初期値は,こうです.

1行目は,x=1y=0.2行目は,x=0y=1.これはxyの係数にかかわらず固定です.1行目のrは,与えられた問題のxの係数,2行目は,同じくyの係数とします.変数qは,初期化の際には使用しません.
アルゴリズムに従うと,行単位で次のqrxyの順に求めていくのですが,先に,必要となるqrのペアを求めておきます.

qの値は,2行上のrの値を被除数(割られる数),1行上のrの値を除数(割る数)としたときの商で,その左隣すなわちrの値は剰余(余り)となります.119を24で割ったら,商が4で余りが23.24を23で割ったら,商が1で余りが1.23を1で割ったら,商が23で余りが0.r=0になったら,それ以上の値の更新はありませんので,表のおしまいを意味する横線を引いておきます.なお,「表の上部と底部,それと表頭の直後」の3箇所にだけ横線を引く作法は,フリーハンドで表を描くときだけでなく,論文でも利用可能です.
次に,xyの列を埋めていきます.3行目以降のそれらの値を求めるためのルールは,こうです.

値 = 2つ上の値 - 1つ上の値×同じ行のqの値*1

3行目のxは,1 - 0\times 4で,1です.実は常に1です.

3行目のyは,0 - 1\times 4で,-4です.ここは,必ず-qになるとしてかまいません.

4行目のxは,0 - 1\times 1で,-1です.

4行目のyは,1 - (-4)\times 1で,1+4ですから,5です.

計算としては,これでおしまいです.r=0の一つ上の行のxyの値が,答えとなります.すなわち,x=-1y=5です.実際,119\times (-1)+24\times 5は,-119+120なので1です.
上記のアルゴリズムは,演算回数(特に乗除算)が最小というわけではありません.しかし手計算で求める際に,計算ミスを容易に知ることが可能です.検算方法は,こうです.

(問題のxの係数)×(xの値)+ (問題のyの係数)×(yの値)=(rの値)

この式が,表の各行について成立します.1行目,2行目でも成立します.実際には話が逆で,この等式が成立するように各行の値を定め,かつ計算によりrの値が小さくなるように(アルゴリズムが有限ステップで終了するように)定めているのです.ついでに,r=0の一つ上の行のrの値は,問題のxyの係数の最大公約数です.ここでは,119と24の最大公約数は1となり,最終的に119\times (-1)+24\times 5=1という等式になったわけです.
次のチェックも,検算には有用です.

  • 表の値はすべて整数であり,小数や分数は一切現れません.
  • 3行目以降のxyの値は,一方が正,一方が負です.具体的には,
    • 奇数行目のxは正
    • 偶数行目のxは負
    • 奇数行目のyは負
    • 偶数行目のyは正
  • 下の行に行くほどrは小さくなります.qにはそのような順序関係はありません.

以上が,授業で説明し,試験の解答例で書いてきたことですが,xyの最後の行も埋めれば,もう一つ別の検算ができます.

計算方法は上述のものから変わりません.念のため式を書いておくと,xのほうは,1-(-1)\times 23で24,yのほうは-4-5\times 23=-4-115で-119です.
最終行のxyrの値で検算をすると,119\times 24+24\times (-119)は,って筆算するまでもなく0です.このようにxの値に,問題のyの係数*2yの値に,問題のxの係数が現れて,一方にマイナスの符号がつけば,計算は合っています.そうでなければ,どこかで計算ミスをしています.

*1:なので,xyの列を埋める際,rは使用しません.しかしxyrの3つ組が検算には有用なので,表はxyrqの順に書くようにします.

*2:厳密には「問題のyの係数」を「問題のxyの最大公約数」で割った値となります.今回の計算ではその最大公約数が1なので,「問題のyの係数」と一致しているというだけです.