e elevado a un número imaginario puro

¿Qué significa elevar e a un número complejo? ¡Hasta los autores de Los Simpson lo saben!

Calculan y resuelven eπ*i:

e elevado a pi por i

No por aparecer en Los Simpson es evidente. Siendo b un número natural, sabemos que ab consiste en multiplicar a b veces. También sabemos que cuando b es un entero negativo la definición es otra, es el inverso de ab:

a elevado a menos b

Y que cuando el exponente es un racional, n/b, se trata de la b-enésima raíz de an:

an/b = b√an

Pero ninguna de estas tres definiciones tienen sentido en la exponenciación de e a un número complejo. Para que lo tenga hemos de tener en cuenta las series de Taylor, según las cuales sabemos que:

Taylor e elevado a x

El signo de admiración expresa el factorial. Cuanto más alargamos la serie mayor precisión decimal obtenemos.

En este caso, cuando nos dicen que x es cualquier número, nos lo dicen en un sentido amplio, puede ser también el complejo xi, y por lo tanto:

Taylor e elevado a x por iEsta agrupación final de los pares a la izquierda y los impares a la derecha no es para pasar el rato, pues como por Taylor otra vez sabemos que:

Taylor seno

Y también:

Taylor coseno

Si reemplazamos las infinitas sumas que resultan en el seno y el coseno nos queda la famosa fórmula de Euler:

Formula de EulerPor lo tanto, podemos ver la exponenciación de e a un número complejo z, imaginario puro, ez,como las infinitas sumas que se pueden agrupar entre las que forman el seno y las del coseno. Hay que tener en cuenta que x expresa un ángulo en radianes. Aunque la la circunferencia completa está comprendida entre 0 y 2Π radianes, se puede calcular perfectamente el seno y el coseno de cualquier ángulo x > 2Π pues representa x mod 2Π giros.

Volviendo a la fórmula de Los Simpson, como cos(Π) = -1 y sen(Π) = 0 tenemos:

Calculo de e elevado a pi por iEn un artículo anterior vimos las potencias de la unidad imaginaria y en este hemos visto la exponenciación de e a un número imaginario puro, aquel complejo que sólo tiene parte imaginaria. ¿Qué pasaría si también tuviera parte real, por ejemplo 1 + Πi? Eso lo dejaré para un próximo artículo.

Zen, matemáticas y la paradoja de Sorites

Montón de arena o duna o n granos de arena

¿Montón de arena? ¿Duna? ¿N granos de arena?

Hace años leí algunos capítulos de un fragmento de un libro Zen escrito en algún momento entre los siglos XVI y XIX, ya no recuerdo, de la escuela Soto o Rinzai, tampoco lo recuerdo, de un autor que, como probablemente habrás adelantado, tampoco recuerdo, pero sí, era japonés. En definitiva, muy Zen todo. Lo que sí recuerdo bien es un símil realizado con la evolución de un fuego recién empezado con unos leños hasta su consumición completa. ¿En qué momento podemos decir que dejaron de haber leños para haber sólo ceniza? Creo que con este ejemplo el autor quería hacer notar las limitaciones que nuestros conceptos mentales tienen para ayudarnos a entender la realidad.

Bastantes años después he caído, navegando por Internet, en la paradoja de Sorites. Esta paradoja entiendo que quiere hacernos caer en la cuenta de algo muy parecido, poniendo como ejemplo no la combustión de un pequeño fuego sino un montón de arena. Sorites es como se pronuncia en griego σωρείτης palabra que significa montón o cúmulo. La paradoja parte del hecho de que estaremos todos de acuerdo en que:

  1. Dos o tres granos de arena no son un montón.
  2. 100.000 o 1.000.000 sí lo son.
  3. Si dos o tres granos de arena – llamemos n a esos dos o tres – no son un montón, tampoco lo serán n+1
  4. Un montón de n granos no dejará de serlo por quitarle uno (n-1)

Mediante inducción matemática se comprueba que la primera y tercera característica niegan la segunda, es decir, que 100.000 granos (ni un millón) forman un montón.

