拡張されたユークリッドの互除法を筆算で行う方法
拡張されたユークリッドの互除法
拡張されたユークリッドの互除法とは不定方程式
の解(の1つ)を求めるアルゴリズムで、これをプログラミング言語で実装する方法はあちこちで解説されています。この記事では筆算を使って拡張されたユークリッドの互除法による解を求めてみましょう。
例 1
まず 11/7
と書きます。これは
割り算 | |
---|---|
11/7 |
次に 余り..商
の順で書きます。
割り算 | 余り..商 |
---|---|
11/7 |
4..1 |
次の行では前の行の除数(
割り算 | 余り..商 |
---|---|
11/7 |
4..1 |
7/4 |
記述的には「前の行を左にシフト」と覚えるとわかりやすいです。この例では
割り算 | 余り..商 |
---|---|
11/7 |
4..1 |
7/4 |
3..1 |
以上のステップを余りが
割り算 | 余り..商 |
---|---|
11/7 |
4..1 |
7/4 |
3..1 |
4/3 |
1..1 |
3/1 |
0..3 |
右側に2カラム増設し、1行目の右側が□になるように市松に塗ります。
割り算 | 余り..商 | ||
---|---|---|---|
11/7 |
4..1 |
□ | |
7/4 |
3..1 |
□ | |
4/3 |
1..1 |
□ | |
3/1 |
0..3 |
□ |
一番下の□に
割り算 | 余り..商 | ||
---|---|---|---|
11/7 |
4..1 |
□ | |
7/4 |
3..1 |
□ | |
4/3 |
1..1 |
□ | |
3/1 |
0..3 |
1 |
下から2行目の□に、「□の斜め下の数」
割り算 | 余り..商 | ||
---|---|---|---|
11/7 |
4..1 |
□ | |
7/4 |
3..1 |
□ | |
4/3 |
1..1 |
1 |
|
3/1 |
0..3 |
1 |
上から2行目の□には、「□の真下[1]の数」
割り算 | 余り..商 | ||
---|---|---|---|
11/7 |
4..1 |
□ | |
7/4 |
3..1 |
2 |
|
4/3 |
1..1 |
1 |
|
3/1 |
0..3 |
1 |
このステップを1行目まで繰り返します。今回の場合の1行目の□は
割り算 | 余り..商 | ||
---|---|---|---|
11/7 |
4..1 |
3 |
|
7/4 |
3..1 |
2 |
|
4/3 |
1..1 |
1 |
|
3/1 |
0..3 |
1 |
最後に、下から2行目の□に入れた数値にマイナスをつけ、その数値と同じカラムにある全ての数値にもマイナスをつけます。
割り算 | 余り..商 | ||
---|---|---|---|
11/7 |
4..1 |
-3 |
|
7/4 |
3..1 |
2 |
|
4/3 |
1..1 |
-1 |
|
3/1 |
0..3 |
1 |
1行目と2行目の□に入れた数が解(の1つ)です。
今回の例の
(説明のために表をたくさん載せていますが、実際に計算する場合には表は1枚で済みます)
例 2
↓
割り算 | 余り..商 |
---|---|
111/30 |
21..3 |
30/21 |
9..1 |
21/9 |
3..2 |
9/3 |
0..3 |
↓
111/30 |
21..3 |
□ | |
30/21 |
9..1 |
□ | |
21/9 |
3..2 |
□ | |
9/3 |
0..3 |
□ |
↓
111/30 |
21..3 |
11 ( |
|
30/21 |
9..1 |
3 ( |
|
21/9 |
3..2 |
2 ( |
|
9/3 |
0..3 |
1 |
↓
111/30 |
21..3 |
-11 |
|
30/21 |
9..1 |
3 |
|
21/9 |
3..2 |
-2 |
|
9/3 |
0..3 |
1 |
負数の扱い
筆算を使わないやり方
筆算と同様の互除法のテーブルを作ります。余り..商
ではなく通常順の 商..余り
で書き直してあります。
割り算 | 商..余り |
---|---|
11/7 |
1..4 |
7/4 |
1..3 |
4/3 |
1..1 |
3/1 |
3..0 |
これを元に還元用の式を導出します。
割り算 | 商..余り | 還元式 |
---|---|---|
11/7 |
1..4 |
|
7/4 |
1..3 |
|
4/3 |
1..1 |
|
3/1 |
3..0 |
この還元式によって不定方程式の右辺の
よって
この筆算法の利点
- 覚えやすい。
- 負数の演算を必要としないので、間違えにくい。小学生でも計算できる。
(追記)別の筆算手法
よりよいと思われる筆算法を見つけた[2]ので、追記します。ただし負数の演算が必要です。
以下のように表を作り始めます。
11 |
7 |
備考 | ||
---|---|---|---|---|
1 |
0 |
11 |
この行
次の行を以下のように追加します。
11 |
7 |
備考 | ||
---|---|---|---|---|
1 |
0 |
11 |
||
0 |
1 |
7 |
11 |
7 |
備考 | ||
---|---|---|---|---|
1 |
0 |
11 |
||
0 |
1 |
7 |
||
1 |
-1 |
4 |
11 |
7 |
備考 | ||
---|---|---|---|---|
1 |
0 |
11 |
||
0 |
1 |
7 |
||
1 |
-1 |
4 |
||
-1 |
2 |
3 |
11 |
7 |
備考 | ||
---|---|---|---|---|
1 |
0 |
11 |
||
0 |
1 |
7 |
||
1 |
-1 |
4 |
||
-1 |
2 |
3 |
||
2 |
-3 |
1 |
行
111 |
30 |
備考 | ||
---|---|---|---|---|
1 |
0 |
111 |
||
0 |
1 |
30 |
111 |
30 |
備考 | ||
---|---|---|---|---|
1 |
0 |
111 |
||
0 |
1 |
30 |
||
0 |
3 |
90 |
次に
111 |
30 |
備考 | ||
---|---|---|---|---|
1 |
0 |
111 |
||
0 |
1 |
30 |
||
0 |
3 |
90 |
||
1 |
-3 |
21 |
以下同様に和の列に
111 |
30 |
備考 | ||
---|---|---|---|---|
1 |
0 |
111 |
||
0 |
1 |
30 |
||
0 |
3 |
90 |
||
1 |
-3 |
21 |
||
-1 |
4 |
9 |
||
-2 |
8 |
18 |
||
3 |
-11 |
3 |
行
慣れると
111 | 30 | 備考 | ||
---|---|---|---|---|
1 |
0 |
111 |
||
0 |
1 |
30 |
||
1 |
-3 |
21 |
||
-1 |
4 |
9 |
||
3 |
-11 |
3 |
この筆算法の利点
- 各行が
を表しているだけなので理論的に覚えやすい(忘れても思い出しやすい)a \times x + b \times y = c - また、引き算の順序を多少間違えても間違った等式を導出するわけではないので、迂遠ながらも最終行にたどり着くことは容易です。
- 負数の場合も、行が
を表していることを覚えてさえいれば、1行目2行目の初期値の正負を理論的にいじれば良いだけです。a \times x + b \times y = c
例えば
111 |
-30 |
備考 | ||
---|---|---|---|---|
1 |
0 |
111 |
||
0 |
-1 |
30 |
続けて計算を続ければ以下のようになります。
111 |
-30 |
備考 | ||
---|---|---|---|---|
1 |
0 |
111 |
||
0 |
-1 |
30 |
||
1 |
3 |
21 |
||
-1 |
-4 |
9 |
||
3 |
11 |
3 |
Discussion