Articles

Como é que chegámos aqui? A história dos algoritmos.

Até recentemente, os algoritmos eram um domínio dos cientistas da computação. Mas agora, eles entraram em nossas vidas e estão se tornando difundidos. Algoritmo não é mais uma palavra estrangeira. Negociação algorítmica, viés algorítmico, o algoritmo do Facebook, até mesmo guerra algorítmica – todos estes termos tornaram-se parte do nosso vocabulário nos últimos anos. Algumas pessoas chegam ao ponto de afirmar que vivemos numa nova era: a idade do algoritmo. Mas os algoritmos não são assim tão novos. Usamo-los, conscientemente ou não, há centenas e milhares de anos. Algoritmos são meramente descrições específicas de ações passo a passo que precisam acontecer para alcançar um determinado resultado. Eles são um dos instrumentos mais comuns de compartilhamento de conhecimento.

Praticamente qualquer processo de ensinar alguém a fazer algo usa algoritmos.

Salguns aspectos dos algoritmos mudaram nas últimas décadas, no entanto. Em particular, a introdução dos computadores significa que muitos algoritmos hoje em dia são dramaticamente mais complexos do que alguma vez poderíamos ter imaginado no passado. Como é que os algoritmos evoluíram para serem muito mais sofisticados hoje do que eram no passado? Vamos dar uma breve olhada em sua história.

Algoritmos orientando as ações humanas

Um selo emitido a 6 de Setembro de 1983, na União Soviética, comemorando o (aproximado) 1200º aniversário de al-Khwārizmī; via Wikimedia Commons

O termo algoritmo deriva do nome de Muhammad ibn Mūsā al’Khwārizmī, um matemático persa do século nono. Seu nome latinizado, Algoritmi, significava “o sistema numérico decimal” e foi usado neste sentido durante séculos. A noção moderna de algoritmo surgiu em inglês no século XIX, e tornou-se mais comumente usada desde a década de 1950, desencadeada pelo surgimento dos primeiros computadores comercialmente disponíveis.

Muito antes dos algoritmos terem o seu nome moderno, no entanto, eles eram comumente criados e usados.

Os primeiros algoritmos foram capturados em papel na Grécia Antiga. Estudiosos como Nicomachus de Gerasa ou Euclides estavam então criando os blocos de construção da matemática moderna. Para facilitar a compreensão e aplicabilidade das suas ideias, eles expressaram muitas delas como acções passo-a-passo.

Nicomachus de Gerasa introduziu a Peneira de Eratóstenes. A peneira está acostumada até hoje pelos alunos que aprendem a escrever códigos de computador eficientes. Ele ajudou a simplificar o processo de identificação de números primos. Números primos são números naturais, maiores que um, que não podem ser formados multiplicando dois números naturais menores. Por exemplo, quatro não é um número primo porque pode ser formado pela multiplicação de dois por dois. Cinco, em contraste, é um número primo, porque nenhum número natural, menor que cinco, pode ser multiplicado para formar cinco. Embora não seja muito difícil identificar os primeiros números primos (por exemplo, 2, 3, 5, 7, 11, 13, 17, 19, 23 e 29), encontrar números primos grandes leva muito tempo. E os grandes números primos são essenciais na criptografia. A peneira de Eratóstenes dá instruções passo a passo para remover rapidamente todos os números não-prime de um conjunto definido de números (por exemplo, entre 1 e 10.000) até restarem apenas os números primos. Hoje em dia, existem inúmeros algoritmos disponíveis, que simplificam a tarefa de identificação desses números. A peneira de Eratóstenes iniciou toda uma família de algoritmos que têm o mesmo objetivo e estão se tornando melhores (mais rápidos, ou que requerem menos passos) na detecção de números primos.

Peneira de Eratóstenes pela SKopp na Wikipedia alemã

