Números perfectos, primos de Mersenne y primos de Fermat#
Introducción#
En este capítulo presentaremos 3 clases de números, los números perfectos, los primos de Mersenne y los primos de Fermat. Exploraremos estas intrigantes categorías numéricas que han cautivado a matemáticos e investigadores durante siglos.
En el capítulo anterior vimos la función sigma \(\sigma(n)\), la cual nos devolvía como resultado la suma de los divisores de un número. En este capítulo veremos que los números perfectos son aquellos que al sumar sus divisores propios nos dan como resultado el número original. También veremos los números de Mersenne, los cuales están fuertemente relacionados con los números perfectos. Los números de Mersenne son de la forma \(2^n - 1\) , donde \(n\) es un número natural. Estos números deben su nombre al matemático francés Marin Mersenne, quien estudió detenidamente sus características. Finalmente, veremos los primos de Fermat, que también son números primos muy especiales. Estos números son de la forma \(2^{2^n} + 1\), donde \(n\) es un número natural. En general no se ha demostrado que existan una infinidad de estos números y aún es un problema abierto.
Números perfectos#
Definición 18
Un entero positivo \(n\) es un número perfecto si la suma de sus divisores propios positivos es igual a \(n\).
Si \(n\) es un entero positivo, es perfecto si \(\sigma(n) - n = n\), es decir, si \(\sigma(n) = 2n\).
Ejemplo 46
Veamos los 4 números perfectos mas pequeños.
Ejemplo 47
Veamos otra forma de escribir a los números perfectos.
Notemos que cada número perfecto en la lista anterior es par y es de la forma \(2^{p-1}(2^p-1)\), donde \(p\) y \(2^p-1\) son primos. Euclides demostró que los números de esa forma donde \(2^p-1\) es un número primo son números perfectos. El siguiente teorema lo demuestra.
Teorema 15 (Euclides)
Si \(n\) es un entero mayor o igual a \(2\) tal que \(2^n-1\) es un número primo, entonces \(N=2^{n-1}(2^n-1)\) es un número perfecto.
Demostración. Como \((2^n-1, 2^{n-1}) = 1\) por la Proposición 12, tenemos que
Por hipótesis \(2^n - 1\) es un número primo, entonces por la Observación 6 tendríamos que
Por lo tanto, como \(\sigma(N) = 2N\), \(N\) es un número perfecto. \(\square\)
Tiempo después, a la mitad del siglo \(\text{XVIII}\), Euler demostró que el inverso del Teorema 15 es cierto.
Teorema 16 (Euler)
Si \(N\) es un número perfecto par, entonces \(N\) es de la forma \(2^{n-1}(2^n-1)\), donde \(2^n-1\) es un número primo.
Demostración. Escribamos \(N\) de la forma \(2^es\), donde \(s\) es un número impar y \(e\ge 1\).
Por un lado, tenemos por hipótesis que \(N\) es un número perfecto. Entonces se cumple que
Por otro lado como \(2^e\) es par y \(s\) es impar resulta que \((2^e,s) = 1\), entonces por la Proposición 12 tenemos
Por lo cual podemos igualar las ecuaciones anteriores obteniendo,
Luego, podemos ver que \((2^{e+1},2^{e+1}-1) = 1\) y por el Corolario 2 tenemos que \(2^{e+1} \mid \sigma(s)\), esto quiere decir que para algún entero \(t\) tenemos que
Luego sustituimos \(\sigma(s) = 2^{e+1}t\) en \(2^{e+1}s = (2^{e+1}-1) \sigma(s)\) obteniendo lo siguiente,
Lo anterior implica que \(t\mid s\) y además que \(t \le s\).
¿Qué implicaría que \(t=s\)? Implicaría lo siguiente
Por lo anterior, si comparamos los exponentes \(1=e+1\). Entonces, \(e = 0\), lo cual sería una contradicción. Así, \(t<s\).
Ahora mostraremos que \(t=1\).
Notemos que la ecuación \(s=(2^{e+1} -1)t\) se puede reescribir de la siguiente manera,
Esto muestra que \(t\) es la suma de los factores propios de \(s\) pero \(t\) era un factor propio de \(s\). Entonces para que la relación \(s+t = \sigma(s)\) se cumpla, \(t\) debe ser igual a \(1\).
Así, tendríamos que \(s+1=\sigma(s)\). Entonces \(s\) tendría dos factores positivos \(1\) y \(s\). Como consecuencia, concluimos que \(s=2^{e+1} -1\) debe ser un primo.
Así, \(N = 2^e(2^{e+1}-1)\), donde \(2^{e+1}-1\) es un primo. \(\square\)
Veamos algunas propiedades que involucran a los números perfectos.
Proposición 14
Todo número perfecto par \(N\) puede expresarse como una suma de potencias de dos consecutivas.
Demostración. Sea \(N\) un número perfecto par, por el Teorema 16 \(N = 2^{n-1}(2^n-1)\), con \(2^n-1\) número primo.
Ya que \(2^n-1\) es primo, y \((2^n-1, 2^{n-1}) = 1\). Tenemos lo siguiente
Por definición de número perfecto tenemos que \(\sigma(N) = 2N\). Si sustituimos \(N\) y \(\sigma(N)\), tenemos
Así, concluimos que un número perfecto par se puede expresar como una suma de potencia de dos consecutivas. \(\square\)
Proposición 15
Si \(N\) es un número perfecto mayor que \(6\), entonces no puede representarse como potencia de un número primo.
Demostración. Sea \(N\) un número perfecto mayor que \(6\). Vamos a proceder por contradicción y supongamos que \(N = p^\alpha\), donde \(p\) es un número primo.
Por definición de numero perfecto tendríamos que \(\sigma(p^\alpha) = 2p^\alpha\). Por otro lado, por la Proposición 10 tenemos que \(\sigma(p^\alpha) = \frac{p^{\alpha +1} - 1}{p-1}\). Si juntamos estas igualdades obtenemos lo siguiente,
Esta última ecuación sólo tiene solución cuando \(p=1\), lo cual contradice la hipótesis, ya que \(p\) es un número primo. Así, un número perfecto mayor que \(6\) no puede ser la potencia de un primo. \(\square\)
Código para verificar si un número es perfecto#
El siguiente código nos ayudará a confirmar si un número es perfecto. En la actualidad se siguen buscando números perfectos y hay algoritmos mas eficientes que el que presentamos a continuación.
El código que presentamos no es eficiente para números enormes, de hecho a partir de números con 9 cifras el código es lento.
Utilizaremos las funciones construidas en la sección de suma de divisores.
def fact_primos_exponentes(n):
a = n
lst_descomp = []
for i in range(2, a+1):
while a % i == 0:
lst_descomp.append(i)
a //= i
if a == 1:
break
lst_primos = set(lst_descomp)
lst_exp = []
for i in lst_primos:
exp = lst_descomp.count(i)
lst_exp.append(exp)
return [list(lst_primos), lst_exp]
def suma_divisores(n):
b = n
lst_prim_exp = fact_primos_exponentes(b)
lst_1 = [i + 1 for i in lst_prim_exp[1]]
suma = 1
for i in range(len(lst_prim_exp[0])):
a = ((lst_prim_exp[0][i])**(lst_1[i])-1)//(lst_prim_exp[0][i] -1)
suma *= a
return suma
El siguiente código nos dice si un número entero positivo es perfecto o no.
def perfecto(n):
a = suma_divisores(n)
if a == 2*n:
print("El número ",n," es perfecto, ya que ",a, " = 2 x",n)
else:
print("el número ",n," no es perfecto.")
perfecto(8128)
El número 8128 es perfecto, ya que 16256 = 2 x 8128
perfecto(765923)
el número 765923 no es perfecto.
perfecto(8374615)
el número 8374615 no es perfecto.
perfecto(33550336)
El número 33550336 es perfecto, ya que 67100672 = 2 x 33550336
perfecto(8589869056)
El número 8589869056 es perfecto, ya que 17179738112 = 2 x 8589869056
Primos de Mersenne#
Una vez presentados los números perfectos, podemos notar que para encontrar números perfectos necesitamos encontrar primos de la forma \(2^p-1\). Lo que sabemos es que todo número perfecto es asociado a un número primo de Mersenne. Sólo se han descubierto una cantidad finita de números de Mersenne, por lo cual sólo se han descubierto una cantidad finita de números perfectos.
Definición 19
Si \(m\) es un entero positivo, entonces \(M_m = 2^m -1\) es llamado el \(m\)-ésimo número de Mersenne; si \(p\) es un primo y \(M_p = 2^p-1\) es también primo, entonces \(M_p\) es llamado un número primo de Mersenne.
Con la definición anterior podemos notar que no todos los números de Mersenne son primos y en la actualidad aún se está trabajando en la búsqueda de estos primos. Hasta el día de hoy que han sido escritas estas notas, se sigue preguntando ¿cuándo una expresión de la forma \(2^n-1\) es un número primo? Aún no hay una respuesta concreta, pero lo que sí podemos ver es lo que nos dice la siguiente proposición.
Proposición 16
Si \(m\) es un entero positivo y \(2^m-1\) es primo, entonces \(m\) debe ser primo.
Demostración. Vamos a demostrar por contrapositiva, es decir, probaremos que si \(m\) no es primo, entonces \(2^m-1\) no es primo.
Recordemos que si un número no es primo, entonces es compuesto o es \(1\).
Si \(m = 1\), tendríamos que \(2^m-1=2^1-1=1\) y por lo tanto la expresión \(2^m-1\) no es un número primo.
Entonces \(m\) debe ser compuesto, digamos \(m=ab\), en donde \(1 < a < m\) y \(1<b<m\).
Luego, tendríamos lo siguiente:
Como ambos factores al lado derecho de la ecuación son mayores que \(1\), podemos ver que \(2^m-1\) es compuesto si \(m\) es compuesto.
Por lo tanto, si \(2^m-1\) es primo, entonces \(m\) también debe ser primo. \(\square\)
Ejemplo 48
Dados \(m=7\) y \(m=10\), verifica si \(M_7\) y \(M_{10}\) son primos de Mersenne.
Solución.
Si sustituimos \(m=7\), tenemos la siguiente expresión:
Por tanto \(M_7\) sí es primo de Mersenne.
Si sustituimos \(m=10\), tenemos que \(10 = 5\cdot 2\), entonces:
Por lo tanto \(M_{10}\) es un número compuesto.
Entonces, ¿por qué se complica la búsqueda de estos primos? La respuesta es que aunque \(m\) sea primo, no siempre \(2^m-1\) es primo, y hay contraejemplos que lo muestran. Los matemáticos de tiempos pasados fueron muy hábiles para encontrar estos contraejemplos a mano, pero actualmente tenemos la potencia de la tecnología computacional. Con el siguiente código, podemos verificar que aunque \(m\) sea un número primo, \(2^m-1\) no necesariamente es primo.
Código para verificar si un número es primo de Mersenne#
Anteriormente creamos un código para ver si un número es primo, pero en esta ocasión vamos a crear un algoritmo con un poco más de condiciones.
def es_primo(n):
if n == 1:
return False
elif n > 1 and n <= 3:
return True
elif n % 2 == 0 or n % 3 == 0:
return False
else:
for i in range(5,int(n**0.5) + 1,2):
if n % i == 0:
return False
return True
es_primo(11)
True
es_primo(121)
False
es_primo(37747)
True
El siguiente código nos dice si el \(M_m\) número de Mersenne es un número primo de Mersenne.
Como \(2^p\) crece exponencialmente a partir de que \(p = 61\), la función empieza a demorar en verificar si el número \(2^p -1\) es primo.
def primo_mersenne(p):
numero_M_n = 2**p - 1
numero_M_p = es_primo(numero_M_n)
if numero_M_p:
return print(numero_M_n, "es un número primo de Mersenne.")
else:
return print(numero_M_n, "no es un número primo de Mersenne.")
primo_mersenne(7)
127 es un número primo de Mersenne.
primo_mersenne(17)
131071 es un número primo de Mersenne.
primo_mersenne(60)
1152921504606846975 no es un número primo de Mersenne.
primo_mersenne(23)
8388607 no es un número primo de Mersenne.
Como podemos observar, en la ejecución anterior del código estamos usando \(p=23\) que es primos, pero el número \(2^{23} - 1 = 8388607\) no es primos pues sus factores son \(47\) y \(178481\).
Primos de Fermat#
Definición 20 (Números de Fermat)
Los enteros de la forma \(f_n=2^{2^n}+1\) son llamados números de Fermat, donde \(n\) es un entero no negativo.
Ejemplo 49
Veamos los primeros 5 números de Fermat.
Continuando de esta manera, obtendríamos los siguientes números de Fermat. Fermat conjeturó que todos los números de esta forma eran primos y al menos los primeros 5 que mostramos sí lo son, Fermat en su búsqueda de todos los primos de la forma \(2^m +1\), notó que \(m\) debería ser una potencia de \(2\), de lo contrario no se obtendría un número primo.
Proposición 17
Si \(m\) no es potencia de \(2\), entonces \(2^m+1\) no puede ser un número primo.
Demostración. Como \(m\) no es potencia de dos, podemos tomar \(m=kh\) con \(k\) un entero impar más grande que \(1\). Entonces tendríamos lo siguiente:
Por lo anterior, podemos notar que es posible factorizar el número \(2^m +1\) y por lo tanto no podría ser primo.
Ejemplo 50
Veamos que si \(m = 6\), la expresión \(2^m+1\) no da como resultado un número primo.
Por lo tanto, \(2^6+1\) no es un número primo.
Euler demostró que la conjetura que hizo Fermat era falsa encontrando un contraejemplo. Euler mostró que \(f_5\) es divisible por \(641\). Para ello utilizó observaciones que no son obvias.
Ejemplo 51
Veamos que \(641 \mid f_5\).
Notemos que \(641 = 5\cdot 2^7 +1\). Reescribiendo esta ecuación tenemos \(641 - 1 = 5\cdot 2^7\), entonces tendríamos lo siguiente:
Por lo tanto, \(641\mid f_5\).
Una definición recursiva de \(f_n\)#
Teorema 17
Sea \(f_n\) que denota el \(n\)-ésimo número de Fermat. Entonces \(f_n = f_{n-1}^2 - 2f_{n-1} + 2\), en donde \(n\ge 1\).
Demostración. Por definición tenemos que \(f_n = 2^{2^n} +1\), entonces \(f_{n-1} = 2^{2^{n-1}} +1\). Sustituyendo esta expresión tendríamos lo siguiente:
Ejemplo 52
Calcula \(f_1,f_2,f_3\) con la siguiente regla de recursión:
Solución.
Código para verificar si un número es primo de Fermat#
El siguiente código nos ayuda a calcular los primeros 7 números de Fermat y nos dice si son primos o no. A partir del séptimo valor, el código comienza a demorar en hacer los cálculos ya que la expresión \(2^{2^n} + 1\) crece más rápido que la expresión \(2^n-1\) para buscar primos de Mersenne.
def primo_fermat(n):
numero_f_n = 2**(2**n) + 1
numero_f_p = es_primo(numero_f_n)
if numero_f_p:
return print(numero_f_n, "es un número primo de Fermat.")
else:
return print(numero_f_n, "no es un número primo de Fermat.")
primo_fermat(0)
3 es un número primo de Fermat.
primo_fermat(1)
5 es un número primo de Fermat.
primo_fermat(2)
17 es un número primo de Fermat.
primo_fermat(3)
257 es un número primo de Fermat.
primo_fermat(4)
65537 es un número primo de Fermat.
primo_fermat(5)
4294967297 no es un número primo de Fermat.
primo_fermat(6)
18446744073709551617 no es un número primo de Fermat.
Solo se conocen \(5\) primos de Fermat \(f_0, f_1, f_2, f_3, f_4,\) hasta el día de hoy que se hicieron estas notas. A partir de \(f_5\) y todos los \(f_n\) para \(n \ge 5\) han sido demostrados como compuestos.
Explicación del código#
Ya vimos que con los condicionales if
y else
podemos ejecutar bloques de códigos dependiendo de una condición. En este capítulo agregamos un condicional más, la sentencia elif
. Este condicional es usado si se quieren evaluar más condiciones para tomar diferentes caminos. El condicional elif
se coloca entre las sentencias if
y else
como vemos en el siguiente ejemplo.
if condición_1:
# Código a ejecutar.
elif condición_2:
# Código a ejecutar.
elif condición_3:
# Código a ejecutar.
else:
# Este código se ejecuta si
# todos los demás condicionales
# fueron falsos.
Podemos poner la cantidad de condicionales elif
que necesitemos. En el código anterior usamos el símbolo #
, éste se usa para hacer comentarios dentro del código, Python ignora esas lineas de código que tienen un #
por delante.
Para que un código dentro de una sentencia condicional se ejecute, es necesario que la condición que está en el condicional tenga un valor verdadero, es decir, un valor booleano de True
. Las condiciones dadas a esas sentencias como if
, elif
o while
pueden ser más complejas utilizando los operadores lógicos and
y or
. Estos operadores funcionan de manera similar a las reglas lógicas.
El valor del operador lógico and
será True
si ambas condiciones dadas son verdaderas. Si algunas de las condiciones es falsa el valor será False
.
n = 8
a = (n == 8) and (n < 10)
b = (n == 8) and ( n > 10)
En el ejemplo anterior el valor de la variable «a» sería True
, ya que \(n = 8\) es verdadera y \(n < 10\) también es verdadera. Sin embargo, el valor de la variable «b» sería igual a False
, ya que \(n = 8\) es verdadera pero \(n > 10\) es falsa.
El valor del operador or
será True
si al menos una de las condiciones dadas es verdadera y sólo será False
cuando ambas condiciones dadas sean falsas.
n = 8
a = (n == 8) or (n > 10)
b = (n == 5) or (n < 5 )
En el ejemplo anterior el valor de la variable «a» sería True
ya que \(n = 8\) es verdadera y \(n > 10\) es falsa. Pero el valor de la variable «b» sería False
ya que \(n = 5\) es falsa y \(n < 5\) también es falsa.
Cuando estamos interesados en sólo ver la parte entera de algún valor obtenido, podemos utilizar la función int()
la cual convierte valores flotantes, cadenas o booleanos en valores enteros.
a = int(14.653)
b = int("123")
c = int(True)
En el ejemplo anterior la variable «a» toma el valor de \(14\), la variable «b» toma el valor de \(123\), cambia el tipo de objeto de ser una cadena a un entero, la variable «c» toma el valor de \(1\).
Ya hemos trabajado con la función range()
. Habíamos visto que como primer argumento recibe el valor inicial del rango y como segundo argumento recibe el valor final menos \(1\) del rango. La función range()
acepta un tercer argumento, el cual especifica el incremento entre los elementos sucesivos del rango, si no se especifica, el incremento predeterminado es de \(1\).
for i in range(1,11,2):
print(i)
El código anterior nos daría de salida los valores de la función range()
los cuales serían \(\{1,3,5,7,9\}\), ya que el tercer argumento es \(2\), el rango empezaría en el valor \(1\) y incrementaría de dos en dos dando sólo los números impares del \(1\) al \(9\).
Ahora veamos cómo funcionan los códigos.
Vamos con el primer código.
def perfecto(n):
a = suma_divisores(n)
if a == 2*n:
print("El número ",n," es perfecto, ya que ",a, " = 2 x",n)
else:
print("el número ",n," no es perfecto.")
Definimos una función llamada «perfecto» la cual recibe como argumento un valor entero \(n\).
def perfecto(n):
Luego creamos una variable \(a\) en donde se guarda el valor de la suma de los divisores del entero \(n\) utilizando la función «suma_divisores» que creamos en la sección de sumas de divisores.
Luego creamos un condicionalif
, el código dentro del condicionalif
se ejecutará si se cumple que \(a = 2n\), dando como resultado que el número dado es perfecto. Si no se cumple lo anterior pasamos al condicionalelse
en donde se imprimirá el mensaje de que el número no es perfecto.
a = suma_divisores(n)
if a == 2*n:
print("El número ",n," es perfecto, ya que ",a, " = 2 x",n)
else:
print("el número ",n," no es perfecto.")
Veamos el siguiente código. Este código lo que hace es decirnos si un número es primo o no. Es una modificación al código creado en el capítulo de números primos y compuestos.
def es_primo(n):
if n == 1:
return False
elif n > 1 and n <= 3:
return True
elif n % 2 == 0 or n % 3 == 0:
return False
else:
for i in range(5,int(n**0.5) + 1,2):
if n % i == 0:
return False
return True
Definimos una función llamada «es_primo» que recibe como argumento un número entero positivo.
def es_primo(n):
Luego tenemos un condicional
if
nos regresa un valor deFalse
si el valor de \(n = 1\) ya que \(1\) no es número primo. Si no se cumple la condición pasamos al primer condicionalelif
el cual nos regresa un valor deTrue
si el valor de \(n = 2\) o \(n =3\) ya que estos dos son números primos. Si no se cumple la condición, pasamos al segundo condicionalelif
el cual nos regresa un valor deFalse
si el número \(n\) es divisible entre \(2\) o entre \(3\). Si lo anterior es falso, entonces pasa al último condicionalelse
el cual nos regresa un valor defalse
si el número \(n\) es divisible entre alguno de los números del rango. Notemos que el rango empieza en \(5\) y va avanzando de \(2\) en \(2\) y así saltamos a los números pares para hacer la mitad de evaluaciones. Si no es divisible entre alguno de los valores del rango, entonces la función nos regresará un valor deTrue
.
if n == 1:
return False
elif n > 1 and n <= 3:
return True
elif n % 2 == 0 or n % 3 == 0:
return False
else:
for i in range(5,int(n**0.5) + 1,2):
if n % i == 0:
return False
return True
El siguiente código nos ayuda a calcular los números de Mersenne y nos dice si el un número calculado es o no primo de Mersenne. Cuando el argumento que pasamos a la función es mayor que \(60\), el código empieza a ser lento en los cálculos.
def primo_mersenne(p):
numero_M_n = 2**p - 1
numero_M_p = es_primo(numero_M_n)
if numero_M_p:
return print(numero_M_n, "es un número primo de Mersenne.")
else:
return print(numero_M_n, "no es un número primo de Mersenne.")
Definimos una función llamada «primo_mersenne» la cual recibe como argumento un número entero positivo \(p\). Creamos dos variables, «numero_M_n» en donde se calcula el valor de \(2^p - 1\) y «numero_M_p» en la cual se verifica si el valor calculado en «numero_M_n» es o no primo. Esta variable solo guarda un valor de
True
oFalse
.
def primo_mersenne(p):
numero_M_n = 2**p - 1
numero_M_p = es_primo(numero_M_n)
Empezamos un condicional
if
el cual ejecuta el código dentro de él si el valor de la variable «numero_M_p» esTrue
y nos imprime en la consola que el número es un primo de Mersenne. En caso de que el valor seaFalse
, el código pasa al condicionalelse
, el cual nos imprime en la consola que el número no es un primo de Mersenne.
if numero_M_p:
return print(numero_M_n, "es un número primo de Mersenne.")
else:
return print(numero_M_n, "no es un número primo de Mersenne.")
El último código nos ayuda a calcular los números de Fermat y nos dice si el número es o no primo. Cuando el argumento que pasamos a la función es mayor que \(7\), el código empieza a tardar mucho en los cálculos por el crecimineot exponencial.
def primo_fermat(n):
numero_f_n = 2**(2**n) + 1
numero_f_p = es_primo(numero_f_n)
if numero_f_p:
return print(numero_f_n, "es un número primo de Fermat.")
else:
return print(numero_f_n, "no es un número primo de Fermat.")
Definimos una función llamada «primo_fermat» la cual recibe como argumento un entero positivo \(n\). Creamos dos variables «numero_f_n» en la cual guardamos el cálculo de la expresión \(2^{2^n} + 1\) y «numero_f_p» en la cual se verifica si el valor calculado en «numero_f_n» es o no primo. Esta variable solo guarda un valor de
True
oFalse
.
def primo_fermat(n):
numero_f_n = 2**(2**n) + 1
numero_f_p = es_primo(numero_f_n)
Empezamos un condicional
if
el cual ejecuta el código dentro de él si el valor de la variable «numero_f_n» esTrue
y nos imprime en la consola que el número es un primo de Fermat. En caso de que el valor seaFalse
, el código pasa al condicionalelse
, el cual nos imprime en la consola que el número no es un primo de Fermat.
if numero_f_p:
return print(numero_f_n, "es un número primo de Fermat.")
else:
return print(numero_f_n, "no es un número primo de Fermat.")
Ejercicios de práctica#
Demuestra que el producto de dos números perfectos pares no puede ser un número perfecto.
Demuestra que si \(N\) es un número perfecto par mayor que \(6\), entonces no puede representarse como el producto de dos primos .
Prueba por inducción lo siguiente.
Sea \(f_k = 2^{2^k}+1\) que denota el \(k\)-ésimo número de Fermat, en donde \(k\) es un entero no negativo. Entonces para todo entero positivo \(n\), se cumple que:\[f_0\cdot f_1\cdot f_2 \cdot \ldots \cdot f_{n-1} = f_n -2\]Con lo anterior, prueba que si \(m\) y \(n\) son dos números enteros diferentes no negativos, entonces los números de Fermat \(f_m\) y \(f_n\) son primos relativos.