Вы находитесь на странице: 1из 20

CÓDIGO DE BARRAS

Eduardo Marques Dias


Universidade Católica de Brasília
Departamento de Matemática
Orientador: Prof. Sinval Braga de Freitas

RESUMO

Este trabalho tem como objetivo apresentar uma visão geral dos Códigos de Barras,
apresentando alguns conceitos matemáticos como ferramenta para o surgimento de tal
tecnologia.
Palavras-chave: códigos de barras, detecção de erros.

1. INTRODUÇÃO

Acha que perde muito tempo nas caixas do supermercado? Com certeza você já perdeu ou
ainda vai perder algum tempo de sua vida na fila de um caixa, seja bancário ou em um
simples supermercado, esperando suas compras serem processadas. Lembre-se de que tempos
houve em que não existiam códigos de barras e toda a informação tinha de ser inserida
manualmente.

Foi graças a esse problema de logística que um dono de supermercado sugeriu a uma
universidade que resolvesse esse problema. Ele estava querendo mais rapidez e agilidade no
dia a dia dos supermercados, surgindo assim, nessa busca, o código de barras.

É notório o surgimento de várias contribuições tecnológicas em diversas áreas de


conhecimento humano, principalmente na disseminação de informação. Nesses avanços
tecnológicos na informação algumas preocupações são imprescindíveis como à rapidez na
transmissão da informação e a confiabilidade, tornando assim o uso do código de barras muito
útil em qualquer processo que envolva a contínua informação de códigos aos computadores.

Devido a suas características de baixo custo, facilidade de implantação, utilização e


principalmente a qualidade de informação e redução de tempo de operação dos sistemas, o
código de barras tem sido usado na automação desde pequenas atividades que necessitam de
identificação de documentos até a comercialização e controle de produtos.

Este artigo mostra um pouco dessa tecnologia demonstrando o funcionamento e segurança de


um código de barras. E como a tecnologia tenta eliminar qualquer e possibilidade erros
humanos.

2. HISTÓRICO

Um dos critérios para determinar o crescimento de um país está no desenvolvimento de meios


eletrônicos; ou seja, máquinas que nos ajudem no dia a dia.

Uma das grandes buscas desse desenvolvimento foi à procura para encontrar máquinas que
realizassem cálculos. Como um exemplo dessa procura foi construída em 1642, por Blaise

1
Pascal, a primeira máquina de calcular de que se tem notícia, capaz de realizar apenas somas.
Em 1694, Wilhelm Leibniz aprimorou o invento de Pascal e criou uma máquina capaz de
realizar também multiplicações. A maior importância dessa descoberta foi à forma com que
os dados (números) eram transmitidos. Essas transmissões feitas através de cartões perfurados
seria o começo do desenvolvimento dos códigos de barras.

Com Joseph-Marie Jacquard (1752-1834), em 1801, realmente começou uma mudança para o
resto da história, pois ele construiu um tear que era comandado por cartões perfurados e que
foi, talvez, a primeira máquina programável. Essa máquina deu um grande impulso para a
revolução tecnológica da era industrial.

Em 1857 um cientista Britânico, inventor de algumas inovações cientifica na época chamado


de Sir Charles Wheatstone deu outro passo importante na ciência, pois utilizou fitas de papéis
para armazenar dados, seguindo os mesmos princípios dos cartões perfurados com o
diferencial positivo de poder armazenarem dados de forma continua, sendo muito útil para o
surgimento de uma tecnologia futura.

Outro propulsor da evolução tecnológica foi o fundador de um grupo de professores na


Inglaterra que modificariam o ensino da matemática, tendo bastante influência na criação da
álgebra abstrata, o Analytical Society. Charles P. Babbage, em 1833 inventou um instrumento
de cálculo bastante sofisticado para a época chamada de Máquina Analítica, capaz de realizar
todas as operações aritméticas além de comparar, analisar seus próprios resultados e ser
programável por cartões perfurados.

Ele é considerado o pai do computador digital, tão comum em nosso dia a dia. O principal
desse feito foi perceber que sua máquina seria alimentada por duas séries de cartões
perfurados, tendo ele a percepção de que uma máquina de computador teria um dispositivo de
entrada “uma memória”.

Hermann Hollerith (1860-1951) teve uma importância considerável para o desenvolvimento


dessa tecnologia, pois em 1890 empregou seu tempo projetando uma máquina que pudesse
tabular dados automaticamente. Para isso, ele aprimorou e utilizou novamente a idéia dos
cartões perfurados de Jacquard, escrevendo dados em oito colunas que utilizavam o sistema
de numeração binária. Esses cartões eram então lidos por uma máquina que ele mesmo
desenvolveu utilizando sensores elétricos.

Em 1948, o presidente de uma cadeia de supermercados norte-americana abordou um dos


reitores do Instituto de Tecnologia Drexel, na Filadélfia, solicitando o desenvolvimento de um
sistema que permitisse extrair rapidamente a informação relativa a determinado produto no
ato de compra, com o intuito de atenuar o pesadelo logístico que estava enfrentando (demora
no atendimento de cliente).

O reitor do instituto rejeitou o pedido. Porém, Bernard Silver, um simples estudante do


instituto ouviu a conversa e repassou o que tinha escutado para o seu amigo Norman Joseph
Woodland, que juntos decidiram levar à frente tal pesquisa.

A primeira idéia foi à utilização de padrões de tinta que brilham sob luz ultravioleta. Os dois
construíram então um aparelho para testar o conceito. Funcionou, porém logo encontraram

2
problemas como a tinta para impressão e, o principal, era financeiramente inviável, pois
ficaria muito caro.

Após meses de pesquisa, inspiraram-se em algo já bem conhecido, o código Morse. A idéia
foi bastante simples. Como diz o próprio Woodland: "limitei-me a prolongar verticalmente os
pontos e traços, alterando os espaços e a espessura entre eles".

Em Outubro de 1949, surgiu assim o primeiro código de barras, formado por quatro linhas
brancas sobre um fundo preto, depois convertido em círculos concêntricos para facilitar a
leitura, a partir de qualquer ângulo. Quanto mais linhas se adicionassem, mais informação
podia ser codificada. Assim, em 1952 a primeira patente de um código de barras foi registrada
por Bernard Silver e Norman Joseph Woodland.

