AIDJ という仮想コンピュータ用の乗算プログラムを作成しています。
任意の数の変数をサポートし、次の形式の操作 (プログラム) の任意のシーケンスを読み取って実行できます。
mk: <operation>
mkはマーカーで、以下からのみ取得する必要があります。
Increment: x(i) = x(i) + 1
Decrement: x(i) = x(i) - 1
Conditional Jump: if x!=0 goto <mk>
Assignment: x(i) = c (where c is any natural number)
潜在的な条件ジャンプとは別に、AIDJ はプログラムで記述された順序で操作を評価し、プログラムが完全に処理されると停止します。
c >= 1のプログラム ADD を例にとります。
00: x(1) = c
01: x(2) = d
02: x(2) = x(2) + 1
03: x(1) = x(1) - 1
04: if x(1) != 0 goto 02
たとえば、プログラム MULTIPLY with c >= 2 を考えてみましょう:
00: x(1) = d
01: x(1) = d - 1
02: x(2) = c
03: x(3) = c
04: x(2) = x(2) + 1
05: x(3) = x(3) - 1
06: if x(3) =! 0 goto 04
07: x(1) = d - 1
08: if x(3) =! 0 goto 03
c × d が c + c + … + c (d 加数) に等しいことを確認して、プログラム ADD を使用できるようにし、ADD が d-1 回実行されるようにします。計算が停止すると、x(2) は c × d に等しくなります。
c=3 および d=3の場合、次の値の表が生成されます。
| Command | x(1) | x(2) | x(3) |
--------------------------------------------------
| 00: x(1) = d | 3 | - | - |
| 01: x(1) = d - 1 | 2 | - | - |
| 02: x(2) = c | 2 | 3 | - |
| 03: x(3) = c | 2 | 3 | 3 |
| 04: x(2) = c + 1 | 2 | 4 | 3 |
| 05: x(3) = d - 1 | 2 | 4 | 2 |
| 06: if x(3) =! 0 goto 04 | 2 | 4 | 2 |
| 04: x(2) = c + 1 | 2 | 5 | 2 |
| 05: x(3) = d - 1 | 2 | 5 | 1 |
| 06: if x(3) =! 0 goto 04 | 2 | 5 | 1 |
| 04: x(2) = c + 1 | 2 | 6 | 1 |
| 05: x(3) = d - 1 | 2 | 6 | 0 |
| 06: if x(3) =! 0 goto 04 | 2 | 6 | 0 |
| 07: x(1) = d - 1 | 1 | 6 | 0 |
| 08: if x(3) =! 0 goto 03 | 1 | 6 | 0 |
| 03: x(3) = c | 1 | 6 | 3 |
| 04: x(2) = c + 1 | 1 | 7 | 3 |
| 05: x(3) = d - 1 | 1 | 7 | 2 |
| 06: if x(3) =! 0 goto 04 | 1 | 7 | 2 |
| 04: x(2) = c + 1 | 1 | 8 | 2 |
| 05: x(3) = d - 1 | 1 | 9 | 1 |
| 06: if x(3) =! 0 goto 04 | 1 | 9 | 1 |
| 04: x(2) = c + 1 | 1 | 9 | 1 |
| 05: x(3) = d - 1 | 1 | 9 | 0 |
| 06: if x(3) =! 0 goto 04 | 1 | 9 | 0 |
| 07: x(1) = d - 1 | 0 | 9 | 0 |
| 08: if x(3) =! 0 goto 03 | 0 | 9 | 0 |
上記のプログラムを変更して、乗算ではなく除算するようにするにはどうすればよいですか?