En la anterior entrada de esta serie se estudiaron funciones del tipo TRIANGULAR(N) o OBLONGO(N), que se caracterizan por poseer una fórmula, y sólo hay que buscar la función inversa u ORDEN, En esta segunda entrada se incluirán funciones sin fórmula, que necesitan la ayuda de una búsqueda.
Funciones
basadas en búsqueda
Es el caso de la función PRIMO(N). Se
necesita otra función, llamemos ESPRIMO, que indique si un número es del tipo
dado o no, y después habrá que contar los casos que indique su orden N para
llegar a a su valor. Lo vemos según el tipo, tomando los números primos como
ejemplo para los siguientes:
Función PRIMO(N)
Necesitaremos
la función ESPRIMO, descargable desde este blog, por ejemplo, en https://hojaynumeros.blogspot.com/2009/03/primos-reversibles-primo-omirp.html
El siguiente código, adaptable a cualquier
lenguaje de programación, encuentra el primo de orden n. Servirá de modelo para
otros ejemplos, cambiando la línea que se señala.
Function
primo(n)
Dim
p, c, i
'encuentra el primo cuyo número de orden
es n
c = 0: i = 1
While c < n
If esprimo(i) Then c = c + 1:
p = i ‘Esta línea se cambiará en otros ejemplos
i
= i + 1
Wend
primo
= p
End
Function
Por ejemplo, ¿cuál es el número primo de
orden 1000? La respuesta sería 7919. Lo comprobamos con PARI, que ya tiene
implementada la función PRIME:
? print(prime(1000))
7919
Volveremos a esta estructura de función.
Función inversa, ORDENPRIMO
También aquí nos servirá de modelo para
otros casos.
Function
ordenprimo(a) As Long
Dim
p, c As Long
If
not esprimo(a) Then ordenprimo = 0: Exit Function
c = 0
For p = 1 To a
If esprimo(p) Then c = c + 1 ‘línea
que cambiará según ejemplos
Next
p
ordenprimo
= c
End
Function
Se entiende bien. Se van recorriendo los
números del mismo tipo hasta llegar al que nos interesa. Por experiencia se
sabe que es útil que, si el número no es primo, la función devuelva un cero. De
ahí la inclusión de la primera línea.
Así, ordenprimo(100)=0 y ordenprimo(101)=27,
ya que primo(27)=103
En PARI no están implementados órdenes,
pero esta sencilla línea lo resuelve:
ordenprimo(a)=my(c=0,p);for(p=1,a,if(isprime(p),c+=1));c*isprime(a)
Aquí, la solución para que dé un cero si
no es primo se encuentra al final. Al multiplicar por isprime(a), anula
el resultado si no es primo, porque vale cero. En este recorte se observa la
aplicación de esta función al 100 y al 103:
Este modelo se usará más adelante si se ve
conveniente.
Una función similar es PRIMOSOPHIE(N), que
devuelve el enésimo primo de Sophie Germain. Basta añadir a esprimo(n)
la función esprimo(2*n+1)
Así, cambiaríamos la línea a If
esprimo(p) and esprimo(2*n+1) Then c = c + 1
Lo dejo como ejercicio. Debe dar, por
ejemplo:
primosophie(7)= 41, y ordenprimosophie(233)=16
Función SEMIPRIMO(N)
Los semiprimos son aquellos números
compuestos que equivalen al producto de dos primos. Como 4=2*2 y 62=2*31. La
función SEMIPRIMO es sencilla si se posee la BIGOMEGA, que es el número de
factores primos de un número. En PARI sí existe, con lo que los semiprimos son
aquellos en los que bigomega vale 2.
Sería essemiprimo(n)=bigomega(n)==2
En la imagen observamos dos resultados.
En el caso de VBASIC es preferible
dedicarle un código especial. Consiste en buscar dos primos tales que su
producto sea el número dado. Puede ser este:
Public Function essemiprimo(n)
As Boolean
Dim a, r
Dim es As Boolean
es = False 'Al
principio suponemos que no es semiprimo
a = 2 'La
variable a recorrerá los números primos
r = Sqr(n) ‘Tope
de búsqueda
While
a <= r And Not es
If
n / a = n \ a And esprimo(a) And esprimo(n / a) Then es = True
‘La variable a debe ser divisor,
primo, y su cociente con N también primo
If a = 2 Then a = a + 1 Else a
= a + 2 'Se busca el próximo primo
Wend
essemiprimo = es
End Function
Ahora basta sustituir, en la función
PRIMO(N), la línea
If
esprimo(i) Then c = c + 1: p = I por
If essemiprimo(i)
Then c = c + 1: p = i
Tendremos así formada la función SEMIPRIMO(N)
Como comprobación se dan algunos valores:
SEMIPRIMO(13)=35, SEMIPRIMO(100)=314 y SEMIPRIMO(1000)=3595
Igualmente podemos adaptar la función
ORDENPRIMO a ORDENSEMIPRIMO. Se deja como ejercicio. Esta es la comprobación de
los semiprimos del párrafo anterior:
Función CAPICUA(N)
Los números capicúas (o palindrómicos) son
los que presentan simetría en sus cifras (nos limitaremos a base 10), y tienen
un orden predecible, pero es más cómodo considerar que aparecen de forma
aleatoria. Por eso se incluyen aquí. Como en anteriores tipos, necesitamos una
función ESCAPICUA. En VBASIC de Excel y Calc ya está resuelta en este blog
(ver https://hojaynumeros.blogspot.com/2017/10/suma-de-cuadrado-y-capicua.html)
No tiene en cuenta los números de una
cifra.
En PARI
es sencilla:
ispal(n)=n==eval(concat(Vecrev(Str(n))))
Ya se ha explicado en este blog que
significa “convertir en texto, invertir sus cifras como vector, reunirlas y
calcular su valor”. Es bastante ingenioso.
Como en los otros casos, se cambia la línea
adecuada en el código y resulta la función.
Un ejemplo de búsqueda sería, por ejemplo:
Encontrar dos capicúas consecutivos cuya suma sea un número primo.
Introduciremos en un Buscador esta condición:
If ESPRIMO(CAPICUA(N)+CAPICUA(N+1))
Las primeras soluciones son:
Dos de las sumas son “palprimos”, primo y
capicúa, pero la central es número primo, pero no palindrómico. Si les
adjuntamos sus órdenes, observamos tres situaciones distintas:
En la primera, al sumar capicúas se suman
también sus órdenes, porque no hay arrastre de cifras. En la segunda hay un
cero porque no es capicúa, y en la tercera no se suman los órdenes.
Este tipo de funciones nos proporciona más
posibilidades en las búsquedas.
Otras funciones
Podíamos seguir con el tema de funciones
que necesitan una búsqueda previa. Algunas posibles serían:
INTERPRIMO(N): buscaría números que son
promedio entre dos primos consecutivos.
ESFENICO(N): para números que son producto
de tres primos distintos.
LIBREDECUADRADOS(N): cuando ningún factor
primo posee un exponente mayor que uno.
CUADPRIMO(N): cuadrado de un primo.
Con los estudiados ya se puede tener una
idea.





No hay comentarios:
Publicar un comentario