La tesis que sentó la base física e ingenieril del ordenador moderno

Alguien o algunas personas, en algún momento de principios del siglo XX, pensó que para crear una máquina que realizara ciertos cálculos, podría ser conveniente emplear la electricidad, las puertas lógicas, usar la base 2 como sistema de numeración y el álgebra de Boole, es decir, alguien debió sentar las bases técnicas del ordenador moderno. Personalmente, siempre tuve la duda de cómo fue ese proceso. Si bien es bastante conocido que el primer diseño de un ordenador digital fue realizado por Von Neumann en los años 40 y que los ordenadores actuales se basan en el mismo, resulta evidente que entre la máquina analítica de Charles Babbage (mecánica y que operaba en base 10) y Von Neumann debieron pasar bastantes cosas.

Bastantes años atrás, leí que Von Neumann dio una respuesta afirmativa a la pregunta de si la creación de su ordenador estaba influenciada por el trabajo de Alan Turing de 1936, en el que presenta el concepto de lo que ahora se conoce como «máquina de Turing» para resolver el problema matemático de la decibilidad. No obstante, el trabajo del matemático inglés es puramente conceptual y está centrado en resolver este célebre problema de lógica matemática, y no dice nada acerca de la base física o ingenieril de una máquina de Turing.

Recientemente he podido descubrir quién fue el creador de esta parte y cómo fue ese proceso. La clave está en la tesis de máster de Claude Elwood Shannon de 1937 llamada «A symbolic analysis of relay and switching circuits«. No la conocía y resulta que está considerada «una de las tesis de máster más importantes jamás escrita». Sus 69 páginas no tienen desperdicio, me han dado las respuestas que buscaba. En primer lugar, se entiende cuál era la situación del momento: ya existían circuitos para automatizar operaciones más o menos complejas, como centralitas de telefonía o equipos de control de motores industriales. Estos circuitos se fabricaban con relés y selectores rotativos. Este vídeo describe muy bien cómo funciona un relé:

En su tesis el autor identifica dos problemas en el trabajo con estos circuitos:

  • El análisis de los mismos, es decir, determinar qué hace un circuito ya existente.
  • La síntesis: consiste en crear un circuito a partir de unos requerimientos. La solución no es única y debería encontrarse la que requiere menor número de componentes.

La solución que el autor propone para ambos problemas es representar cada circuito mediante un conjunto de ecuaciones, cuyos términos representan los relés e interruptores del circuito. Para manipular las ecuaciones, Shannon desarrolla lo que denomina un «cálculo» (calculus), y demuestra que éste es análogo al «cálculo» de lógica proposicional (hoy en día simplemente se denomina «lógica de enunciados»). A continuación, expone que el álgebra de Boole es aplicable. Esto es debido a que la lógica de enunciados tiene estructura de álgebra de Boole.

Shannon no sigue la convención actual, él emplea el 0 para representar un circuito abierto (pasa corriente) y el 1 para el circuito cerrado (no pasa corriente), esto es importante tenerlo en cuenta para entender las primeras páginas. La suma u OR lógico se consigue mediante dos contactos ubicados en línea, accionado cada uno por un relé, mientras que el producto o AND lógico mediante dos interruptores en paralelo:

Contactos eléctricos tesis Shannon

El lado izquierdo del signo igual es una representación algo más «realista», mientras que el lado derecho es una abstracción simbólica.

En los siguientes esquemas se representa de forma un poco más detallada cómo crear las puertas lógicas AND y OR con humildes relés:

puerta lógica OR con relés

Puerta lógica OR

puerta lógica AND con relés

Puerta lógica AND

Si bien ambos diseños se podrían simplificar para emplear un único relé, éstos son de una mayor claridad. Por cierto, la puerta lógica NOT se puede implementar con un relé inverso (en el vídeo también se explica en qué consiste este relé).

En su tesis, después de desarrollar los conceptos básicos, explicar la analogía con la lógica de enunciados, mostrar los teoremas de álgebra de Boole que serán útiles para la síntesis de circuitos y poner ejemplos prácticos de su aplicación, en las páginas 16 / 17 hace una afirmación que parece avanzada a su tiempo:

También es posible emplear la analogía entre el álgebra de Boole y los circuitos de relés en dirección contraria, es decir, representar relaciones lógicas mediante circuitos eléctricos. Siguiendo esta línea se han obtenido algunos resultados interesantes, pero no son de importancia aquí.

Al decir que los circuitos pueden hacer cálculos lógicos, ha concebido el ordenador digital moderno. Su afirmación de que esto carece de importancia en su tesis no sé si es por modestia o porque no intuye sus disruptivas aplicaciones futuras. Al final de su tesis muestra el diseño de dos máquinas: una es un «sumador eléctrico» (electric adder) que trabaja en base 2 y la otra da todos los múltiplos de todos los primos menores o iguales a 10.000, a partir de la cual un humano sabrá que cualquier número inferior a 100.000.000 que no esté en la lista obtenida es un número primo (aunque la del diagrama de ejemplo está limitada a los tres primeros primos). Hasta el momento, hacer una lista así manualmente había representado un gran esfuerzo y encima con algunos errores, como Shannon explica. Si bien estas máquinas parecen ordenadores primitivos, todavía les falta una memoria programable, además de carecer de condicionales y saltos.

ecuaciones sumador eléctrico

Ecuaciones del sumador eléctrico

Diseño sumador eléctrico

Diseño del sumador eléctrico

En definitiva, esta tesis sentó las bases para la creación de circuitos digitales (y por lo tanto de los ordenadores) con una base teórica sólida, a diferencia de cómo se diseñaban los circuitos en esa época y mucho antes de la invención del transistor. Si bien este no es el trabajo más famoso de Claude Elwood Shannon, fue fundamental para sentar las bases del fenómeno que más ha cambiado la existencia del ser humano durante la segunda mitad del siglo pasado y del actual. En lo personal, descubrirlo ha sido encontrar mi eslabón perdido entre por un lado Babbage y por el otro Von Neumann y la tesis de Church-Turing.

Estructura de álgebra de Boole

En una entrada anterior publicada hace más de 4 años, en primer lugar se explicaba cómo simplificar expresiones booleanas en nuestro código a partir de las propiedades fundamentales o axiomas del álgebra de Boole y de sus propiedades derivadas, así como a partir del complemento de una función booleana. Finalmente, se añadía una nota en la que se comentaba la similitud entre el álgebra de Boole, la lógica de primer orden y la teoría básica de conjuntos (la formulada por Georg Cantor). Con el presente artículo se pretender dar orden y exponer correctamente el porqué de está relación que se dejó caer en forma de una breve nota.

En su breve obra titulada «El análisis matemático de la lógica» publicada en 1847, el matemático británico autodidacta George Boole tuvo la originalidad de utilizar las técnicas algebraicas para tratar expresiones de la lógica. En su sistema se definen unas operaciones sobre unas variables abstractas que tienen que cumplir unas propiedades, de forma similar a como en el álgebra de las fracciones se definen las operaciones de suma, resta, multiplicación y división y deben cumplir unas determinadas propiedades. Con esta obra puso fin a la lógica aristotélica e inició la lógica formal matemática contemporánea.

No obstante, no fue hasta 1860 que en los trabajos del también británico economista y lógico William Jevons y el filósofo, lógico y matemático norteamericano Charles Sanders Peirce apareció el concepto más general de álgebra de Boole. Un álgebra de Boole es una estructura algebraica, es decir, consta de un conjunto no vacío de elementos y un conjunto no vacío de operaciones sobre dicho conjunto. Además, una estructura algebraica es axiomática, es decir, debe cumplir una serie de propiedades.

William Jevons

William Jevons, principalmente conocido por la paradoja de Jevons.

Sigue leyendo

¿Qué representa el producto escalar?

En un artículo anterior acerca del producto escalar, se explicó detalladamente cómo se define matemáticamente esta operación. En la presente entrada se explicará qué representa realmente esta operación entre dos vectores, la noción «intuitiva» del mismo; algo imprescindible para entender qué estamos calculando realmente en otras ciencias (por ejemplo física) cuando es empleado.

Dados dos vectores, desde un punto de vista estrictamente matemático podríamos definir infinitas operaciones con ellos, por ejemplo el «producto payaso» de los vectores de n dimensiones u y v, se denota mediante u 🤡 v y se define así:

