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

回路が「気づく」とは?

遠くから届く 0 と 1

1977 年に打ち上げられた探査機ボイジャー 1 号は、いまも地球に電波を送ってきている。 地球からの距離は、250 億 km を超えた。 人間が作ったもので、これより遠くにあるものはない。

白い皿のようなアンテナを載せた探査機ボイジャー

ボイジャー。上の白い皿(直径 3.7 m)で、地球と電波をやりとりする

探査機が送ってくるものは、写真も、測ったデータも、すべて 0 と 1 の並びだ。 0 か 1 かの 1 桁を、ビットという。 このシリーズでは、名前を出すのはここだけにして、あとは単に「桁」と呼ぶ。

その電波は、とても弱い。 ボイジャー 1 号の送信機の強さは、およそ 23 ワット。 それが地球に届くころには、10 億分の 1 の、さらに 10 億分の 1 ワットにも満たなくなっている。

地上では、巨大なパラボラアンテナでこの電波を拾う。 NASA のアンテナには、直径 70 m のものがある。 日本にも、長野県佐久市に直径 54 m のアンテナがある。

山のふもとに並ぶ、大小のパラボラアンテナ

空に向けた大きな皿で、かすかな電波を集める

受け取る側は、拾った電波から、1 桁ずつ 0 か 1 かを読み取る。 ところが、宇宙にも、アンテナや受信機の中にも、雑音がある。 弱い電波に雑音が混ざると、0 を 1 と、1 を 0 と、読み違えることがある。

0 が 1 に、1 が 0 に変わってしまうこと。 このシリーズでは、これを化けると呼ぶ。

化けるのは、宇宙の話だけではない。 線の中を走る信号も、回路が覚えている値も、雑音でときどき化ける。 『記憶のしくみ』を読んだ人は、第9回の「使っていない番号」に出てきた、ノイズで一瞬化ける桁を思い出してほしい。

では、受け取った側は、化けたことに気づけるだろうか。

化けても、分からない

話を小さくしよう。 送りたい知らせは 4 桁、たとえば 1011 とする。

通り道で 3 桁目が化けて、1001 が届いたとする。 受け取った側は、1001 を見て、おかしいと思えるだろうか。

思えない。 1001 も、りっぱな知らせだからだ。

4 桁のパターンは、0000 から 1111 まで 16 通りある。 送る側は、そのどれを送ってもよい。 だから、どのパターンが届いても、受け取った側は「そういう知らせが送られてきた」と読むしかない。

下のシミュレータで確かめてほしい。 上の 4 つのスイッチで送る知らせを決め、通り道の ⚡ を押すと、その桁が受け取るまでのあいだに反転する。

そのまま送る シミュレータ

送る側のスイッチで知らせを決め、⚡ を押して桁を化かしてみてください

送る側

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

↓ 化けた桁:0 か所

受け取る側

1
0
1
1

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

受け取った側には、これが送られたとおりかどうかを確かめる手がかりがない。

どこを化かしても、受け取る側には何も起きない。

「16 通りの地図」を開くと、受け取ったパターンがどこに落ちたかが分かる。 どこを化かしても、落ちる先は 16 通りのどれか、つまりありうる知らせのどれかだ。

化けたパターンと、正しいパターンの見分けがつかない。 困るのは、ここである。

1 桁、足す

そこで、1 桁だけ足して送ることにする。

送る前に、知らせの中の 1 の数を数える。

  • 1 の数が奇数なら、1 を足す
  • 1 の数が偶数なら、0 を足す

こうすると、送る 5 桁の中の 1 の数は、いつも偶数になる。

1011 なら、1 は 3 個で奇数。1 を足して、10111 を送る。 1001 なら、1 は 2 個で偶数。0 を足して、10010 を送る。

足した桁を検査の桁、もとの 4 桁を知らせの桁と呼ぶことにする。

受け取る側は、5 桁の中の 1 の数が偶数かどうかを確かめればいい。 偶数なら、そのまま受け取る。 奇数なら、どこかがおかしい。

なぜ、これで気づけるのか。

5 桁のパターンは、32 通りある。 そのうち、送る側が送る可能性があるのは、1 の数が偶数の 16 通りだけだ。 残りの 16 通りは、送る側が決して送らない。ありえないパターンである。

どれか 1 桁が化けると、1 の数は 1 つ増えるか、1 つ減る。 どちらにしても、偶数は奇数になる。 だから、1 か所化けたパターンは、必ずありえないパターンの側に落ちる。

