Академический Документы
Профессиональный Документы
Культура Документы
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.
2. HISTÓRICO
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.
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”.
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.
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.
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)
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).
Figura 1
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
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.
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).
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.
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:
Tabela 1
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:
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.
Para os dígitos do lado direito não temos que nos preocupar com paridade, e obtemos
diretamente da tabela, a seguinte codificação:
Figura 7
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.
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)
α.ρ = 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:
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
O uso do dígito verificador ou corretor para detecção de erros será comentado no próximo
tópico.
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
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.
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 ):
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.
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.
(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)
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:
É notável que nesse caso o algoritmo não seja eficaz, já que o erro não seria detectado.
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 + a 3 + 3a 4 + K + a j + K + 3a i + K + 3a12 + a13
Resultaria
a i − a j + 3a j − 3a i ≡ 0 (mod 10) , ou 2 a j − a i ≡ 0 (mod 10) ,
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.
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.
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
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:
α.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 ) .
(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.
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:
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.
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
a n + δ (a n −1 ) + a n− 2 + δ (a n −1 )K ≡ c (mod 10 ) .
a n = c − (δ (a n −1 ) − a n − 2 − δ (a n −3 ) − K) (mod 10 ) .
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
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
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.
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.
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.
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.
20