Mas esse feito só foi realmente visto com sua importância merecida várias décadas depois,
quando a miniaturização dos componentes eletrônicos e avanços na tecnologia laser
permitiram a produção de sistemas de leitura de baixo custo.

Em torno de 1970, uma firma de assessoria, a McKinsey & Co., junto com a Uniform Grocery
Product Code Council definiu um formato numérico para identificar produtos e pediu a
diversas companhias que elaborassem um código adequado e viável, que pudesse ser utilizado
no dia a dia.

Dentre as diversas firmas solicitadas quem acabou apresentando o resultado mais viável foi
Gerge J. Laurer, engenheiro do International Business Machines mais conhecida por nós
brasileiros como IBM.

Em 3 de abril 1974, um cliente do supermercado Marsh's em Troy, no Estado de Ohio, fez a


primeira compra de um produto com código de barras. O código foi denominado de Código
Universal de Produtos, com sigla UPC (Universal Product Code).

Este código é adotado atualmente nos Estados Unidos e Canadá. Ele consistia de uma
seqüência de 12 dígitos, traduzidos para barras da forma que estamos acostumados a ver em
vários objetos ou itens.

Com o grande sucesso do código UPC, fabricantes e distribuidores de vários países da Europa
formaram um conselho para estudar a possibilidade de desenvolver um sistema que
padronizasse a numeração de produtos, parecido ao sistema do UPC (Código Universal de
Produtos), que é regulamentado pelo UCC (Uniform Code Council). Conseqüentemente, em
1977, formou-se uma entidade sem fins lucrativos, a EAN (European Article Numbering
Association).

Para a elaboração do código EAN logo surgiu um problema bastante delicado, o de ser
necessário adicionar um digito a cada código com a finalidade de identificar o país de origem
já que tal tecnologia seria expandida por todo o mundo. O problema era fazer isto de forma
que a mesma máquina leitora pudesse ler indistintamente os códigos UPC e EAN.

A solução encontrada foi à seguinte. Os países que utilizavam o código UPC antigo, EUA e
Canadá, são identificados com um 0 (zero), na frente, resultando no novo código UPC-A (o

3
mesmo código UPC, apenas com um zero antes para identificar os países que já utilizavam o
código UPC, Estados Unidos e Canadá), e o resto da codificação é feita utilizando o sistema
anterior. Para outros países, os primeiros dois ou três dígitos (da esquerda para a direita),
identificam o país.

No Brasil, em 29 de novembro de 1984, o então Presidente João Batista de Oliveira


Figueiredo assinou decreto-lei instituindo o código de barras no País. O Ministério da
Indústria e do Comércio ficou responsável por sua implantação, devendo padronizar
procedimentos, normas e embalagens.

O código utilizado no Brasil é o EAN (European Article Number), que possui os primeiros
três dígitos identificando o país. Todos os produtos produzidos no Brasil começam com a
seqüência 789. Alguns países adotam este mesmo sistema, dando-lhe outro nome. Por
exemplo, no Japão o sistema é conhecido como JAN (Japanese Article Numbering system)

3. O QUE É O CÓDIGO DE BARRAS

Um código de barras é uma representação gráfica de dados que podem ser numéricos ou
alfanuméricos dependendo do tipo de código de barras empregado. As linhas paralelas e
verticais escuras e os espaços entre elas têm diferentes larguras em função das várias técnicas
de codificação de dados empregada.

O código na verdade é um texto qualquer escrito em uma fonte que as máquinas entendem de
um jeito mais fácil. É como se fosse para nós, seres humanos, ler qualquer texto usando fonte
“Times New Roman”, “Arial”, “Tahoma”, etc. Já para um scanner não; para um scanner é
mais fácil ler linhas verticais e decodificar de acordo com sua espessura.

Um código de barras consiste numa única seqüência de barras e espaços variando em altura e
espessura, impressos para representarem de uma forma unívoca um determinado produto.
Estas simbologias se apresentam em duas variedades: o código bidimensional ou de duas
dimensões, que possui as informações contidas em duas direções, sendo a leitura feita em dois
sentidos, com símbolos geralmente quadrados ou retangulares e que possuem elevada
capacidade de armazenamento (100 a 2000 caracteres) e os códigos lineares, que têm sua
representação simbólica de informações em apenas uma direção (este segundo inclusive será
o que abordaremos neste artigo; os códigos lineares).

Código bidimensional Código linear

Figura 1

3.1. Composição de um código de barras linear

Quando nos deparamos com um código de barras linear logo observamos várias barras
expostas verticalmente e números abaixo dessas barras. Estas barras como já foi mencionado

4
não é mais do que um número escrito de forma a permitir uma leitura rápida de uma máquina.
Conseqüentemente observamos abaixo das barras que aparece o mesmo número escrito em
algarismos correntes, de forma que o leitor humano também possa ler o número.

Figura 2

3.1.1. Barras

As barras na vertical são legíveis apenas por máquinas. Cada barra representa uma série de
números compostas por sete dígitos. Estas várias listras brancas e pretas alternadas de
grossuras e tamanhos variados são classificadas em relação à espessura. Essa classificação é
feita da seguinte forma: fina, média, grossa e muito grossa. As barras são as partes escuras do
código (normalmente pretas) que servem para absorver a luz do scanner e os espaços (barras
não impressas) consistem na parte clara do código (geralmente a cor de fundo onde o código é
impresso) e refletem a luz do scanner.

Observamos algumas barras maiores que outras. Estas são chamadas de separadores e servem
para indicar a extremidade do código. Uma das principais funções desses delimitadores
(separadores) é determinar de qual lado o scanner esta começando a leitura, se é do lado
esquerdo ou lado direito e tem como ponto de referência o delimitador central do código.

Na frente de cada código observamos a Zona de silêncio ou Quites Zonas que são margens ou
espaços antes do caractere inicial e final (começo e fim). Muito importante, pois se forem
excluídos poderão impossibilitar a interpretação do código gerando uma leitura nula.

Espaço Barra

Separadores Separadores

