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.