viernes, 17 de octubre de 2008

El conocimiento del todo

Llevo tiempo meditando sobre la programación de un sistema que generé todas las posibles combinaciones existentes de pixeles, dada una resolución de pantalla limitada con todos los colores que permite un monitor de hoy en día; de poder esperar el tiempo suficiente para visualizar los resultados obtenidos, ante nuestros ojos aparecería tarde o temprano toda fotografía habida y por haber de toda la historia del mundo, en cualquier lugar, en cualquier tiempo, con todas las posibles variaciones y mezclas posibles, pasadas y futuras. Sé que suena extraña la idea pero vamos por partes. Partiendo de la base de que lo que podemos ver en una pantalla de computadora (o en una televisión) son en realidad un conjunto de puntos diminutos (pixeles) en un espacio limitado de X por Y, las diferencias de color entre unos y otros son los que a los ojos humanos, forman imágenes. Estas mismas letras son pixeles negros junto a otros blancos que están posicionados de tal manera que forman letras. Las imágenes se forman bajo el mismo principio pero utilizando mas colores.

Ya sea que estemos viendo una fotografía con nuestros amigos, la graduación de la universidad, la formula de la teoría de la relatividad especial de Einstein, o de campo unificada con todo su desglose matemático, una obra de Cervantes, las noticias del día, o a Elba Esther Gordillo con alopecia (que no le falta mucho) dichas representación son una combinación especifica de pixeles en el monitor, con cierta resolución y ciertos colores, y cualquier variación de estas posibilidades (de una gama no infinita pero si muy MUY grande), es posible con la combinación exacta de puntos.

Imaginemos ahora, que podemos variar estas posibilidades y generar más combinaciones de estos puntos. Entonces tarde o temprano, dada la mezcla especifica, lo que tendríamos ante nosotros serian situaciones inverosímiles, imposibles, inexistentes o simplemente bizarras e increíbles; todo lo que nuestra imaginación puede (o no puede) ofrecernos, seria plausible tener en pantalla, con la correcta iluminación de color de los puntos que forman una imagen.

Dependiendo de la capacidad que tenga el dispositivo (en este caso nuestro adaptador grafico) para pintar colores y colocar imágenes, un monitor común consta de 1024 puntos de ancho por 768 puntos de alto, dándonos un total de 786432 puntos (pixeles) en la pantalla, donde cada uno de estos puede tomar uno de mas de 16 millones de colores.

Una fotografía que ocupe el total del ancho y alto del monitor, tendrá una resolución de 1024 x 768 pixeles con una gama de 16 millones de colores (aunque no necesariamente todos los colores se presentan al mismo tiempo en la pantalla). Suponiendo que en este momento estemos viendo una foto que fue tomada apenas hace unos minutos, indudablemente es una cierta combinación de colores en la pantalla pintados sobre esos 786432 pixeles, y el hecho de que tenga unos minutos de existencia, no implica que dicha combinación no haya sido posible antes, por el contrario, siempre existió en potencia como parte de la casi infinita gama de posibilidades que tenemos al momento de combinar estos colores en la pantalla dentro del limite de pixeles del que disponemos. Si hubiéramos podido saber cual era la mezcla exacta de pixeles/colores antes de tomar la foto, podríamos haber tenido la fotografía en nuestra computadora antes de haberla tomado, antes de que ocurriera el evento que fue capturado con la cámara; tendríamos una fotografía del futuro. En otras palabras, cualquier fotografía que vayamos a tomar representa una combinación especifica de pixeles, la cual aun desconocemos y no es posible generar si no hasta tomar la fotografía en sí. ¿Pero qué tal si tuviéramos un programa que genere todas las combinaciones posibles?. Como mencioné antes, toda imagen representable en pantalla es parte de una gama enorme de posibilidades y con el tiempo suficiente de espera o un sistema de análisis de imágenes, sería perfectamente factible obtener imágenes de situaciones futuras, pasadas, inexistentes, etc.

