next up previous contents
Seguinte: Matrizes e afins Acima: Alguns códigos lineares com Anterior: Aquecendo os motores   Conteúdo

Um pouco de aritmética (a tabuada revisitada)

Assuma que se pretende testar o código ISBN de um livro recebido. Antes de mais, o código ISBN-10 (investigue o que se passa com o ISBN-13) é uma sequência de 10 símbolos $ x_1x_2\dots x_9 x_{10}$ onde $ x_i=0..9$ , se $ i=1..9$ , e $ x_{10}\in \left\{0..9\right\}\cup\left\{X\right\}$ . É indiferente a colocação dos hífenes: estes servem apenas para separar a codificação de certo tipo de informação - país ou língua de edição, número da editora, número do livro. O símbolo $ x_{10} $ é de facto o responsável pela detecção de erros - o símbolo de verificação. Tomando $ X=10$ no que se segue, estes têm que satisfazer

$\displaystyle \sum_{i=1}^{10} (11-i)x_i \equiv 0 \mod 11.$

Ou doutra forma, $ (x_1,x_2,\dots,x_{10})\cdot (10,9,8,7,6,5,4,3,2,1) \equiv 0 \mod 11$ .

Por exemplo, e para simplificar, assuma recebido o suposto código 989-616072-4 (de que livro? pelo menos a língua deve tentar saber; http://www.isbn-international.org/en/identifiers/allidentifiers.html), dado como uma tabela:
» cod:=table(1=9,2=8,3=9,4=6,5=1,6=6,7=0,8=7,9=2,10=4)
Faça ?table para entender a sintaxe. Se preferir, pode usar o comando array:
» cod:=array(1..10,[9,8,9,6,1,6,0,7,2,4]);
Podemos definir $ {\mathbb{Z}}_{11}$ como
» Z11:=Dom::IntegerMod(11);
Falta-nos agora verificar se o somatório é multiplo de 11, ou seja, se $ \sum_{i=1}^{10} ix_i\equiv 0 \mod 11$ . Antes é preciso calcular a soma:
» sum((11-i)*cod[i],i=1..10)
Repare que cod[i] indica o elemento i da tabela cod. Falta agora estudar a congruência $ \mod 11$
» sum((11-i)*cod[i],i=1..10) mod 11
ou
» Z11(sum((11-i)*cod[i],i=1..10))

Se não tivéssemos à disposição o comando sum ou um similar, então ter-se-ia optado, por exemplo, por um ciclo for. Veja a sintaxe com ?for.
» soma:=0:
» for i from 1 downto 10 do
soma:=soma+(11-i)*cod[i]
end_for:
» print(Z11(soma));

As mudanças de linha são feitas por shift+return, se estiver a usar o x-mupad em linux, ou o mupad no Windows.

É escusado referir a importância que ciclos como
for i from inicio to fim <step tamanhodosalto> do .. end_for
repeat .. until condição end_repeat
while condição do .. end_while

ou instruções de decisão como
if condição
 then ..
<elif condição then ..>
<elif condição then ..>
<...>
<else ..>
end_if

têm importância quase vital na construção de códigos.


next up previous contents
Seguinte: Matrizes e afins Acima: Alguns códigos lineares com Anterior: Aquecendo os motores   Conteúdo
2006-12-21