Skip to content

Algoritmos

Jose Luiz Rodrigues edited this page Sep 10, 2026 · 1 revision

Algoritmos

Los dígitos verificadores de América Latina se parecen entre sí pero nunca son iguales. Esta página documenta los que están implementados, para que corregir un bug o sumar un país no implique leer papers de organismos tributarios.

Todos operan sobre la salida de strip, o sea sobre dígitos.

Módulo 11 con pesos cíclicos — RUT chileno

Pesos 2, 3, 4, 5, 6, 7 aplicados de derecha a izquierda y repetidos en ciclo.

suma = Σ (dígito[i] × peso[ciclo])
resto = 11 − (suma mod 11)

resto = 11 → verificador '0'
resto = 10 → verificador 'K'
otro       → verificador String(resto)

El K es lo que obliga a onlyDigitsAndK en lugar de onlyDigits. cl.rut.getCheckDigit expone este cálculo como función pública.

Módulo 11 con pesos fijos — CUIT argentino

Pesos 5, 4, 3, 2, 7, 6, 5, 4, 3, 2 sobre los primeros diez dígitos.

suma = Σ (dígito[i] × peso[i])
resto = 11 − (suma mod 11)

resto = 11 → verificador 0
resto = 10 → INVÁLIDO, devolver false
otro       → verificador = resto

El caso resto = 10 no tiene representación: ningún CUIT válido lo produce, así que validate devuelve false en vez de forzar un dígito.

Además se verifica el prefijo de dos dígitos, que solo puede ser 20, 23, 24, 27, 30, 33 o 34.

Módulo 11 con tabla larga — NIT colombiano

Pesos 71, 67, 59, 53, 47, 43, 41, 37, 29, 23, 19, 17, 13, 7, 3. Se usan los últimos N para un cuerpo de N dígitos.

suma = Σ (dígito[i] × peso alineado a la derecha)
resto = suma mod 11

resto = 0 → verificador 0
resto = 1 → verificador 1
otro      → verificador = 11 − resto

La alineación a la derecha es la parte que se suele equivocar: los pesos se toman del final de la tabla, no del principio.

Doble módulo 11 — CPF brasileño

Dos pasadas, una por cada dígito verificador.

primer dígito:
  suma = Σ dígito[i] × (10 − i), para i de 0 a 8
  resto = (suma × 10) mod 11
  si resto es 10 u 11 → 0

segundo dígito:
  suma = Σ dígito[i] × (11 − i), para i de 0 a 9
  resto = (suma × 10) mod 11
  si resto es 10 u 11 → 0

Antes de calcular se rechazan los once dígitos repetidos (11111111111 y compañía): pasan la aritmética pero no son documentos reales.

El CNPJ usa la misma idea con catorce dígitos y otra secuencia de pesos.

Módulo 10 — cédula ecuatoriana

Pesos alternados 2, 1 sobre los primeros nueve dígitos; los productos de dos cifras se reducen restando 9.

producto = dígito × peso
si producto ≥ 10 → producto − 9
suma = Σ productos
resto = suma mod 10
verificador = resto = 0 ? 0 : 10 − resto

Se valida además el código de provincia en los dos primeros dígitos, que va de 01 a 24 más 30 para ecuatorianos en el exterior, y que el tercer dígito no supere 5.

RUC ecuatoriano

Trece dígitos, con reglas distintas según el tipo de contribuyente:

tercer dígito tipo verificación terminación
0 a 5 persona natural los diez primeros dígitos son una cédula válida 001
6 entidad pública módulo 11 con pesos 3,2,7,6,5,4,3,2, verificador en la posición 9 0001
9 sociedad privada módulo 11 con pesos 4,3,2,7,6,5,4,3,2, verificador en la posición 10 001

Cualquier otro tercer dígito es inválido.

DNI argentino de 7 dígitos

No lleva verificador; el detalle está en el agrupamiento, que se hace desde la derecha.

split = largo − 6
resultado = d[0..split] . d[split..split+3] . d[split+3..]

Con 1234567 da 1.234.567.

Dónde tocar

Cada algoritmo vive en el archivo del documento que lo usa, no en un módulo compartido. Un error en el CUIT se arregla en src/ar/cuit.ts y en ningún otro lado. Si dos países comparten un algoritmo, cada uno lo implementa: la duplicación acá es más barata que una abstracción que se rompe cuando un país cambia su regla.

Ver también: Arquitectura, Agregar un país.

Clone this wiki locally