4 桁で送ったときは、化けても、落ちる先がどれも「ありうる知らせ」だった。 1 桁足したことで、落ちる先に「ありえない」側ができたのだ。

1 の数が偶数か奇数か。これをパリティという。 英語の parity は、もともと「等しいこと」を表す言葉で、数学では、整数が偶数か奇数かという性質を指す。 足した検査の桁は、パリティの桁とも呼ばれる。 機器どうしを線でつないで 1 桁ずつ送る通信(シリアル通信)でも、実際に使われている。

押して、確かめる

今度は、検査の桁を足して 5 桁で送る。 検査の桁は、送る側が自動で決める。紫のマスがそれだ。

受け取る側には、「検査の回路」と、ランプを 1 つ置いた。 回路の中身は、あとで開ける。いまは、ランプだけを見てほしい。

パリティ シミュレータ

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

送る側

知らせ
検査
1

知らせの 1 の数:3 → 検査の桁を 1 にして、合わせて 4(偶数)

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

↓ 化けた桁:0 か所

受け取る側

知らせ
1
0
1
1
検査
1

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

数えてみると、1 の数:4(偶数)

↓ 受け取った 5 桁を、検査の回路に入れる

検査の回路1234検中身は、あとで開ける10111化けた

ランプは消えている。1 の数は偶数で、正しいパターンに見える。

知らせを好きに決めてから、⚡ でどれか 1 桁を化かしてほしい。

ランプが光る。 どの桁を化かしても、光る。 知らせの桁でなく、検査の桁そのものが化けても、やはり光る。

地図を開くと、受け取ったパターンが「ありえない」側へ飛んでいるのが分かる。

ここで、ひとつ強調しておきたい。

受け取る側の回路は、送った知らせを知らない。 シミュレータの赤い枠は、画面の前のあなたにだけ見えている印だ。 回路が見ているのは、受け取った 5 桁だけである。

それでも、化けたことに気づける。 正しい答えを知らなくても、「ありえない」ことは分かるからだ。

数えずに、偶奇を知る

では、検査の回路の中身を見よう。

「1 の数を数えて、偶数か奇数かを見る」。 そう書くと、数を数える回路が要りそうに見える。 けれど、知りたいのは、いくつあるかではない。偶数か奇数か、それだけだ。 それなら、数えなくても分かる。

使うのは、XOR というゲートである。 入力が 2 本、出力が 1 本。入力が食い違っているときだけ 1 になる。

入力1入力2出力
000
011
101
110

この表を、少し違う向きから読んでみる。

入力2 が 0 の行(1 行目と 3 行目)では、出力は入力1 と同じだ。 入力2 が 1 の行(2 行目と 4 行目)では、出力は入力1 の反対になっている。

つまり XOR は、片方が 1 なら、もう片方を反転して通すゲートでもある。 『計算のしくみ』を読んだ人は、第3回で XOR を同じように読み直したのを思い出してほしい。

これを、つないでいく。

  1. 1 桁目と 2 桁目を XOR に入れる
  2. その答えと、3 桁目を XOR に入れる
  3. その答えと、4 桁目を XOR に入れる
  4. その答えと、検査の桁を XOR に入れる。これがランプにつながる

途中の答えは、何を表しているだろうか。

はじめの XOR の答えは、1 桁目と 2 桁目の 1 の数が奇数なら 1 だ(1 個なら 1、0 個と 2 個なら 0)。 次の XOR は、そこへ 3 桁目を入れる。 3 桁目が 0 なら、答えはそのまま通る。1 の数が増えないのだから、偶奇も変わらない。 3 桁目が 1 なら、答えは反転する。1 の数が 1 つ増えたのだから、偶奇がひっくり返る。

だから、どの段の答えも、**「ここまでの桁の 1 の数が奇数なら 1」**になっている。 最後の答えは、5 桁ぜんぶの 1 の数が奇数なら 1。 ランプが光るのは、1 の数が奇数のとき、つまり、ありえないパターンを受け取ったときだ。

箱を開けたシミュレータで、確かめてほしい。

パリティ シミュレータ(検査の回路を開けた)

⚡ を押して、XOR の鎖を答えがどう伝わるか見てください

送る側

知らせ
検査
1

知らせの 1 の数:3 → 検査の桁を 1 にして、合わせて 4(偶数)

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

↓ 化けた桁:0 か所

受け取る側

知らせ
1
0
1
1
検査
1

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