Zona de silêncio Lado Esquerdo Lado Direito Zona de silêncio

Separadores

Figura 3

A parte mais estreita do código é o módulo, seja ele barra ou espaço. Todos os elementos que
compõem o código de barra são múltiplos do módulo quanto à largura. Assim sendo, o

5
tamanho é definido diretamente pela densidade do módulo. Densidade é determinada pela
relação entre a quantidade de módulos ou caracteres e o espaço ocupado pelo mesmo uma vez
impresso; ou seja; de acordo com o tamanho do código.

Figura 4

3.1.2. Números

Os números abaixo das barras variam sua quantidade de algarismos de acordo com a
variedade do código que é utilizado e cada número tem sua posição e sua significação, sendo
que o último número tem uma função diferenciada de segurança para possíveis erros chamado
de digito corretor ou verificador. Estas posições são determinadas por uma ONG chamada
(GS1-Brasil) que organiza e padroniza todos os códigos.

Os números da empresa que utiliza os códigos variam de empresa para empresa, os números
que identificam o item variam de item para item tendo que o dígito verificador deve ser
recalculado a cada variação na numeração.

O padrão, por exemplo, adotado no Brasil é o EAN (European Article Number), a unidade
responsável é a GS1-Brasil, que tem como objetivo a organização na disseminação de padrões
globais para o gerenciamento da cadeia de suprimentos e de demanda. Desta forma, na
condição de 26º país filiado, o Brasil recebeu seu número código, que é 789, em maio de
1985. Assim sendo, Para utilizar código de barras em um produto no Brasil a empresa deve
obter registro junto a GS1-Brasil.

3.2 Os códigos UPC-A e EAN-13

O código UPC é composto por 12 algarismos. Analisando da esquerda para a direita (figura 5)
temos o primeiro dígito, que representa a categoria do produto, cinco dígitos para a
identificação do fabricante, cinco dígitos para a identificação do produto e um último dígito
que é chamado de número verificador ou controlador.

Figura 5

6
O código EAN-13 é composto por 13 algarismos que obedecem a um algoritmo institucional
internacional, chamado EAN-13. A estrutura numérica do código de barras EAN-13 é
utilizada para identificar produtos e bens de consumo. A posição de cada número é da
seguinte forma (figura 6):

Figura 6

A: os três dígitos cedidos pela EAN indicam o País, por exemplo, (789 = Brasil);
B: os três, quatro ou cinco dígitos, cedidos pela EAN indicam o fabricante (1 2 3 4 5 =
Empresa);
C: os quatro, cinco ou seis dígitos, de controle seqüencial do fabricante indicam o produto
(6 7 8 9 = produto);
D: um dígito verificador obtido pelo algoritmo padrão do código (5 = DV).

3.3. Leitura do código de barras

O código de barras é lido através de equipamento apropriado chamado scanner que pode
decodificar; ou seja, traduzir o código de barra numa velocidade de até 500 vezes por
segundo. Tal aparelho mede a luz refletida, e interpreta o código (barras pretas e espaços
brancos) em números e letras.

Ele faz a varredura de um pequeno ponto de luz através do símbolo do código de barras
impresso. Nossos olhos vêem apenas uma fina linha vermelha emitida pelo leitor laser
(scanner). Porém, o que está acontecendo é que a fonte de luz do leitor está sendo absorvida
pelas barras escuras e refletida pelos espaços claros.

O laser do leitor (fonte de luz) começa a varredura do código de barras em um espaço em


branco (a zona de silêncio) antes da primeira barra e continua passando até a última barra,
encerrando em um espaço em branco que a segue (outra zona de silêncio).

Através da luz refletida pelos módulos que compõem o espaço, ou pela sua ausência nas
barras, o leitor interpreta o código. A interpretação acontece através do uso de um conversor
analógico-digital que transforma os sinais elétricos analógicos produzido pela luz recebida por
meio de um sensor fotoelétrico, em um sinal digital (sucessão de 0 e 1 em forma de pulso) e
que na ausência da luz refletida gera um outro sinal digital que caracteriza a barra, assim, cada
caractere do código é interpretado como um número binário, onde cada módulo reproduz um
dígito 0 (reflexão da luz pelo código, ou seja, espaço no código), ou um dígito 1 (absorção da
luz pelo código, ou seja, barra no código).

7
3.4. Codificação do código de barras UPC-A e EAN-13

Nos códigos a simbologia utilizada é o código binário, ou seja, uma seqüência de 1 (um) e 0
(zero). Nesse sistema é utilizado o símbolo 0 para indicar uma listra branca fina, o símbolo 00
para uma listra branca média, 000 para uma listra branca grossa e 0000 para uma muito
grossa. Da mesma forma, representamos por 1, 11, 111 e 1111, uma listra preta fina, média,
grossa ou muito grossa, respectivamente. Cada dígito 0 ou 1 é equivalente a um módulo de
espaço vazio ou barra respectivamente. Não contando com as listras que servem de limite, os
separadores.

Como já foi comentado, o código de barras representa uma série de números. A cada número
lhe é dado um espaço de espessura fixa, que corresponde sempre a uma seqüência de sete
dígitos iguais a 1 ou 0. Por exemplo, a seqüência 0001101 representa o número 0 (zero), a
seqüência 0111011 o número 7 (sete) e assim por diante.

É intrinsecamente interessante observarmos como a leitora faz a leitura tanto da direita para a
esquerda ou vice-versa e isso sabendo que o código de barras não são palíndromos.

Isto ocorre de maneira diferente variando no tipo do código. No código UPC os dígitos são
codificados de maneia diferente quando estão do lado direito ou esquerdo do código de barras.
Isto é feito conforme a seguinte tabela:

Dígito Lado esquerdo Lado direito


0 0001101 1110010
1 0011001 1100110
2 0010011 1101100
3 0111101 1000010
4 0100011 1011100
5 0110001 1001110
6 0101111 1010000
7 0111011 1000100
8 0110111 1001000
9 0001011 1110100

Tabela 1

A codificação de um dado número, à direita, se obtém da sua codificação à esquerda, trocando


