シリーズ「コンピュータの誤り訂正のしくみ」 第3回

回路が「突き止める」とは?

気づくを、組み合わせる

ここまでの 2 回を、振り返っておこう。

第1回は、4 桁の知らせに、1 の数を偶数にそろえる検査の桁を 1 つ足した。 これだけで、どの 1 桁が化けても、受け取った側のランプが必ず光った。 けれど、どこが化けたかは分からなかった。

前回は、同じ 4 桁を 3 回送り、縦に並んだ 3 つごとに多数決をとった。 これで、1 か所の化けなら直せるようになった。 けれど、送る桁は 12。足した桁は 8 つで、パリティの 8 倍かかった。

そして、前回の終わりに、こう問いかけた。

気づくを組み合わせて、どこが化けたかまで分からないか。

第1回のパリティは、なぜ場所が分からなかったのだろう。 5 桁全部を、1 つのランプで見ていたからだ。 どの桁が反転しても、同じ 1 つのランプが、同じように光る。 光り方が 1 通りしかなければ、場所を言い分けようがない。

それなら、ランプを増やせばいい。 全部の桁をまとめて見るのではなく、桁の組ごとにパリティをかけて、組ごとにランプを付ける。 どのランプが光ったかで、場所が絞りこめるかもしれない。

問題は、組の作り方である。

並べて、縦と横

4 桁の知らせを、2 行 2 列に並べてみる。 1011 なら、1 行目が 1 0、2 行目が 1 1 だ。

こうすると、組が 2 通りの向きで作れる。 横に並んだ 2 つ(行)と、縦に並んだ 2 つ(列)だ。

そこで、それぞれにパリティをかける。

  • 行ごとに、1 の数を偶数にそろえる桁を、行の右端に足す(横の検査の桁)
  • 列ごとに、1 の数を偶数にそろえる桁を、列の下に足す(縦の検査の桁)

1011 で決めてみよう。

  • 1 行目は 1 0。1 は 1 個で奇数だから、横の検査の桁は 1
  • 2 行目は 1 1。1 は 2 個で偶数だから、横の検査の桁は 0
  • 1 列目は 1 1。1 は 2 個で偶数だから、縦の検査の桁は 0
  • 2 列目は 0 1。1 は 1 個で奇数だから、縦の検査の桁は 1

どの行も、どの列も、1 の数が偶数になった。 右下の角は、空けておく。

送るのは、知らせの 4 桁と、検査の桁 4 つで、8 桁になる。

受け取った側は、届いた 8 桁を同じ形に並べ直す。 そして、行ごと、列ごとに、1 の数が偶数かどうかを確かめる。 奇数なら、その行(列)のランプを光らせる。

ランプは、行の右端に 2 つ、列の下に 2 つ。 右のランプを横のランプ、下のランプを縦のランプと呼ぶことにする。 どのランプも、第1回のパリティの検査そのものだ。 ただ、見ている桁が、全部ではなく、1 つの行か 1 つの列だけになっている。

押して、確かめる

まずは、ランプが光るところまでを見よう。 直すのは、もう少しあとにする。

縦横のパリティ シミュレータ

知らせを決めてから、⚡ でどれか 1 桁を化かしてみてください

送る側

1
0
0
1

右の紫=その行(横)の 1 の数を偶数にそろえる桁
下の紫=その列(縦)の 1 の数を偶数にそろえる桁

↓ 8 桁を送る。通り道(⚡ を押した桁が反転する)

↓ 化けた桁:0 か所

受け取る側

1
0
1
1
1
0
0
1

右のランプ=その行(横)の 1 の数が奇数なら光る
下のランプ=その列(縦)の 1 の数が奇数なら光る

受け取った側の回路は、送った知らせを知らない

ランプは 1 つも光っていない。どの行も、どの列も、1 の数は偶数だ。

知らせを好きに決めてから、⚡ で空色の知らせの桁を 1 つ化かしてほしい。

横のランプが 1 つと、縦のランプが 1 つ、光る。 光ったランプの行と列には、薄い帯を敷いた。 帯が十字に重なって、濃くなっているマスがあるはずだ。

