A matemática do

Código de Barras

No cotidiano...

Você já se perguntou porquê a maioria, se não todos, dos produtos do supermercado têm um código de barras? 

Com o avanço da tecnologia e o desenvolvimento dos leitores de códigos de barras, este tipo de código se tornou muito frequente na maioria dos produtos. 

O código presente nos produtos dos supermercados são acompanhados por uma sequência de números e servem para a identificação dos produtos. Os números escritos abaixo destas barras, possibilitam que os humanos também possam ler o código.

Você já deve ter notado que algumas vezes, quando o leitor não reconhece o código de barras, o atendente do caixa tenta passar o produto em diversas posições diferentes, e quando não obtém sucesso, digita o código manualmente.

 

Com base nestas experiências, podemos nos perguntar:

Se o leitor por acaso recebe o código de ponta cabeça, será que ele o lê ao contrário? É possível que o atendente do caixa digite os números errados e cobre por um outro produto de outro valor?

A resposta curta para estas perguntas é: NÃO. O que ocorre é que mesmo lido ao contrário, o código sempre é interpretado de forma correta, e se por acaso o operador do caixa cometa um erro de digitação, a máquina emite um aviso.

Vamos entender por quê isto acontece, e como um código de barras é emitido. Mas antes, um pouco de história

A história dos códigos de barra

A primeira patente de um código de barras foi atribuída em 1952 a Joseph Woodland e Bernard Silver.

O código consistia em um padrão de circunferências concêntricas de espessura variável. Ao dar entrada ao pedido de patentes, os dois cientistas descreviam sua nova invenção como uma classificação de artigos através de identificação de padrões.

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 para isso. Dentre as firmas contatadas, a que acabou apresentando a proposta vencedora foi a IBM, e o código foi criado por George J. Laurer.

 

Norman Joseph Woodland, George Laurer e Bernard Silver

O código proposto foi formalmente aceito em maio de 1973,  e passou a ser conhecido como código UPC (Universal Product Code) e foi adotado nos Estados Unidos e no Canadá. Ele consistia em uma seqüência de 12 dígitos, traduzidos para barras.

Existem várias versões sucessivas do UPC, com pequenas modificações. Posteriormente foi solicitado a Laurer que ampliasse o código, para permitir uma maior difusão do sistema, de modo a identificar também o país de origem de cada produto classificado. assim, baseado no UPC-A, ele acabou criando um novo código, com 13 dígitos, que foi adotado em dezembro de 1976 com o nome EAN (European Article Numbering system). Alguns países adotam esse mesmo sistema, dando-lhe outro nome. Por exemplo, no Japão o sistema é conhecido como JAN (Japanese Article Numbering system).

Agora, resta saber como esses números são traduzidos em barras.

Escrevendo em barras no código UCP

Observando da código da figura abaixo, notamos que ele é composto por listras brancas e pretas alternadas, de espessuras variadas. Na verdade, há quatro espessuras possíveis para essas listras, que podem ser classificadas como finas, médias, grossas ou muito grossas.

Além disso, vemos que o número correspondente é \(0 \hspace{5pt} 75678 \hspace{5pt} 16412 \hspace{5pt} 5\). Qualquer número no sistema UPC obedece a esse padrão, isto é, os 12 algarismos sempre são escritos na forma \(x – xxxxx \hspace{5pt} xxxxx – x\).

Vamos utilizar 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.  Analogamente, vamos representar por \(1\), \(11\), \(111\) e \(1111\), uma listra preta fina, média, grossa ou muito grossa, respectivamente.

Assim, as primeiras quatro listras da figura (sem contar as três listras que servem de limite no inicio e fim do código), que são uma listra branca grossa, uma preta média, uma branca fina e uma preta fina respectivamente, podem ser representadas pela seqüência \(0001101\). Como já vimos, o código de barras representa uma série de números. A cada número é atribuído 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\) que achamos acima representa o número \(0\), o primeiro do código da figura. O seguinte número do código, o \(7\), é representado pela sequência \(0111011\).

Agora que vimos como podemos de escrever usando as barras, podemos responder à primeira das nossas perguntas: como a leitora de códigos de barra faz a distinção de quando o produto é ser passado em uma ou outra direção? 

Temos que os dígitos são codificados de maneira diferente quando estão do lado direito ou esquerdo do código de barras. Isto é feito conforme à seguinte tabela:

Então, é só perceber que a codificação de um dado número, pela direita, se obtém da sua codificação à esquerda, mas trocando cada por  e vice-versa.