cada zero por um e reciprocamente. O mecanismo de reconhecimento fica claro se
observarmos que cada seqüência do lado esquerdo tem um número ímpar de dígitos iguais a
um e, conseqüentemente, cada uma dos que estão à direita tem um número par. Assim,
verificando a paridade de cada seqüência de sete dígitos, a máquina reconhece imediatamente
de que lado está lendo o código.

Nos códigos EAN como se tem um algarismo a mais, o que identifica o país, precisavam
também manter o mesmo padrão de tamanho do código de barras para não ter que modificar

8
todas as leitoras. A idéia utilizada foi fazer com que o novo dígito estivesse implícito na
forma de escrita de todos os outros. Para isso, não foi modificada a codificação do lado direito
(permitindo assim que as leitoras continuassem a identificar o lado correspondente), mas à
codificação do lado esquerdo varia, dependendo do dígito inicial.

Um dígito do lado esquerdo pode ser agora codificado com um número par ou ímpar de
dígitos iguais a 1, de acordo com a seguinte tabela:

Dígito Lado esquerdo ímpar Lado esquerdo par Lado direito


0 0001101 0100111 1110010
1 0011001 0110011 1100110
2 0010011 0011011 1101100
3 0111101 0100001 1000010
4 0100011 0011101 1011100
5 0110001 0111001 1001110
6 0101111 0000101 1010000
7 0111011 0010001 1000100
8 0110111 0001001 1001000
9 0001011 0010111 1110100

Tabela 2

Sendo assim, finalmente, para cada dígito inicial escolhe-se uma alternância diferente de
pares e ímpares de acordo com o seguinte critério:

Digito inicial 1º 2º 3º 4º 5º 6º
0 ímpar ímpar ímpar ímpar ímpar Ímpar
1 ímpar ímpar par ímpar par Par
2 ímpar ímpar par par ímpar Par
3 ímpar ímpar par par par Ímpar
4 ímpar par ímpar ímpar par Par
5 ímpar par par ímpar ímpar Par
6 ímpar par par par ímpar Ímpar
7 ímpar par ímpar par ímpar Par
8 ímpar Par ímpar par par Ímpar
9 ímpar Par par ímpar par Ímpar

Tabela 3

9
Para um melhor entendimento, vejamos como exemplo uma barra de cereal identificado pelo
código 7895000266241. Olhando para os três dígitos iniciais 789, logo percebemos que foi
fabricado no Brasil, pois este é o código mundial do país.

Como uma característica do código EAN, tem-se que o primeiro digito implícito na
codificação é sete (7); ou seja; ele indica qual seqüência da tabela criada pela EAN irá seguir.
Conseqüentemente, neste caso deve-se usar a seguinte ordem de codificação (obtida na tabela
3): ímpar – par – ímpar – par – ímpar – par.

Consultando a tabela 2, de codificação do EAN-13 obtemos:

8 a 0110111 9 a 0010111 5 a 0110001


0 a 0100111 0 a 0001101 0 a 0100111

Para os dígitos do lado direito não temos que nos preocupar com paridade, e obtemos
diretamente da tabela, a seguinte codificação:

2 a 1101100 6 a 1010000 6 a 1010000


2 a 1101100 4 a 1011100 1 a 1100110

Figura 7

3.5. Dígito verificador ou corretor

Todo código de barras possui um dígito de verificação, ou de correção, que funciona como
processo de detecção de erros. Esse dígito normalmente é o último algarismo da seqüência.
Para descobrir qual é esse algarismo utilizamos um algoritmo de fácil compreensão. Este
algoritmo é utilizado em quase todos os tipos de códigos.

Algoritmo: Suponhamos que um determinado produto está identificado, no sistema EAN-13,


por uma dada seqüência de dígitos a1 , a 2 ,.., a10 , a11 , a12 , x .

Como os primeiros dígitos identificam o país de origem, o fabricante e o produto específico,


os primeiros doze dígitos da seqüência estão determinados naturalmente por um método
padrão, a cargo de uma autoridade classificadora em cada país. Assim sendo, chamaremos o
décimo terceiro dígito de verificação, por x .

Para facilitar o entendimento, escrevemos esta seqüência como um vetor:

α = (a1 , a 2 , ..., a10 , a11 , a12 , x )

10
O sistema EAN-13 se utiliza de um vetor fixo, que chamaremos vetor de pesos que é o vetor:

ρ = (1,3,1,3,1,3,1,3,1,3,1,3,1)

Calculando-se, então o “produto escalar” dos vetores temos:

α.ρ = (a1 , a 2 , ..., a10 , a11 , a12 , x ) . (1,3,1,3,1,3,1,3,1,3,1,3,1)

α.ρ = 1.a1 + 3.a 2 + 1.a3 + 3.a 4 + 1.a 5 + 3.a 6 + 1.a 7 + 3.a8 + 1.a9 + 3.a10 + 1.a11 + 3.a12 + 1.x

Feito isso, encontramos o digito verificador, pois ele é escolhido de tal forma que a soma
acima seja um múltiplo de 10, isto é, encontramos x de forma que tenhamos a congruência:

α.ρ ≡ 0 (mod 10) .

O dígito verificador é a diferença do próximo múltiplo de 10 para a soma dos números de


posição par, multiplicados por 3 (da esquerda para a direita), com os números de posição
ímpar. Assim sendo, o digito verificador será o menor inteiro positivo congruente módulo 10.

Como exemplo de aplicação do algoritmo descrito acima, seja a barra de cereal mencionada
anteriormente cujo código de barras é 7895000266241 . Na geração deste código, depois de se
atribuir os doze primeiros números, que indicam o país de origem, o fabricante e o produto,
tem-se a seqüência 789500026624 x e se quer calcular o valor para x . Sendo

α = (a1 , a 2 , ..., a10 , a11 , a12 , x ) e ρ = (1,3,1,3,1,3,1,3,1,3,1,3,1) ,

aplicando o algoritmo teremos:

α.ρ = 7 + 3 × 8 + 9 + 3 × 5 + 0 + 3 × 0 + 0 + 3 × 2 + 6 + 3 × 6 + 2 + 3 × 4 + x = 99 + x ≡ 0 ( mod 10)

Conseqüentemente o digito verificador é x = 1 , como já conhecido.

