lunes, 21 de diciembre de 2015

Números belgas


Estos números han sido introducidos por Eric Angelini y publicados en el año 2005 en http://oeis.org/A106039. Hay varios tipos, por lo que comenzaremos con los 0-Belgas. Estos números tienen la propiedad de que si a partir del número 0 vamos sumando reiteradamente las cifras (por orden) del número dado, se forma una sucesión que contiene a ese número. Por ejemplo, el 18 es 0-belga, porque a partir del 0 vamos a ir sumando sucesivamente 1, 8, 1, 8,…hasta llegar o sobrepasar el 18: 0, 1, 9, 10, 18, resultando que el mismo 18 es término de la sucesión. Sin embargo, el 19 no lo es, porque se forma la sucesión 0, 1, 10, 11, 20, 21, 30,…al ir sumando sucesivamente 1, 9, 1, 9,… y el mismo 19 es sobrepasado sin pertenecer a la sucesión. Se llaman 0-belgas porque la sucesión la comenzamos en 0, y los primeros son estos:

0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 17, 18, 20, 21, 22, 24, 26, 27, 30, 31, 33, 35, 36, 39, … http://oeis.org/A106039

Si un número posee 3, 4 o más cifras, estas se irán también sumando de forma sucesiva y ordenada.

Llamaremos n-belgas a aquellos números que pertenecen a la sucesión formada al sumar cifras, pero comenzando en el número n, siendo n menor que el número dado. Así, estos son los 1-belgas:

1, 10, 11, 13, 16, 17, 21, 23, 41, 43, 56, 58, 74, 81, 91, 97, 100, 101, 106, 110,… http://oeis.org/A106439

Por ejemplo, el 23, comenzando en 1, genera con las cifras 2 y 3 la sucesión 1, 3, 6, 8, 11, 13, 16, 18, 21, 23,…a la que él mismo pertenece.
Se han publicado también los 2-belgas (A106518), los 3-belgas (A106596) y otros.

Función ESBELGA

Dado un número cualquiera, es posible saber si es 0-belga, 1-belga o de rango superior. Podemos idear una función con dos parámetros, uno, el número dado, y otro, el tipo. Como el objetivo de esta entrada es experimentar y descubrir curiosidades, daremos dos versiones de esta función, una un poco larga, antes de reflexionar sobre la cuestión, y otra simplificada.

En primer lugar pensamos en lo obvio:
* Deberemos extraer las cifras del número
* Después las iremos sumando ordenadamente a partir del número tipo
* Proseguimos hasta llegar o sobrepasar el presunto número belga
* Si un término de la sucesión coincide con el número dado, es que sí es belga.

Algo así, en el Basic VBA:

Function esbelga(n, t) ‘Los parámetros son el número y el tipo
Dim c(10) ‘Se reserva un vector para almacenar hasta diez cifras (se puede ampliar)
Dim i, nu, a, b, m, p
Dim es As Boolean

‘En primer lugar se extraen las cifras y se almacenan

i = 0: m = n
While m > 0
p = m - 10 * Int(m / 10)
i = i + 1
c(i) = p ‘memorias que guardan las cifras
m = Int(m / 10)
Wend
nu = i

‘Iniciamos la prueba para ver si es belga

es = False
i = 1: a = t ‘La variable a se inicia en el tipo
While a < n ‘Creamos una sucesión hasta n
m = i Mod nu: If m = 0 Then m = nu
a = a + c(nu - m + 1) ‘Se van sumando las cifras a la variable a
i = i + 1
If a = n Then es = True ‘Si la sucesión coincide con n, es belga
Wend
esbelga = es
End Function

Esta función resulta lenta para valores grandes de n, ya que contiene demasiados ciclos de suma de cifras. Sería más práctico eliminar todo esos ciclos dividiendo de forma entera n-t (siendo t el tipo de belga) entre la suma de sus cifras. Para números pequeños no se advierte diferencia en la rapidez del algoritmo, pero siempre debemos intentar simplificar. También se puede usar la función MOD para acelerar la extracción de cifras. Quedaría así:

Function esbelga(n, t) As Boolean
Dim c(10)
Dim i, nu, a, m, p, s
Dim es As Boolean

i = 0: m = n: s = 0
While m > 0
p = m Mod 10
i = i + 1
c(i) = p: s = s + p ‘Extracción de cifras en orden inverso
m = Int(m / 10)
Wend
nu = i

