La Biblioteca de Babel

Fuente http://www.taringa.net/posts/info/3205996/He-creado-la-biblioteca-de-Babel-de-Borges.html

Borges ideó la biblioteca de Babel. Una biblioteca finita, pero tan grande que es inimaginable cuantos ejemplares tiene. Ninguno se repite. Se trata de libros de 410 páginas, con 40 renglones por página y 80 caracteres (símbolos dice él) por renglon. Esto con un abecedario de 25 letras. (por lo que tuve que quitar algunas letras, el último sacrificio fue la “v”, que sería reemplazada siempre por la “b” conservando el sentido de la oración.

La biblioteca contiene todas las combinaciones posibles de las letras, por lo que con ella se pueden contar todas las historias posibles, mi biografía, y otra biografía falsa (miles de ellas) y otra con una falta de ortografía, cada una sería un libro. Habría uno que tenga la palabra piedra repetida a lo largo de todo el libro y otro que sea una repetición constante de “x”. En alguno habría una repetición de “x” con un espacio en alguna de sus páginas y ya sería otro libro.

Borges dice “Todo: la historia minuciosa del porvenir, las autobiografías de los arcángeles, el catálogo fiel de la Biblioteca, miles y miles de catálogos falsos, la demostración de la falacia de esos catálogos, la demostración de la falacia del catálogo verdadero, el evangelio gnóstico de Basilides, el comentario de ese evangelio, el comentario del comentario de ese evangelio, la relación verídica de tu muerte, la versión de cada libro a todas las lenguas, las interpolaciones de cada libro en todos los libros, el tratado que Beda pudo escribir (y no escribió) sobre la mitología de los sajones, los libros perdidos de Tácito.”

Finalmente he creado un script en python que crearía la biblioteca de babel. Digo crearía, porque mi computadora no es capaz de ejecutarlo.

En el script se puede elegir el número de caracteres para que se lleven a cabo las combinaciones posibles. Si elegimos 5, tardará unos segundos en ejecutarse y nos dará las 17847788 combinaciones posibles. Con 10 caracteres tardaría varios días.

Si ponemos 999 caracteres tarda en arrancar, y no puedo calcular cuanto tardaría en dar el resultado total, pero la cantidad de combinaciones posibles es de 532926821259598611954998230920470005196694347937879130552782521402984085793057100947727403850614534280490893872790792077962536612409561255013149249895964510958553956692526419794003817623710029137541523954354144412374951457537661115745803250768882497330415042643772118498186756171384372349995433756618750809731488129306862370007391150062832042447186878844520154886254525921651234945380581841491248017098233161242782118946766976141257757936727903369663756632878405676885168602252412962923993134221129646062716663760260964849510060249787189783866044678808647383852475382128890762140464723658244528391376614025889441981326475851714681940545689477954686884255894006762441311758600593754768927439886123672228896800059321727753985671492292526203828215955099532747768915230928211908020526455543419082869238127240304056259484559888516246654249486609315014373905063312903229267391401126286795914194054947252509140043329856291569753009054629664224690263933560522562293323326628748097803828646560455933796167951690071043537819435612341946350046801252809151650510630463191505929691979474422787658629752489235953643950768851958682473862575873772453070224977673757345907865139502242647614507636890004684728334264558831097922382166313076328198053126460239248430632716424356609279932823825873958725320938610360857945153648644769611326000544148716929298608299460311771708845054324300677386103727982997954354490531618272469035729466788011933512274075255864816838124

Si tenemos 401 páginas, de 40 renglones con 80 caracteres por renglon, tenemos que cada libro tiene una extensión de

401 x 40 x 80 = 1283200

y para saber la cantidad de libros sería 251283200 + 251283199 + 251283198 + 251283197 + 251283196…

Entonces deberíamos poner en la longitud que elegimos en el script, que haga todas las combinaciones posibles con las 25 letras, de una extensión de 1283200. Y ahí queda mi pc intentando ejecutarlo. Claro que no puede, y en caso de lograrlo, mi disco rígido no sería capaz de albergar el resultado.

Como sea, crear la biblioteca de Babel es posible (o casi) y solo faltan unos años para poder ejecutarlo. Otro problema a resolver, es que si queremos que cada libro sea un archivo distinto, se va a complicar con los nombres a ponerle a cada uno. La solución má sencilla sería guardarlo en carpetas de a 100000 o 1000000, pero igual sería complicado.

Finalmente deberíamos discutir la utilidad de hacer esto, pero en fin…

El script es el siguiente:

#!/usr/bin/python
#
# Creando la biblioteca de Babel (por Guille)
# Base script diccionario de fuerza bruta de makiolo
# Licencia Creative Commons, se permiten obras derivadas
# siempre que se respete el nombre del autor, pero sin fines comerciales.

import sys, math
from time import time, localtime, strftime

########################### CONFIGURACION ######################### 

LONGITUD = 1283200 
ALFABETO = "abcdefghijklmnopqrstuwxyz_,." 

#################################################################### 

########################## FUNCIONES ############################### 
def getVariacionesConRepeticion(ALFABETO , LONGITUD): 
sumatorio = 0 
for i in range(LONGITUD): 
producto = 1 
for j in range(i+1): 
producto = producto * len(ALFABETO) 
sumatorio = sumatorio + producto 
return sumatorio 

def eventoPalabraGenerada(palabra): 
print palabra 

#################################################################### 

##################### VARS AUXILIARES ############################## 
DEBUG = True 
VERBOSE = True 
variacionesConRepeticion = getVariacionesConRepeticion(ALFABETO , LONGITUD) 
inicioReloj = time() 
cont = 0 
progreso = 0 
#################################################################### 

while LONGITUD > 0: 
try: 
contadores = [] # contadores en 0 
for i in range(LONGITUD): 
contadores.append(0) 

fin = False 
while not fin: 
if DEBUG == True: 
palabra=[] # lista vacia 
for i in range(LONGITUD): 
palabra.append(ALFABETO[contadores]) # incorpora letras 
eventoPalabraGenerada("".join(palabra)) 

if VERBOSE == True: 
if (cont % 600000 == 0) and (cont != 0): 
progreso = cont*100.0/variacionesConRepeticion # porcentaje 
progreso = round(progreso , 2) 
finReloj = time() - inicioReloj # retraso 
velocidad = cont / finReloj # resultados por segundo 
velocidad = round(velocidad , 2) 
estimado = finReloj * variacionesConRepeticion / cont # estimado total 
restante = estimado - finReloj # estimativo lo que queda 
restante = restante / 60 / 60 
restante = round(restante , 2) 
sys.stderr.write(str(progreso)+"% - Quedan "+str(restante)+" horas. La velocidad es de "+str(velocidad)+" palabras/seg\n" 

cont = cont + 1 
actual = LONGITUD - 1 
contadores[actual] = contadores[actual] + 1 

while(contadores[actual] == len(ALFABETO)) and not fin: 
if(actual == 0): 
fin = True 
else: 
contadores[actual] = 0 
actual = actual - 1 
contadores[actual] = contadores[actual] + 1 

LONGITUD = LONGITUD - 1 

except KeyboardInterrupt: 
sys.stderr.write("Interrumpido por el usuario\n" 
fin = True 
LONGITUD = 0 

if VERBOSE == True: 
sys.stderr.write("Terminado al "+str(progreso)+"% - Realizadas "+str(cont)+" combinaciones de "+str(variacionesConRepeticion)+"\n" 
Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s