O uso do dígito verificador ou corretor para detecção de erros será comentado no próximo
tópico.

3.5.1 Detecção de erros

Quando o scanner não faz a leitura e se é obrigado a digitar o código de barras, podem-se
cometer erros. O dígito verificador dos códigos UPC e EAN é usado como garantia de
digitação correta, como será visto. Porém pode vir a pergunta: “Será que os dígitos
verificadores detectam todos os erros? A resposta para esta pergunta é não. O digito
verificador detecta até aproximadamente 88,9% dos erros obtidos.

Algumas investigações em relação a possíveis erros nos trouxeram a freqüência em que eles
ocorrem, com mostrado na tabela a seguir:

11
Tipo de Erro Freqüência Relativa %
Erro único K a K a Kb K 79
Transposição adjacente K ab K a K ba K 10,2
Transposição alternada K abc K a K cba K 0,8
Erro gêmeo K aa K a K bb K 0,6
Erro gêmeo alternado K aba K a K cbc K 0,3
Outros 9,1

Tabela 4. Tipos de erros e suas freqüências segundo Verhoeff.

A detecção de erro se dá quando a máquina faz o teste do dígito verificar e obtém que
α.ρ ≡/ 0 (mod 10) (a congruência não se verifica). Imediatamente um sinal sonoro é emitido
avisando do erro.

Em relação a tais erros podemos fazer algumas considerações:

Proposição 1. Uma transposição adjacente do tipo K a i ai +1 K a K ai +1 ai K é detectado


pelos sistemas UPC e EAN-13 se e somente se a i − a i +1 ≠ 5 .

Demonstração. Considere que o código α = (a1 , a 2 , ..., ai , ai +1 , K , a12 , a13 ) tenha sido digitado
como α = (a1 , a 2 , ..., ai +1 , a i , K , a12 , x ) e que, de alguma forma, o erro não tenha sido
detectado. Assim, temos como válidas as duas congruências abaixo (outra possibilidade seria,
na primeira equação K 3a i + a i +1 K e na segunda, K a i + 3ai +1 K ):

α.ρ = a1 + 3a 2 + a3 + 3a 4 + K + ai + 3a i +1 + K + 3a12 + a13 ≡ 0 ( mod 10 ) ,


α.ρ = a1 + 3a 2 + a3 + 3a 4 + K + ai +1 + 3ai + K + 3a12 + a13 ≡ 0 ( mod 10 )

Fazendo a diferença, teríamos 2ai +1 − 2a i ≡ 0 (mod 10) , ou 2(a i +1 − a i ) ≡ 0 (mod 10) e assim,
a i +1 − a i ≡ 5 (mod 10) . Em qualquer possibilidade, devemos ter ai +1 − ai ≡ 5 (mod10) . Como
esse procedimento vale no sentido oposto, temos que um erro não será detectado se e somente
se ai +1 − ai ≡ 5 (mod10) . De outro modo, um erro será detectado se e somente se,
diferentemente, ai +1 − ai ≡/ 5 (mod10) e concluímos a afirmação 1.

Aqui vemos a importância do vetor de pesos β , pois se a escolha do dígito de verificação


fosse feita de forma que

a1 + a 2 + a3 + a 4 + a 5 + a 6 + a 7 + a8 + a9 + a10 + a11 + a12 + x ≡ 0 (mod 10) ,

12
Nenhum erro de transposição seria detectado. Talvez apenas erro de troca de números de
forma que a congruência não se verificasse.

Para um melhor entendimento, suponha o código de barras 9788531404580 tenha sido


erroneamente digitado como 9788 351404580 . Ao efetuar a verificação, utilizando o
algoritmo, teríamos:

(9,7,8,3,5,1,4,0,4,5,8,0) .(1,3,1,3,1,3,1,3,1,3,1,3,1) =
9 + 21 + 8 + 24 + 3 + 15 + 1 + 12 + 12 + 5 + 24 = 134 ≡/ 0 (mod 10)

Desta forma, o erro seria facilmente detectado.

Proposição 2. Um erro de transposição não adjacente do tipo


K a i ai +1 a i + 2 K a K a i + 2 a i +1 a i K não é detectado pelos sistemas UPC-A e EAN-13.

Demonstração. Aplicando o algoritmo de verificação teríamos, para a digitação correta (o


outro caso possível seria K 3a i + ai +1 + 3ai + 2 K ),

α.ρ = a1 + 3a 2 + a3 + 3a 4 + K + ai + 3a i +1 + a i + 2 + K + 3a12 + a13 ≡ 0 ( mod 10 )

e, para a digitação errada

α.ρ = a1 + 3a 2 + a3 + 3a 4 + K + ai + 2 + 3ai +1 + a i + K + 3a12 + a13 ≡ 0 ( mod 10 ) ,

já que é a mesma soma da congruência para a digitação correta. Assim, o erro não seria
percebido e a afirmação 2 está concluída.

Como exemplo, imagine que o código de barras de um pincel marca texto seja
7897424082117 e, por algum descuido do digitador humano, tenha sido cometido um erro do
tipo transposição não adjacente e o número digitado tenha sido 789742 804 2117 . Utilizando
o algoritmo de verificação teríamos:

α.ρ = (7,8,9,7,4,2,8,0,4,2,1,1,7 ). (1,3,1,3,1,3,1,3,1,3,1,3,1) =


7 + 24 + 9 + 21 + 4 + 6 + 8 + 0 + 4 + 6 + 6 + 1 + 3 + 7 = 100 ≡ 0 (mod10) .

É notável que nesse caso o algoritmo não seja eficaz, já que o erro não seria detectado.

Proposição 3. Um erro de transposição em que dois dígitos não adjacentes ai e a j são


trocados não pode ser detectado pelo sistema se a diferença i − j é par.

Demonstração. No produto interno α.ρ , a cada duas posições o fator de multiplicação 1 ou 3


se repete, portanto se a variação de i para j é par, o fator de multiplicação (1 ou 3 ) é o
mesmo. Assim o resultado final não se altera.

13
Proposição 4. Um erro de transposição em que dois dígitos não adjacentes a i e a j são
trocados, se a diferença i − j for ímpar então o erro pode ser detectado pelo sistema EAN-
13 se e somente se a i − a j ≠ 5 .