別の桁を化かしてみる。 光るランプの組み合わせが変わり、十字の重なるところも動く。

ここでも、いつもの確認をしておこう。 受け取った側の回路は、送った知らせを知らない。 赤い枠は、画面の前のあなたにだけ見えている。 回路に分かるのは、4 つのランプのどれが光ったか、それだけだ。

交わるところ

なぜ、十字の重なるところが、化けた桁と一致するのだろう。

1 行 2 列の桁が化けたとする。 この桁は、2 つの検査に見られている。 1 行目の横の検査と、2 列目の縦の検査だ。 だから、その 2 つのランプが光る。

ほかのランプは光らない。 2 行目の横の検査も、1 列目の縦の検査も、この桁を見ていないからだ。

では、逆に考えてみる。 横の 1 行目と、縦の 2 列目のランプが光った。 この 2 つの検査が両方とも見ている桁は、どれか。

1 行目の横の検査が見ているのは、1 行目の桁。 2 列目の縦の検査が見ているのは、2 列目の桁。 両方に入っているのは、1 行 2 列の桁、ただ 1 つしかない。

光った横のランプから行が決まり、縦のランプから列が決まる。 行と列が決まれば、マスは 1 つに決まる。

チェスの盤も、同じ考え方でマスを呼ぶ。 縦の列に a から h、横の段に 1 から 8 の名前を付けて、「e4」のように、列と段の名前を 1 つずつ言う。 それだけで、64 マスのどれなのかが決まる。

ふちに数字とアルファベットが書かれたチェス盤と、並んだ駒

盤のふちの文字と数字を 1 つずつ言えば、マスは 1 つに決まる

数字を並べた表を、縦に足した合計と横に足した合計で確かめる検算にも、似ている。 表のどこかに書き間違いがあると、そのマスの行の合計と、列の合計が、両方とも合わなくなる。 合わない行と、合わない列の交わるところを見に行けばいい。

このシリーズでは、このやり方を縦横のパリティと呼ぶ。 情報処理の教科書では、「水平垂直パリティ」という名前で出てくることが多い。

場所が分かれば、直せる

化けた場所が分かった。 では、どう直せばいいだろう。

答えは、拍子抜けするほど簡単だ。 その桁を、反転すればいい。

化けた桁は、いま間違った値を持っている。 0 と 1 しかないのだから、間違っているなら、正しいのはもう片方しかありえない。 1 なら 0 に、0 なら 1 に戻せば、それが送られた値だ。

今度のシミュレータは、受け取った側が、ランプの光り方から 1 桁を反転する。

縦横で直す シミュレータ

⚡ で化かした桁を、受け取った側が見つけて直せるか見てください

送る側

1
0
0
1

右の紫=その行(横)の 1 の数を偶数にそろえる桁
下の紫=その列(縦)の 1 の数を偶数にそろえる桁

↓ 8 桁を送る。通り道(⚡ を押した桁が反転する)

↓ 化けた桁:0 か所

受け取る側

1
0
1
1
1
0
0
1

右のランプ=その行(横)の 1 の数が奇数なら光る
下のランプ=その列(縦)の 1 の数が奇数なら光る

受け取った側の回路は、送った知らせを知らない

受け取った側が直した 8 桁

1
0
1
1
1
0
0
1

受け取った知らせ:1011

緑の ✓ = 回路が反転した桁(回路にも分かる)
✗ = 送ったのと違う(あなたにだけ見える)

ランプは 1 つも光っていない。そのまま受け取る。

知らせの桁を 1 つ化かしてほしい。 「受け取った側が直した 8 桁」で、交わるところのマスに緑の ✓ が付き、値が元に戻る。 受け取った知らせは、送ったとおりだ。

これは、0 と 1 しかない世界だからできることである。

もし 1 つの桁が、0 から 9 までの 10 通りの値をとるとしたらどうだろう。 「このマスが間違っている」と分かっても、正しい値の候補は、いま入っている値を除いて、まだ 9 通り残る。 場所のほかに、「どれだけずれたか」という手がかりが、もう 1 つ要る。

