Pequeña y poco útil herramienta, ¿ alguien se ha encontrado en el mundo real con la necesidad de saber si un número es primo o no? ,para saber si un número es primo o no y para saber cuales son los dos números primos que sumados dan un número par determinado.
Funciones utilizadas:
- Coincidir()
- Indice()
- Si()
- Entero
Rangos o variables con nombre:
- CGB=ConjeturaGoldbach!$B$1
- Num=Primo!$B$1
- Primos=NPrimos!$A:$A
- RaizNum=ENTERO(RAIZ(Primo!$B$1))
- RanSum=INDIRECTO("$g$3:$g" & Primo!$D$1+1)
- UCoin=Primo!$D$1
¿ Como podemos calcular si un número es primo o no? En principio un número primo es aquel que solo es divisible por uno o por si mismo. Si un número no es primo tiene al menos dos divisores, uno con un valor inferior a su raíz cuadrada y el otro con un valor superior a esa raíz, salvo en el caso de que su raíz cuadrada sea un valor entero, en el solo podemos asegurar un divisor. Además al menos uno de los divisores es un número primo. Por tanto, para calcular si un número es primo, o no, se puede dividir por todos y cada uno de los números comprendidos entre el entero de su raíz cuadrada y dos. Si una de esas divisiones nos da entero, en número no es primo y si en ninguna de ellas nos da entero el número es primo. Este es el camino largo, para acortar el proceso basta con dividir por los números primos que hay entre su raíz cuadrada y dos. Es mas complejo pero permite, dadas las limitaciones del Excel, aumentar el máximo numero a comprobar. En la hoja de cálculo utilizo este segundo método. Los 65536 primeros números primos los encuentro mediante programación, con la siguiente subrutina:
Dim N, I, X As Double, Es
N = 2
I = 1
Sheets(1).UsedRange.Clear
While N < 65536
I = I + 2
X = Int(Sqr(I))
Es = True
For j = X To 2 Step -1
If I / j = Int(I / j) Then
Es = False
Exit For
End If
Next
If Es Then
N = N + 1
Sheets(1).Range("a" & N).Value = I
End If
Wend
End Sub
La hoja NPrimos contiene los 65536 primeros números primos, en la hoja "Primo" hago encuentro si un numero es primo o no. En la hoja "ConjeturaGoldbach" encuentro al menos una pareja de números primos que sumados dan un determinado número par. El mecanismo de funcionamiento exige, en ambas hojas, activar el filtro después de escribir el número, eligiendo 1 en el desplegable de valores de la columna G en Primo y de la columna I en la conjetura.
Números primos. Hoja "PRIMO":
Números primos. Hoja "PRIMO":
- El numero a procesar se escribe en B1 (variable con nombre Num)
- Incluyo en la columna C, a partir de la línea 3, los números enteros del 0 al 655333.
- En D1, mediante la fórmula =COINCIDIR(RaizNum;Primos;1) (ver rangos y variables con nombre) , localizo el mayor número primo que es menor o igual al entero de la raíz cuadrada del número.
- En la columna E divido el número Num por los números primos menores al primero encontrado. Para ello utilizo la función =Num/INDICE(Primos;UCoin-$C3). Esta función produce un error cuando UCoin-$C3 es menor que uno.
- En la columna G, mediante la función condicional =SI(ENTERO($E3)=E3;1;0) indico que si el resultado de la división del apartado anterior es entero de un uno y si no un cero.
- Sumo la columna G en la variable con nombre RanSum ,=INDIRECTO("$g$3:$g" & Primo!$D$1+1). Si un número no es primo tiene varios divisores primos, hasta llegar a uno, y si lo es solo tiene uno, el uno. En ambos casos hay que sumar hasta la línea del uno, pero no incluirla. Esto significa que si el último primos menor o igual a la raíz está en la línea N hay que sumar N-1 terminos. Como empezamos el la línea tres, corregimos la fórmula hasta D1+1. No es necesario gestionar los errores dado que solo utilizamos el rango en el que no se ha producido ninguno.
- En H, mediante la función condicional =SI(SUMA(RanSum)=0;"Es primo";"No es primo") presento el resultado del proceso.
- Lamentablemente el filtro no se actualiza automáticamente, hay que activarlo cada vez, seleccionando uno en G.
Hoja ConjeturaGoldbach:
- El número par a comprobar se sitúa en B1.
- Cálculo la mitad de ese número en d1.
- Encuentro el mayor número primo que es menor o igual a la mitad del número procesado.
- El algoritmo consiste en restar cada número primo inferior a igual a la mitad del número procesado, restarlo del número para después encontrar, media la función COINCIDIR, el último primo menor que el resultado de la resta. Si este segundo número primo encontrado sumado al primero suman igual que el número procesado la conjetura se cumple. En la columna I, mediante el condicional SI se prepara, mediante 0 o 1 la selección del par de primos que hacen que la conjetura se cumpla.
- Lamentablemente el filtro no se actualiza automáticamente, hay que activarlo cada vez, seleccionando uno en I.