Llamemos a ser un montón tener la propiedad P. La primera característica nos dice que para n = 1 no existe la propiedad P, y que tampoco existe para n = 2 ni para n = 3. La tercera nos dice que dado que Pn no es un montón tampoco lo será Pn+1 = n+1 Tenemos:

  1. ¬P(1)
  2. ¬P(2)
  3. ¬P(n) ⇒ ¬P(n+1)

Supongamos que hay un número mínimo de granos de arena a partir del cual sí se verifica P, llamaremos m a ese número. Tenemos entonces que m-1 no es un montón y a partir de m granos sí lo es. También sabemos por la característica 1 que m > 1 y por la 3 sabemos que m -1 debe cumplir:

P(m-1) ⇒ P(m -1 + 1)

Es decir, que P(m-1) = P(m) y esto es una contradicción pues hemos impuesto que m es el elemento mínimo a partir del cual tenemos la propiedad P (es un montón) y por debajo de m granos no tenemos esa propiedad.

Por el mismo método de la inducción matemática se demuestra a partir de las características segunda y cuarta de un montón que la primera es falsa, es decir, que tan solo dos o tres granos de arena sí son un montón. Incluso que ningún grano también lo es.

Por lo tanto, no sólo conceptos como la belleza o la armonía son difíciles de definir, sino que identificar conceptos que representan objetos físicos como la madera o la ceniza, incluso los medibles como la gordura o la delgadez (peso), o un montón (número de elementos que lo forman) nos pueden resultar evidentes cuando realmente no lo son.

Las potencias de la unidad imaginaria como clase de equivalencia

El número imaginario i es aquel que permite resolver, entre otras cosas, la ecuación:

i2 = -1

Por lo tanto i = √-1

Podemos ver que sus potencias enteras son:

i0 = 1

i1 = i (= √-1)

i2 = -1

i3 = i * i2 = i * (-1) = -i

i4 = i2 * i2 = -1 * (-1) = 1

i5 = i2 * i3 = -1 * (-i) = i

in = …

Si seguimos la serie vemos que emerge un patrón: 1, i, -1, -i, …

Así como vimos que las congruencias se podían tratar como clases de equivalencia, vemos aquí que las potencias de i se pueden tratar como la clase de equivalencia Z4

Sabemos que Z4 = {[0], [1], [2], [3]} es decir, el total de restos posibles de 4 y sabemos una n potencia de i que pertenece a cada clase:

0 = i0

1 = i1

2 = i2

3 = i3

Con todo esta información no habrá potencia que se nos resista. Si queremos calcular i54 sólo tendremos que calcular el resto de la división de 54 entre 4, que es 2 y por lo tanto pertenece a la misma clase que i2 , por lo que podemos afirmar que i54 = i2 = -1 También podemos afirmar que i54 es congruente con i2 La fórmula general es:

in = i4 mod (n)

Esto también puede enfocarse desde una perspectiva más gráfica. Multiplicar por i es rotar en el plano 90º hacía atrás y multiplicar por -i es avanzar 90º Por más que rotemos siempre acabaremos en uno de los 4 puntos:

El número imaginario en el plano cartesiano complejo

El número imaginario i en el plano cartesiano complejo

Programa para resolver ecuaciones diofánticas

En el artículo anterior expliqué cómo se resuelven las ecuaciones diofánticas y su relación con las ecuaciones de congruencia. En la presente entrada vamos a ver un programa en Python que las resuelve.

#! /usr/bin/env python
# -*- coding: utf-8 -*-
# Resuelve ecuaciones diofánticas tipo ax + by = c

import sys
from sys import argv

def extendedEuclideanAlgorithm(old_r, r):
    negative = False
    s, old_t = 0, 0
    old_s, t = 1, 1

    if (r < 0):
        r = abs(r)
        negative = True
        
    while r > 0:
        q = old_r / r
        #MCD:
        r, old_r = old_r - q * r, r
        #Coeficiente s:
        s, old_s = old_s - q * s, s
        #Coeficiente t:
        t, old_t = old_t - q * t, t
        
    if negative:
        old_t = old_t * -1
        
    return old_r, old_s, old_t

a = long(argv[1])
b = long(argv[2])
c = long(argv[3])