Demonstração. Note que o vetor de pesos é tal que a distância entre dois pesos iguais é par.
Daí, i − j é ímpar, então a i e a j são multiplicados por pesos diferentes, ou a i é
multiplicado por 1 e a j por 3 , ou vice-versa. Aplicando o algoritmo de verificação teríamos,
para a digitação correta:

α. ρ = a1 + 3a 2 + a3 + 3a 4 + K + ai + K + 3a j + K + 3a12 + a13 ≡ 0 (mod 10)

e para a digitação errada

α. ρ = a1 + 3a 2 + a 3 + 3a 4 + K + a j + K + 3a i + K + 3a12 + a13

Supondo que o erro não fosse detectado, teríamos

α.ρ = a1 + 3a 2 + a3 + 3a 4 + K + a j + K + 3a i + K + 3a12 + a13 ≡ 0 (mod 10) .

Resultaria
a i − a j + 3a j − 3a i ≡ 0 (mod 10) , ou 2 a j − a i ≡ 0 (mod 10) ,

Que vale se e somente se a i − a j = 5 . Daí, o erro será detectado se e somente se a i − a j ≠ 5 .


E a afirmação está provada.

Podemos perceber que o sistema não detecta todos os erros de transposições e possui algumas
falhas de segurança, porém é muito eficiente para detectar os erros mais freqüentes. Existem
outros verificadores que serão comentados no próximo tópico.

3.5.2 Outros Detectores de erros

Como já foi dito anteriormente iremos descrever alguns dos métodos existentes ditos mais
seguros. Para um melhor entendimento, denotaremos por A o conjunto dos valores que
podem assumir os dígitos utilizados na codificação. Por exemplo, no caso do código UPC da
seção anterior, esse conjunto é

A = {x ∈ Ζ / 0 ≤ x ≤ m − 1}.

O vetor com os dados α = (a1 , K , a n−1 ) será o vetor de informação e o vetor já acrescentado o
dígito de verificação será chamado de número ou vetor de identificação.

Definição: Sejam w = (w1 , K , wn ) com wi ∈ A, 1 ≤ i ≤ n um vetor de pesos e c ∈ A um


inteiro fixado. Dado dois inteiros positivos m e n e um conjunto de números a1 , K , a n −1 tais

14
que a i ∈ A, 1 ≤ i ≤ n − 1 , define-se o número de verificação a n como o único elemento de A
que verifica a equação:
n

∑a w i i ≡ c (mod m )
i =1

Um sistema de codificação assim definido será denotado por C = ( A, m, n, c, w) .

Em geral, A = {0,1,K, m − 1}. Nesse caso, tomando classes x módulo m , temos que a n é o
único elemento de A que satisfaz a equação

n −1
−1  
a1 w1 + K + ai wi + K + a n wn = c , ou a n = wn  c − ∑ ai wi  .
 i =1 

Como exemplo, temos o sistema utilizado por bancos (nem todos) para codificar o número da
conta de seus clientes que é composto por 9 dígitos, sendo que o último é o digito verificador.
Na notação assumida temos C = ( A,10, 9, 0, w) onde A é o conjunto dos dígitos de 0 a 9 e
w = (7,3,9,7,3,9,7,3,9) . Se tomarmos o número de certa conta bancaria como 95 − 005541 − 9 ,
usando o algoritmo para verificação temos que:

(9,5,0,0,5,5,4,1,9).( 7,3,9,7,3,9,7,3,9) = 63 + 15 + 15 + 45 + 28 + 3 + 81 = 250 ≡ 0 (mod10) .


Descreveremos agora a capacidade de detecção de erros mais freqüente por um sistema
definido desta forma.

Teorema 1. Sejam m um inteiro positivo e w = (w1 , K , wn ) um vetor de pesos. Suponhamos


que um vetor de identificação α = (a1 ..., a n ) , onde assumimos 0 ≤ a i < m , para todo índice
i, 1 ≤ i ≤ n , satisfaz a condição

α.w = a1 w1 + K + a n wn ≡ c (mod m ) .

Então,

a) Todo erro consistente numa única alteração na posição i-ésima será detectado se e
somente, se mdc(wi , m ) = 1 ;
b) Todo erro de transposição da forma K a i K a j K a K a j K ai K será detectado se e
somente se mdc(wi − w j , m ) = 1 .

Demonstração. (a) Suponha inicialmente que o digito ai , na posição i foi trocado por outro
valor bi . Denotaremos por β o vetor resultante desse erro. O erro não será detectado se, e
somente, se α .w − β .w ≡ 0 (mod m ) . Mas α.w − β.w = (a i − bi ) wi ≡ 0 ( mod m) . De modo que
o erro será detectado se, e somente, se m (ai − bi ) wi , ou se denotarmos por x a classe de um
inteiro x em Z m , se e somente, se (a i − bi ) wi = 0 em Z m , ou a i wi = bi wi . Se

15
mdc(wi , m ) = 1 tem-se que wi é invertível em Z m e segue que a i = bi , logo a i ≡ bi (mod m ) e,
sendo os dois números menores que m , isto só aconteceria se a i = bi . Logo o erro será
detectado. Por outro lado, se mdc(wi , m ) = d ≠ 1 , dado ai tem-se que dentre os números
bi = ai + m / d e bi = ai − m / d , um deles verifica a condição 0 ≤ bi < m e o erro que substitui
ai por esse numero não pode ser detectado (nesse caso, a i ≠ bi ).

(b) (⇐) Suponhamos que foi cometido um erro de transposição, sendo que disto, do vetor
inicial α = (a 0 ,..., a i , ...a j ,...a n ) , teremos outro vetor denotado de β = (a 0 ,..., a j ,...ai ,...a n ) .
Supondo por absurdo que o erro não seja detectado, teríamos que:

α.w = a 0 w0 + K + a i wi + K + a j w j + K + a n wn ≡ c (mod m) ,
β.w = a 0 w0 + K + a j wi + K + a i w j + K + a n wn ≡ c (mod m )

Assim,
α.w − α. β = (a i wi + a j w j ) − (a j wi + ai w j ) ≡ 0 (mod m ) .

