Fundamentos By Henrique Cruz / Share 0 Tweet A computação é a ciência do nosso século, dominando completamente não só todas as atividades cotidianas, mas marcando até o que somos em nossas identidades numéricas. Vivemos rodeados de números e os algoritmos dos programas computacionais condicionam a nossa maneira de viver. O autor aborda os princípios que norteiam as programações dos computadores analógicos e analisa em detalhe o sistema binário da sua linguagem. O tão conhecido código de barras é apresentado na sua composição e no modo como é lido pela leitora óptica. Há 2.500 anos os Pitagóricos tinham como lema “tudo são números”, mas para os não iniciados nos mistérios numéricos, isso devia parecer uma ousadia. Hoje é uma realidade. Todas as nossas atividades são regidas por números. Não lidamos mais com dinheiro mas com cartões de crédito. Códigos compostos por algarismos ou alfanuméricos, onde se combinam letras do alfabeto com algarismos, são lidos, em códigos de barras, por dispositivos constituídos por leitoras ópticas. Senhas e contra-senhas protegem os nossos valores. Compras em lojas, supermercados e pela internet são efetuadas por intermédio de programas de computadores. Entre nós e o mundo existem as máquinas que operam os algoritmos dos nossos desejos. Esta profunda revolução do nosso modo de viver foi provocada pelo computador, máquina capaz de realizar o tratamento automático da informação. Vejamos como opera um computador analógico, quer dizer, um computador que trata as informações desde que sejam representadas por sinais analógicos. Sinal analógico é um sinal cujas variações são contínuas. A função de um computador é ordenar, classificar, calcular, testar, pesquisar e editar informações que tenham sido previamente codificadas segundo uma representação binária. Um computador analógico funciona à base de impulsos decorrentes de diferenças de potencial elétrico, todos rigorosamente iguais em tempos de duração. Para abordar este modelo de computação, recorro a Roger Penrose, Professor de Matemática da Universidade de Oxford, no seu livro Shadows of the Mind, Oxford University Press, Inc., Ed. 1994: “Diz-se que um processo computacional é uma organização ‘top-down’ se for construído de acordo com algum processo computacional fixo, bem definido e claramente compreendido … O oposto é a organização ‘bottom-up’, cujas regras de operação e conhecimento não são previamente especificadas. Em vez disso, existe um procedimento pelo qual o sistema ‘aprende’ e expande a sua performance de acordo com a sua ‘experiência’”. A diferença fundamental entre os dois processos é que o “top-down” trata da informação, ao passo que o “bottom-up” destina-se a explorar o conhecimento. Vamos tratar apenas do primeiro. Segundo Penrose, um exemplo simples do modelo “top-down” é o hoje conhecido pelo nome “algoritmo de Euclides”, destinado a se obter o máximo divisor comum, (mdc), de dois números inteiros. A expressão algébrica da divisão de dois números diz-nos que: o dividendo (D) é igual ao divisor (d) vezes o quociente (q) mais o resto (r), D=d.q+r. Se o resto for zero, a divisão é perfeita, isto é, o dividendo é igual a um múltiplo do divisor. Ou seja, o divisor divide o dividendo em partes iguais, tantas quantas as indicadas pelo quociente. Agora, se o resto não for zero, isso não quer dizer que não possa existir um divisor comum menor que o inicial. Obter esse máximo divisor comum, quando existe, é o método do algoritmo de Euclides. Suponhamos dois números 3654 e 1365. Dividindo um pelo outro dá o resto 924. A regra agora é dividir sempre o divisor anterior pelo seu resto até se obter o resto zero. Quando isso acontecer, o último divisor é o máximo divisor comum dos dois números dados. Vejamos. 1365 dividido por 924 dá resto 441; 924 dividido por 441 dá resto 42; 441 dividido por 42 dá resto 21; 42 dividido por 21 dá resto 0. Portanto, o mdc é 21. De fato, dividindo os números dados 3654 e 1365, cada um por 21, temos a fração inicial reduzida à sua expressão mais simples, 174 a dividir por 65, que lhe é equivalente. Quais os motivos que levaram Penrose a citar o algoritmo de Euclides como uma programação “top-down”? É claro que este tipo de programação só lida com algoritmos, o que inclui o de Euclides. Mas não é só por isso. É que o algoritmo de Euclides é um processo de divisão seqüencial do dividendo, em partes iguais, dando, na última divisão, o resto 0 ou um número inteiro. O mesmo acontece na programação “top-down” do computador, ao se substituírem os números do sistema decimal pelos números 0 e 1 do sistema binário. A substituição corresponde à divisão do número decimal, em partes iguais, até se obterem os restos de 0 ou 1. Os números binários usados em programas de computador, são números expressos em algarismos de um sistema de base 2, em que se utilizam apenas dois valores, o 0 e o 1. Para se converter um número decimal na sua forma binária, precisa-se realizar uma seqüência de divisões, todas por 2. Inicialmente divide-se o número decimal dado por 2 e nas etapas posteriores, cada quociente obtido, continua sendo dividido por 2 até se obter o quociente 0. Vamos a um exemplo. Seja o número decimal 237. Temos então: 237 dividido por 2 dá 118 e resto 1; 118/2=59, resto 0; 59/2=29, resto 1; 29/2=14, resto 1; 14/2=7, resto 0; 7/2=3, resto 1, 3/2=1, resto 1; 1/2=0, resto 1. Ao número decimal 237 corresponde portanto o número binário 11101101, que são os restos obtidos escritos da direita para a esquerda. Como sabemos, um número decimal tem sempre uma representação algébrica em potências de 10. Assim, 237 é igual a 2×102+3×10+7. Do mesmo modo, o número binário correspondente tem sempre uma representação em potências de 2. Vejamos como se apresenta em potências de 2 o número binário correspondente a 237. Vamos considerar primeiro os números binários equivalentes aos números naturais 0,1,2,3,4, … . Procedemos da mesma forma, dividindo sucessivamente por 2. Dígito 0 temos o binário 0; dígito 1 binário1;2-10;3-11;4-100;5-101;6-110;7-111;8-1000;9-1001;10-1010;11-1011;12-1100,etc. Reparem que aos números decimais pares correspondem números binários começando com 0 e aos números decimais ímpares, números binários começando com 1. Notem também que para 2 decimal temos 10 binário; 4-100;8-1000;16-10000;etc. em que os números decimais são potências de 2: 22, 23,24;etc. Vamos então obter do número decimal 237 as correspondentes potências de 2. Comecemos pelo 7 que é ímpar, portanto o número binário começa com 1. Façamos agora a seqüência das potências de 2 no sentido inverso, da direita para a esquerda. Para se obter o número binário 11101101 temos de somar os números binários, alinhados da direita para a esquerda, das seguintes potências de 2: 27+26+25+23+22+1. Quer dizer, temos de somar, alinhados da direita para a esquerda, os seguintes números binários: 1+100+1000+100000+1000000+10000000 para se obter, como resultado da soma, o número binário desejado 11101101. Atenção, não confundam. Quando se diz, por exemplo, que 23 é igual a 8 e corresponde ao número 1000, 23 e 8 são números decimais, ao passo que 1000 é um número binário, que deve ser lido da direita para a esquerda, em algarismos separados, ou seja, deve ser lido 0, 0, 0, 1. Este exemplo de potências de 10 e potências de 2, serve para mostrar que lidamos com logaritmos. Devem estar lembrados que logaritmo de um número, é o expoente a que temos que elevar a base para reproduzir esse número. Logo os expoentes das potências da base 10 e os expoentes das potências da base 2, representam os números decimais, (base 10), e os números binários, (base 2), equivalentes. É a razão de ambos serem séries de logaritmos que faz com que sejam equivalentes. Voltemos ao código de barras. Ele é constituído por faixas verticais paralelas pretas, separadas, uma a uma, por faixas brancas. As faixas pretas representam a unidade binária 1 e as faixas brancas a unidade binária 0. Ambas têm larguras variáveis conforme o número binário que representam. A leitora óptica emite um feixe de luz que se reflete no papel das faixas brancas, ao passo que nas faixas pretas do código de barras nada se reflete. Além disso, a leitora tem um medidor de impulsos elétricos todos da mesma duração. Ao receber o feixe de luz de volta ao aparelho, o chip da máquina decodifica a leitura, pelo número de impulsos contados por cada intervalo, brancos e pretos. Assim, a leitora “lê” o código e emite a correspondente mensagem por escrito gravada na memória da programação. O feixe de luz é colorido ao passar por um rubi sintético, para se tornar visível para quem maneja a leitora. Assim opera a leitora óptica, lendo o código de barras e acionando os algoritmos correspondentes da programação analógica. Fico por aqui. Até à próxima.