mcd, s, t = extendedEuclideanAlgorithm(a, b)
if c % mcd == 0:
    a1, b1, c1 = -a / mcd, b / mcd, c / mcd
    x1, y1 = s * c1, t * c1
    print "x = {0}{1:+d}k" . format(x1, b1)
    print "y = {0}{1:+d}k" . format(y1, a1)
else:
    print "No tiene solución"

Para calcuar 23x -4y = 11 hacemos:

vic@LESBIAN:~/mates$ ./diofanticas.py 23 -4 11
x = -11-4k
y = -66-23k

Aplicando el concepto de clase de equivalencia, tal y como se explica en el anterior artículo, podemos computar la forma paramétrica más simplificada como muestra el siguiente programa:

#! /usr/bin/env python
# -*- coding: utf-8 -*-
# Resuelve ecuaciones diofánticas tipo ax + by = c
# El primero par x e y es la forma parmétrica más simplificada
 
import sys
from sys import argv

def extendedEuclideanAlgorithm(old_r, r):
    negative = False
    s, old_t = 0, 0
    old_s, t = 1, 1

if (r < 0):
    r = abs(r)
    negative = True

while r > 0:
    q = old_r / r
    #MCD:
    r, old_r = old_r - q * r, r
    #Coeficiente s:
    s, old_s = old_s - q * s, s
    #Coeficiente t:
    t, old_t = old_t - q * t, t

if negative:
    old_t = old_t * -1

return old_r, old_s, old_t

a = long(argv[1])
b = long(argv[2])
c = long(argv[3])

mcd, s, t = extendedEuclideanAlgorithm(a, b)
if c % mcd == 0:
    a1, b1, c1 = a / mcd, b / mcd, c / mcd
    x1, y1 = s * c1, t * c1
    # Uso abs() pues Python no hace la división Euclídea con cociente negativo
    equivClass = x1 % abs(b1)
    print "x = {0}{1:+d}k" . format(equivClass, b1)
    print "y = {0}{1:+d}k" . format((c1 - (a1 * equivClass)) / b1, -a1)
    print "x = {0}{1:+d}k" . format(x1, b1)
    print "y = {0}{1:+d}k" . format(y1, -a1)
else:
    print "No tiene solución"

Este es el resultado de diferentes ejecuciones:

vic@LESBIAN:~/mates$ ./diofanticas.py 4 7 29
x = 2+7k
y = 3-4k
x = 58+7k
y = -29-4k
vic@LESBIAN:~/mates$ ./diofanticas.py 23 -4 11
x = 1-4k
y = 3-23k
x = -11-4k
y = -66-23k

El uso de la función abs(), que nos devuelve el valor absoluto, es debido a que Python no hace la división Euclídea cuando el cociente es negativo. Los dos pasos:

  • q = old_r / r
  • old_r = old_r – q * r

Se podrían unificar con la función divmod(), pero me parece menos claro para quien no conoce el lenguaje, siendo los dos pasos más parecidos al pseudocódigo.

Resolución de ecuaciones diofánticas

Las ecuaciones diofánticas contienen 2 incógnitas en una sola ecuación y están generalmente expresadas en la forma ax + by = c

Cuando hay dos incógnitas, tal vez nos resulte más familiar un sistema de dos ecuaciones como nos enseñaron en primaria, por ejemplo:

  • 2x + 2 = 6y
  • 4y + 2 = x + 6

Ahora bien, una ecuación diofántica también nos resulta familiar expresada en la forma ax + by – c = 0 , pues se trata de la ecuación de una recta. Al tratarse de una recta sus soluciones serán infinitas, si tiene solución.

Aunque el conjunto de puntos de una recta está en R, al igual que hemos hecho con las congruencias contemplaremos sólo las soluciones en Z. En este conjunto, hay un teorema debido al matemático indio Brahmagupta, que nos dice que la condición necesaria y suficiente para que la ecuación diofántica ax + by = c tenga solución es que d = mcd(a, b) | c En este caso, si (x1, y1) es una solución, todas las demás soluciones se obtienen mediante las expresiones:

  • x = x1 + (b / d) * k
  • y = y1 – (a / d) * k

