Nerdisse - Saiba seu número de gödel
Atualmente estou fazendo a disciplina de Teoria da Computação e tínhamos como trabalho prático a implementação de simuladores de algumas máquinas universais (Turing e suas variações, Norma, Post, Wang Post, etc). Cada grupo teria que implementar um, em python, seguindo algumas regras impostas pelo professor. Meu grupo ficou responsável por fazer um simulador de máquinas de turing com múltiplos movimentos e resolvemos, para ganhar mais que 80% da nota (isso mesmo, quem faz tudo o que foi pedido, ganha 8 em 10. Para ganhar 10 é preciso ir além), fazer também um simulador para máquina de wang post.
Para a construção do segundo simulador, um amigo, que dias antes havia provado a equivalência entre a máquina de turing e wang post como trabalho opcional, me explicou como o número de gödel era usado na prova para expressar únicamente um programa na máquina de wang. Bom, já haviamos estudado como calcular o número de gödel durante as aulas, mas eu ainda não tinha parado para pensar no que mais ele poderia ser usado.
Quando ele me mostrou como um programa era convertido em um número natural que era único para ele, pensei: “Que bacana! Que tal calcularmos o número de gödel do nosso nome?! Seria a tradução de um nome em um número natural que o representa, de forma unívoca”(Pensei xique assim? hehe claro que não).
Logo nos veio a mente a tabela ASCII, que associa um número natural a um caractere. Era o suficiente para começarmos a nerdisse hehe :D
Para vocês entenderem melhor o que queríamos fazer, segue um exemplo:
enc("abc") = (2^97) * (3^98) * (5^99) = Número de Gödel
Sendo que o natural correspondente ao caracter “a” na tabela ASCII é 97, o do “b” é 98 e o do “c” é 99.
A função enc(x) gera o número de gödel.
Ou seja: ![]()
Esse número de gödel é único para “abc”. Qualquer outra sequência da caracteres não irá gerar o mesmo número! Conseguem ver a importância desse número?!
Infelizmente o custo computacional para encontrá-lo é alto e algumas aplicações que seriam interessantes, como compactação de arquivos por exemplo, tornam-se inviáveis.
De qualquer forma, fizemos um programa em python (e anexamos ao nosso trabalho! haha. O professor deu risadas :P) que calcula o número de gödel do seu nome:
# This Python file uses the following encoding: utf-8
class YourGodelNumber:
def __init__(self, yourName):
self.yourName = yourName
self.prime = 1L
def calcula(self):
godelNumber = 1
for c in self.yourName:
self.prime = self.nextPrime(self.prime)
godelNumber *= pow(self.prime, ord(c))
print "(",self.prime,"^",ord(c),")","*",
print "\n"
return godelNumber
def isPrime(self, n):
"""Método para verificar se um número n é primo."""
for x in range(2,n-1):
if n % x == 0:
return False
return True
def nextPrime(self, n):
"""Método para retornar o primeiro primo após n"""
n += 1
while not(self.isPrime(n)):
n += 1
return n
name = raw_input('Entre com seu nome:\n>>>')
print 'O número de godel de seu nome é:\n'
godel = YourGodelNumber(name)
print godel.calcula()
Observações sobre o código:
- o método ord(c) retorna o número correspondente ao caracter passado via parâmetro na tabela ASCII :)
- O ” ” (espaço) é considerado. O número dele na tabela ascii é 32
Gostaria de finalizar dizendo como fiquei impressionado com a facilidade que o python tem em lidar com números grandes!! Veja só:
Digitando meu nome: “Renan Martins” , o python calcula o seguinte número instantaneamente
( 2 ^ 82 ) * ( 3 ^ 101 ) * ( 5 ^ 110 ) * ( 7 ^ 97 ) * ( 11 ^ 110 ) * ( 13 ^ 32 ) * ( 17 ^ 77 ) * ( 19 ^ 97 ) * ( 23 ^ 114 ) * ( 29 ^ 116 ) * ( 31 ^ 105 ) * ( 37 ^ 110 ) * ( 41 ^ 115 ) =
OBS: Foi omitido o resultado (número de gödel) por motivos óbvios.
Aí vocês podem dizer: “Que nominho pequeno hein Renan?” hehehe
Para tirar a dúvida, então, que tal calcularmos o número de gödel do imperador Dom Pedro II ? Para os mais intimos:
Pedro de Alcântara João Carlos Leopoldo Salvador Bibiano Francisco Xavier de Paula Leocádio Miguel Gabriel Rafael Gonzaga de Bragança e Habsburgo
Veja só! O python calcula esse número muito rapidamente: (Acho que a execução não passa de 2 segundos xD)
( 2 ^ 80 ) * ( 3 ^ 101 ) * ( 5 ^ 100 ) * ( 7 ^ 114 ) * ( 11 ^ 111 ) * ( 13 ^ 32 ) * ( 17 ^ 100 ) * ( 19 ^ 101 ) * ( 23 ^ 32 ) * ( 29 ^ 65 ) * ( 31 ^ 108 ) * ( 37 ^ 99 ) * ( 41 ^ 195 ) * ( 43 ^ 162 ) * ( 47 ^ 110 ) * ( 53 ^ 116 ) * ( 59 ^ 97 ) * ( 61 ^ 114 ) * ( 67 ^ 97 ) * ( 71 ^ 32 ) * ( 73 ^ 74 ) * ( 79 ^ 111 ) * ( 83 ^ 195 ) * ( 89 ^ 163 ) * ( 97 ^ 111 ) * ( 101 ^ 32 ) * ( 103 ^ 67 ) * ( 107 ^ 97 ) * ( 109 ^ 114 ) * ( 113 ^ 108 ) * ( 127 ^ 111 ) * ( 131 ^ 115 ) * ( 137 ^ 32 ) * ( 139 ^ 76 ) * ( 149 ^ 101 ) * ( 151 ^ 111 ) * ( 157 ^ 112 ) * ( 163 ^ 111 ) * ( 167 ^ 108 ) * ( 173 ^ 100 ) * ( 179 ^ 111 ) * ( 181 ^ 32 ) * ( 191 ^ 83 ) * ( 193 ^ 97 ) * ( 197 ^ 108 ) * ( 199 ^ 118 ) * ( 211 ^ 97 ) * ( 223 ^ 100 ) * ( 227 ^ 111 ) * ( 229 ^ 114 ) * ( 233 ^ 32 ) * ( 239 ^ 66 ) * ( 241 ^ 105 ) * ( 251 ^ 98 ) * ( 257 ^ 105 ) * ( 263 ^ 97 ) * ( 269 ^ 110 ) * ( 271 ^ 111 ) * ( 277 ^ 32 ) * ( 281 ^ 70 ) * ( 283 ^ 114 ) * ( 293 ^ 97 ) * ( 307 ^ 110 ) * ( 311 ^ 99 ) * ( 313 ^ 105 ) * ( 317 ^ 115 ) * ( 331 ^ 99 ) * ( 337 ^ 111 ) * ( 347 ^ 32 ) * ( 349 ^ 88 ) * ( 353 ^ 97 ) * ( 359 ^ 118 ) * ( 367 ^ 105 ) * ( 373 ^ 101 ) * ( 379 ^ 114 ) * ( 383 ^ 32 ) * ( 389 ^ 100 ) * ( 397 ^ 101 ) * ( 401 ^ 32 ) * ( 409 ^ 80 ) * ( 419 ^ 97 ) * ( 421 ^ 117 ) * ( 431 ^ 108 ) * ( 433 ^ 97 ) * ( 439 ^ 32 ) * ( 443 ^ 76 ) * ( 449 ^ 101 ) * ( 457 ^ 111 ) * ( 461 ^ 99 ) * ( 463 ^ 195 ) * ( 467 ^ 161 ) * ( 479 ^ 100 ) * ( 487 ^ 105 ) * ( 491 ^ 111 ) * ( 499 ^ 32 ) * ( 503 ^ 77 ) * ( 509 ^ 105 ) * ( 521 ^ 103 ) * ( 523 ^ 117 ) * ( 541 ^ 101 ) * ( 547 ^ 108 ) * ( 557 ^ 32 ) * ( 563 ^ 71 ) * ( 569 ^ 97 ) * ( 571 ^ 98 ) * ( 577 ^ 114 ) * ( 587 ^ 105 ) * ( 593 ^ 101 ) * ( 599 ^ 108 ) * ( 601 ^ 32 ) * ( 607 ^ 82 ) * ( 613 ^ 97 ) * ( 617 ^ 102 ) * ( 619 ^ 97 ) * ( 631 ^ 101 ) * ( 641 ^ 108 ) * ( 643 ^ 32 ) * ( 647 ^ 71 ) * ( 653 ^ 111 ) * ( 659 ^ 110 ) * ( 661 ^ 122 ) * ( 673 ^ 97 ) * ( 677 ^ 103 ) * ( 683 ^ 97 ) * ( 691 ^ 32 ) * ( 701 ^ 100 ) * ( 709 ^ 101 ) * ( 719 ^ 32 ) * ( 727 ^ 66 ) * ( 733 ^ 114 ) * ( 739 ^ 97 ) * ( 743 ^ 103 ) * ( 751 ^ 97 ) * ( 757 ^ 110 ) * ( 761 ^ 195 ) * ( 769 ^ 167 ) * ( 773 ^ 97 ) * ( 787 ^ 32 ) * ( 797 ^ 101 ) * ( 809 ^ 32 ) * ( 811 ^ 72 ) * ( 821 ^ 97 ) * ( 823 ^ 98 ) * ( 827 ^ 115 ) * ( 829 ^ 98 ) * ( 839 ^ 117 ) * ( 853 ^ 114 ) * ( 857 ^ 103 ) * ( 859 ^ 111 ) =
Muito legal, não é ?
Esse post foi para comemorar o dia do orgulho nerd, um dia depois.
“Pq as pessoas pensam que são nerds só pq passam horas no twitter, orkut, etc e assistem à seriados? Isso não é ser nerd! #prontofalei ” via @loiane
Concordo com a Loiane :D
Que tal agora calcular o seu número de gödel? Faça o download do programa: yourgodelnumber.py
Até a próxima!
É com grande entusiasmo que reabro meu blog em um servidor novinho, bem melhor do que o antigo, gratuito, em que eu esperava 10 segundos entre uma requisição e outra na área administrativa do wordpress.