Luiz Fernando Nunes
Universidade Tecnológica Federal do Paraná - UTFPR



O ano era 1987 e eu cursava licenciatura em Matemática na Fundação Educacional da Região de Joinvile – FURJ, quando um jovem professor de álgebra apresentou-nos o seguinte desafio:

Calcular a potência 21000, com todos os algarismos, sem fazer aproximações ou uso de potências de 10. Logo de início percebemos que o número era gigantesco e o verdadeiro objetivo do professor não era o resultado em si, mas testar a criatividade dos alunos na tentativa de encontrar a solução.

Alguns colegas se aventuraram usando a força bruta, tentando calcular manualmente a referida potência, utilizando enormes cartolinas e se revezando na realização dos cálculos.

Vale lembrar que naquela época os computadores pessoais não eram comuns e as máquinas de calcular normalmente apresentavam no máximo 8 ou 10 dígitos.

Para ter uma ideia da dificuldade do problema, abra seu computador e peça, por exemplo, à calculadora científica do Windows para calcular 21000. Você obterá
1,071508607186086267320948425504906e+301, que é a notação científica para 1,07...06 × 10301, ou seja, 10715...0600...000, com 271 zeros no final. Ora, é claro que o inteiro 21000 não termina em 271 zeros (aliás, nem em um). Portanto, essa resposta da calculadora é uma aproximação grosseira. Ela só conta corretamente que 21000 tem 302 algarismos, dos quais exibe só os 30 primeiros. Queremos todos os 302 algarismos.

Pensei durante algum tempo, mas não encontrei um caminho. Foi então que pedi ajuda para o amigo Figueiredo, que estava mais adiantado no curso e costumava ter boas ideias para resolver problemas. Além disso, ele possuía uma máquina de calcular programável que aceitava códigos na linguagem BASIC, mas que também tinha uma capacidade limitada de dígitos.

Ele pensou um pouco e teve a ideia colocada na forma do algoritmo que segue para obter a potência:

Passo 1: Construir um vetor com uma quantidade suficiente de coordenadas.

Passo 2: Atribuir valor 1 para a primeira coordenada e o valor 0 para as demais.

Passo 3: Multiplicar as coordenadas do vetor por 2.

Passo 4: Percorrer cada coordenada do vetor, verificando se o número constante nela excede 8 algarismos. Se positivo, eliminar o primeiro algarismo do número que excedeu esse limite (e nesse caso será necessariamente 1) e somá-lo na coordenada seguinte.

Passo 5: Retornar ao passo 3 até que tenham sido efetuadas 1000 multiplicações por 2.

Passo 6: Reescrever o vetor resultante, invertendo a ordem das coordenadas, isto é, a primeira coordenada será a última, a segunda será a penúltima e assim sucessivamente, mantendo a ordem dos algarismos em cada coordenada. O número resultante, colocando essas coordenadas lado a lado, é a potência procurada.

No Apêndice, apresentamos o algoritmo implementado em MATLAB (que não existia, na época).

Para que o leitor tenha uma ideia mais clara de como funciona o algoritmo, vamos supor, apenas para efeito didático, que se tenha uma calculadora que só exibe dois algarismos, e nela queiramos calcular 214.

Observe as tabelas a seguir, onde as coordenadasV1, V2 e V3 do vetor V estão em verde:

n 1 2 3 4 5 6 7
V1 2 4 8 16 32 64 28
V2 0 0 0 0 0 0 1
V3 0 0 0 0 0 0 0
2n 2 4 8 16 32 64 128

n 8 9 10 11 12 13 14
V1 56 12 24 48 96 92 84
V2 2 5 10 20 40 81 63
V3 0 0 0 0 0 0 1
2n 256 512 1024 2048 4096 8192 16384

A primeira linha das tabelas é o expoente, que avança de 1 a 14, enquanto a última linha reflete o Passo 6 (último) do algoritmo.

As três linhas intermediárias contêm o vetor V, com suas componentes V1, V2 e V3. No início, só precisamos da primeira coordenada do vetor. As outras, fazemos igual a 0.