Este teorema nos resulta familiar con las ecuaciones de congruencia; vimos que ax ≡ b (mod m) tendrá solución si d | b En los dos artículos anteriores, 1 y 2, vimos también que solucionar ecuaciones de congruencia lineal se reduce a resolver congruencias donde el coeficiente de la x, a, y el módulo m son primos entre si. El procedimiento es el mismo para las ecuaciones diofánticas. Por el teorema de Bezout sabemos que existen coeficientes s y t tales que:

a*s + b * t = d

Si e = c / d y multiplicamos ambos lados por e tendremos:

  • x1 = s * e
  • y1 = t * e

Vamos a resolver 23x – 4y = 11 Mediante el algoritmo de Euclides tenemos:

  • 23 = -4 * (-5) + 3 ⇒ 2 = 23 – 4 * 5
  • -4 = 3 * (-2) + 2 ⇒ 2 = -4 + 3 * 2
  • 3 = 2 * 1 + 1 ⇒ 1 = 3 -2 * 1

Obtenemos mcd(23, -4) = 1 Usemos el algoritmo extendido de Euclides para hallar un s y t:

1 = 3 – 2 * 1 = 3 – (-4 + 3*2) * 1 = 3 + 4 – 3 * 2 = 4 – 3 * 1 = 4 – (23 – 4 * 5) * 1 = 4 -23 * 1 + 4 * 5 = 23 * (-1) + 4 * 6

Sabiendo s y t tenemos tendremos x1 e y1:

23 * (-1) – 4 * (-6) = 1

23 * (-11) – 4 * (-66) = 11

  • x1 = -11
  • y1 = -66

Reemplacemos para encontrar las expresiones que dan todas las soluciones:

  • x = -11 + (-4 / 1) * k = -11 – 4k
  • y = -66 – (-23 / 1) * k = -66 – 23k

Siguiendo con las familiaridades, podemos ver que estas expresiones para x e y coinciden con la forma paramétrica de la ecuación de la recta.

Si usamos fracciones continuas para resolver la ecuación diofántica llegaremos a este resultado:

  • x1 ⇒ x = 1 – 4k
  • y1 ⇒ y = 3 – 23k

Cómo resolver ecuaciones diofánticas mediante fracciones continuas puede encontrarse en Google, lo que quiero destacar es que aparentemente hemos llegado a un resultado diferente pero no es así. Veamos que ambas soluciones representan la misma recta:

23x - 4y - 11 = 0La segunda solución nos conduce a la misma ecuación 23x – 4y – 11 = 0

23x -4y - 11 = 0El algoritmo extendido de Euclides nos da un par s y t y cualquier otro par nos dará soluciones que son la misma recta. El resto de pares nos los da la expresión:

1 = 23*( -1 – (-4) * h) + (-4)*(-6 + 23 * h) ∀ h ∈ Z

Para h = 1 y multiplicando luego por 11:

  • x1 = 33 ⇒ x = 33 – 4k
  • y1 = 66 ⇒ y = 187 – 23k

Podemos ver que se trata de la misma recta:

23x - 4y - 11 = 0En el artículo anterior resolvimos la congruencia 12x ≡ 15 (mod 21) y podemos ver que resolver esta ecuación equivale a encontrar todos los enteros x que satisfagan la ecuación diofántica 12x + 21y = 15. Vamos a resolverla:

12x + 21y = 15 equivale a 4x + 7y = 5

Bezout: 4s + 7t = 1

Podemos ver que s = 2 y t = -1 satisfacen la ecuación. Por lo tanto:

4(2 * 5) + 7(-1 * 5) = 5

  • x1 = 10 ⇒ x = 10 + 7k
  • y1 = -5 ⇒ y = -5 – 4k

La solución para x son todos los múltiplos de 7 + 10 En «términos» de congruencias diríamos que estamos en Z7 y que 10 pertenece a la clase de equivalencia [3] Sabemos que el mcd es 3, por lo tanto los 3 primeros residuos serán las soluciones: 3, 10 y 17

También vemos que el conjunto de soluciones k = {-1, 0, 1} dan las soluciones de la ecuación de congruencia 12x ≡ 15 (mod 21) x = {3, 10, 17}  Gracias a lo que sabemos de congruencias podemos suponer que otra forma paramétrica correcta para x es:

x = 3 + 7k Por lo tanto x1 = 3. Para encontrar y1 reemplazamos:

4*(3) + 7y = 5 ⇒ y1 = -1 ⇒ y = -1 – 4k Así que otra forma paramétrica equivalente es:

  • x = 3 + 7k
  • y = -1 – 4k

Si desarrollamos como hemos visto anteriormente veremos que ambas formas paramétricas conducen a la misma ecuación de la recta: -4x -7y + 5 = 0

Las congruencias como clases de equivalencia

En este artículo trataré el caso particular de ecuaciones de congruencia lineal que dejé pendiente en el anterior artículo: la solución cuando a y m no son primos entre si, es decir mcd(a, m) > 1 y b es un múltiplo del mcd, es decir mcd | b. Recordemos que si b no es múltiplo del mcd no existirá ninguna solución.

Para poder explicar cómo se solucionan y no dar meramente la fórmula como hace la Wikipedia, hay que introducir las clases de equivalencia y el conjunto de restos. Las clases de equivalencia permiten agrupar los enteros de manera que dos números están en la misma clase sólo si dan el mismo resto módulo m. Esto equivale a decir que a y b están en la misma clase módulo m si m | a – b , es decir, si a – b es un múltiplo de m.

Como la clase de equivalencia de un número a es el conjunto de números que dan el mismo resto al dividirlos por m, es decir [a] = {x ∈ Z: x ≡ a (mod m)} podemos afirmar que una congruencia es una clase de equivalencia.

Por ejemplo, 13 y 24 están en la misma clase módulo 11 al dar el mismo resto 2 y al ser 11 | (24-13). En general, para todo módulo m:

Si [0] = {… ,−2m, −m, 0, m, 2m, …}

[1] será = {…, -2m+1, -m+1, 1, m+1, 2m+1, …}

[2] = {…, -2m+2, -m+2, 2, m+2, 2m+1, …} Indicados en negrita están 13 y 24 para módulo 11.

Así hasta llegar a [m – 1]. El conjunto de restos de un número m será {0, 1, …, m-1} El conjunto de restos de m se designa por Zm. Continuando con el ejemplo:

Z11 = {[0], [1], [2], [3], [4], …, [10]}

Por lo tanto, todo entero será congruente módulo m con algún elemento del conjunto de restos módulo m: {0, 1, …, m-1}. Por ejemplo, todo entero módulo 5 dará uno de estos restos: {0, 1, 2, 3, 4} Si cogemos un número cualquiera, por ejemplo 1234567890123456789, vemos que su resto es 4, por lo tanto 1234567890123456789 ≡ 4 (mod 5)

Por ejemplo, si en el conjunto de los enteros consideramos la clase de equivalencia módulo 5, las clases de equivalencia de -22, -6, 0 y 3 son:

-22 => El resto de -22 / 5 es 3, por lo tanto la clase de equivalencia son todos los múltiplos de 5 + 3:

[-22] = {…, -12, -7, -2, 3, 8, 13, 18, …}

-6 => El resto de -6 / 5 es 4, por lo tanto la clase de equivalencia son todos los múltiplos de 5 + 4:

[-6] = {… , −11, −6, −1, 4, 9, 14, 19, …}

0 => El resto de 0 / 5 es 0, por lo tanto forman parte de la clase todos los múltiplos de 5:

[0] = {…, -15, -10, -5, 0, 5, 10, 15, …}

3 => El resto de 3 / 5 es 3, por lo tanto:

[3] = [-22]

Vemos que mod m divide el conjunto de los números enteros Z en m-1 clases, lo que podemos expresar así:

Zm = {[0]m, [1]m, …, [m – 1]m}

Y como todos los infinitos enteros están contenidos en Zm :

Z = Zm = [0]m ∪ [1]m ∪ … ∪ [m – 1]m

Volviendo a la ecuación de congruencia ax ≡ b (mod m), llamando d al mcd de a y m y siendo d > 1 y d|b, las soluciones serán:

x1 + x1 + m1 , …, x1 + (d – 1)*m1

Donde m1 = m/d, a1 = a/d, b1 = b/d y x1 es la solución de la congruencia a1 x ≡ b1 (mod m1 ) Es decir, las soluciones serán los múltiplos de m1 + x1 Como el número de soluciones es d, se cumple xd < m