Agora, para que a máquina saiba em qual direção o código esta sendo lido, ela usa o fato de que cada sequência do lado esquerdo tem um número ímpar de dígitos e, portanto, cada uma das que estão à direita tem um número par. Assim, verificando a paridade de cada seqüência de sete dígitos, ela “entende” imediatamente de que lado está lendo o código.

O código EAN-13

No desenvolvimento do EAN-13 o objetivo era adicionar um novo digito ao código, para que fosse possível identificar o país de origem do produto e tornasse o código de uso mundial.  Mas o desafio era fazer isso de forma que uma máquina pudesse ler sem distinção alguma os códigos UPC e EAN.

Mas se pararmos pra pensar, o novo digito adicionado não poderia sozinho identificar o país de origem, uma vez que só poderia distinguir 10 países. Assim, no sistema EAN, os primeiros dois ou três dígitos são utilizados para identificar o país onde o fabricante está registrado, os próximos quatro ou cinco dígitos (dependendo de quantos foram já utilizados para identificar o país) indicam o produtor e os cinco restantes identificam o próprio artigo produzido. Por fim, o último dígito é um dígito de controle como no sistema UPC. Por exemplo, o código de barras de todos os produtos no Brasil começa com a sequência 789.

Comparando os códigos abaixo, poderíamos supor que eles pertencem a produtos diferentes, o que é razoável, já que do ponto de vista numérico há mais um zero no início da sequência. Mas na verdade eles representam o mesmo produto, e se observarmos o código de barras percebemos que a configuração não se altera de um para outro. 

 

Esse digito zero adicional é explicado pelo fato de que EUA e Canadá utilizavam o antigo código UPC e passaram a ser identificados por meio desse zero inicial, enquanto que para os demais países, a identificação  é feita por meio dos primeiros dois ou três dígitos. Por exemplo, o código de barras de todos os produtos produzidos no Brasil começa com a seqüência 789, que é a que identifica o país.

Voltando ao nosso problema de adicionar um dígito e, ao mesmo tempo, manter o mesmo padrão de tamanho do código de barras (para não ter que modificar todas as leitoras), a idéia foi fazer com que o novo dígito estivesse implícito na forma de escrita de todos os outros

Para fazer isso, codificação do lado direito não foi modificada, e todos os dígitos continuam codificados utilizando-se um número par de posições iguais a 1 (permitindo que as leitoras continuassem a identificar o lado em que o código estava sendo lido).  Mas foram utilizados padrões de paridade na codificação do lado esquerdo, que podem variardependendo do dígito inicial. Agora, um dígito (número) do lado esquerdo pode ser descrito de duas maneiras: utilizando-se um numero par ou ímpar de digitos iguais a um, que podem ser determinados através da tabela:

Mas como vamos saber se cada digito deve ser escrito por uma quantidade par de 1’s, ou por uma quantidade ímpar? Para determinarmos isso, há mas uma regrinha: 

  • Se o dígito inicial é 0, para manter o padrão do sistema UPC, todos os dígitos do lado esquerdo devem ser codificados utilizando sempre um número ímpar de posições iguais a 1, tal como antes. (e para isso, basta consultar a tabela anterior)
  • Se o dígito inicial for 1, então os seis dígitos do lado esquerdo serão codificados de acordo com o seguinte padrão: ímpar, ímpar, par, ímpar, par, par.

Mas se o digito for qualquer outro número, também há um padrão a ser seguido pelos dígitos restantes do lado esquerdo, que determinam um numero par ou ímpar de posições iguais a 1. Esses padrões estão na tabela abaixo:

Para entender como funciona, vamos ver um exemplo mais prático. Suponha que uma barra de cereais produzida no Brasil é identificada pelo código \(7895000266241\). Como o código começa com a sequência \(789\), o primeiro dígito, que é o sete, estará implícito na codificação dos demais. Com base na tabela anterior, vemos que a ordem de codificacao do lado esquerdo deve seguir o padrão: ímpar, par, ímpar, par, ímpar, par. Bom, agora ficou fácil, é só substituir os dīgitos do código por suas respectivas sequências de identificação. Então, consultando a tabela de codificação do EAN-13 obtemos: $$8 \rightarrow 0110111 \hspace{10pt} 9 \rightarrow 0010111 \hspace{10pt} 5 \rightarrow 0111001$$ $$0 \rightarrow 0001101 \hspace{10pt} 0 \rightarrow 0001101 \hspace{10pt} 0 \rightarrow 0001101$$ Para os dígitos do lado direito não temos que nos preocupar com paridade, e obtemos, diretamente da tabela a codificação: $$2 \rightarrow 1101100 \hspace{10pt} 6 \rightarrow 1010000 \hspace{10pt} 6 \rightarrow 101000$$ $$2 \rightarrow 1101100 \hspace{10pt} 4 \rightarrow 1011100 \hspace{10pt} 1 \rightarrow 1100110$$ Juntando todas essas informações, e traduzindo essas sequência para o código de barras, obtemos:

Identificando erros

Vimos que os primeiros dois ou três dígitos do código (dependendo do caso) servem para identificar o país de origem, os cinco ou quatro dígitos que restam, até as barras centrais, identificam o fabricante, e os primeiros cinco dígitos do lado direito identificam o produto específico do fabricante.

Mas e o último digito? Qual será sua função? O último dígito é chamado dígito de verificação, e é adicionado no final do processo de elaboração do código para que a máquina possa reconhecer o erro de digitação de um operador apressado.

Antes de entender como o computador usa o o dígito de verificação para identificar estes erros, vamos entender como esses ditos são atribuídos aos produtos, e isso é pura matemática!

Vamos considerar que um produto está registrado sob o sistema EAN-13 por uma sequência qualquer de dígitos \(a_1 a_2 \cdots a_{13}\). Vamos chamar o último dígito de \(x\) e escrever nossa sequência como um vetor: \(\vec{v} = (a_1, a_2, \cdots, a_{12}, x)\). O sistema EAN-13 utiliza um vetor fixo (não se altera) chamado vetor de pesos, dado por \(\vec{w} = (1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1)\).

Para obter o dígito verificador, é realizado o produto escalar entre esses dois vetores:

$$\vec{v} \cdot \vec{w} = (a_1, a_2, \cdots, a_{12}, x) (1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1) = a_1 + 3a_2 + a_3 + 3a_4 + a_5 + 3a_6 + a_7 + 3a_8 + a_9 + 3a_{10} + a_{11} + 3a_{12} + x$$

Com isso, escolhemos \(x\) de forma que a soma anterior seja múltiplo de 10, isto é, tal que:

$$\vec{v} \cdot \vec{w} = 0 \hspace{6pt} mod \hspace{3pt} 10$$

Novamente, vamos utilizar um exemplo para entender melhor. Supondo que a sequência de um código de barras, sem o digito de verificação é dada por \(789500026624\). Vamos identificar o digito verificador \(x\) realizando o produto escalar do vetor formado por estes números, com o vetor peso:

$$7 + (3 \times 8) + 9 + (3 \times 5) + 0 + (3 \times 0) + 0 + (3 \times 2) + 6 + (3 \times 6) + 2 + (3 \times 4) + x = 99 + x$$

Como o  número resultante deve ser múltiplo de 10, notamos que \(x = 1\).

Agora, para ilustrar a identificação do erro, suponha que um autor tem um livro inscrito sob o código de barras \(9781402002380\) e que um operador de caixa por engano tenha digitado o código \(9782402002380\) (trocando o quarto dígito). Assim que o computador recebe esta sequência, ele realiza a conta

$$9 + (3 \times 7) + 8 + (3 \times 2) + 4 + 0 + 2 + 0 + 0 + (3 \times 2) + 3 + (3 \times 8) + 0 = 73$$

e, notando que o resultado não é um múltiplo de 10, logo alerta o atendente do erro cometido.

O mesmo que explicamos para o sistema EAN-13 vale para o sistema UPC, com a diferença de que o vetor peso é dado com um dígito a menos: \(\vec{w} = (3,1,3,1,3,1,3,1,3,1,3,1)\).

Eai, ficou ainda mais curioso sobre os códigos de barras ou já deu pra entender o suficiente? Que tal tentar analisar o código de algum produto aí da sua casa?

Fontes

MILIES, C. P. A matemática dos códigos de barras. 2006. IME – USP.

MILIES, C. P. A matemática dos códigos de barras. RPM 65. Disponível em: <http://www.rpm.org.br/cdrpm/65/9.html>. Acesso em: abr 2020.

MILIES, C. P. A matemática dos códigos de barras – Detectando erros. RPM 68. Disponível em: <http://www.rpm.org.br/cdrpm/68/12.html>. Acesso em: abr 2020.