viernes, 10 de junio de 2022

Números con cifras crecientes o decrecientes (1)

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

 for(i=10^3,10^7,m=i*(i+1);if(digits(m)==vecsort(digits(m)),print(m)))

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: