miércoles, 4 de mayo de 2016

“Palprimos” (primos palindrómicos)

Tomamos la palabra palprimo directamente del inglés, pero si te apetece, nómbralos como primos palindrómicos.

Según se deduce del nombre, los palprimos son números primos capicúas o palindrómicos (nos limitaremos al sistema de numeración en base 10 por ahora), es decir, que se leen igual de izquierda a derecha que de derecha a izquierda.

Los números de una sola cifra se suelen considerar palindrómicos (en realidad, cumplen la definición), por lo que es fácil entender que los primeros palprimos son

2, 3, 5, 7, 11, 101, 131, 151, 181, 191, 313, 353, 373, 383, 727, 757, 787, 797, 919, 929, 10301, 10501, 10601, 11311, 11411, 12421, 12721,…
(https://oeis.org/A002385)

Para identificarlos con hoja de cálculo necesitaremos la función ESPRIMO y la ESCAPICUA. Disponemos de las dos en nuestra colección, por lo que nos limitaremos a copiarlas aquí.

Public Function esprimo(a) As Boolean
Dim n, r
Dim es As Boolean

'Devuelve true si es primo.
es = False
If a = Int(a) Then  ‘Ha de ser entero
If a = 1 Then es = False ‘Casos particulares
If a = 2 Then es = True
If a > 2 Then
If a / 2 = Int(a / 2) Then ‘Descarta los pares
es = False
Else
    n = 3: es = True: r = Sqr(a) ‘Busca posibles divisores
    While n <= r And es = True
    If a / n = Int(a / n) Then es = False ‘Si se encuentra un divisor se declara compuesto
    n = n + 2
    Wend
End If
End If
End If
esprimo = es

End Function


Public Function escapicua(n) As Boolean
Dim l, i, k
Dim c As Boolean
Dim auxi$

  'Convierte el número en texto para lograr más rapidez. Devuelve VERDADERO si es palindrómico o capicúa
  
auxi = haztexto(n) ‘Se puede usar la función STR$ del Basic
l = Len(auxi)
If l < 2 Then
escapicua = False
Else
c = True
i = 1
k = Int(l / 2)
While i <= k And c
  If Mid(auxi, i, 1) <> Mid(auxi, l - i + 1, 1) Then c = False ‘Va comparando cada dígito con su simétrico
  i = i + 1
  Wend
End If
escapicua = c
End Function

Con estas dos funciones podemos encontrar palprimos en cualquier intervalo, contarlos u operar con ellos. Por ejemplo, con esta rutina podemos destacar los existentes en un intervalo:

Sub buscapalprimos()

Dim i,j
i = ActiveWorkbook.Sheets(1).Cells(6, 7).Value ‘Suponemos que el intervalo está
j = ActiveWorkbook.Sheets(1).Cells(6, 8).Value ‘alojado en las celdas G6 y H6.

fila = 15 ‘Inicio del listado

For i = j To l
If esprimo(i) And escapicua(i) Then
ActiveWorkbook.Sheets(1).Cells(fila, 6).Value = i ‘Se presenta e incrementamos la fila
fila = fila + 1
End If
Next i
End Sub

Aquí tienes el listado de los palprimos comprendidos entre 10000 y 11000:

10301
10501
10601

Como ves, muy pocos. Entre 1000000 y 1100000 sólo encontramos estos:

1003001
1008001
1022201
1028201
1035301
1043401
1055501
1062601
1065601
1074701
1082801
1085801
1092901
1093901

Antes de seguir adelante, quizás te hayas percatado de que no existen palprimos con un número de cifras par, porque entonces serían múltiplos de 11, y no primos, como le ocurre a 1771, que es igual a 7*11*23. Así que siempre nos referiremos a un número impar de cifras.

Se ha conjeturado que existen infinitos primos palídrómicos. Unos de los mayores encontrados es


(Tomado de Wikipedia)

Entre los mayores conocidos se encuentra el número de Belfegor, 1000000000000066600000000000001, llamado así por sus referencias al número de la bestia, 666.

La anterior rutina para destacar palprimos en un intervalo se puede transformar en una función que los cuente simplemente, sin tener que mostrarlos. Su estructura sería muy similar:

 Public Function cuentapalprimos(m, n)

Dim i, c
c = 0
For i = m To n
If esprimo(i) And escapicua(i) Then c = c + 1
Next i
cuentapalprimos = c
End Function

Con esta función comprobamos que entre 10000 y 11000 existen tres, que son los que presentamos arriba, y entre 1000000 y 1100000, los catorce reseñados.

Con un poco de paciencia se puede obtener el número de palprimos para cada número de cifras: De tres cifras existen 15, de cinco 93 y de siete 668. El resto requiere de otras herramientas. Tienes los datos en http://oeis.org/A016115

Suma de inversos

Se ha comprobado que la suma de inversos de los primeros palprimos converge a una constante cuyos primeros decimales son 1.32398… Pondremos a prueba la capacidad de nuestra hoja de cálculo: buscaremos los primeros con la rutina presentada más arriba, hallaremos sus inversos y posteriormente la suma de estos. Como la tabla resultará larga, copiaremos sólo los primeros y últimos términos:





Podíamos seguir con más cifras, pero ya vemos la tendencia a la constante límite. Con hoja de cálculo es preferible dejarlo aquí.

Hemos probado con los inversos de los cuadrados y ha aparecido una convergencia más fuerte (como era de esperar) hacia la constante 0,43008339502. Puedes probar otras posibilidades.