a = (n - t) Mod s ‘Se eliminan los ciclos de suma de cifras
i = 1
If a = 0 Then ‘Si el número es múltiplo de la suma de cifras, es belga
es = True
Else
es = False
For i = 1 To un ‘Se eliminan cifras de la suma para ir probando
If Abs(a - s) < 1 Then es = True ‘Debería escribirse a=s, pero así eliminamos problemas de coma flotante
If Not es Then s = s - c(i)

Next i
End If
esbelga = es
End Function

Por si deseas experimentar, esta es la versión de la función para PARI:

esbelga(n,p)={s=0;k=0;x=n;while(x>0,s+=x%10;x=(x-x%10)/10;k++);
r=(n-p)%s;t=s;x=n;e=0;for(j=0,k,if(r==t,e=1);t-=x%10;x=(x-x%10)/10;);
return(e);}

En la imagen se han generado con esta función los belgas de tipo 0, 1 y 2:



Algunas propiedades

Esta idea de eliminar previamente todos los ciclos de suma de cifras permite afirmar algo más:

Si un número es divisible entre la suma de sus cifras, será 0-belga.

En efecto, al sumar n ciclos de suma de cifras llegamos a n sin tener que recorrer la sucesión. Estos números son los llamados Números Harshad o de Niven:

 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 18, 20, 21, 24, 27, 30, 36, 40, 42, 45, 48, 50, 54, 60, 63, 70,… http://oeis.org/A005349

Aplícale a cualquiera de ellos la función ESBELGA con parámetro 0 y deberá devolverte siempre VERDADERO.

El número de k-belgas, para cualquier valor de k, es infinito.

Bastará sumar a k todos los múltiplos de la suma de cifras de cualquier otro número.

Todo número es k-belga para algún valor de k.

Porque k puede ser el resto de dividir n entre la suma de sus cifras.

Números autobelgas

Puede darse la casualidad de que un número que comienza por la cifra k, sea también k_belga. Por ejemplo, el 25 tiene como primera cifra el 2, y 2-belga.
Esto no pasa de ser un divertimento, como todo el tema, pero nos permite crear una función:

Function autobelga(n)
Dim c, l

l = Len(Str$(n)) – 1 ‘Extrae el número de cifras
If l = 1 Then c = n Else c = Int(n / 10 ^ (l - 1)) ’Extrae la oprimera cifra
If esbelga(n, c) Then autobelga = True Else autobelga = False ‘Comprueba si es belga
End Function

Con ella es fácil crear listados de autobelgas. En la imagen se han listado los comprendidos entre 10 y 30:



Están publicados en http://oeis.org/A107062

Estos números se llaman autobelgas de primer tipo. Hay otros de segundo, en los que además de coincidir la primera cifra con el tipo, también lo hace la segunda con la primera cifra del segundo término. No merece el tema tanta complicación. Te dejamos que busques información y experimentes.

miércoles, 9 de diciembre de 2015

Volvemos a los números "arolmar" (1) Historia y generación


Esta entrada y otras siguientes que aparecerán sobre el mismo tema suponen un regreso a una sucesión que ideamos en 2011, cuya originalidad atrajo a nuestro colaborador Rafael Parra, que fue quien le dio el nombre de “números arolmar”. Tanto él como el autor publicaron sobre el tema en OEIS (The On-line Encyclopedia of integer sequences). Ahora, transcurridos cuatro años, hemos querido desarrollar con tranquilidad la generación de esos números, así como sus propiedades, curiosidades y otras sucesiones afines.

No busque el lector profundidad en esta serie. Se trata tan sólo de exprimir a nivel descriptivo las posibilidades que nos ofrece esta sucesión, sin plantearnos otros objetivos.

Es posible que la publicación no se efectúe de forma consecutiva, a fin de no bloquear el blog si surgen cuestiones de actualidad. Pueden aparecer siete o más entradas distintas.

Historia

