Tratando de explicar el Teorema Aúreo con R
- fjroar
- 26 jul 2021
- 7 Min. de lectura
Siguiendo un poco con la estela que abrí en R sobre el cómo utilizar R para ayudar a entender un poco la Teoría de Números, cité en un post anterior a la librería primes:
Pero sin duda la librería que realmente tiene una gran cantidad de funciones relacionadas con esta teoría es la que se denomina numbers (no confundir con la serie del mismo nombre, donde unos policías resuelven casos de modo totalmente inverosímiles haciendo razonamientos que en ocasiones se tardarían miles de años en que las máquinas acabaran sus resultados, mucho después de que el criminal muriese y perpetrara muchos más crímenes … hasta aquí mi crítica a la serie, ahora seguimos, disculpad jjjj)

Uno de los resultados claves de esta teoría es el denominado por Karl Friedrich Gauss como el Theorema Aureum, del que voy a hablar aquí un poco sobre curiosidades históricas y sobre cómo hacer uso de R para analizar algunas de los elementos que lo acompañan, aunque intentaré en la medida de lo posible hacerlo entendible, pero aviso que el enunciado en sí resulta un poco complicado.
Para entender el Theorema Aureum, hay que tener en cuenta que el ser humano intenta siempre generalizar el conocimiento de lo particular, sencillo y conocido, a otros marcos distintos y cada vez más generales. En este caso, a finales del siglo XVIII estaba emergiendo la Teoría de las Congruencias que Gauss sistematizará en sus Disquisitiones Arithmeticae.
Un grado más de detalle en este teorema, implica entrar en el concepto de cuerpo numérico que básicamente viene a ser como un conjunto de números con operaciones de suma, multiplicación, elemento nulo, neutro y que verifican un montón de propiedades; así pues un ejemplo de cuerpo es por supuesto conjunto de los números racionales (reales, complejos, etc); pero los matemáticos notaron de que no era necesario disponer de infinitos números para tener las propiedades anteriores, sino que se podían crear clases de equivalencia de modo por ejemplo que siempre que se contase de 7 en 7, justo en el número 7 empezaría el 0, es decir, el universo de los números se restringe a 0, 1, 2, 3, 4, 5, 6 y si por ejemplo aparecía un nuevo número, por ejemplo el 85, pues se hacía la división por 7 cuyo cociente es 12 y por tanto dado que 7 · 12 = 84 y hasta 85 hay 1 unidad, entonces 85 sería lo mismo que el número 1. Todo lo anterior se expresa en matemáticas como:
85 ≡ 1 mod(7)
Pues bien, siempre que lo que haya dentro de la expresión mod(p) sea un número primo p, se genera un cuerpo numérico con las propiedades que conocemos de adición, multiplicación con existencia de los elementos unidad y nulos que se conoce en cualquier otro cuerpo (además si el número no es primo, se obtienen menos propiedades, pero aún hay una estructura como es el caso de un anillo). Pues bien, en R hay muchas formas de resolver una congruencia y saber a que es equivalente, de hecho es lo mismo que calcular el resto de la división y así por ejemplo en la librería numbers bastaría con usar mod(85, 7) y se obtiene 1 pero aún es más sencillo si desde R base se utiliza 85%%7, por lo que hasta aquí "nada nuevo bajo el Sol".
Dado que se tenían infinitos cuerpos numéricos, tantos como números primos, y además sencillos de manejar, el siguiente paso que se plantea es la resolución de ecuaciones diofánticas (en números enteros) en dichos nuevos cuerpos. Una de tales ecuaciones de tipo diofántico es la siguiente:
a x ≡ b mod(m)
Claramente en esta expresión hay que despejar la x pero ¿Se puede siempre lograr solución como un número dentro del cuerpo (anillo)? Nótese que en el conjunto de los número racionales la solución es super sencilla (aquí no se aplica el tema módulo y se usa el signo =):
a x = b sí y sólo sí x = b / a si a no es 0
Ya por la época de Gauss el problema para la ecuación modular e incluso para sistemas lineales de ecuaciones de este tipo era bastante conocido y caracterizado para cualquier valor valor de m.
Pues bien, lo que se planteó a mitad del XVIII por Euler y donde Gauss en 1801 ofrece una prueba completa del resultado es la resolución de las expresiones siguientes:

Nótese que ya no se habla de un número m cualquiera, ya que se tiene que estar al menos en un cuerpo numérico y para ello el número con respecto al que se toma módulo debe ser primo, además una expresión es como la “espejo” o más bien la recíproca de la otra, de ahí el nombre de la Ley de Reciprocidad Cuadrática. Pues bien, este problema planteado y enunciado 1742 por Euler, resistió a ser demostrado por otro de los grandes del momento como era Legendre, y en este entorno de élite matemática, va un chaval de 19 años que se lo toma como reto personal, además no sólo es capaz de caracterizar las soluciones del anterior sistema, sino que por primera vez en 1801, publica una obra que es capaz de unificar y sintetizar gran parte de la teoría de números conocida hasta la época. Por otro lado, tanto le gustó la demostración del resultado, que llegó a dar a lo largo de su vida unas 8 demostraciones distintas (actualmente se conocen unas 233).
Un modo de simplificar la demostración del Teorema Aúreo es a través de la notación usada por Legendre en 1798 (que casi lo llegó a demostrar, pero … cachis, no lo logró). Legendre introduce una notación curiosa que en matemáticas se sigue denominando como Simbolo de Legendre y que se denota por (de modo parecido a una fracción con paréntesis):

Pues bien, la librería numbers tiene precisamente implementado dicha función de modo que somos capaces, analizar, tal y como se observa en la figura de la portada qué números del 1 al 100 son o no residuos cuadráticos de todos los primos entre 1 al 100. Una figura como la anterior se lograría en R con la siguiente sintaxis (los cuadrados en negros son aquellos cuyo Simbolo de Legendre vale 1 y en los blancos, este toma el valor de -1):
library(tidyverse)
library(ggplot2)
library(numbers)
m_legendre = matrix(nrow = 99, ncol = length(Primes(99)))
for (i in c(1: 99)){
for (j in c(1:ncol(m_legendre))){
m_legendre[i, j] = legendre_sym(i, Primes(99)[j])
}
}
m_legendre<- as.data.frame(m_legendre)
col_n <- paste0("p_", Primes(99))
col_n <- ifelse(nchar(col_n) == 3, paste0('p_0', substr(col_n, 3, 3)), col_n)
row_n <- paste0("n_", c(1: 99))
row_n <- ifelse(nchar(row_n) == 3, paste0('n_0', substr(row_n, 3, 3)), row_n)
names(m_legendre) <- col_n
rownames(m_legendre) <- row_n
m_legendre <- m_legendre %>%
as.data.frame() %>%
rownames_to_column("numbers1to100") %>%
pivot_longer(-c(numbers1to100), names_to = "primes1to100", values_to = "legendre")
m_legendre %>%
ggplot(aes(x=primes1to100, y=numbers1to100)) +
geom_tile(aes(fill=legendre)) +
scale_fill_gradient(low = "white", high = "black")
Y así pues tras todo este preámbulo, se enuncia el resultado que tanto llenaba de orgullo a Gauss:
Theorema Aureum
Dado el sistema:

1.- Si alguno de los primos p y q pertenecen a la sucesión 4k + 3 entonces una de las 2 congruencias cuadráticas tiene solución sí y sólo sí la otra no la tiene
2.- Si alguno de los primos p y q pertenecen a la sucesión 4k + 1 entonces o bien ambas congruencias tienen solución o bien ninguna de las 2 las tiene
Lo anterior por tanto se resume en la siguiente expresión en términos de Símbolo de Legendre:
Theorema Aureum (Versión 2)

Nótese que en el caso que p y q sean primos de la forma 4k + 3, el producto del exponente es impar y en caso contrario es par, valiendo respectivamente -1 y 1 el resultado de la izquierda. Por tanto como el símbolo de Legendre sólo puede valer 1, 0 ó -1, para que sea cierta la anterior igualdad, los signos deben estar cambiados (es decir, se tiene una congruencia y la otra no) y si son de la forma 4k + 3, entonces los signos deben de ser los mismo, es decir, o se tienen las 2 congruencias o no se tiene ninguna.
Para entender mejor el anterior resultado, se buscan 2 primos de la forma 4k + 1, uno de ellos puede ser directamente el número 5 y el otro podría ser el 13. Ahora ya se puede saber directamente si el sistema de ecuaciones siguiente tendrá o no solución:

Para ello se tiene que (5 – 1)(13- 1) / 4 = 12 y por tanto las 2 conguencias o tienen solución o no la tienen, para averiguarlo, usamos R:
legendre_sym(5, 13) = -1
legendre_sym(13, 5) = -1
Por tanto, el sistema anterior no es resoluble, pero sí lo sería por ejemplo el sistema formado por 13 y 17, en este caso:
legendre_sym(13, 17) = 1
legendre_sym(17, 13) = 1
De hecho aquí sale a la palestra otra interesante función de la librería modsqrt() que da una solución factible en caso de existir o 0, así pues ante los 2 caso anteriores se tiene que las soluciones, vía R son las siguientes:
modsqrt(13, 17) = 8, nótese que 8·8 – 13 = 3 · 17
modsqrt(17, 13) = 2, nótese que 2·2 – 17 = -1 · 13
Finalmente tal y como se ha visto, en el plano de las ecuaciones con cierta complejidad, la resolución puede resultar muy costosa conforme se sube de grado, se habla de reciprocidad cuadrática, pero también existe la cúbica y la bicuadrática y más generalizaciones, el nivel de dificultad aumenta exponencialmente y no sólo en lo que concierne a la demostración sino también a sus correspondientes enunciados ...
La Teoría de Números supone un reto en sus resultados, pero tras el reto intelectual llegan las aplicaciones reales, así que mientras que para Gauss demostrar lo anterior era un modo de decir al mundo “soy el más grande”, años después se descubre que existen aplicaciones más “mundanas” que una simple lucha intelectual, como son la criptografía y el diseño de difusores acústicos tipo Quadratic Residue Diffussor que aprovecha la simetría numérica que subyace bajo este hermoso resultado.
Comments