En este estudio nos dedicaremos a cuestiones derivadas del orden de las cifras de un número. Serán desarrollos sin mucha trascendencia, pues tan solo se pretende efectuar ejercicios de creación de funciones o de búsquedas. Al igual que nos ocurrió en otros desarrollos, en este comenzaremos con distintos tipos de números y sus propiedades respecto al orden de sus cifras, y seguiremos investigando con temas afines hasta constatar que pierden interés.
En todas las cuestiones deberemos concretar el tipo de
orden, que puede ser creciente, en sentido amplio, con cifras repetidas, o en
sentido estricto, en el que no se permiten cifras consecutivas iguales.
Igualmente, en el orden decreciente también usaremos los dos sentidos. Como el
tema es amplio, daremos preferencia a las cifras crecientes.
Tipos
de números y orden de sus cifras
Están publicadas muchas sucesiones que relacionan tipos
de números con sus cifras. Unos ejemplos:
Triangulares
con cifras crecientes (sentido amplio)
Están publicados en http://oeis.org/A234848:
0, 1, 3, 6, 15, 28, 36, 45, 55, 66, 78, 136, 378, 666,
1128, 1225, 1378, 2278, 2346, 2556, 5778, 12246, 13366, 22366, 22578,…
Aprovechamos esta sucesión para presentar nuestra función
en VBasic destinada a detectar este tipo de orden creciente:
Function
cifras_crecientes(n) As Boolean
Dim
j, l
Dim
c As Boolean
l = numcifras(n) ‘Cuenta las cifras del número
c = True
If l > 1 Then ‘Si
tiene una cifra, no lo estudiamos
j =
l
While
j >= 2 And c
If cifra(n, j) > cifra(n, j - 1) Then
c = False ‘Si una cifra rompe el orden, no es creciente
(se estudia de derecha a izquierda)
j =
j - 1
Wend
End
If
cifras_crecientes
= c
End
Function
La función NUMCIFRAS se define como
Function numcifras(n)
Dim nn, a
a =
1: nn = 0
While
a <= n
a =
a * 10: nn = nn + 1
Wend
numcifras = nn
End Function
Y la función CIFRA como
Function
cifra(m, n)
Dim
a, b
If n
> numcifras(m) Then
cifra = -1
Else
a = 10 ^ (n - 1)
b = Int(m / a) - 10 * Int(m / a / 10)
cifra = b
End If
End Function
Vemos que extrae las cifras en el orden desde las unidades hasta las decenas, centenas…
Con estas funciones es fácil encontrar los triangulares
que tienen sus cifras en orden creciente amplio. El criterio sería
ESTRIANGULAR(N) AND CIFRAS_CRECIENTES(N)
La primera función la hemos usado mucho. Puedes usar la
búsqueda estriangular( hoja en
Google. Exige que 8*n+1 sea cuadrado.
El resultado sería:
Es evidente que coincide con lo publicado. Esto solo ha
sido la comprobación de que nuestra función está correctamente diseñada.
En PARI la detección de cifras crecientes es brevísima.
Basta plantear
digits(m)==vecsort(digits(m))
Es una solución muy ingeniosa, porque viene a decir que
las cifras actuales coinciden con las cifras ordenadas. Si se desea orden
estricto, sin repeticiones, ha de incorporarse el parámetro 8 de esta forma: vecsort(digits(m,,8))
Por ejemplo, con esta línea encuentras los triangulares
con cifras en orden creciente estricto:
for(i=0,10^3,if(digits(i)==vecsort(digits(i),,8)&&issquare(8*i+1),print1(i,",
")))
Usamos los triangulares como introducción a las técnicas
adecuadas. Si deseas practicar o profundizar puedes consultar estas sucesiones:
http://oeis.org/A028864:
Primos con cifras crecientes.
http://oeis.org/A028820:
Ídem cuadrados.
http://oeis.org/A273045:
Números de Fibonacci.
Como los números oblongos, del tipo N(N+1) son olvidados
fácilmente, los rescataremos aquí:
Oblongos
con cifras crecientes
Un número oblongo es el doble de un triangular, luego si
en estos 8*n+1 ha de ser cuadrado, en los oblongos lo será 4*n+1. En esto se
basa nuestra función ESOBLONGO, y con ella podemos investigar en Excel junto a
CIFRAS_CRECIENTES. El resultado es
Con PARI podemos llegar más lejos:
0, 2, 6, 12, 56, 156, 1122, 2256, 4556, 11556, 111222, 445556, 11112222, 44455556, 222233556, 1111122222, 4444555556, 111111222222, 444445555556, 11111112222222, 44444455555556, 1111111122222222, 4444444555555556, 111111111222222222,
Primera versión: generar los oblongos a partir del 2, sumando luego 4, 6, 8. 10. El inconveniente es que hay que partir siempre del 2, no se puede iniciar, por ejemplo en 10^10. Es muy rápido al principio, pero luego ralentiza.
m=2;k=2;while(m<10^8,if(digits(m)==vecsort(digits(m)),print1(m,", "));k+=2;m+=k)
Lo hemos probado en https://pari.math.u-bordeaux.fr/gp.html
Segunda versión: construir m(m+1) y después aplicar el criterio. Es más lento, porque tiene que multiplicar en cada caso
Lo hemos probado con GP/PARI CALCULATOR con este resultado, que comprende los valores incluidos para m, 10^3 a 10^7:
Tercera versión: Es la más lenta, porque, como en Excel, aplica el criterio de que sea cuadrada la expresión (4*n+1). Lo comprobamos para números no muy grandes en la web de PARI:
ok(n)=digits(n)==vecsort(digits(n))&&issquare(4*n+1)
for(i=0,10^6,if(ok(i),print(i)))
Potencias perfectas con cifras crecientes
En este tipo nos limitaremos a presentar el resultado,
para animar a los lectores a intentar reproducirlo. Como pista, en PARI habría
que usar la función ispower:
4, 8, 9, 16, 25, 27, 36, 49, 125, 128, 144,
169, 225, 256, 289, 1156, 1225, 1369, 1444, 4489, 6889, 11236, 11449, 13456,
13689, 27889, 33489, 111556, 112225, 113569, 134689, 146689, 344569, 444889,
2666689, 2778889, 11115556, 11122225, 11135569, 11336689, 11444689, 13446889,…
Cubos
Aquí nos detendremos, porque su número es, al parecer, finito. Sólo se han encontrado los cubos 0, 1, 8, 27 y 125 con cifras crecientes en sentido amplio (en el estricto tendríamos menos posibilidades).
Empleando diversas técnicas y lenguajes, no ha sido posible encontrar más ejemplos de cubos con cifras crecientes, por lo que se puede enunciar la conjetura:
Sólo existen cinco cubos perfectos con sus cifras crecientes en sentido amplio en base 10.
Con hoja de cálculo podemos usar la función ESCUBO junto a la de cifras crecientes. Por el problema de los decimales, no es fácil determinar si un número desconocido es un cubo. Hemos usado esta versión:
Function escubo(n)
Dim a
a = Int(n ^ (1 / 3) + 10 ^ (-6))
If a
* a * a = n Then escubo = True Else escubo = False
End
Function
Buscamos, por ejemplo, entre 0 y 10^6, y conseguiremos tan solo esos cinco casos:
En PARI se pueden plantear dos puntos de vista: en el primero usar una función que detecte la propiedad directamente en un número cualquiera, y en el segundo se trata de ir construyendo los cubos uno a uno y esperar a que se cumpla la condición en uno de ellos.
Función directa
ok(n)=digits(n)==vecsort(digits(n))&&ispower(n,3)
Se entiende fácilmente con lo explicado con anterioridad. Esta función, aplicada a un número natural, indica si es un cubo (ispower(n,3)) y si sus cifras crecen (digits(n)==vecsort(digits(n)).
Es muy directa y sencilla, pero resulta bastante lenta, por tener que probar todos los números, sean cubos o no.
Construcción de cubos
Para encontrar cubos es preferible construirlos desde 0. Esto es lo que efectúa esta otra variante:
for(i=0,1000,m=i^3;if(digits(m)==vecsort(digits(m)),print1(m,”, “)))
Es tres veces más veloz que la función anterior, porque la variable m siempre será un cubo. He aquí el resultado:
Hemos llegado de varias formas hasta 10^24,
sin detectar otro cubo con cifras crecientes, por lo que podemos dar por cierta
la conjetura hasta que alguien descubra un contraejemplo.
Lo dejamos aquí por hoy. En la siguiente entrada estudiaremos algunos ejemplos con cifras decrecientes.
No hay comentarios:
Publicar un comentario