En teoría es posible obtener la combinación precisa antes de tomar la fotografía, aunque en la práctica resulta casi imposible de realizar ¿por qué?, porque existe un numero muy muy muy grande de posibles combinaciones existentes, un numero que si pudiéramos escribir, ocuparía millones de caracteres.

Bueno, ¿pero que tal si PUDIÉRAMOS? Bajo la posibilidad de tener un programa que generara todas las combinaciones posibles dentro de una gama limitada de colores y pixeles, y repito, de tener el tiempo suficiente para apreciar cada una de ellas, ante nuestros ojos se desplegaría tarde o temprano cualquier cosa imaginable e inimaginable por el hombre, las cosas mas raras, bizarras, impensables, maravillosas, extraordinarias, etc. Podríamos ver a nuestros hijos que aun no han nacido bajo cualquier situación posible e imposible, en cualquier ciudad, país,... en otro mundo, así como cualquier forma de vida, el día de nuestra muerte, nosotros mismos dándole la mano a al Papa parados en la punta del monte Everest, la solución al viaje hiperespacial en perfectas formulas matemáticas, toda obra literaria habida o por haber con todas las variantes posibles, la descripción completa de la vida en nuestra galaxia y del universo de principio a fin en todas y cada una de sus infinitas posibilidades, en todas sus eras, visto desde el punto de vista atómico hasta el macroscópico. Es abrumador.

Hace unos momentos comenté que las posibilidades son finitas, aunque bajo la descripción actual parecen infinitas. En unos momentos mas veremos que las posibilidades son finitas, sin embargo, al haber un número tan grande de posibles combinaciones, finito se vuelve prácticamente infinito. ¿O tu puedes distinguir entre finito y un numero que tardarías en transcribir en papel, suponiendo que escribieras 2 dígitos por segundo durante 24 horas al día, sin pausa alguna, los 7 días de la semana durante un año?.

Bueno, mi primer interrogante es poder saber, si no el número de combinaciones existentes, al menos el número de dígitos que tiene el número que representa las combinaciones posibles. Más adelante explicaré la utilidad de éste paso.

Nuestro punto de partida será la función Nc = C ^ (Es) (C elevado a Es)

“Nc” es el numero de combinaciones que obtenemos.
“C” es el numero de caracteres
“Es” es el espacio que tenemos para poder realizar nuestras combinaciones

Por ejemplo, si tuviéramos solo 3 letras (A,B,C) y 2 espacios, las posibles combinaciones (AA, AB, AC, BA, BB, BC, CA, CB, CC) son 9. Ósea, 3 elevado al 2 (3 al cuadrado) = 9. El 9 es UN carácter. Así pues, el número de dígitos del número que representa la cantidad de combinaciones (9) es uno.

Nc = 2 ^ 3
Nc = 9 (1 digito)

En el ejemplo anterior, tenemos solo 2 espacios para poder mezclar los caracteres que teníamos disponibles (3). Este espacio era de una dimensión (una dimensión de 2 espacios horizontales). Si aumentamos el plano a dos dimensiones, entonces el espacio que tenemos para combinar los caracteres de que disponemos, aumenta a un plano de i x j . Esto resulta en 2 dimensiones de i espacios horizontales, por j espacios verticales.

En un monitor tenemos i renglones por j columnas de pixeles, es decir una resolución de i x j, aumentando así nuestra variable “Es” a Es = i x j

Nc = C ^ (i x j)

Veamos uno de los ejemplos más sencillos que podríamos tener bajo estas circunstancias. Asumamos que disponemos solo de 2 colores (blanco y negro), y un espacio bidimensional de 2 x 2 pixeles. Obtenemos 16 combinaciones posibles.

Nc = 2 ^(2 x 2) = 2 ^ 4 = 2 x 2 x 2 x 2 = 16 (dos dígitos).

Parecen pequeñas y fáciles de almacenar, solo 16 posibles variaciones de nuestros dos colores en una escala de 4 espacios (2 horizontales por 2 verticales), pero, aumentando solo en 3 unidades la cantidad de espacios por eje en nuestro plano bidimensional, la cantidad de posibles diferentes combinaciones aumenta increíblemente.

