El algoritmo de Verhoeff [1] es una suma de comprobación para la detección de errores publicada por primera vez por el matemático holandés Jacobus Verhoeff en 1969. [2] [3] Fue el primer algoritmo de verificación de dígitos decimales que detecta todos los errores de un solo dígito y todos los errores de transposición que involucran dos dígitos adyacentes, [4] lo que en ese momento se creía imposible con un código de este tipo.
El método fue descubierto independientemente por H. Peter Gumm en 1985, esta vez incluyendo una prueba formal y una extensión a cualquier base. [5]
Verhoeff tenía como objetivo encontrar un código decimal (en el que el dígito de control fuera un solo dígito decimal) que detectara todos los errores de un solo dígito y todas las transposiciones de dígitos adyacentes. En ese momento, las supuestas pruebas de la inexistencia [6] de estos códigos hicieron que los códigos de base 11 se popularizaran, por ejemplo, en el dígito de control del ISBN .
Sus objetivos también eran prácticos y basó la evaluación de diferentes códigos en datos en vivo del sistema postal holandés, utilizando un sistema de puntos ponderados para diferentes tipos de error. El análisis dividió los errores en varias categorías: primero, por cuántos dígitos son erróneos; para aquellos con dos dígitos erróneos, hay transposiciones ( ab → ba ), gemelos ( aa → 'bb'), transposiciones de salto ( abc → cba ), fonéticos ( 1a → a0 ) y gemelos de salto ( aba → cbc ). Además, hay dígitos omitidos y agregados. Aunque las frecuencias de algunos de estos tipos de errores pueden ser pequeñas, algunos códigos pueden ser inmunes a ellos, además de los objetivos principales de detectar todos los sencillos y transposiciones.
Los errores fonéticos en particular mostraron efectos lingüísticos, porque en holandés los números normalmente se leen en pares; y además, aunque 50 suena similar a 15 en holandés, 80 no suena como 18.
Tomando números de seis dígitos como ejemplo, Verhoeff informó la siguiente clasificación de los errores:
La idea general del algoritmo es representar cada uno de los dígitos (del 0 al 9) como elementos del grupo diedro . Es decir, asignar dígitos a , manipularlos y luego asignarlos nuevamente a dígitos. Sea esta asignación
Sea el n-ésimo dígito y sea el número de dígitos .
Por ejemplo, dado el código 248 entonces es 3 y .
Ahora defina la permutación
Por ejemplo . Otro ejemplo es que
Usando la notación multiplicativa para la operación de grupo de , el dígito de verificación es entonces simplemente un valor tal que
se da explícitamente por permutación inversa
Por ejemplo, el dígito de control para 248 es 5. Para verificarlo, use la asignación a e inserte en el LHS de la ecuación anterior.
Para evaluar esta permutación rápidamente use eso
Para conseguir eso
Esta es la misma reflexión que se multiplica iterativamente. Use que las reflexiones son su propia inversa. [7]
En la práctica, el algoritmo se implementa utilizando tablas de búsqueda simples sin necesidad de entender cómo generar esas tablas a partir del grupo subyacente y la teoría de permutaciones. Esto se considera más propiamente una familia de algoritmos, ya que también funcionan otras permutaciones. Verhoeff señala que la permutación particular, dada anteriormente, es especial ya que tiene la propiedad de detectar el 95,3% de los errores fonéticos. [8]
Los puntos fuertes del algoritmo son que detecta todos los errores de transliteración y transposición y, además, la mayoría de los errores gemelos, de salto gemelo, de transposición de salto y fonéticos.
La principal debilidad del algoritmo de Verhoeff es su complejidad. Los cálculos necesarios no se pueden expresar fácilmente como una fórmula , por ejemplo, se necesitan tablas de consulta para facilitar el cálculo. Un código similar es el algoritmo de Damm , que tiene cualidades similares.
El algoritmo de Verhoeff se puede implementar utilizando tres tablas: una tabla de multiplicación d , una tabla inversa inv y una tabla de permutación p .
La primera tabla, d , se basa en la multiplicación en el grupo diedro D 5 . [7] y es simplemente la tabla de Cayley del grupo. Nótese que este grupo no es conmutativo , es decir, para algunos valores de j y k , d ( j , k ) ≠ d ( k , j ).
La tabla inversa inv representa el inverso multiplicativo de un dígito, es decir, el valor que satisface d ( j , inv ( j )) = 0.
La tabla de permutaciones p aplica una permutación a cada dígito en función de su posición en el número. En realidad, se trata de una única permutación (1 5 8 9 4 2 7 0)(3 6) aplicada de forma iterativa; es decir, p ( i + j , n ) = p ( i , p ( j , n )).
El cálculo de la suma de comprobación de Verhoeff se realiza de la siguiente manera:
El número original es válido si y sólo si .
Para generar un dígito de control, agregue un0 , realice el cálculo: el dígito de control correcto es .
Dígito de control de Verhoeff.