Euclid, o outro estudioso mencionado acima, muito mais conhecido que Nicomachus nos dias de hoje, introduziu um algoritmo para identificar o maior divisor comum de dois números. Mais uma vez, nem sempre uma tarefa fácil, mas essencial em muitas situações. O algoritmo de Euclid ajudou a tornar este cálculo fácil. Porque é que o algoritmo de Euclid é útil? Imagine que você tem uma sala com o tamanho exato de 612 centímetros até 2006 que precisa de um novo piso. O algoritmo de Euclid ajudará você a encontrar o tamanho dos maiores ladrilhos quadrados que cobririam o piso. A resposta, dada pelo algoritmo, é 34 cm por 34 cm, resultando em um layout de 18 por 59 ladrilhos. Claro que cada ladrilhador lhe dirá que a resposta está errada e que você não tem ideia do que está a fazer porque o algoritmo não considera a largura do reboco e não deixa espaço para isso. Não tenha medo: isto também pode ser calculado, e expresso de forma clara como um algoritmo.

Algoritmos orientando as acções da máquina

Até várias centenas de anos depois, muitos mais algoritmos foram criados e capturados no papel. Eles foram então utilizados por indivíduos e seguidos passo a passo. O primeiro algoritmo destinado a ser executado em uma máquina foi criado por Ada Lovelace (née Byron) e publicado em 1843.

>

Ada Byron, com quatro anos de idade. Em breve, ela se tornará a primeira programadora de computadores do mundo. Por Artista: Alfred, Comte d’Orsay. Imagem digital; Somerville College, Oxford – Somerville College, Oxford, Domínio Público, https://commons.wikimedia.org/w/index.php?curid=44246375

Ada era um personagem intrigante. Ela nasceu em 1815 como a única filha legítima do poeta Lord Byron. Ela desenvolveu grandes talentos em matemática. E como o amor pela poesia estava claramente em seus genes, ela de alguma forma conseguiu desenvolver e equilibrar tanto o amor pela ciência quanto pela poesia. Ada autodescreveu a sua mentalidade como “ciência poética”. Como uma hábil matemática, ela conheceu Charles Babbage, que é muitas vezes chamado “o pai dos computadores”, graças às suas invenções. Ambos desenvolveram uma relação de trabalho e amizade. Ada estava muito interessada em um dos desenhos de Charles – o Motor Analítico.

>

Um diagrama para o Motor Analítico. Por ArnoldReinhold – Trabalho próprio, CC BY 4.0, https://commons.wikimedia.org/w/index.php?curid=69497631

O Motor Analítico era um computador mecânico – uma máquina que automatizava os cálculos. Foi para o Motor Analítico que ela escreveu o primeiro algoritmo. Seu trabalho foi uma fórmula mostrando como configurar o Motor para calcular uma seqüência complexa de números particular, chamada de números Bernoulli. A fórmula é agora amplamente reconhecida como o primeiro algoritmo de computador da história.

Ada não se limitou apenas a cálculos matemáticos puros. Dado que ela viveu no século XIX, ela era uma verdadeira visionária.

Embora muitos de seus contemporâneos estivessem vendo os primeiros computadores mecânicos principalmente como números-crunchers, ela estava perguntando o que está além de fazer cálculos. Ela estava curiosa sobre o potencial mais amplo dos computadores mecânicos como ferramentas colaborativas. Ela esperava ver computadores que capacitassem os humanos muito mais do que apenas através da automatização de cálculos.

O diagrama de Lovelace da “nota G”, o primeiro algoritmo de computador publicado, por Ada Lovelace – http://www.sophiararebooks.com/pictures/3544a.jpg, Domínio Público, https://commons.wikimedia.org/w/index.php?curid=37285970

Felizmente, a construção do Motor Analítico não foi concluída antes da morte de Ada, e por isso ela nunca foi capaz de ver o seu algoritmo em ação. Infelizmente, o Motor Analítico ainda não foi construído até hoje. Outro projeto de Charles Babbage, o Motor Analítico №2, foi construído pelo Museu de Ciência de Londres somente em 1991. Foi demonstrado ser funcional, usando materiais e tecnologias disponíveis para Charles Babbage. Parece que Babbage teve apenas azar quando se tratou de construir seus projetos. Outras implementações parciais do trabalho de Charles existem em outros lugares, mas infelizmente, não podemos executar o algoritmo de Ada Byron em um verdadeiro Motor Analítico.

O século XIX tornou-se uma era de “algoritmos embutidos em máquinas”.

