電子機器が作動しない理由

ステファン・チン氏:ハードディスクや人工衛星、DVDからインターネットケーブルに至るまで、私たちは、電子機器は動いて当然だと思っています。すべてのビット、1や0は、完璧にストアされ、移動されていると考えています。

しかし、よくよく考えてみると、電子機器が正常に働くのは、実は非常に不思議なことなのです。

ワイヤーやメモリチップ、無線リンクは、伝送損失や電波障害、もしくは単なるちょっとした傷や汚れなどによってデータが破損しないよう、常に守ってくれています。電気機器が動いているのは事実上の奇跡に近く、エンジニアリングの偉業のなせるわざです。舞台裏ではデバイスたちは、エラーを検出し、何事もなかったように通常運行を続けるべく、奮闘しているのです。

さて、これらのデバイスの秘密兵器は何でしょうか。それは「エラー検出訂正符号」です。「エラー検出訂正符号」は、破損しても修復できるように、情報を記号化する方式です。これらの符号のおかげで、電子機器は、完璧に動いているかのような外観を保てるのです。まあほとんどの場合は、ですが。

私たちは、いつもはコンピュータが「物」であることから目を背け、よくわからない純粋な情報の世界で動いているものだと思い込もうとしています。しかしエンジニアたちは、そうではない現実と常に格闘しています。

例えば、ルーターを経由して「SciShow」をみなさんの元にお届けしている電波は、距離が開くと弱くなります。思いがけない動きをする乳幼児は、ブルーレイディスクを傷つけたり、汚したりします。また、お隣さんのワイヤーから生じた電界や、太陽放射、雷、さらには宇宙線などによっても、ワイヤーやチップには、不必要な電流が流れます。

エンジニアたちは、これらすべての問題は、大事なシグナルを消してしまう一つの大きな「ノイズ」として処理しています。しかし、ノイズとして認識するだけでは不十分で、これを軽減する必要があります。

その解決法は、広義でいえば「冗長化」すること、つまりバックアップ用の情報を用意することです。そうすれば、情報が失われる事態が起きても、サルベージできる情報がバックアップされていることになります。

この問題に対する一番単純なアプローチは、「繰り返す」こと、つまり「繰り返し符号」です。もし私が、すべての「すべての」言葉を「言葉を」復唱すれば「復唱すれば」、片方が文字化けしたり変換されてしまってもすぐわかりますね。とはいえ、これでは明らかに非効率です。

これをより良い符号にするには、メッセージの各ブロックに「パリティビット」と呼ばれるものを付与するのです。パリティビットは、メッセージの1つのブロックの、2進法で表されるデータであるバイナリに含まれる1の数が、偶数か奇数かを示します。1の数が偶数であれば、パリティビットは「0」となります。奇数であれば、「1」となります。

「前方誤り訂正」の試み

さて、受信者であるデバイスが、1の数は奇数だと認識したにも関わらず、パリティビットが「0」だったとします。するとつまり、ビットのうち少なくとも1つは勝手に変換されてしまったことがわかります。つまり、これがエラーであるわけです。

受信者が、もう一度データを再送するよう要請できる環境であったり、エラーがあまり起こらない場合であれば、こういった検出方法で十分です。しかしデータストレージが無駄ですし、通信速度が遅い場合は、「前方誤り訂正」が必要となるでしょう。

「前方誤り訂正」は、わざわざ再送を行わずとも、ビット誤りを受信側で回復できるようにする冗長な符号を付加したデータを送信する方式です。

前方誤り訂正は、かなり昔、1940年代に開発されたものです。ベル研究所では、リチャード・ハミングという研究員が、10トン近くもある最近式の「コンピュータ」と呼ばれる機械と格闘し不機嫌になっていました。コンピュータは、人がいないと認識した時に問題を改善するようプログラムされていたため、ハミングがコンピュータの作業をするには、週末に出勤するしかありませんでした。

コンピュータが、ハミングのプログラムで破損データを検出した場合は、アボート(処理を中断)し、別のタスクに移行してしまうだけです。ハミングは、コンピュータがエラーを検出しても、特定し修復できないのはおかしいと考えました。そこで、その点を改善したのです。

彼のアイデアは、今日では「ハミング符号」として知られ、データのすべてのブロックに、複数のパリティビットを付与するのもです。すべてのパリティビットは、それぞれ異なるコンビネーションのデータビットを担当してチェックします。

あるパリティビットは、1、2、5番目のデータビットをチェックし、別のパリティビットは1、3、4番目のデータビットをチェックします。大抵は複数回、すべてのデータビットがカバーされます。

パリティビットは、データビットのコンビネーションに含まれる「1」の数が、奇数か偶数かを示してくれます。受信者が、データと異なるパリティビットがあると認識すれば、複数あるパターンと比べて、訂正するべき箇所がわかるのです。

ハミング符号は、シンプルで迅速であり、スペースもとらないため、エラー訂正メモリ(ECCメモリ)チップに、いまだに広く使われています。しかし、一度に1つのエラーしか修正できません。

この課題は、「リードソロモン符号」と呼ばれる、よりパワフルな一群の方式により解決されました。最初に「リードソロモン符号」の活用が注目されたのは、1970年代、NASAのボイジャー探査機から送られて来た、高解像度画像においてでした。

メッセージを細分化してパリティビットを付与するのではなく、リードソロモン符号で送信するひとまとまりのチャンクは、メッセージ全体と等しい情報を持っています。それを可能にしたのは、オリジナルのメッセージを、単なる数字ではなく、数学的な曲線上の点として再翻訳したことです。

エラーは修復されることも、されないこともある

送信者は、冗長性を持たせるために、同一曲線上に余分な点を付与して送信します。そのため、受信者に到達した時点で、いくつかの点が破損したり消失していても、受信者は元の形に復元できます。つまり、残った点から正しいメッセージを再構築できるのです。

リードソロモン符号は、エラー生存率を大幅に下げます。さらに、柔軟な調整が可能です。膨大な数の冗長な点を付与できますし、それでメッセージの容量が増えたとしても、それを上回るエラー修正をします。

そのため、これらの符号が、現在でも広く使われているのは、じゅうぶんに納得できます。これらの符号は今でも、壊れたQRコード、傷ついたハードドライブ、ひびの入ったケーブルテレビ受信機などの数多くのテクノロジーを守っています。

近ごろでは、これにさらなる性能が付与されています。CDや宇宙船などの多くのシステムでは、リードソロモン符号の補足に、インターリーブ、別名ジャンブル(バラバラにするの意)が用いられています。

これは、誤り訂正の能力を凌駕してしまうバーストエラーから符号をプロテクトできます。例えば、ルーレイに大きな長い傷がついても、バラバラにした元データを、元の順番に戻して修正可能なブロックへと変換するため、その後の誤り訂正が容易になります。

このように、リードソロモン符号にはさまざな機能がありますが、インターネットやスマホ、ケーブルテレビなどの多くの物に活用される符号は、他にもたくさんあり、その多くは類似の概念に基づいたものです。

パリティビットからリードソロモン符号、その他に至るまで、エラー修復・検出コードは、デジタル世界の知られざるヒーローです。スマホのプッシュ通知がきちんと表示されたり、宇宙から送られてきた画像を目にしたり、メールをチェックしたりする際には、みなさんはこれらの符号に大いにお世話になっているのです。

逆に、うまく通知が表示されなかった場合には何が起きているのか、これでわかったことでしょう。エラーは修復されることもあり、されないこともあるのです。