0 と 1 なら、候補は 1 つしか残らない。 場所が分かった時点で、答えも分かっている。

前回の多数決は、同じ桁を 3 つ比べて、多いほうを選んだ。 この回路は、同じ桁の写しを持っていない。 それでも直せるのは、場所を突き止めたからだ。

0 と 1 しかない世界では、化けた場所さえ分かれば、反転するだけで直せる。場所は、縦と横の検査が交わるところにある。

検査の桁も、化ける

化けるのは、知らせの桁だけではない。 検査の桁も、同じ通り道を通ってくるのだから、同じように化ける。

上のシミュレータで、今度は紫の検査の桁を化かしてほしい。 たとえば、1 行目の右端の、横の検査の桁。

横の 1 行目のランプだけが光る。縦のランプは、どれも光らない。

横の検査の桁は、その行の横の検査にしか見られていない。 どの列の縦の検査にも入っていないからだ。

受け取った側は、こう考える。 横のランプが 1 つ光ったのに、交わる縦のランプが無い。 知らせの桁が化けたなら、縦のランプも光るはずだ。 だから、化けたのは、その行の横の検査の桁そのものだ、と。

縦の検査の桁が化けたときも同じで、縦のランプだけが 1 つ光る。

受け取った側の決め方をまとめると、こうなる。

  • 横のランプ 1 つと、縦のランプ 1 つが光った → 交わるところの知らせの桁を反転する
  • 横のランプだけが 1 つ光った → その行の、横の検査の桁を反転する
  • 縦のランプだけが 1 つ光った → その列の、縦の検査の桁を反転する

8 か所のどこが化けても、光り方はすべて違う。

化けた桁光るランプ
知らせ 1 行 1 列横の 1 行目 + 縦の 1 列目
知らせ 1 行 2 列横の 1 行目 + 縦の 2 列目
知らせ 2 行 1 列横の 2 行目 + 縦の 1 列目
知らせ 2 行 2 列横の 2 行目 + 縦の 2 列目
横の検査 1 行目横の 1 行目だけ
横の検査 2 行目横の 2 行目だけ
縦の検査 1 列目縦の 1 列目だけ
縦の検査 2 列目縦の 2 列目だけ

だから、どの 1 か所が化けても、場所を突き止めて直せる。 検査の桁が化けたときは、知らせはもともと無事だったことになる。

気の早い人は、もう 2 か所を化かしてみたかもしれない。 光り方によっては、回路は「直せない」と言う。 光り方によっては、化けていない桁を反転して、自信満々に間違える。 2 か所は、この回路の手には余る。 この話は、もう少し先の回まで取っておこう。

桁を数える

物差しの表に、1 行足そう。

やり方送る桁数1 か所化けたら2 か所化けたら
そのまま4気づかない気づかない
パリティ5気づく気づかない
3 回送る12直す別の桁なら直る。同じ桁の 2 回なら、間違った値に直す
縦横のパリティ8直す気づくことが多いが、間違って直すこともある

3 回送るやり方は、足した桁が 8 つだった。 縦横のパリティは、4 つ。 同じ「1 か所なら直す」が、半分の桁でできた。

知らせが長くなると、差はもっと開く。 知らせを大きな正方形に並べれば、足す桁は、行の数と列の数の分だけで済むからだ。

知らせの桁並べ方縦横のパリティで足す桁3 回送るなら足す桁
42×248
164×4832
648×816128

64 桁の知らせなら、3 回送るやり方は 128 桁も足すのに、縦横のパリティは 16 桁で済む。 ただし、直せるのは、表全体で 1 か所までだ。

表の形に並べて、縦と横の両方から確かめるという考え方は、実際の機械にも使われてきた。 1960 年代の IBM の磁気テープ装置を見てみよう。

青い板の付いた大きな箱が 3 台並び、それぞれの上のほうに、テープを巻いたリールが 2 つずつ見える

IBM 2401 型の磁気テープ装置。2 つのリールのあいだでテープを巻き取りながら、読み書きする

