Algoritmo de Validação do CPF Explicado: da Teoria ao Código
Entenda passo a passo como o algoritmo de módulo 11 da Receita Federal valida um CPF e implemente-o do zero em JavaScript, Python e Java.
20 de abril de 2025 · 5 min de leitura
O que é o CPF e por que ele tem dígitos verificadores?
O Cadastro de Pessoa Física (CPF) é o registro fiscal de pessoas físicas no Brasil, administrado pela Receita Federal. Seu número é composto por 11 dígitos no formato NNN.NNN.NNN-DD, onde os últimos dois dígitos (DD) são os chamados dígitos verificadores.
Os dígitos verificadores existem para detectar erros de digitação e impedir que números aleatórios de 11 dígitos sejam aceitos como CPFs válidos por sistemas. A lógica se baseia no algoritmo de módulo 11, amplamente utilizado em sistemas de identificação ao redor do mundo.
Estrutura do número CPF
Antes de entender o cálculo, é fundamental compreender a anatomia do CPF:
| Posição | Papel |
|---|---|
| 1º ao 8º dígito | Número base gerado sequencialmente |
| 9º dígito | Dígito regional — indica a Região Fiscal de emissão |
| 10º dígito | 1º dígito verificador |
| 11º dígito | 2º dígito verificador |
O dígito regional e os estados
O nono dígito não é aleatório. Ele segue o seguinte mapeamento de regiões fiscais:
| Dígito | Estados |
|---|---|
| 0 | RS |
| 1 | DF, GO, MS, MT, TO |
| 2 | AC, AM, AP, PA, RO, RR |
| 3 | CE, MA, PI |
| 4 | AL, PB, PE, RN |
| 5 | BA, SE |
| 6 | MG |
| 7 | ES, RJ |
| 8 | SP |
| 9 | PR, SC |
Esse mapeamento é relevante para sistemas que precisam vincular um CPF de teste a um estado específico.
Calculando o 1º dígito verificador
Dado um CPF base de 9 dígitos (ex.: 123456789), o cálculo do primeiro verificador segue:
- Multiplique cada dígito pelos pesos
10, 9, 8, 7, 6, 5, 4, 3, 2da esquerda para a direita. - Some todos os produtos.
- Calcule
resto = soma % 11. - Se
resto < 2, o dígito verificador é0. Caso contrário, é11 - resto.
Exemplo com 123456789:
1×10 + 2×9 + 3×8 + 4×7 + 5×6 + 6×5 + 7×4 + 8×3 + 9×2
= 10 + 18 + 24 + 28 + 30 + 30 + 28 + 24 + 18
= 210
resto = 210 % 11 = 1 → dígito verificador = 0
Portanto, o 1º verificador é 0, e o CPF parcial é 123456789-0.
Calculando o 2º dígito verificador
Agora use os 10 primeiros dígitos (incluindo o verificador já calculado) com os pesos 11, 10, 9, 8, 7, 6, 5, 4, 3, 2:
1×11 + 2×10 + 3×9 + 4×8 + 5×7 + 6×6 + 7×5 + 8×4 + 9×3 + 0×2
= 11 + 20 + 27 + 32 + 35 + 36 + 35 + 32 + 27 + 0
= 255
resto = 255 % 11 = ??? → 255 / 11 = 23 (quociente), 23 × 11 = 253, 255 - 253 = 2
resto = 2 → dígito verificador = 11 - 2 = 9
O CPF completo é 123.456.789-09 ✓
Implementação em JavaScript / TypeScript
function isValidCpf(cpf: string): boolean {
const digits = cpf.replace(/\D/g, "");
if (digits.length !== 11) return false;
// Rejeita sequências como 000.000.000-00, 111.111.111-11 etc.
if (/^(\d)\1{10}$/.test(digits)) return false;
function calcVerifier(length: number): number {
const sum = digits
.slice(0, length)
.split("")
.reduce((acc, d, i) => acc + Number(d) * (length + 1 - i), 0);
const rem = (sum * 10) % 11;
return rem >= 10 ? 0 : rem;
}
return (
calcVerifier(9) === Number(digits[9]) &&
calcVerifier(10) === Number(digits[10])
);
}
Implementação em Python
import re
def is_valid_cpf(cpf: str) -> bool:
digits = re.sub(r'\D', '', cpf)
if len(digits) != 11 or len(set(digits)) == 1:
return False
def calc_verifier(length: int) -> int:
total = sum(int(digits[i]) * (length + 1 - i) for i in range(length))
rem = (total * 10) % 11
return 0 if rem >= 10 else rem
return (
calc_verifier(9) == int(digits[9]) and
calc_verifier(10) == int(digits[10])
)
Implementação em Java
public static boolean isValidCpf(String cpf) {
String digits = cpf.replaceAll("[^0-9]", "");
if (digits.length() != 11) return false;
if (digits.chars().distinct().count() == 1) return false;
int[] d = digits.chars().map(c -> c - '0').toArray();
int sum1 = 0;
for (int i = 0; i < 9; i++) sum1 += d[i] * (10 - i);
int v1 = (sum1 * 10) % 11;
if (v1 >= 10) v1 = 0;
int sum2 = 0;
for (int i = 0; i < 10; i++) sum2 += d[i] * (11 - i);
int v2 = (sum2 * 10) % 11;
if (v2 >= 10) v2 = 0;
return d[9] == v1 && d[10] == v2;
}
Casos especiais: CPFs que passam no algoritmo mas são inválidos
Existem CPFs que passam matematicamente na validação mas são rejeitados pela Receita Federal:
- Sequências repetidas:
000.000.000-00,111.111.111-11etc. São matematicamente coerentes, mas a Receita os bloqueia. - CPF com todos os dígitos iguais: a verificação deve rejeitar explicitamente esses casos.
Toda implementação séria deve incluir essa checagem.
Gerando CPFs de teste com segurança
Após entender o algoritmo, gerar um CPF fictício é trivial: basta criar 9 dígitos aleatórios (respeitando o dígito regional, se necessário) e calcular os dois verificadores.
Use o Gerador de CPF desta ferramenta para gerar CPFs de teste instantaneamente, sem nenhuma instalação ou configuração.
Conclusão
O algoritmo do CPF é um exemplo clássico de checksum por módulo 11. Com 30 linhas de código em qualquer linguagem, você pode validar e gerar CPFs corretamente. O ponto mais crítico é tratar os casos especiais (sequências repetidas) e entender que um CPF matematicamente válido não é necessariamente cadastrado na Receita Federal — distinção fundamental para evitar falhas em sistemas de produção.
Precisa gerar CPFs para testar sua implementação?
Usar o Gerador de CPF →