数えてみると、1 の数:4(偶数)

↓ 受け取った 5 桁を、検査の回路に入れる

XORXORXORXOR1234検10111化けた

ランプは消えている。1 の数は偶数で、正しいパターンに見える。

⚡ でどれか 1 桁を化かすと、その桁が入る段から先の答えが、すべて 1 回ずつ反転する。 そして、最後の出力も反転する。

どの 1 本を反転させても、出力が反転する。 これが、1 か所の化けに必ず気づける理由である。 『記憶のしくみ』を読んだ人は、第2回の階段の照明を思い出してほしい。2 階と 1 階のどちらのスイッチを倒しても照明が反転した、あの XOR 1 個の回路の、スイッチを 5 つに増やしたものだ。

この回路は、1 の数を一度も数えていない。 隣へ渡しているのは、「ここまでで奇数か」を表す 1 桁だけだ。

送る側の検査の桁も、同じつなぎ方で作れる。 知らせの 4 桁を、XOR 3 つでつなげばいい。 最後の答えは「知らせの 1 の数が奇数なら 1」。まさに、足すべき検査の桁である。

2 か所、化けたら

では、2 か所を同時に化かしたら、どうなるだろう。 今度は地図を開いた状態にしておいた。

パリティ シミュレータ(検査の回路を開けた)

⚡ を押して、XOR の鎖を答えがどう伝わるか見てください

送る側

知らせ
検査
1

知らせの 1 の数:3 → 検査の桁を 1 にして、合わせて 4(偶数)

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

↓ 化けた桁:0 か所

受け取る側

知らせ
1
0
1
1
検査
1

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

数えてみると、1 の数:4(偶数)

↓ 受け取った 5 桁を、検査の回路に入れる

XORXORXORXOR1234検10111化けた

ランプは消えている。1 の数は偶数で、正しいパターンに見える。

正しい(1 の数が偶数)16 通り

00000000110010100110010010101001100011111000110010101001011111000110111110111110

ありえない(1 の数が奇数)16 通り

00001000100010000111010000101101101011101000010011101011011011001110101110011111

点線の枠=送ったパターン 塗り=受け取ったパターン

⚡ を 2 つ押してほしい。

ランプは光らない。

1 か所目で 1 の数の偶奇がひっくり返り、2 か所目でもう一度ひっくり返る。 偶数は、偶数に戻ってしまう。 鎖の答えも、2 回反転して、元に戻る。

地図を見ると、もっと困ったことが分かる。 受け取ったパターンは「正しい」側に落ちている。 しかも、送ったのとは別の正しいパターンだ。

受け取った側から見れば、そういう知らせが送られてきた、としか思えない。 2 か所化けると、回路はだまされてしまう。

3 か所なら、また光る。4 か所なら、光らない。 化けた桁が奇数個なら気づき、偶数個なら気づけない。

それでも、パリティが役に立つのは、化けることがめったに起きないときだ。 めったに起きないことが 2 回重なるのは、もっとめったに起きない。 パリティは、そこに賭けている。

この弱点は、覚えておいてほしい。 このシリーズの後半で、思わぬ使い道が出てくる。

気づいても、直せない

ここまでを、表にしておこう。

やり方送る桁数1 か所化けたら2 か所化けたら
そのまま4気づかない気づかない
パリティ5気づく気づかない

この表は、これから回を追うごとに、1 行ずつ伸ばしていく。

さて、ランプが光ったとする。 受け取った側は、どうすればいいのだろう。

ランプは「どこかが化けた」と教えてくれる。 けれど、どこが化けたかは教えてくれない。

検査の回路の出力は 1 本だけで、どの桁が反転しても、同じように反転した。 だからこそ、どの 1 か所にも気づけた。 そして、だからこそ、どれだったのかは分からない。

人間どうしなら、こういうときは「もう一度言って」と頼む。 回路でも、同じように頼めばいいのではないか。

ところが、相手は遠い。 電波は光と同じ速さで進むが、ボイジャー 1 号までは、それでも片道 1 日近くかかる。 「もう一度」と頼んで、送り直してもらった知らせが届くまで、じっと待つことになる。 しかも、送り直してもらった知らせが、また化けないとは限らない。

遠すぎて、聞き返せない。

それなら、こう考えるしかない。

受け取った側だけで、直すことはできないか。

次回は、人間が大事なことを確実に伝えたいときにする、いちばん素朴なやり方から始めよう。

参考文献