午後のひとときに、数学の問題について、どのように記述して解くのがいいのかを考えてみる。
問題
302x+93y=1
を満たす、整数x、yを求めよ。
シンキングタイム
タイトルにもある通り、ユークリッドの互除法を使うのですが、
プログラミングではユークリッドの互除法をかなりの頻度で使うのですが、
筆算でユークリッドの互除法って、あまりやらないですよね。
まずは、みなさんが馴染みのある記述で解いてみようかと思います。
302÷93=3...23 → 23=302-3×93
93÷23=4...1 → 1=93-4×23
これより、
1=93-4×23
=93-4×(302-3×93)
=93-4×302+4×3×93
=-4×302+(4×3+1)×93
ゆえに、
x=-4
y=4×3+1=13
検算
302×-4+93×13=-1208+1209=1
答え x=-4、y=13
このように記述して解いても問題ないのですが、
もっと効率よく機械的に記述する方法をご紹介します。
0 | 1 | -4 | 13 | ||||||
-4 | -3 | ||||||||
23 | ) | 93 | ) | 302 | |||||
92 | 279 | ||||||||
1 | 23 |
まずは、302÷93を計算します。
3で割って、余り23になりました。
続いて、93÷23を計算します。
4で割って、余り1になりました。
余りが1になったので、割り算の計算はここで終わり。
93の上の4、302の上の3をマイナスにします。
-4の1段上の左に0と右辺の1を記述します。
1×-4+0=-4
-4×-3+1=13
のように斜めに掛け算をして、斜め上の左の数を足す。
たすき掛けで、
302に掛けられているのは-4、
93に掛けられているのは13、
となります。
では、もう少しユークリッドの互除法が深くなるものを練習問題として出題しておきます。
問題2
23x+49y=1
を満たす、整数x、yを求めよ。
0 | 1 | -1 | 8 | -17 | ||||||||
-1 | -7 | -2 | ||||||||||
2 | ) | 3 | ) | 23 | ) | 49 | ||||||
2 | 21 | 46 | ||||||||||
1 | 2 | 3 |
検算
23×-17+49×8=-391+392=1
答え x=-17、y=8
問題3
64x+87y=3
を満たす整数x、yを求めよ。
0 | 3 | -3 | 6 | -21 | 27 | -75 | 102 | ||||||||||||||
-1 | -1 | -3 | -1 | -2 | -1 | ||||||||||||||||
2 | ) | 3 | ) | 5 | ) | 18 | ) | 23 | ) | 64 | ) | 87 | |||||||||
2 | 3 | 15 | 18 | 46 | 64 | ||||||||||||||||
1 | 2 | 3 | 5 | 18 | 23 |
検算
64×102+87×-75=6528-6523=3
答え x=102、y=-75
ユークリッドの互除法は、かなり効率の良いアルゴリズムなので、試験に出るような数学の問題であれば、数回の反復で解けるものばかりかと思われます。
途中の計算式も採点の対象となるのであれば、この方法での記述では、出題者は面食ってしまって点数を貰えないかもしれません。
テクニックとしては、かなり良いかと思います。
こういう記述とか、あまり学校では教えないですよね。
先生によっては、このへんを教えてくれる人もいるかもしれません。
どちらかと言うと、予備校とかでテクニックとして教えてくれるところもあるかと思います。
本当は、学校問わず、教えてくれるのが望ましいのですけどね。
ではでは