Quando o expoente passa de 6 para 7, a potência 27=128 tem 3 algarismos e, portanto, ultrapassa a capacidade de exibição da calculadora. Coloca-se então em V1 apenas o final 28, enquanto o 1 passa para V2, que abrimos nesse instante. Na verdade, apenas foi utilizada a velha ideia do “...vai um”. Aqui, o 1 está representando 100 = 102, sendo o expoente 2 a capacidade máxima de exibição da calculadora.

Para os expoentes seguintes, seguimos multiplicando todas as coordenadas do vetor por 2.

Quando se passa do expoente 8 para o expoente 9, multiplicando as coordenadas por 2, o vetor deveria ser:

n 8 9
V1 56 112
V2 2 4

Mas como 112 tem 3 algarismos, devemos passar o 1 inicial para a segunda coordenada (“vai um”, de novo!), que ficará 4 + 1 = 5, obtendo então:

n 8 9
V1 56 12
V2 2 5

Fenômeno análogo ocorre quando n passa de 12 para 13 (confira!).

De 13 para 14, o resultado de multiplicar cada coordenada por 2 deveria ser:

n 13 14
V1 92 184
V2 81 162

Mas 184 não pode ser exibido pela calculadora. Então, retemos 84 e vai um para V2, ficando:

n 13 14
V1 92 84
V2 81 163

Mas isso ainda não é suficiente, pois 163 tem 3 algarismos. Então, introduz-se a terceira coordenada do vetor V e, usando de novo o “vai um”, fica:

n 13 14
V1 92 84
V2 81 63
V3   1

Aqui, o 1 está representando 100 = 102.

A ideia desse algoritmo é simples, mas muito criativa, tendo permitido a resolução do problema com os recursos que estavam disponíveis na época. E ainda hoje é útil, porque não existe calculadora ou computador que exiba 302 algarismos. Esse exemplo mostra que muitas vezes mais vale uma boa ideia (um bom algoritmo) do que uma máquina poderosa sem que se saiba utilizá-la.

O resultado encontrado, ao final das 1000 etapas, foi o seguinte número com 302 algarismos:

21000 = 10715086071862673209484250490600018
10561404811705533607443750388370351051124

93612249319837881569585812759467291755314
68251871452856923140435984577574698574803
93456777482423098542107460506237114187795
41821530464749835819412673987675591655439
46077062914571196477686542167660429831652
624386837205668069376

Felizmente o professor não pediu para escrevermos o resultado por extenso!

A propósito, os colegas que tentaram efetuar os cálculos manualmente não conseguiram encontrar a resposta.

Tantos anos se passaram, mas me lembro como se fosse hoje o interesse dos alunos e do contentamento do professor quando mostramos a solução. Assim, acredito que a apresentação em sala de aula de problemas desafiadores e curiosos, preferencialmente dentro do contexto da aula, pode levar alguns estudantes a perceber a beleza das boas ideias, a enxergar a Matemática com outros olhos e, quem sabe, a admirá-la como quem aprecia uma bela obra de arte.

 

Comentário

Vale a pena também lembrar que os computadores trabalham com o sistema binário e que, nesse sistema, multiplicar por dois (ou somar um número com ele mesmo) nada mais é do que acrescentar um zero no final da cadeia binária (por exemplo, 2×1101=11010). Assim, a resposta mais simples para o referido problema seria simplesmente escrever o numeral 1, seguido de mil zeros, pois o professor não havia especificado a base do sistema de numeração (... na época ninguém pensou nisso!).

 

Apêndice

Transcrição do algoritmo em um código do MATLAB:
%
clear
A(1)=1;
A(2:40)=0;
for i=1:1000
    A=A.*2;
    for j=1:40
      int=fix(A(j)/100000000);
      if int==1
        A(j+1)=A(j+1)+1;
        A(j)=A(j)-100000000;
      end
    end
end
RESULTADO=fliplr(A)
%