Es = i x j
Es = ((2 + 3) x (2 + 3)) = 5 x 5 = 25
Nc = 2 ^ (25) = 33,554,432 (8 dígitos).

Obtenemos mas de 33 millones de combinaciones solo para 2 colores con una resolución (espacios vert. por esp. Horiz.) de 5 x 5 pixeles. ¿Qué será con 16 millones de colores y una resolución de 1024 x 768 o más?. En realidad tenemos 256 ^ 3 de colores, la cifra exacta es 16,777,216 colores. Para obtener esto tendríamos que calcular:

Nc = 16,777,216 ^ (1024 x 768) = 16,777,216 ^ (786,432).

Ósea, 16777216 x 16777216 x 16777216 x ……………. x 1677216 unas 786mil veces. Solo elevar al cubo (multiplicar 16 millones por si mismo 3 veces) da la increíble suma de 4,722,366,482,869,645,213,696 (22 dígitos). No puedo imaginar el numero de dígitos que obtendríamos de multiplicar 16 millones por si mismo esas 786mil veces. Aunque si lo podremos calcular un poco más adelante.

Para darnos una idea del número que representa tal posibilidad y la cantidad de espacio necesaria para poder guardar la imagen de cada posibilidad, como numero de combinación*, en nuestros discos duros, regresemos a nuestro ejemplo de 2 colores con 2 por 2 espacios.

* Numero de Combinación. Se refiere a almacenar el numero (digito numérico) que representa el numero de combinación (la posición dentro del total de posibilidades) de pixeles de la imagen. Por ejemplo, al tener a,b,c y 2 espacios, la combinación BA es la número 4. Almacenar el 4 (1 byte) ocupa menos espacio que almacenar BA (2 bytes).


Tenemos 16 formas distintas de mezclar dos colores, si quisiéramos guardar cada posibilidad como NUMERO DE COMBINACIÓN*, es decir, combinación numero 1, combinación número 2,.... combinación numero 16, tendríamos que guardar que numero de posibilidad representa, y cada numero ocuparía el numero de bytes correspondiente al numero de caracteres que ocupa este numero de combinación. Ejemplo:

Combinación numero 1: el uno ocupa 1 byte (un carácter)
Combinación numero 2: el dos ocupa 1 byte (un carácter)
Combinación numero 3: el tres ocupa 1 byte (un carácter)
....
Combinación numero 10: el diez ocupa 2 bytes (dos caracteres)
...
Combinación numero 16: el dieciséis ocupa 2 bytes (dos caracteres)

De ésta manera, al almacenar únicamente la Combinación Numero X, la cantidad de dígitos que tendría este número seria mucho menor que la cantidad necesaria para guardar en un archivo la información sobre posición y color de cada uno de los pixeles que forman la imagen. De ésta manera no solamente podremos obtener las imágenes inimaginables pidiéndole al sistema la combinación numero X; si no que al tener una imagen, podríamos utilizar el proceso inverso y poder determinar que tal imagen es la combinación numero Z de la gama posible en el universo de posibilidades, y almacenar ese número en sí mismo, en lugar de utilizar los formatos existentes.


En la imagen vemos las 16 combinaciones posibles para 4 espacios y 2 colores. En lugar de almacenar la información de cada una de las 4 posiciones a,b,c,d de la imagen, con el respectivo color de cada lugar, como en el caso de la imagen numero 13, donde:

A - color 1
B - color 1
C - color 0
D - color 1

Almacenamos el número 13 (dos dígitos) los cuales son mucho menos información (2 bytes) que la información completa sobre cada pixel. En éste ejemplo, el máximo valor en dígitos que obtenemos para este universo de 4 espacios y 2 colores, es de 2 bytes. Ya que el número máximo de combinaciones es de 16, y éste valor ocupa 2 dígitos. Aquí fue fácil determinar que bajo 2 ^ 4, el resultado tiene 2 dígitos, puesto que lo podemos calcular, obtener el numero 16 directamente y ver con facilidad que son 2 caracteres los que forman este 16 (el 1 y el 6). Sin embargo las cosas se ponen mucho más complicadas cuando tenemos 1024 x 768 pixeles y los 16 millones de colores.