Segue que

a i wi + a j w j − a j wi − a i w j = ai wi − a j wi − a i w j + a j w j = (a i − a j )(wi − w j ) ≡ 0 (mod m ) .

Conseqüentemente, se o erro não for detectado é porque temos

(a i ( )( )
− a j )(wi − w j ) ≡ 0 (mod m ) , ou a i − a j wi − w j = 0 .

Seguem as possibilidades:

(i) a i = a j e wi ≠ w j , significando que não houve erro de digitação, que não é o caso, pois
estamos assumindo que houve um erro;
(ii) a i ≠ a j e wi = w j : nesse caso wi − w j = 0 e mdc(wi − w j , m ) ≠ 1 ;
(iii) a i ≠ a j e wi ≠ w j : wi − w j é divisor de zero (é não nulo tal que o produto por outro
elemento não nulo resulta em zero) e mdc(wi − w j , m ) ≠ 1 , pois se fosse, wi − w j seria
invertível (a condição para que a ∈ Z m tenha inverso é que mdc(a, m) = 1 );
(iv) a i = a j e wi = w j ⇒ (wi − w j ) : análogo aos casos (i) e (ii).

(⇒ ) Supondo por absurdo que mdc(wi − w j , m ) ≠ 1 , temos que (wi − w j ) é divisor de zero; ou
( )
seja, existe k ∈ Z com k = 0 , tal que wi − w j k = 0 , podendo nessas condições acontecer
de α.w ≡ 0 (mod m ) , bastando apenas tomarmos k = (ai − a j ) sendo assim teremos:

( ) ( )( )
k bi − b j = a i − a j bi − b j = 0 ⇔ α. β ≡ 0(mod m ) ,

16
que é uma contradição. E o teorema está demonstrado.

Teremos como conseqüência do resultado encontrado, que a melhor forma de ter certeza que
o sistema de codificação será capaz de detectar os erros únicos e todos os erros de
transposições (do tipo contígua ou não) é tomarmos m um número primo.

Um exemplo disso é o sistema universal adotado para a classificação de livros ISBN


(International Standard Book Number). Ele trabalha módulo 11, mas para simplificar a
notação, utiliza como conjunto de valores A os dígitos de 0 a 9 e os vetores de identificação
têm 10 componentes. Este sistema descrito na notação que estamos utilizando neste artigo
será ( A,11,10, 0, w) com w = (10,9,8,7,6,5,4,3,2,1).

Tomemos como exemplo prático do uso desse sistema o livro que tem como identificação
ISBN 0-387-96035. Para descobriremos qual será seu dígito de verificação, que será denotado
por r ∈ A , fazemos:
(0,3,8,7,9,6,0,3,5, r )(. 10,9,8,7,6,5,4,3,2,1) ≡ 0 (mod11) .
Desenvolvendo as operações teremos que:

243 + r ≡ 0(mod11) , ou r ≡ −243 (mod 11) .

Como 243 ≡ 1(mod11) e − 1 ≡ 10 (mod11) temos que r = 10 . É fácil perceber que no código
ISBN os dígitos codificados pertencem ao conjunto A = {0,1,2,3,4,5,6,7,8, 9} e logicamente
não se tem o representante 10 . Devemos introduzir então mais um símbolo para representar
este número. A convenção atual utilizada é o símbolo X e assim, no exemplo descrito, o
código ISBN que aparece no livro é 0-387-96035-X.

É percebível que, se tomarmos o número m de modo que seja primo e o conjunto A formado
por inteiros menores que m tendo todos os componentes wi do vetor de peso w primos com
m , multiplicar por wi , módulo m , resulta numa permutação do conjunto A (uma bijeção de
A em si mesmo). Isto nos leva a um método mais geral para definir o vetor de pesos.

Dado um vetor de informação α' = (a1 , K , a n −1 ) podemos escolher n permutações δ1 , K , δ n


do conjunto A e definir um “vetor de pesos” por λ = (δ1 , K , δ n ) , fixar um numero c ∈ A e
escolher um digito de verificação de forma que satisfaça:

λ(α ) = δ1 (a1 ) + K + δn (a n ) ≡ c (mod m )

Ficando definido por:


n =1
−1  
a n = δn  c − ∑ δi (a i ).
 i =1 

17
Como exemplo dessa codificação, se um código usado pela IBM (International Business
Machines) que utiliza como conjunto A os números de 0 a 9, m = 10 , um valor qualquer
c ∈ A e a permutação

 0 1 2 3 4 5 6 7 8 9
δ =  
 0 2 4 6 8 1 3 5 7 9

Nos casos em que o número de componentes do vetor de identificação é ímpar utiliza-se o


vetor de pesos δ = (I , δ , I , δ ,K, δ , I ) .

Assim a equação de verificação será

a n + δ (a n −1 ) + a n− 2 + δ (a n −1 )K ≡ c (mod 10 ) .

O dígito de verificação é dado pela fórmula

a n = c − (δ (a n −1 ) − a n − 2 − δ (a n −3 ) − K) (mod 10 ) .

Quando o numero de verificação é par utiliza-se o vetor de pesos δ = (δ , I , δ ,K, δ , I ) .

Assim sendo, resulta uma equação de verificação análoga com uma fórmula similar ao feito
antes para o cálculo do digito de verificação.

Este é o sistema utilizado para determinar os números nos cartões de crédito. Tomemos como
exemplo, um determinado cartão tem o número 5745 5195 0431 5412 aplicando o sistema
de verificação IBM teremos:

5 7 4 5 5 1 9 5 0 4 3 1 5 4 1 2
↓δ ↓I ↓δ ↓I ↓δ ↓I ↓δ ↓I ↓δ ↓I ↓δ ↓I ↓δ ↓I ↓δ ↓I
1 7 8 5 1 1 9 5 0 4 6 1 1 4 2 2

Efetuando os cálculos teremos

1 + 7 + 8 + 5 + 1 + 1 + 9 + 5 + 0 + 4 + 6 + 1 + 1 + 4 + 2 + 2 ≡ 7 (mod 10)

