ISBN-10とISBN-13のチェックディジット変換と見逃す入れ替え
書籍のISBNは、10桁の旧規格と13桁の現行規格で最後の1桁(チェックディジット)の計算法が違う。10桁から13桁への変換は「先頭に978を付けて末尾を計算し直す」だけだが、計算式を取り違えると末尾が合わない。ここでは両方を Node.js で実装し、変換結果と、隣り合う数字の入れ替えを検出できるかどうかを実測した。
手計算の答え合わせには ISBN変換(10桁⇔13桁)(ハシトシステム) が使える。10桁と13桁を相互変換し、チェックディジットが正しいかを判定する。以下はそのロジックを手元で再現するコードである。
2つの規格の計算式
- ISBN-10: 先頭9桁に重み10, 9, 8, …, 2 を掛けて合計し、
(11 - 合計 % 11) % 11を末尾にする。結果が10のときはXと書く。 - ISBN-13: 先頭12桁に重み 1, 3, 1, 3, … を交互に掛けて合計し、
(10 - 合計 % 10) % 10を末尾にする。 - 10桁から13桁への変換は、先頭9桁の前に
978を付けた12桁から ISBN-13 の末尾を計算し直す。ISBN-10 の末尾は引き継がない。 - 13桁から10桁への逆変換は
978始まりに限られる。979始まりには対応する ISBN-10 がない。
実際に試す
isbn.mjs として保存する。Node.js v24.11.1、Windows PowerShell 5.1 で実行した。
1 | |
1 | |
出力:
1 | |
読み取れること
030640615の合計は130で、130 % 11 = 9、11 - 9 = 2だから末尾は2。ISBN-10 は0-306-40615-2になる。- 同じ本体を
978付きの12桁にすると合計は93、93 % 10 = 3、10 - 3 = 7で末尾は7。ISBN-13 は9780306406157になる。10桁の末尾2は13桁には残らない。 080442957は合計が199、199 % 11 = 1、11 - 1 = 10なので末尾がXになる。13桁へ変換するとXは消えて9780804429573になる。979始まりの9791234567896は10桁へ変換できず、例外になる。
入れ替えエラーの検出力
チェックディジットは、タイプミスを見つけるための仕組みである。隣り合う2つの数字を入れ替えたとき、検算に通ってしまう位置を総当たりで調べた。
- ISBN-10 は、
0306406152の隣接入れ替えを全9箇所で検出した。重みが10から2まで1ずつ違い、mod 11 が素数だからである。 - ISBN-13 は、
9780306406157の入れ替え12箇所のうち1箇所(添字9、6と1の入れ替え)を見逃した。差が5の数字を重み1と3の位置で入れ替えると、合計が(3-1)×5 = 10だけ動き、mod 10 では変わらないためである。 - 隣り合う数字の差が5のときは、ISBN-13 では入れ替えても検算に通る場合がある。今回の例は1つの ISBN で調べた結果であり、すべての ISBN で同じ位置とは限らない。
つまり、ISBN-13 のチェックを通っても、入力が正しいとは限らない。確実に確かめたいときは書名や出版社の検索結果も見る。
ISBN-10とISBN-13のチェックディジット変換と見逃す入れ替え
https://blog.hashito.biz/2026/10/21/isbn10-isbn13-check-digit-conversion-swap-miss-js/