Nerdisse - Saiba seu número de gödel

26, maio, 2009

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: godel

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!

Renan nerdisse , , , ,

Post no IBM Academic Initiative - “Produzo software no Brasil, na Rússia, na Índia ou na China?”

6, maio, 2009

Quero indicar a leitura de um post super interessante do José Augusto Fabri no blog brasileiro do programa Academic Initiative da IBM , que praticamente toda semana publica post de qualidade. Realmente é uma excelente iniciativa. Recomendo!

Vejam: http://www.ibm.com/developerworks/blogs/page/academicbr?entry=produzo_software_no_brasil_na

Além de toda as informações interessantes sobre esses países emergentes (Brasil, China, Rússia e Índia), o post nos alerta sobre o quanto precisamos agir!
A criatividade de nós brasileiros em produzir software não entra nas estatísticas, e segundo Juliano - com sua experiência em projetos internacionais -  os estrangeiros preferem trabalhar conosco. (Veja também os comentários do post)

Portanto, aliado a nossa criatividade e ao bom relacionamento que demonstramos ter, precisamos buscar qualificação! Na minha opinião, a língua inglesa é primordial para estreitar as relações e fazer com que fiquemos bem colocados na lista quando alguém pensar: ” Onde produzirei software?”

Juliano arrisca dizer que metade dos 17 mil formandos /ano brasileiros não estão preparados para o mercado.
Diante disso, uma dica aos universitários (assim como eu): Nós, mais do que ninguém, precisamos nos mexer! Precisamos chegar com uma certa maturidade no mercado e com objetivos bem definidos para nossa carreira.
O que procuro fazer durante minha graduação (onde vejo vários alunos que já passaram da metade do curso e que ainda não sabem a área dentro de TI que pretendem trabalhar (Estão perdendo tempo!)) é aprender bem o máximo possível de tecnologias dentro da área que vou trabalhar (e que AMO trabalhar), melhorar a comunicação e tentar criar diferenciais com o objetivo de fazer parte dessa pequena fatia de profissinais que saem da universidades preparados pro mecado.
Isso significa: Não ficar preso as disciplinas, procurar se envolver em projetos reais (com prazos, metas, etc) em todas as etapas de seu desenvolvimento , melhorar a comunicação pessoal (sendo monitor de disciplinas, ministrando cursos/palestras, ou seja, ensinando o que aprendeu!) e muitas outras atitudes que você pode tomar para criar diferenciais.

Recomendo novamente o blog brasileiro do programa academic initiative da IBM.

Até a próxima!

Renan carreira

Servidor novo, vida nova!

18, abril, 2009

É 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.
O número de acessos do blog antigo, que não tinha um público bem definido devido a diversidade dos conteúdos postados, era satisfatório. Espero, desta vez, começar com o pé direito e conseguir outros seguidores.

Você está convidado a participar deixando seus comentários, sugestões, críticas e entrando em contato comigo para o que precisar.

Deixando de lero-lero, vamos falar de desenvolvimento de software!

Renan Sem categoria ,