METODOLOGIA · BRASIL
Algoritmo do Dígito Verificador do CPF
O CPF brasileiro possui dois dígitos verificadores calculados sequencialmente pelo algoritmo Mod-11. Esta página explica os dois passes do algoritmo, inclui um exemplo numérico completo, e detalha 15 casos de borda de produção — incluindo por que CPFs com todos os dígitos iguais são inválidos mesmo que o algoritmo seja satisfeito.
O algoritmo
O CPF (Cadastro de Pessoas Físicas) é o número de identificação fiscal brasileiro para pessoas físicas, emitido pela Receita Federal do Brasil. Tem 11 dígitos no formato XXX.XXX.XXX-VV, onde VV são dois dígitos verificadores calculados sequencialmente com dois passes de Mod-11.
Passe 1 — primeiro dígito: multiplica os 9 primeiros dígitos pelos pesos [10, 9, 8, 7, 6, 5, 4, 3, 2], soma os produtos, calcula resto = soma mod 11. Se resto < 2, dígito = 0; caso contrário, dígito = 11 − resto.
Passe 2 — segundo dígito: repete o processo com os 9 dígitos base mais o primeiro dígito verificador já calculado, usando pesos [11, 10, 9, 8, 7, 6, 5, 4, 3, 2]. Mesma regra para o resultado.
Exemplo numérico passo a passo
Calculamos os dígitos verificadores para os 9 dígitos base 529.982.247.
Passe 1 — primeiro dígito
Passe 2 — segundo dígito
Pseudocódigo
digits = strip_non_numeric(input) // 11 chars if all_same_digit(digits) → INVALID pass1_weights = [10, 9, 8, 7, 6, 5, 4, 3, 2] d1 = compute_check(digits[0..8], pass1_weights) pass2_weights = [11, 10, 9, 8, 7, 6, 5, 4, 3, 2] d2 = compute_check(digits[0..9], pass2_weights) return d1 == digits[9] AND d2 == digits[10] // compute_check(d, w): sum = Σ d[i]×w[i]; rem = sum mod 11; return rem < 2 ? 0 : 11−rem
Casos de borda que uma implementação simples não trata
- CPFs de dígitos repetidos (000.000.000-00 a 999.999.999-99): passam o algoritmo matematicamente mas são inválidos. A Receita Federal os rejeita explicitamente. São 10 padrões que qualquer implementação deve filtrar.
- Resto < 2 → dígito = 0, não 11 − resto: diferença crítica do Mod-11 clássico. Implementações que aplicam a fórmula padrão sem essa correção rejeitam CPFs válidos com dígitos verificadores 0.
- CPF com zero à esquerda perdido: sistemas que tratam o CPF como inteiro perdem o zero inicial (ex.: 012.345.678-90 vira 12345678-90). A validação passa a ter 10 dígitos e falha.
- CPF de menores de idade: crianças têm CPF desde o nascimento. Não há nenhum campo extra no número — o CPF tem o mesmo formato para qualquer faixa etária.
- CPF em NF-e vs CPF em PIX: para emitir NF-e basta validar o formato. Para PIX, o CPF precisa estar ativo na Receita Federal e vinculado a uma chave PIX — validação de formato é condição necessária mas não suficiente.
- Formatos de entrada: 529.982.247-24, 52998224724, 529 982 247 24 — todos válidos como input. Pontos, hífens, espaços devem ser removidos antes de validar.
- CPF cancelado pela Receita: CPFs suspensos ou cancelados passam a validação de formato. Apenas uma consulta à Receita confirma o status ativo.
- Mudança de nome não altera o CPF: o CPF é vitalício e não muda com casamento, divórcio ou mudança legal de nome. Sistemas que recalculam o CPF a partir do nome cometem um erro conceitual.
- CPF de pessoas falecidas: continua matematicamente válido. Sem consulta à Receita não é possível detectar que o titular faleceu.
- Validação em batch: 100k CPFs em um loop Python com regex recompilada a cada iteração é 3-5x mais lento que pré-compilar. Operações vetorizadas (pandas, polars) reduzem ainda mais o overhead.
- Caracteres Unicode invisíveis: zero-width spaces e marcas RTL em inputs copiados de PDFs ou WhatsApp quebram strips de caracteres não numéricos baseados em regex simples.
- Integração com sistemas legados: CPFs vindos de COBOL ou mainframe chegam frequentemente em campos de largura fixa com padding de espaços à esquerda ou à direita.
- Padrões sequenciais não emitidos: CPFs como 123.456.789-09 passam o algoritmo mas a Receita Federal nunca emite sequências completamente ordenadas.
- Encoding em campos XML de NF-e: CPFs com caracteres de controle inseridos por sistemas de RH podem corromper o XML antes da validação de formato chegar a acontecer.
- CPF vs CNPJ no mesmo campo: sistemas genéricos de documento fiscal aceitam CPF ou CNPJ no mesmo campo. A discriminação entre os dois requer verificar o comprimento após strip: 11 = CPF, 14 = CNPJ.
Quer pular tudo isso?
Tratar todos esses casos de borda em produção exige semanas de testes e manutenção contínua conforme as regras regulatórias mudam. A API da Normadata trata tudo isso — incluindo casos que nem listamos aqui — com uma única chamada REST.
Fontes
Receita Federal do Brasil — especificação pública do algoritmo de validação do CPF. O algoritmo é de domínio público há décadas.