u 🤡 v = (u1·vn·|u|, u2·vn-1·|v|, u3·vn-2·|u|, …, un·v1·|v|)

Donde las coordenadas impares se multiplican por |u| y las pares por |v|.

Entonces, ¿por qué la operación conocida como producto escalar es importante? Un profesor de matemáticas podría responder a esta pregunta de sus alumnos afirmando que entenderán su importancia en la asignatura de física, donde es muy usado, pues tal vez en matemáticas no tenga un valor especial, pero esta respuesta es un tanto esquiva. La razón por la que es importante en física es precisamente por su interpretación geométrica (ergo matemática), pero esta sistemáticamente se omite, de manera que en física los alumnos deben resignarse a aplicarlo ciegamente.

La explicación a grosso modo no debería rehuirse pues no es ningún concepto especialmente complejo ni requiere de matemáticas «superiores»: el producto escalar de dos vectores, u·v, expresa «cuánto» de u «descansa» en la dirección de v, escalado al tamaño de v. (Esto ya se expresó sucintamente en el artículo anterior) Una vez expuesto esto, resulta mucho más intuitivo entender porqué en física se emplea para:

El trabajo

En la mítica representación del trabajo en Bachillerato:

trabajo en fisica

Sigue leyendo

Aritmética modular para entender el complemento a 2

Los ordenadores codifican internamente los números en binario. Los enteros pueden representarse mediante dos sistemas de representación: el complemento a 2 (Ca2 para abreviar) y el de signo y magnitud. Para los humanos es más amigable el segundo de ellos, pues consiste en reservar el primer bit para indicar si se trata de un positivo o negativo (0 o 1) y el resto es el valor absoluto del número. No obstante, en la mayoría de ordenadores hace ya bastantes años que se emplea el primero, pues goza de dos ventajas: un mayor rango de representación posible al mismo número de bits – pues tiene una única representación para el 0 – y mayor velocidad de ejecución por parte del microprocesador de las operaciones de resta y suma. En el presente artículo, se explicará cómo funciona el complemento a dos, porqué permite realizar las operaciones aritméticas más rápidamente y porqué su resultado debe interpretarse.

En primer lugar, para entender cómo funciona, el lector debe conocer lo básico de la aritmética modular y las clases de equivalencia. En caso de que lo desconozca o bien necesite refrescarlo, al inicio de este artículo se introducen.

Los procesadores representan los números enteros en 8, 16, 32 o 64 bits dependiendo del microprocesador. Para simplificar los ejemplos inicialmente se emplearán 3 bits, que permiten representar 23 = 8 dígitos, es decir, los números comprendidos entre el 0 y el 7. Si se excede el rango, debido a la aritmética modular se sigue obteniendo un resultado, por ejemplo:

  • 2 + 4 = 6 No sobrepasa el límite, el resultado es el esperado.
  • 4 * 2 = 0, pues 0 ≡ 8 (mod 8)
  • 4 + 5 = 1, pues 1 ≡ 9 (mod 8)

Sigue leyendo

Expresión analítica y geométrica del producto escalar

El producto escalar es una operación entre dos vectores que retorna un escalar, es decir, un número real. Existen dos definiciones de esta operación que darán el mismo resultado, aunque inicialmente no sea muy intuitivo que así sea: la analítica y la geométrica. Veamos la primera de ellas:

Dados dos vectores del espacio vectorial ℝn, u = (u1, u2, …, un) y v = (v1, v2, …, vn), se define el producto escalar de ambos, u · v como:

u·v = u1 · v1 + u2 · v2 + … + un · vn

En todo espacio vectorial euclídeo, y por lo tanto normado, podemos usar también la definición geométrica, esta nos dice que el producto escalar de dos vectores es el producto del módulo (o norma) de cada uno de ellos por el coseno del ángulo que forman:

Producto escalar

(2)

A continuación, veamos dos ejemplos sencillos en el plano cartesiano, ℝ2, para ver que ambas formas arrojan el mismo resultado. Ya nos advirtió Johan Cruyff: «Un palomo no hace verano», por lo que estos dos ejemplos no pretenden demostrar nada sino ejemplificar este concepto poco intuitivo. El primer ejemplo consistirá en los vectores u = (2, 2) y v = (2, -2):

ejemplo 1 Sigue leyendo