ヴェルホエフアルゴリズム

ヴェルホフアルゴリズム[1]は、1969年にオランダの数学者ヤコブス・ヴェルホフによって初めて発表されたエラー検出のためのチェックサムです。 [2] [3]これは、すべての単一桁エラーと、2つの隣接する桁を含むすべての転置エラーを検出する 最初の10進チェックディジットアルゴリズムであり、 [4]当時はそのようなコードでは不可能だと考えられていました。

この方法は1985年にH.ピーター・ガムによって独立に発見され、この時には正式な証明と任意の基数への拡張が含まれていました。[5]

目標

フェルホフは、チェックデジットが1桁の10進コード、つまり1桁のエラーと隣接する桁の転置をすべて検出できるコードを見つけることを目標としていました。当時、このようなコードの非存在を証明するとされていた[6]ため、例えばISBNチェックデジットなどの11進コードが普及しました。

彼の目標は実際的でもあり、彼はオランダの郵便システムのライブデータに基づいてさまざまなコードを評価し、さまざまな種類のエラーに加重ポイントシステムを使用しました。分析では、エラーをいくつかのカテゴリに分類しました。まず、エラーのある桁の数です。2桁のエラーには、転置( abba )、ツイン( aa → 'bb' )、ジャンプ転置( abccba )、表音( 1aa0 )、ジャンプツイン( abacbc ) があります。さらに、数字の省略と追加があります。これらの種類のエラーの一部は頻度が低いかもしれませんが、すべてのシングルと転置を検出するという主な目標に加えて、一部のコードはこれらのエラーの影響を受けない可能性があります。

特に音声上の誤りは言語的影響を示していた。なぜならオランダ語では数字は通常ペアで読まれるからであり、またオランダ語では 50 は 15 と似た発音だが、80 は 18 のようには発音されないからである。

6桁の数字を例にとると、Verhoeff は次のようなエラーの分類を報告しました。

数字が間違っています分類カウント頻度
1転写9,57479.05%
2転置1,23710.21%
双子670.55%
音声590.49%
その他の隣接2321.92%
ジャンプ転置990.82%
ジャンプツインズ350.29%
その他のジャンプエラー430.36%
他の980.81%
31691.40%
41180.97%
52191.81%
61621.34%
合計12,112

説明

このアルゴリズムの基本的な考え方は、各数字(0から9)を二面体群 の元として表すことです。つまり、数字を にマッピングし、これを操作して、再び数字にマッピングします。このマッピングを

n 番目の桁を、桁数を とします

たとえば、コード 942 の場合、は 3 および です

順列を定義する

例えば、もう一つの例は

のグループ演算に乗法表記法を用いると、チェックデジットは単に次のような値となる。

は乗法逆数によって明示的に与えられる:

例えば、942のチェックデジットは7です。これを確認するには、マッピングを使用して、前の式の左辺に挿入します。

この順列を素早く評価するには、

それを得るために

これは同じ反射を繰り返し乗算したものです。反射はそれ自体の逆数であることを利用してください。[7]

実際には、このアルゴリズムは単純な参照テーブルを用いて実装されており、基礎となる群論や順列理論からそれらのテーブルを生成する方法を理解する必要はありません。他の順列も機能するため、これはアルゴリズムのファミリーと見なす方が適切です。Verhoeffは、上記の特定の順列は音声エラーの95.3%を検出するという特性を持つため、特別なものであると指摘しています。[8]

このアルゴリズムの強みは、すべての翻字および転置エラーを検出し、さらにほとんどのツイン、ツインジャンプ、ジャンプ転置および音声エラーも検出することです。

Verhoeffアルゴリズムの主な弱点は、その複雑さです。必要な計算は、例えば のような式で簡単に表現できません。計算を容易にするには、ルックアップテーブルが必要です。類似のコードとして、同様の性質を持つDammアルゴリズムがあります。

テーブルベースのアルゴリズム

Verhoeff アルゴリズムは、乗算表d、逆算表inv、順列表pの 3 つの表を使用して実装できます。

最初の表dは、二面体群 D 5 . [7]における乗法に基づいており、単にその群のケーリー表である。この群は可換ではないことに注意されたい。つまり、jkのある値に対して、d ( j , k ) ≠ d ( k , j ) となる。

