世の中、番号だらけ

 気がつけば世の中いたるところ番号だらけ。

 電話番号、郵便番号、自動車登録番号、証券番号、学籍番号・・・、私たちは番号とともに生活しています。ネット社会ではサイトごとにパスワードの入力が必要です。

 文字情報を数字情報に置き換える仕組みがASCII(アスキー)と呼ばれる文字コードです。ASCIIとはAmerican standard code for information interchangeの略です。このcodeがポイントです。日本語では符号と訳されます。

 現在、コンピューター上におけるeメールやウェブ上で文字情報が自在に扱うことを可能にしている基本がアスキー変換です。文字情報以外にも映像、音声、動画といった情報も数に符号化されることが、コンピューターがマルチメディアを扱うことを可能にしています。

 あらゆる情報が数に変換されるメリットは「数が計算できる」ことにあります。

ISBNの秘密

ISBN978─4─0874─6876─2

 書籍にはこのようなISBNと呼ばれる番号がつけられて流通しています。ISBNはInternational Standard Book Number(国際標準図書番号)の略で、我が国では「日本図書コード」と呼ばれています。

 ISBNはその名の通り、国際的な番号システムのことで固有の書籍出版物を発行形態別、1書名ごとに識別するユニークなコードです。

 言うならば本の学籍番号のようなもので、書誌情報(国籍、出版者、書名)を特定して書籍の取引や図書目録の編纂に活用されています。今では世界100以上の国と地域で使用されています。ちなみに、例のISBNは拙書「夢中になる!江戸の数学」(集英社文庫)のものです。

 このISBNには隠された“仕組み”が仕込まれています。符号の誤読を検出する仕組みです。13桁のISBNのうち1桁転記ミスしたコードが別な書籍のものに該当してしまい流通していまうことは問題です。

 例えば次のように正しいコードに対して1桁異なるコードがあるとしましょう。

 ISBN978─4─0874─6876─2 正しいコード
 ISBN978─4─0874─6870─2 誤ったコード

 次の計算によってコードの正誤判別できます。

【計算方法】右端から奇数番目の桁は1倍、偶数番目は3倍したものの総和を計算します。

 9+7×3+8+4×3+0+8×3+7+4×3+6+8×3+7+6×3+2=150
 9+7×3+8+4×3+0+8×3+7+4×3+6+8×3+7+0×3+2=132

【判定方法】総和が10で割り切れるならば正しいコード、そうでないならば誤ったコードと判定できます。

 したがって、150は10で割り切れるので正しいコード、132は10で割り切れないので誤ったコードと判別されます。誤った(正しくない)ISBNとはその番号に対する書籍が存在しないという意味です。

 ではどのようにして13桁の番号は決められるのでしょうか。

 978(接頭記号)─4(国記号)─0874(出版社記号)─6876(書名記号)─2(チェックディジット)

 最後のチェックディジットとは検査数字のことで、入力の際に誤りがないか確かめるものです。接頭記号、国記号、出版社記号、書名記号はある程度自動的に決まってしまいます。その上で計算され決定されるのが1桁目のチェックディジットです。 

 「夢中になる!江戸の数学」ISBN978─4─0874─6876─□のチェックディジット□の算出過程は次のようになります。

 ̄γ爾ら奇数番目の桁は1倍、偶数番目3倍したものの和を計算します。

 9+7×3+8+4×3+0+8×3+7+4×3+6+8×3+7+6×3=148

⊆,砲海力造10で割った余り(すなわち総和の一桁目)を求めます。

 148÷10=14…8

すると、10からこの余りを引いた値2がチェックディジット。

 チェックディジット=10-(余り)=10-8=2

 このようにチェックディジットを決めているので13桁から算出される総和が148+2=150と10で割り切れるわけです。

 ISBNと同様に身近にある番号がJAN(Japanese Article Number)コードです。バーコードとして商品につけられているのがそうです。POSシステム、受発注システム、在庫管理システム、さらには公共料金の支払いシステムにも利用されており、日本の共通商品コードとして流通情報システムの基礎となる番号です。

 JANコードは13桁ないし8桁で表されますが、右端の数字がチェックディジットを表します。その計算方法(アルゴリズム)はISBNのそれと同じです。