Vamos a calcular 12x ≡ 15 (mod 21):

mcd(12, 21) = 3 Por lo que la solución de 4x ≡ 5 (mod 7) será también solución de la ecuación que queremos resolver. El inverso de 4 ≡ 1 (mod 7) es 2. Formemos entonces las dos congruencias como vimos en el artículo previo:

  1. 4x ≡ 5 (mod 7)
  2. 2 ≡ 2 (mod 7)

Al multiplicarlas resulta la congruencia x ≡ 2 * 5 (mod 7), x ≡ 10 (mod 7), En Z7 10 y 3 son la misma clase de equivalencia, por lo tanto es equivalente x ≡ 3 (mod 7) Efectivamente 3 y 10 son soluciones de la ecuación inicial:

3*12 / 21 da resto 15 así como también lo da 120 / 21 La siguiente y última solución xd la da x2 + m: 17. Todas las demás soluciones están en la misma clase de equivalencia [3] en Z7

Además de que la primera solución nos da la clase de equivalencia donde encontraremos todas las soluciones también podemos observar los cuatro puntos siguientes:

Primero:

En Z7 tenemos que [3] = [10] = [17] = [24] = [31] = … = [3+7] = [45]

En Z21 tenemos que [3] = [24] = [45] = … = [3+21]

Segundo:

Todos los enteros que forman la clase de equivalencia de cada clase de resto en Z7 están también en Z21Las clases de restos que forman Z7 son {0, 1, 2, 3, 4, 5, 6} pero para abreviar veremos sólo [3] y [1]:

[3] en Z7 lo forman 7+ 3 = 10, 17, 24, 25, …, 45

[3] en Z21 lo forman 21+ 3 = 24, 45

[1] en Z7 lo forman 7+ 1 = 8, 22, 29, 43, …

[1] en Z21 lo forman 21+ 1 = 22, 43, …

Tercero:

Z21 tiene d veces las clases residuales que tiene de Z7

Cuarto:

Las soluciones de la ecuación de congruencia que hemos resuelto son los primeros d enteros de la clase [3] = 3, 10 y 17

En el artículo anterior tratamos los casos en que mcd(a, m) = 1. Usemos un ejemplo ya resuelto anteriormente: vimos que x ≡ 6 (mod 13) era la solución de 3x ≡ 5 (mod 13) Entonces Z13 [6] = 6, 19, 32,… Como mcd = 1 cogemos el primer entero de la clase de equivalencia: el 6. Por lo tanto, lo aquí expuesto es válido para toda ecuación de congruencia lineal.

El programa definitivo que resuelve cualquier tipo de ecuación de congruencia lineal es:

import sys
from sys import argv

def extendedEuclideanAlgorithm(old_r, r):
    negative = False
    s, old_t = 0, 0
    old_s, t = 1, 1

    if (r < 0):
        r = abs(r)
        negative = True

    while r > 0:
            q = old_r / r
            #MCD:
            r, old_r = old_r - q * r, r
            #Coeficiente s:
            s, old_s = old_s - q * s, s
            #Coeficiente t:
            t, old_t = old_t - q * t, t

    if negative:
        old_t = old_t * -1
        
    return old_r, old_s, old_t

a = long(argv[1])
b = long(argv[2])
m = long(argv[3])
#Para las soluciones no necesitaremos t pero lo recogemos para evitar el error.
mcd, s, t = extendedEuclideanAlgorithm(a, m)
if mcd == 1:
    inverse = (s * b) % m
    print "x ≡ {0} (mod {1})" . format(inverse, m)
elif b%mcd == 0:
    m1, b1, = m / mcd, b / mcd
    equivRelation = (s * b1) % abs(m1)
    print "x ≡ {0} (mod {1})" . format(equivRelation, m1)
    for i in range(mcd):
        print "Solución {0}: {1}" . format(i + 1, i * m1 + equivRelation)
else:
    print "No tiene solución"

Resolvamos la ecuación 4x ≡ 10 (mod 30):

vic@LESBIAN:~/mates$ ./inversoModuloNsoluciones.py 4 10 30
x ≡ 10 (mod 15)
Solución 1: 10
Solución 2: 25