逆数表inv は数字の逆数、つまりd ( j , inv ( j )) = 0 を満たす値を表します

順列表pは、各桁に、その数字の位置に基づいて順列を適用します。これは実際には単一の順列(1 5 8 9 4 2 7 0)(3 6)を繰り返し適用したものです。つまり、p ( i + j , n ) = p ( i , p ( j , n ) ) です。

Verhoeff チェックサムの計算は次のように実行されます。

  1. 右から左へ数値の各桁を取って配列nを作成します (右端の桁はn 0など)。
  2. チェックサムc をゼロに初期化します。
  3. 配列nの各インデックスiについて、 0 から始めて、c をに置き換えます

元の番号は、 ⁠ の場合にのみ有効です

チェックデジットを生成するには、0、計算を実行します。正しいチェック ディジットは .. です。

用途

Verhoeff アルゴリズムは、次のようなさまざまなシステムで使用されます。

参照

参考文献

  1. ^ Verhoeff、J. (1969)。 「10 進数コードのエラー検出 (Tract 29)」。数学と機械に関する知識51 (3)。アムステルダム数学センター: 240。ビブコード:1971ZaMM...51..240N。土井:10.1002/zamm.19710510323。
  2. ^ カートランド、ジョセフ(2001). 「5. 群論とヴェルホエフ・チェックディジット・スキーム」.識別番号とチェックディジット・スキーム. アメリカ数学会. p. 153. ISBN 0-88385-720-0
  3. ^ サロモン、デイビッド (2005). 「§2.11 Verhoeff チェックディジット法」.データとコンピュータ通信の符号化. シュプリンガー. pp.  56– 58. ISBN 0-387-21245-0
  4. ^ ハウンスパーガー、ディアナ、ケネディ、スティーブン編 (2006). 『宇宙の果て:Math Horizo​​ns 10周年記念』アメリカ数学会. p. 38. ISBN 978-0-88385-555-3LCCN  2005937266。
  5. ^ Gumm, H. (1985年1月). 「任意数システムのための新しいチェックディジット法(対応)」. IEEE Transactions on Information Theory . 31 (1): 102– 105. doi :10.1109/TIT.1985.1056991.
  6. ^ シッソン、ロジャー・L. (1958年5月). 「改良された10進冗長検査」. Communications of the ACM . 1 (5): 10–12 . doi : 10.1145/368819.368854 .
  7. ^ ab ガリアン、ジョセフ A. (2010)。現代抽象代数(第 7 版)。ブルックス/コール。 p. 111.ISBN 978-0-547-16509-7. LCCN  2008940386 . 2011年8月26日閲覧. verhoeffチェックディジット。
  8. ^ ヴェルホエフ 1969, 95ページ
  9. ^ ヴェルホエフ 1969, 83ページ
  10. ^ 「EIMI 2010 Proceedings」(PDF) .フロイデンタール研究所、ユトレヒト大学. リスボン、ポルトガル:数学と産業の教育インターフェース. 2010. p. 128. doi :10.1007/978-3-319-02270-3. 2024年5月16日時点のオリジナル(PDF)からアーカイブ。 2025年9月13日閲覧
  11. ^ Surelia, Vipin. 「Aadhaar関連アプリケーションのための銀行によるVerhoeffアルゴリズムの実装」(PDF)npci.org.in . National Payments Corporation of India. p. 1. 2025年9月10日時点のオリジナル(Official Circular)からのアーカイブ。 2025年9月10日閲覧
  12. ^ “Meter Point Reference Number (MPRN)”. mrso.ie . アイルランドのメーター登録システムオペレーター。2025年9月13日時点のオリジナルよりアーカイブ。 2025年9月13日閲覧
  13. ^ 「チェックディジット計算」. docs.snomed.org . SNOMED International. オリジナル(公式文書)から2025年9月13日時点のアーカイブ。 2025年9月13日閲覧
  • Verhoeffアルゴリズムの詳細な説明
Retrieved from "https://en.wikipedia.org/w/index.php?title=Verhoeff_algorithm&oldid=1312266324"