Este sistema detecta todo erro único de digitação e toda transposição adjacente exceto no caso
em que ai e a j assumem os valores ( 0 e 9 ou 9 e 0 ), respectivamente com já foi
demonstrado anteriormente no capitulo anterior. Porém o sistema não detecta transposições
do tipo
K a i K a j K a K a j K ai K

quando a diferença i − j for par e quando o erro for gêmeo do tipo K aa K a K bb K

De forma geral o código IBM generalizado utiliza a mesma permutação, com o vetor de pesos

18
(
onde δ 0 = I . A equação então é λ = δ n −1 , δ n− 2 , K , δ , δ 0 )
n n

∑ δ (a
i −1
i −1
n +1−i ) ≡ c (mod10) e a n = c − ∑ δ i −1 (a n +1−i ) (mod 10 ) .
i =2

Esse sistema detecta todo erro único de digitação, transposição adjacente ou não, com exceção
é claro, quando os dígitos envolvidos são 0 e 9 , além de todo erro gêmeo.

Vimos a capacidade e eficiência de detecção de erros com código ISBN, logo poderia surgir a
curiosidade da possibilidade de trabalhar no modulo 10 . A resposta para essa curiosidade
seria não a justificativa seria

Teorema 2. Se um sistema numérico de detecção de erros, com um módulo par, detecta todo
erro único de digitação, então para todo par de índices i, j existe um erro de transposição
entre as posições i e j que não é detectada pelo sistema.

Demonstração. Como o módulo é par, vamos trabalhar com os números de 0 a 2m − 1 e


congruência modulo 2m , considerando os dígitos como elementos de Ζ 2 m , (tendo como
finalidade simplificação nos argumentos). Suponha que o sistema transforma o vetor
(a1 ,K, a n ) num outro vetor, cuja notação será (σ (a1 ), K, σ n (a n )) . Tendo a capacidade de
detecção do erro único de digitação, então a aplicação na posição i-ésima x a σ i ( x ) deve ser
uma permutação de Ζ 2 m .

Para que o sistema detecte todo erro de transposição entre as posições i e j é necessário que
σ i (a ) + σ j (b ) ≠ σ j (a ) + σ i (b ) , para todo par de elementos diferentes a, b ∈ Ζ 2m , ou seja, esta
aplicação σ = σ i − σ j é uma permutação em Ζ 2 m . Mas como m ∈ [0, 2m-1] , temos que;

0 + 1 + 2 + K + 2m − 1 =
(2m − 1) 2m = 2m . m − m ≡ m (mod 2m ) .
2

Logo
m= ∑ x = ∑ σ(x) = b ∑ (σ (x ) − σ (x )) = ∑ σ (x ) − ∑ σ (x )
x∈Z 2 m x∈Z 2 m x∈Ζ 2 m
i j
x∈Ζ 2 m
i
x∈Ζ 2 m
j = m−m = 0.

Mas isto é uma contradição.

19
4. CONCLUSÃO

É notória a presença matemática em vários segmentos da tecnologia que surgiu e que ainda irá
surgir. O código de barras é um desses exemplos de uma matemática, que pode ser simples ou
mais sofisticada, que tem sua aplicação a novas tecnologias que nos auxiliam no dia a dia.

Como foi exposto neste artigo como o código de barras se tornou uma tecnologia
indispensável nos dias atuais, no auxilio as empresas no controle e identificação de produtos e
na “agilização” do atendimento a clientes, em atendimento bancário e entre diversos setores.

Buscamos abordar o assunto em questão da forma mais clara possível, explicando o tema de
modo a tentar desvendar a matemática que está por detrás dos códigos de barras e de como
possíveis erros humanos, que podem eventualmente ocorrer, precisam ser corrigidos dentro de
certos limites.

O código de barras ainda é objeto de pesquisa para muitos desenvolvedores e há diversas


maneiras de se trabalhar com esta tecnologia que surgiu nos Estados Unidos, na década de 70,
com o intuito de diminuir as filas, processos de pagamento, etc. deixando-os mais rápidos.
Código de barras, hoje, tornou-se uma unanimidade mundial.

REFERÊNCIAS BIBLIOGRÁFICAS

BARCODE ISLAND. Disponível em: < http://www.barcodeisland.com/ean13.phtml>. Acesso em: 29 out. 2008.
GARCIA, Ana Cristina dos Santos et al. Matemática dos códigos de barras. 2007. 58 f. Osasco, SP: Centro
Universitário UNIFIEO.
CÓDIGO DE BARRAS - CONCEITOS BÁSICOS E UTILIZAÇÃO NO VB. Disponível em:
<http://www.macoratti.net/cod_bar.htm>. Acesso em: 30 set. 2008.
GS1-BRASIL. Disponível em: <http://www.eanbrasil.org.br/servlet/ServletContent?requestId=14>. Acesso em:
10 ago. 2008.
GS1-BRASIL. Disponível em:
<http://www.eanbrasil.org.br/main.jsp?lumPageId=FF8080810CC51BE1010CCA6BA8BB4BFB&lumDS=defa
ult&itemId=FF8080810D131846010D1846856F0258>. Acesso em: 29 ago. 2008.
MEDIA IDENTIFICATION NUMBERS. <http://www.milk.com/barcode/>. Acesso em: 27 ago. 2008.
MILIES, César Polcino. A matemática dos códigos de barras. 19 f. São Paulo, SP. IME/USP - Departamento
de Matemática, SP.
PONTOS & VÍRGULA. Disponível em:
<http://www.pontosevirgulas.hpg.ig.com.br/pontos_interessantes/codigo_barras>. Acesso em: 29 set. 2008.
PORTAL DE SERIVÇOS DO GOVERNO DO PARANÁ. Disponível em:
<http://www.pr.gov.br/batebyte/edicoes/1994/bb30/codigo.htm>. Acesso em: 22 out. 2008.
TONON, Gesuel et al. Códigos de barras. 2007. 23 f. Poços de Caldas, MG: Pontifica Universidade Católica de
Minas Gerais.

Eduardo Marques Dias (eduardo.markes@hotmail.com)


Curso de Matemática, Universidade Católica de Brasília.
EPCT – QS 07 – Lote 01 – Águas Claras – Taguatinga – CEP.: 72966-700

20

Вам также может понравиться