Verhoeff algoritm
Verhoeff -algoritmen är en kontrollsummaformel för feldetektering utvecklad av den holländska matematikern Jacobus Verhoeff och publicerades första gången 1969. Det var den första decimala kontrollsiffransalgoritm som upptäcker alla ensiffriga fel, och alla transponeringsfel som involverar två intilliggande siffror, vilket ansågs vid den tiden vara omöjligt med en sådan kod.
Mål
Verhoeff hade som mål att hitta en decimalkod - en där kontrollsiffran är en enda decimalsiffra - som upptäckte alla ensiffriga fel och alla transponeringar av intilliggande siffror. På den tiden gjorde förmodade bevis på att dessa koder inte fanns, bas-11-koder populära, till exempel i ISBN-kontrollsiffran .
Hans mål var också praktiska, och han baserade utvärderingen av olika koder på livedata från det holländska postsystemet, med hjälp av ett viktat poängsystem för olika typer av fel. Analysen delade upp felen i ett antal kategorier: för det första efter hur många siffror som är felaktiga; för de med två siffror felaktiga finns transpositioner ( ab → ba ), tvillingar ( aa → 'bb'), hopptranspositioner ( abc → cba ), fonetiska ( 1a → a0 ) och hopptvillingar ( aba → cbc ). Dessutom finns utelämnade och tillagda siffror. Även om frekvensen för vissa av dessa typer av fel kan vara små, kan vissa koder vara immuna mot dem förutom de primära målen att upptäcka alla singlar och transpositioner.
Särskilt de fonetiska felen visade språkliga effekter, för på nederländska läses siffror vanligtvis i par; och även medan 50 låter som 15 på holländska, låter 80 inte som 18.
Med sexsiffriga siffror som exempel rapporterade Verhoeff följande klassificering av felen:.
Felaktiga siffror | Klassificering | Räkna | Frekvens |
---|---|---|---|
1 | Transkription | 9,574 | 79,05 % |
2 | Transponeringar | 1 237 | 10,21 % |
tvillingar | 67 | 0,55 % | |
Fonetisk | 59 | 0,49 % | |
Annat intilliggande | 232 | 1,92 % | |
Hoppa översättningar | 99 | 0,82 % | |
Hoppa tvillingar | 35 | 0,29 % | |
Andra hoppfel | 43 | 0,36 % | |
Övrig | 98 | 0,81 % | |
3 | 169 | 1,40 % | |
4 | 118 | 0,97 % | |
5 | 219 | 1,81 % | |
6 | 162 | 1,34 % | |
Total | 12.112 |
Beskrivning
Den allmänna idén med algoritmen är att representera var och en av siffrorna (0 till 9) som element i den dihedriska gruppen . Det vill säga mappa siffror till manipulera dessa och mappa sedan tillbaka till siffror. Låt denna mappning vara
Låt den n:te siffran vara och låt antalet siffror vara .
Till exempel med koden 248 är 3 och .
Definiera nu permutationen
Till exempel . Ett annat exempel är eftersom
Genom att använda multiplikativ notation för gruppoperationen av är kontrollsiffran då helt enkelt ett värde så att
ges explicit av invers permutation
Till exempel är kontrollsiffran för 248 5. För att verifiera detta, använd mappningen till och infoga i LHS för föregående ekvation
För att snabbt utvärdera denna permutation använd det
att få det
Detta är samma reflektion som multipliceras iterativt. Använd att reflektioner är deras egen invers.
I praktiken implementeras algoritmen med enkla uppslagstabeller utan att behöva förstå hur man genererar dessa tabeller från den underliggande grupp- och permutationsteorin. Detta anses mer korrekt vara en familj av algoritmer, eftersom andra permutationer också fungerar. Verhoeffs noterar att den speciella permutationen, som ges ovan, är speciell eftersom den har egenskapen att detektera 95,3% av de fonetiska felen.
Algoritmens styrkor är att den upptäcker alla translitterations- och transponeringsfel, och dessutom de flesta tvilling-, tvillinghopp-, hopptranspositions- och fonetiska fel.
Den största svagheten med Verhoeff-algoritmen är dess komplexitet. De beräkningar som krävs kan inte enkelt uttryckas som en formel i säg . Uppslagstabeller krävs för enkel beräkning. En liknande kod är Damm-algoritmen , som har liknande egenskaper.
Tabellbaserad algoritm
Verhoeff-algoritmen kan implementeras med hjälp av tre tabeller: en multiplikationstabell d , en inverstabell inv och en permutationstabell p .
|
|
|
Den första tabellen, d , är baserad på multiplikation i den dihedriska gruppen D 5 . och är helt enkelt Cayley-bordet i gruppen. Observera att denna grupp inte är kommutativ , det vill säga för vissa värden på j och k , d ( j , k ) ≠ d ( k , j ).
Den inversa tabellen inv representerar den multiplikativa inversen av en siffra, det vill säga värdet som uppfyller d ( j , inv ( j )) = 0.
Permutationstabellen p tillämpar en permutation på varje siffra baserat på dess position i talet. Detta är faktiskt en enda permutation (1 5 8 9 4 2 7 0)(3 6) tillämpad iterativt; dvs p ( i + j , n ) = p ( i , p ( j , n )).
Verhoeffs kontrollsummaberäkning utförs enligt följande:
- 0 Skapa en array n av de individuella siffrorna i numret, tagna från höger till vänster (siffran längst till höger är n , etc.).
- Initiera kontrollsumman c till noll.
- För varje index i i arrayen n, med början på noll, ersätt c med .
Det ursprungliga numret är giltigt om och endast om .
0 För att generera en kontrollsiffra, lägg till en , utför beräkningen: den korrekta kontrollsiffran är .
Exempel
Generera en kontrollsiffra för 236 :
c är 2, så kontrollsiffran är inv (2), vilket är 3. |
Validera kontrollsiffran 2363 :
c är noll, så kontrollen är korrekt. |