テープには、長さの方向に、9 本の筋(トラック)が走っている。 1 文字は、テープの幅の方向に並んだ 9 か所に、いっぺんに書く。 次の文字は、その隣に書く。 だから、テープの上では、1 文字が縦の 1 列になり、文字が横に並んでいく。

テープの長さの方向(書いていく順)…1 文字(幅の方向に 9 か所)1 本の筋検査終わりの1 文字
  • 文字の桁(1 文字に 8 か所)
  • いちばん下の段:文字ごと(列ごと)に 1 の数をそろえる桁。この回の縦の検査の桁と同じ役
  • 右端の 1 文字:筋ごと(行ごと)に 1 の数をそろえる桁。この回の横の検査の桁と同じ役

説明のために描き直した図。実物では、検査の筋は 9 本の真ん中あたりにある。
また、「終わりの 1 文字」の手前にある、もう 1 つの検査の文字は省いた

9 か所のうち 1 か所(図のいちばん下の段)は、その文字の 1 の数をそろえる桁だ。 列ごとの検査だから、この回の縦の検査の桁と同じ役になる。

そして、ひとまとまりの文字を書き終えたところに、筋ごとの 1 の数をそろえる文字を 1 つ書く(図の右端)。 こちらは行ごとの検査で、横の検査の桁と同じ役だ。

テープの上に、この回のシミュレータと同じ向きの表が、ずっと長く引き伸ばされて描かれていたわけだ。 (実際に 1 か所を直すのには、もっと手の込んだ、別の検査の文字も使っていた。)

ランプの使い道

最後に、ランプのほうを数えてみよう。

ランプは 4 つ。 どれも、光るか消えているかの 2 通りだから、光り方は 2 × 2 × 2 × 2 = 16 通りある。

そのうち、受け取った側の決め方で使っているのは、何通りだろう。

  • 1 つも光らない(無事)… 1 通り
  • 知らせの桁のどれかが化けた … 4 通り
  • 検査の桁のどれかが化けた … 4 通り

合わせて、9 通りだけだ。

表を開いた状態のシミュレータを置いておく。 ⚡ を押して、いまの光り方が表のどこに落ちるか、見てほしい。

縦横で直す シミュレータ

⚡ で化かした桁を、受け取った側が見つけて直せるか見てください

送る側

1
0
0
1

右の紫=その行(横)の 1 の数を偶数にそろえる桁
下の紫=その列(縦)の 1 の数を偶数にそろえる桁

↓ 8 桁を送る。通り道(⚡ を押した桁が反転する)

↓ 化けた桁:0 か所

受け取る側

1
0
1
1
1
0
0
1

右のランプ=その行(横)の 1 の数が奇数なら光る
下のランプ=その列(縦)の 1 の数が奇数なら光る

受け取った側の回路は、送った知らせを知らない

受け取った側が直した 8 桁

1
0
1
1
1
0
0
1

受け取った知らせ:1011

緑の ✓ = 回路が反転した桁(回路にも分かる)
✗ = 送ったのと違う(あなたにだけ見える)

ランプは 1 つも光っていない。そのまま受け取る。

左の見出し=横のランプ(右の 2 つ)の光り方
上の見出し=縦のランプ(下の 2 つ)の光り方

横\縦
無事—
—
—
————

小さな図=回路が「化けた」と考える桁
— = 1 か所の化けでは、こう光らない(直せない)
使うのは 9 通り(無事 1 + 1 か所 8)、空きは 7 通り

表の「—」のマスは、横のランプが 2 つとも光るか、縦のランプが 2 つとも光る光り方だ。 1 か所の化けでは、こう光ることはない。 16 通りのうち 7 通りは、使わずに空いている。

ランプを 4 つ置いたのに、光り方の半分近くを遊ばせている。 なんだか、もったいない。

ランプを減らしても、化けた場所を言い当てられないか。 ランプが減れば、検査の桁も減る。送る桁数は、もっと少なくなるかもしれない。

次回は、ランプを 3 つに減らしてみよう。

参考文献

シリーズ「コンピュータの誤り訂正のしくみ」