Con fecha 23/2/2011 se publicó en este blog una pequeña entrada titulada “Primos por todas partes” (http://hojaynumeros.blogspot.com.es/2011/02/primos-por-todas-partes.html) En ella se presentaba la sucesión

21, 33, 57, 69, 85, 93, 105, 129, 133, 145, 177, 195,…

Son números compuestos que tienen todos sus factores primos distintos (son números libres de cuadrados) y el promedio de esos factores es un número primo.

Por ejemplo 145=5*29, y el promedio de ambos es (5+29)/2= 17, que es primo.
195=3*5*13, y el promedio es (3+5+13)/3 = 21/3 = 7, también primo.

Posteriormente se publicó esta sucesión en OEIS (https://oeis.org/A187073), y Rafael Parra Machío les dio el nombre de números arolmar, dedicándoles un estudio publicado en http://hojamat.es/parra/arolmar.pdf

Dado el interés del tema, ampliaremos la búsqueda de esos números y estudiaremos algunos detalles más sobre esta sucesión y otras afines. Nos moveremos en un nivel de profundidad de tipo medio, que es el que domina el autor, sin pasar a cuestiones de criptosistemas, muy bien explicados en el documento de Rafael Parra. Nuestro objetivo será el de ampliar las formas de generarlos, estudiar alguna subsucesión y buscar números con propiedades similares.

En esta primera entrada reflexionaremos sobre su generación con varias herramientas.

Generación de la sucesión

Con el Buscador de Naturales

En el documento http://www.hojamat.es/publicaciones/Hojanum3.pdf publicamos la forma de encontrar estos números con nuestro Buscador de números naturales (http://www.hojamat.es/sindecimales/divisibilidad/herramientas/herrdiv.htm#global)

Basta leer las cuatro líneas de condiciones necesarias para entender la gran potencia de este buscador:



Si lo descargas y escribes las cuatro condiciones en la zona dedicada a ellas obtendrás los primeros términos de la sucesión:



En la primera columna figuran los términos y en la segunda el número primo promedio de los factores primos de los mismos.

La primera condición exige que el promedio de factores primos sea también primo. La segunda lo presenta. La tercera exige que esté libre de cuadrados, y la cuarta que no sea primo.

Con el Basic de las hojas

Al ser el Buscador una herramienta no contrastada, puede ser bueno comprobar los resultados con otros instrumentos. En este blog solemos usar el Basic de las hojas de cálculo. Si tenemos definidas las funciones pertinentes, la búsqueda se reduce a un simple bucle FOR-NEXT

Necesitamos las funciones

PARTECUAD

Te devuelve la parte cuadrada de un número natural. Si esa parte vale 1, es que el número es libre de cuadrados. La tienes en

http://hojaynumeros.blogspot.com.es/2011/05/parte-cuadrada-y-parte-libre-solucion.html

Se puede encontrar escribiendo PARTECUAD en Google.

ESPRIMO

La hemos usado mucho en este blog. La puedes encontrar en nuestra hoja sobre conjeturas

http://www.hojamat.es/sindecimales/divisibilidad/herramientas/herrdiv.htm#global

SOPF y F_OMEGA

(o SOPFR Y BIGOMEGA, que en libres de cuadrados son equivalentes)

La primera suma los factores y la segunda los cuenta. Su cociente dará el promedio.
En la entrada http://hojaynumeros.blogspot.com.es/2013/11/de-donde-vengo-3-sumamos-y-contamos.html damos algunas ideas sobre ellas.

Bucle

Con esas funciones y alguna otra podemos ya construir nuestro bucle de búsqueda:

For i = 2 to 1000
If Not esprimo(i) And partecuad(i) = 1 Then
b = sopf(i) / f_omega(i)
If esentero(b) And esprimo(b) Then msgbox(i)
End If
Next i

Implementando un programa similar en una hoja en la que los resultados aparecen bien ordenados, obtenemos los mismos resultados que con el Buscador:



En la primera columna figuran los números arolmar y en la segunda el promedio (primo) de sus factores primos.

Existen infinitos números arolmar, según veremos en la próxima entrada, siempre que se admita la conjetura de Goldbach. En el gráfico de los primeros de ellos (hasta una cota de 2000) se percibe una clara tendencia lineal, que en este intervalo presenta una pendiente aproximada de 17 con un ajuste de nivel 0,9971. Podemos esperar un número arolmar en cada incremento de 17.



Más incidencias presenta la distribución de los números primos que son promedio de sus factores:



En el gráfico distinguimos fácilmente varias líneas de tendencia ¿Adivinas la causa? Pues sí, depende del número de factores que intervengan en el promedio. La línea superior corresponden a los números arolmar que son semiprimos, la siguiente a los que tienen tres factores, y las de más abajo, que llegan a hacerse indistinguibles, a los números que poseen más factores aún. Como también veremos en utra entrada, este gráfico recorre todos los primeros números primos.

Código PARI

En la sucesión A187073 figura un código generador debido a Charles R Greathouse IV

 isA187073(n)=my(f=factor(n)); #f[, 1]>1&vecmax(f[, 2])==1&denominator(f=sum(i=1, #f[, 1], f[i, 1])/#f[, 1])==1&isprime(f) 

Como puede resultar incomprensible, por compacto, lo sustituiremos por otro más sencillo (y largo), pero que nos permitirá ir explicando las funciones que necesitamos:

freesqrcomp(n)=issquarefree(n)&&!isprime(n)
sopf(n)= { local(f, s=0); f=factor(n); for(i=1, matsize(f)[1], s+=f[i, 1]); return(s) }
averg(n)={local(s); s=sopf(n)/omega(n); return(s)}
{  for (n=4, 10^3,  if(freesqrcomp(n), m=averg(n);if(m==truncate(m),if(isprime(m), print1(n, ", ")))))}

En él se van implementando las condiciones exigidas a los números buscados.

Carácter de número compuesto libre de cuadrados:

Basta definir esta función.

freesqrcomp(n)=issquarefree(n)&&!isprime(n)

En ella exigimos que sea libre de cuadrados (issquarefree) y que no sea primo (!isprime(n)). El signo “!” representa la conectiva NO y && la conjunción Y. Si escribes a continuación “{print(freesqrcomp(30))}” la respuesta será 1, que significa VERDADERO, pues 30=2*3*5 es compuesto y libre de cuadrados. Ya tenemos el primer paso: identificar los números de este tipo.

Función SOPF

sopf(n)= { local(f, s=0); f=factor(n); for(i=1, matsize(f)[1], s+=f[i, 1]); return(s) }

Esta parte es más difícil de entender. Esta función suma los factores primos de un número sin contar las repeticiones. En PARI la matriz (o vector) factor(n) contiene los factores primos en la primera columna y sus exponentes en la segunda. La variable s suma sólo los factores primos, pero no sus exponentes. Por eso se escribe s+=f[i, 1])

Promedio de los factores primos

averg(n)={local(s); s=sopf(n)/omega(n); return(s)}

Se basa en la función anterior SOPF y en OMEGA, que cuenta los factores primos sin repetición. Por tanto, su cociente es el promedio de los factores primos.

Bucle de búsqueda

{  for (n=4, 10^3,  if(freesqrcomp(n), m=averg(n);if(m==truncate(m),if(isprime(m), print1(n, ", ")))))}

Lo que queda es ya recorrer los números (en el ejemplo desde 4 hasta 1000) e imprimir aquellos cuyo promedio de factores primos es entero (m==truncate(m)) y primo (isprime(m))

Aquí tienes la pantalla con el resultado:


Hemos querido detenernos en esta generación en PARI porque usaremos más adelante códigos similares.

Por último, incluimos la función ESAROLMAR, que nos devuelve VERDADERO si su argumento es un número arolmar. Con ella se pueden emprender otras búsquedas y encontrar curiosidades.

Función ESAROLMAR

Con el Basic de las hojas de cálculo podría tener esta estructura:

Public Function esarolmar(n)
Dim es As Boolean
Dim b

es = False
If Not esprimo(n) And partecuad(n) = 1 Then
b = sopf(n) / f_omega(n)
If esentero(b) And esprimo(b) Then es = True
End If
esarolmar = es

End Function

La segunda línea exige que el número no sea primo (Not esprimo(n))y que sí sea libre de cuadrados, o bien que su parte cuadrada sea igual a 1 (partecuad(n) = 1), que son las dos condiciones iniciales de la definición de número arolmar.

En la siguiente se calcula la media de los factores primos, dividiendo su suma (sopf(n)) entre su número (f_omega(n)) y, por último, se exige que el resultado sea entero y primo.

La versión con PARI necesita la definición progresiva de varias funciones:

freesqrcomp(n)=issquarefree(n)&&!isprime(n)
sopf(n)= { local(f, s=0); f=factor(n); for(i=1, matsize(f)[1], s+=f[i, 1]); return(s) }
averg(n)={local(s); s=sopf(n)/omega(n); return(s)}
esarolmar(n)={local(a=averg(n),s);s=freesqrcomp(n)&&a==truncate(a)&&isprime(a); return(s)}
{for(i=2,1000,if(esarolmar(i),print(i)))}

La última línea presenta todos los números arolmar hasta el 1000.

En la siguiente entrada sobre este tema estudiaremos el carácter impar de estos números y cómo aparecen sus diferencias (arolmar gemelos, cousin, sexy,...)

Recuerda que esta serie no se publicará de forma consecutiva. Intercalaremos otros temas y para el verano resumiremos todo en una publicación,