The Doomsday (O Algoritmo)

Na sequência do meu artigo no final do mês de Dezembro, gostaria de partilhar convosco uma das técnicas de cálculo mental que mais consegue impressionar, como os juristas dizem, o homem médio. Não é por coincidência que refiro os juristas; de facto, tomei conhecimento desta técnica por um professor de Direito do ensino superior. Este professor, quando os alunos lhe entregavam o documento de identificação, deduzia sempre o dia da semana em que esse aluno teria nascido. Talvez não sirva para impressionar uma pessoa do ponto de vista afetivo (if you know what I mean), mas intelectualmente penso que esta técnica consegue ter grande impacto. Todos os alunos que conheci desse professor diziam-me que ele era uma pessoa genial, simplesmente por utilizar uma técnica de cálculo mental (não estou a dizer que o Sr. Doutor não era genial, dado que de tal não tenho conhecimento).

Se tiverem dado uma vista de olhos nas provas do campeonato mundial de cálculo mental, vão verificar que, desde a sua primeira edição, este conta com uma prova de cálculo de calendário. Na realidade, o algoritmo para este cálculo, o doomsday algorithm (a tradução não faz sentido, daí irei referir sempre o nome do algoritmo em inglês), foi publicado em 1982 por John Horton Conway. É um algoritmo muito simples de aplicar, no entanto envolve alguma memorização. Para esta memorização são propostas várias mnemónicas (claro, todas em inglês), no entanto, pessoalmente, não gosto muito deste tipo de técnicas de memorização, pelo que as omitirei do respectivo algoritmo. Assim, segue-se a explicação do algoritmo que permite calcular que dia da semana foi qualquer data que seja apresentada.

Doomsday é definido como o último dia de Fevereiro, 28 ou 29, dependendo se o ano é bissexto ou não. A forma mais simples de determinar se um ano é bissexto é dividir o ano por 4. Se essa divisão der resto 0, então o ano é bissexto. No entanto, devo fazer a ressalva de que se o ano for divisível por 100 (1900 é um exemplo), este ano será bissexto se for divisível por 400 (por exemplo, o ano 1900 é divisível por 4, por 100 mas não por 400, pelo que não é um ano bissexto, como pode ser verificado).

Voltando ao nosso algoritmo, então o Doomsday deste ano é sexta-feira. Então, sabe-se que:
Para os meses pares: 4/4, 6/6, 8/8, 10/10 e 12/12 também serão sextas-feiras (peço que verifiquem, pelo menos para uma das datas); Para os meses ímpares: 0/3, 5/9, 9/5, 7/11 e 11/7 também serão sextas-feiras (claro que a data 0/3 não existe, mas estas datas servem apenas como pontos de referência). Em relação ao mês de Janeiro, num ano bissexto será 4/1 enquanto que num ano "normal" será 3/1. Esta parte, claramente, obriga-nos a memorizar estes pontos de referência, mas depois de aplicar o algoritmo uma dúzia de vezes, simplesmente passa a ser natural sabermos os doomsdays em cada mês.

Com estes dados, podemos deduzir, por exemplo, que dia da semana será o dia de Natal: 25/12. Ora 25-12=13, e 13 mod 7= (-1) mod 7, logo o natal será um dia antes de um doomsday de Dezembro, logo uma quinta-feira. Par os menos familiarizados com o conceito de mod, este apenas se refere ao resto da divisão de um número por sete, podem ver mais em textos de Álgebra, por exemplo http://faculty.atu.edu/mfinan/4033/absalg10.pdf.

Então conseguimos saber que dia da semana é cada dia de um ano, quando soubermos qual é o doomsday desse ano. O passo final será prolongar este algoritmo a qualquer ano. Para isso temos de saber qual é o doomsday de cada século. Tal será a última coisa que terão de memorizar:

Poderia-me estender sobre o porquê desta tabela, mas acho mais fácil simplesmente decorar. Na verdade, a maioria das pessoas que conhecemos nasceram no século XX, e como este algoritmo tem o particular interesse de determinar o dia em que os nossos amigos nasceram (entre outros...) parece-me simples decorar que o doomsday de 1900 é quarta-feira. A  fórmula para determinar o doomsday de cada outro ano deste século, da forma 19YY, será: a+b+c mod 7, onde a será o quociente da divisão inteira de YY por 12, b será o resto desta divisão e c será o quociente de b a dividir por 4.

Exemplo: Qual é o doomsday de 1974?
a=74/12=6, b=2 e c=2/4=0, logo 6+2+0 mod 7= 1 mod 7, logo o doomsday de 1974 é quinta-feira (um dia depois de quarta-feira). Torna-se mais simples visualizar o processo dividindo à mão. Finalmente, sinto mais facilidade em converter o doomsday para um número e simplesmente calcular o mod da conta toda; por exemplo, se estivesse no século de 1900, o doomsday seria 4 para mim (eu uso a escala de domingo ser o dia 1 e sábado o dia 7, mas claro que qualquer escala serve, desde que se lembrem em que escala estão a trabalhar).

Assim, para a data 25/04/1974: já vimos que 1974=5, e como 4/4 é doomsday, 25-4 mod 7=21 mod 7= 0 mod 7, logo 0 mod 7 + 5 mod 7= 5 mod 7, logo o dia 25 de Abril de 1974 foi uma quinta-feira.
Já a implantação da República Portuguesa, 5/10/1910 poderá ser calculada por:
4+(0+10+2)+(-5) mod 7= 11 mod 7=4 mod 7, logo foi uma quarta-feira (o primeiro 4, vem de quarta-feira ser o doomsday de 1900, (0+10+2) é a soma de a, b e c, respectivamente, e -5= 5-10, onde 5 é a nossa data e 10 é o doomsday de Outubro.

Portanto a fórmula que eu uso para uma data dd/mm/yyyy é: s+(a+b+c)+(dd-t) mod 7, onde a, b e c foram definidos anteriormente, s refere-se ao domsday do século que estamos a tratar e t será o dia do doomsday do respectivo mês. Este cálculo toma a forma de algoritmo se o subdividirmos em pequenos cálculos, como foi apresentado pelo autor do mesmo.

Claro que mentalmente, cada um utilizará diferentes variantes deste algoritmo (com ou sem mods negativos, somando ou não ou não o doomsday, etc.) mas é este o algoritmo base, e sem a fórmula de cálculo dos doomsdays para cada ano não será possível implementar o algoritmo. Pessoalmente, eu imagino sempre a divisão inteira por 12 na minha cabeça, onde depois posso somar o quociente com o resto e com o resto a dividir por 4.

O recorde mundial data de 4 de Dezembro de 2010, pertence a Yusnier Viera Romero e corresponde ao cálculo de 93 datas em 1 minuto. Duvido que alguma vez consiga bater este recorde, mas desde que estudei pela primeira vez este algoritmo estou cada vez a ser mais rápido (conseguindo quase determinar 3 num minuto...). Assim, aconselho a praticarem alguns dias, antes de tentarem impressionar alguém com ele.