Existe una solución matemática para poder obtener el número de dígitos del resultado de la operación, sin realizar la operación. Definamos para tal propósito Nbytes[Nc], que representará el numero de dígitos del resultado de la operación, o bien, como el numero de caracteres del número máximo de combinaciones.

Siendo Nc = 2 ^ (2 x 2) = 2 ^ 4 = 16 (2 bytes)
Nbytes[Nc] seria igual a 2

La formula sería la siguiente: Nbytes[Nc] = 1 + Int(i x j (Log(C))

Léase, 1 más la parte entera de ((i por j) por el logaritmo de C). donde i x j es la resolución de la pantalla (o numero de espacios disponibles) y C es el numero de colores que vamos a utilizar.

Si Nc = C ^ (i x j). Entonces en el ejemplo que hemos estado trabajando, Nc = 2 ^ (2 x 2).

i x j = 2 x 2 = 4
C = 2
Nbytes[Nc] = 1 + INT (i x j (LOG(C))
NBytes[Nc] = 1 + INT (4 x LOG(2)) = 1 + Int(4 x 0.301) = 1+Int(1.2) = 1 + 1 = 2

Obtenemos que NBytes[Nc] = 2, valor que ya habíamos obtenido mediante el conteo directo de dígitos del resultado de Nc, pero ahora lo obtuvimos sin hacer el cálculo, es decir, sin elevar el 2 a la cuarta potencia.

Para el caso de 2 colores y un espacio de 5 x 5 habíamos obtenido 33 millones de combinaciones, y éste número (33,554,432) tiene una longitud de 8 caracteres. Por lo tanto, cualquier imagen contenida en este rango, tendría una longitud máxima de 8 bytes por combinación.

Nc = 2 ^ (25) = 33,554,432 (8 dígitos).

i x j = 5 x 5 = 25
C = 2
NBytes[Nc] = 1 + INT(25 x LOG(2)) = 1 + INT(25 x 0.301) = 1 + INT(7.525) = 1 + 7 = 8

Si ahora Nc = 16,777,216 ^ (1024 x 768) = 16,777,216 ^ (786,432). El numero es extraordinariamente grande, y así como para 2 ^ 4 pudimos saber que el resultado constaba de 2 dígitos (el 16) y para 2 ^ 25 era de 8 dígitos, también podemos calcular el número de dígitos NBytes[Nc] del resultado de esta gran operación.

i x j = 1024 x 768
C = 16,777,216
Nbytes[Nc] = 1 + INT (i x j (LOG(C))
NBytes[Nc] = 1 + INT(1024 x 768 x Log(16,777,216)
NBytes[Nc] = 1 + INT(786432 x 7.225) = 1 + INT(5,681,750.92)
NBytes[Nc] = 5,681,751

Es increíble la cantidad de dígitos que obtenemos del resultado de calcular Nc. Si pudiéramos escribir el resultado de elevar a la potencia 786,434 el número 16,777,216, obtendríamos un numero que ocupa poco mas de 5.6 millones de caracteres. Esto sin olvidar que ese número Nc de 5.6 millones de dígitos, representa en sí mismo, el número máximo de combinaciones posibles de pixeles en una pantalla con una resolución de 1024 x 768 y 16 millones de colores.

Nc = 16,777,216 ^ (1024 x 768) = 16,777,216 ^ (786,432) = Q (donde Q es un numero de 5.6 millones de dígitos).

No podemos saber exactamente de cual numero se trata, simplemente lo llamaremos el numero Q; sinceramente no encuentro un nombre o sé cuantas veces debería repetir la frase miles de millones de trillones de cuatrillones…. de quasillones para poder nombrar ésta extraordinaria cantidad, por el momento me conformaré con saber que ese cifra, de poder escribirla, necesitaría más de cinco millones de números para poder representarla en papel, y ahí en algún punto, en algún numero de combinación dentro de Q se encuentra el conocimiento del todo lo existente y por existir. Y es un área limitada de un monitor, ¿qué será de extender los limites a planos mayores, como los de la materia a nivel atómico?

Continuará…