クレジットカード番号

 ISBNコードやJANコードは流通過程で使用され、読み取り装置による誤読防止のために利用されます。

 それに対してクレジットカードは氏名が記載してあることから分かるように個人に与えられています。インターネットの通信販売での決済時、私たちはクレジットカード番号を自分でコンピューターに入力します。

 最近ではカードの不正使用防止のためにカード番号とは別に3〜4ケタのセキュリティコードも設けられています。とはいえカード番号の手入力には入力ミスが考えられるので、クレジットカード番号の最後のケタも実はチェックディジットになっています。

 ここでは16ケタのクレジットカード番号で説明してみましょう。

314159(発行会社番号)─265358979(口座番号)─6(チェックディジット)

 冒頭の6桁が発行会社番号は、カード番号入力の際に訪ねられる「カード種類」がチェックとして機能します。次の9ケタが個人を特定する口座番号です。

 ISBNやJANコードと同様に、チェックディジットの前の桁を用いてチェックディジットは決定されます。違うのはその計算方法(アルゴリズム)です。ここで用いられるのが「Luhnのアルゴリズム」と呼ばれるものです。

Luhnのアルゴリズム

 ̄γ爾ら偶数番目の桁を2倍します。

2倍にした数(これが2桁になる場合には一と十の位の桁の和とする)と右端(縦書きの下端)から奇数番目の総和を求めます。

A輜造10で割り切れる場合(総和の一の位が0)であれば、この番号はLuhnのアルゴリズムでは正当な番号で、そうでない場合には正しくない番号と判定されます。

 カード番号3141 5926 5358 9793を例に検証してみましょう。

ゞ数番目の桁を2倍にして、2桁になったらその桁の和を求めて1桁にします。

3×2=6、4×2=8、5×2=10→1+0=1、2×2=4、5×2=10→1+0=1、5×2=10→1+0=1、9×2=18→1+8=9、9×2=18→1+8=9

6+1+8+1+1+9+4+6+1+3+1+8+9+7+9+6=80

A輜80は10で割り切れるので、この番号はLuhnのアルゴリズムでは正当な番号であると判定されます。

 「Luhnのアルゴリズムでは正しい」とは、総和が10の倍数であるからといって本当の番号とは限らないということです。Luhnのアルゴリズムですべての誤読の判定はできません。

 任意の1桁の間違いや隣接する桁の順序間違いならば検出できます。その場合も例外があります。

 09と90の順序間違いは検出不可能ですし、同じ数字が2文字連続する場合の間違いも、22と55、33と66、44と77は検出できないなど制約があります。

 実際にはより多くの転記ミスを可能にするさらに複雑なチェックディジット計算アルゴリズムが考案されており、Luhnのアルゴリズムに幾重にも複雑なチェックディジット計算アルゴリズムが施されて、簡単にカード番号を偽造できないようになっています。

 ここで紹介した番号に仕込まれたチェックディジットですが、そのアルゴリズムはISBNコード、JANコードとカード番号では異なります。しかし、共通する部分があることに気づきます。

 それは、チェックディジットを決定するために番号の桁の総和を用いること、そしてその総和が「10で割り切れる」ことです。これは「MOD─10アルゴリズム」と呼ばれます。

 そもそも単純にデータの総和すなわちSUMを用いてチェックする方法も考えられます。データにそれらの総和を付加する方法です。これがチェックサム方式です。チェックサムもチェックディジットと同じようにデータの誤りを検出する仕組みです。

符号理論に支えられる現代社会

 人類は身の回りにあるものを、片っ端から数量化すなわち符号化してきました。暦、地図、貨幣、楽譜・・・。それらがコンピューターという計算機によって処理されるようになったのが現代です。

 コードを単純に社会に流通させてしまうことには大きなリスクが伴います。リスク回避が必然となります。様々なアルゴリズムを用いて生成される符号にや暗号理論よってセキュリティ保護が実現します。

 情報をいかに符号化するか、符号の種々の信頼性を高めるアルゴリズムをいかに作るかなどの研究分野が「符号理論」です。符号化の最先端にあるのがビットコインです。私たちの社会は符号とともに発展していきます。

[JBpressの今日の記事(トップページ)へ]

筆者:桜井 進