Existiam muitos deles, automatizando todos os tipos de ações humanas. Se você precisava de um padrão intrincado em um pedaço de tecido, Joseph Marie Jacquard, um tecelão e comerciante francês, tinha uma solução para você: o Tear Jacquard. Ele permitia aos fabricantes de tecidos produzir padrões sofisticados usando uma série de cartões perfurados que instruíam um tear a tecer. De forma semelhante, as primeiras centrais telefónicas utilizavam dispositivos mecânicos sofisticados para ligar as chamadas telefónicas. Elas seguiam automaticamente instruções passo a passo para conseguir que duas pessoas falassem uma com a outra. Estas máquinas, sejam teares ou trocas, eram revolucionárias no seu tempo, e ainda hoje são impressionantes até hoje. É difícil não admirar os níveis de complexidade de algumas destas máquinas. No entanto, todos estes dispositivos ainda eram puramente mecânicos. Eram feitos de alavancas, interruptores, veios. Eles faziam muito barulho. E eles estavam muito longe do que chamamos de computadores hoje em dia.

Algoritmos em computadores de uso geral

Só nos anos 30 é que vimos as primeiras menções de algoritmos em computadores eletrônicos (não-mecânicos). Alan Turing esteve entre os primeiros cientistas que capturaram formalmente a forma como os indivíduos faziam os cálculos. O objetivo de Turing era capturar um processo geral, ao invés de um específico para uma tarefa específica, como a identificação de números primos ou o cálculo do maior divisor comum. O processo geral poderia então ser usado para realizar tarefas específicas. O trabalho conceitual de Turing levou ao desenvolvimento do que agora é conhecido como a Máquina de Turing. A Máquina de Turing, por sua vez, levou ao surgimento de computadores de uso geral. O prefixo de propósito geral é essencial aqui. Ao contrário das máquinas anteriores, os novos computadores executariam conjuntos arbitrários de instruções. Eles poderiam ser usados para propósitos que nem mesmo foram previstos pelos seus criadores. Em outras palavras: O trabalho de Turing levou ao desenvolvimento de computadores nos quais podemos instalar e executar aplicações.

No Flappy Bird no seu smartphone sem o conceito de uma máquina Turing.

Décadas mais tarde, os algoritmos tornaram-se extremamente sofisticados. Tão sofisticados, de fato, que muitas vezes achamos impossível explicar como eles funcionam. No século XX, muitos preferiram pensar em algoritmos de computador como caixas pretas. Não era preciso entender exatamente como eles funcionavam. Tudo o que lhe interessava eram as entradas – o que entrava na caixa negra – e as saídas – o que saía. Esta simplificação era uma escolha. No século XXI, para alguns algoritmos, isto já não é uma escolha: os humanos não conseguem explicar exactamente como é que os algoritmos chegam a determinadas saídas, e por isso somos forçados a pensar nestes algoritmos como caixas negras, ou talvez mágicas. Um grupo de tais algoritmos são alguns dos algoritmos de inteligência artificial. Nós podemos explicar os seus princípios. Por exemplo, podemos dizer que um algoritmo usa uma rede neural artificial. Podemos também explicar como a rede foi criada, e como a entrada resultou com uma determinada saída. O que não podemos explicar, no entanto, é porque este resultado em particular foi a saída do algoritmo, para além de uma explicação puramente mecânica. Eric L. Loomis, cujo tempo de encarceramento dependia de um algoritmo, tentou entender porque o algoritmo COMPAS o avaliou como um criminoso de alto risco. Era simplesmente impossível. A sofisticação dos algoritmos é frequentemente avassaladora. E isto é apenas o começo.

Vivemos num mundo onde os algoritmos estão em toda parte – não apenas no papel ou em nossas mentes, mas controlando máquinas, computadores e robôs.

São pequenos, onipresentes e – pelo menos em alguns casos – inexplicáveis.

Uma definição mais formal de um algoritmo é “uma especificação inequívoca de como resolver uma classe de problemas” ou “um conjunto auto-contido de operações passo-a-passo a realizar”

www.oed.com/view/Entry/4959

A partir de Outubro de 2018, o maior número primo conhecido é 277.232.917- 1, um número com 23.249.425 dígitos. Basta verificar se este único número primo é o número primo para seis dias de computação sem parar em um computador doméstico contemporâneo. (https://www.mersenne.org/primes/press/M77232917.html)