jueves, 10 de noviembre de 2022

Números con divisores consecutivos

 Todos los números pares poseen al menos un par de divisores consecutivos, el (1, 2). Los múltiplos de 6 poseen también el (2, 3). Los factoriales poseen muchos, debido a su definición. Por ejemplo, 5!=120 posee los pares (1,2) (2,3) (3,4), (4,5) y (5,6). En el extremo opuesto están los impares, y entre ellos los primos mayores que 2, en los que no existe ningún par de divisores consecutivos, como es claro.

Otros números poseen pares inesperados. Por ejemplo 936 posee el par (12, 13), que no se esperaría sin conocer su descomposición factorial. Es elemental construir un número con los pares de consecutivos que nosotros deseemos, por ejemplo 5*6*17*18. Basta multiplicar según sea nuestro objetivo.

No es difícil, ante un número propuesto cualquiera, como el 17432, averiguar si posee divisores consecutivos. En primer lugar, solo trabajaríamos con números pares, pues los impares no presentan esta situación, ya que n(n+1) es siempre par.

Otra forma de presentar el problema es la búsqueda de divisores oblongos, ya que al tener la descomposición N(N+1) nos garantizan la existencia de un par de divisores consecutivos.

Con toda esta introducción y alguna búsqueda previa, queda claro que los casos de uno o de dos pares no tienen mucho interés, ya que cada tres números pares consecutivos aparecerá un múltiplo de 6.

Búsqueda del número de pares

La experiencia de años nos indica que en las búsquedas es conveniente comenzar con ideas muy simples, para después complicar si se ve necesario.

En este caso el esquema de búsqueda sería:

·       Llamamos N al número y M al número de pares encontrado.

·       Averiguamos si es par. Si no lo es le asignamos una salida M=0

·       Si es par, recorremos los números menores que él desde el 1 hasta N/2-1, que sería el mayor divisor a considerar (pues N/2 siempre sería divisor). Iniciamos M=0. Añadimos un caso especial para N=2.

·       Por cada par que aparezca, incrementamos M en una unidad, y al final esa sería la salida del algoritmo.

En Excel se podría definir esta función:

Public Function paresdivcons(n)

Dim m, d

If n / 2 <> n \ 2 Then paresdivcons = 0: Exit Function 'No es par

If n = 2 Then paresdivcons = 1:exit function ‘Caso del 2

m = 0 'Contador de pares

For d = 1 To n / 2 - 1

If n / d = n \ d And n / (d + 1) = n \ (d + 1) Then m = m + 1 'Hay un par

Next d

paresdivcons = m

End Function

Hemos usado el criterio n/d=n\d, que es sencillo, para averiguar si n es múltiplo de d (se iguala la división con decimales con la división entera). Podíamos haber usado también n mod d =0.

Así el número que se eligió como ejemplo más arriba, el 17432, tendría un solo par de divisores consecutivos, porque paresdivcons(17432)=1. Será entonces, necesariamente, el par (1,2), como puedes comprobar en el listado de divisores:

17432 8716 4358 2179 8 4 2 1


Casos particulares

Vimos más arriba que los números impares no pueden tener pares de divisores consecutivos. En ellos M=0

Los semiprimos pares, salvo el 6, presentarán un solo par, el (1,2) porque si N=2P con P primo, sus únicos divisores serían 1, 2, P y 2P, por lo que solo contaríamos con dos pares si P=3.

Estos dos casos, junto al de los factoriales, nos da la idea de establecer una medida de la abundancia de pares de consecutivos que posee un número. Para mejor comparar unos  con otros, podíamos medir esta cuestión con el cociente M/D, siendo D el número total de divisores. Así, M/D siempre estaría entre 0 y 1, lo que facilitaría las gráficas y las comparaciones. Le vamos a llamar ADP (abundancia de pares).

El conteo de los divisores de un número está muy estudiado. Es la función TAU o DIVISOR, que puedes consultar en nuestra publicación “Funciones multiplicativas”,

 http://www.hojamat.es/publicaciones/multifun.pdf

En esta tabla puedes observar los valores de ADP en los primeros números pares:

La primera columna contiene el valor del número N, y después le siguen M, número de pares, TAU, como contador de divisores, y a continuación su cociente, APD, que hemos tomado como medida estándar. Las dos últimas columnas contienen respectivamente, los factores primos y la lista de divisores, para comprobar. El segundo número que figura entre corchetes en la columna de factores es su exponente. Por ejemplo, para 12 es [2,2][3,1].

En este listado comprobamos que los que menos abundancia tienen son los semiprimos mayores que 6, con APD=0,25, y unos que habíamos olvidado, como son las potencias de 2. Observamos que 8, 16 y 32 solo preesentan el par (1,2).

Si construimos una gráfica, deberemos esperar algún tipo de periodicidad:

 

Se observan máximos relativos en 2, 6 y 12  y mínimos en 70 y 88 y periodos parciales de 6 unidades.

 

Caso general

Con lo que hemos observado hasta ahora podemos resumir la situación para números en general:

Todo número N se puede descomponer de la forma N=2k*p1*p2*p3…, donde p1, p2 p3, son primos impares , repetidos o no.

Si N=2k, sin primos acompañantes, ya sabemos que solo puede presentar el par (1,2)

Por el contrario, si N=p1*p2*p3…todos los divisores son impares, y es imposible que contengan ningún par de divisores consecutivos.

Por último, si N contiene potencias de 2 y también algún primo, deberemos distinguir

Si la potencia de 2 tiene exponente 1, y solo existe un primo mayor que 3, por ejemplo en 2*7=14, como semiprimo de este tipo presentará el par (1,2).

Si la potencia de 2 es mayor, pueden surgir pares por pura coincidencia, como en N=23*7=56, en el que aparece el par (7,8).

Si existe abundancia de factores primos, es de esperar que surjan más pares, pero esta es una idea empírica. Sobre ella construiremos algunas frecuencias sin valor probatorio.

 

Frecuencias

Para tener un término de comparación, recorreremos todos los números pares desde 2 hasta 20000 para encontrar las frecuencias según el número de divisores. Para quienes sientan curiosidad, hemos usado esta función de Excel:

Function histodivcons$(n)

Dim i, a

Dim f(9)

Dim s$

For i = 0 To 9: f(i) = 0: Next i

For i = 1 To n

a = paresdivcons(i * 2)

If a < 9 Then f(a) = f(a) + 1 Else f(9) = f(9) + 1

Next i

s = ""

For i = 1 To 9: s = s + Str$(f(i)) + ", ": Next i

histodivcons = s

End Function

 

En este caso, con números sin filtrar, resultan esta tabla y este diagrama de columnas:


Ahora podríamos exigir que su número de divisores (función TAU) sobrepasara el número 16 (o igual a 16), que es el que presentan los números con cuatro divisores sin repetir. Resultaría entonces algo muy distinto:


Por último, si exigimos que TAU sobrepase el valor 31, queda:

 

Queda así comprobada de forma empírica la influencia del número de divisores en el de pares de consecutivos. Esto refleja la componente de azar que presentan estos.


lunes, 24 de octubre de 2022

Regresos 5 – Un cuadrado y una unidad (2)

Triangulares del tipo n2+1

Si a un número natural le exigimos que sea triangular del tipo n2+1, es equivalente a que su anterior sea un cuadrado. Buscamos, pues, un cuadrado seguido de un triangular. No es difícil plantearlo. En nuestras funciones de Excel sería, usando la conectiva lógica Y:

Y(ESCUAD(N-1);ESTRIANGULAR(N))

Con ella es fácil encontrar los primeros ejemplos de triangulares con la forma n2+1:

10=4*5/2=32+1

325=25*26/2=182+1

11026=148*149/2=1052+1

Con PARI podemos usar el criterio issquare(i-1)&&issquare(8*i+1) y obtendríamos fácilmente otro elemento, el 374545.

Estudio algebraico

Podemos plantear que un número triangular sea el consecutivo a un cuadrado:

X*(X+1)/2=Y2+1

Manipulamos esta igualdad buscando una ecuación diofántica tipo Pell-Fermat:

X2+X-2Y2-2=0

4X2+4X+1-8Y2-9=0

(2X+1)2-8Y2=9

Z2-8Y2=9

En este tipo de ecuaciones solemos intentar resolverlas como una ecuación de Pell (en lugar del 9 debería haber un 1 o un -1), para después aprovechar, si es posible, la recurrencia entre soluciones.

Usamos nuestra hoja de cálculo correspondiente (descargable desde http://www.hojamat.es/sindecimales/aritmetica/herramientas/herrarit.htm#pell)

Sus primeras soluciones son:

Z=9, X=4, Y=3, con el triangular 4*5/2=10 y el cuadrado 3^2=9

Z=51, X=25, Y=18, Triangular 25*26/2=325 y cuadrado 18^2=324

“Engañamos” al algoritmo usando como primera solución Z=9, Y=3, con lo que el resto de soluciones se genera fácilmente de forma recursiva:


Excel no puede seguir con más cifras enteras. Estas soluciones están publicadas en http://oeis.org/A164055:

A164055    Triangular numbers that are one plus a perfect square.    

1, 10, 325, 11026, 374545, 12723490, 432224101, 14682895930, 498786237505, 16944049179226, 575598885856165, 19553418069930370, 664240615491776401, 22564627508650467250, 766533094678624110085, 26039560591564569275626

Con el lenguaje PARI el planteo es muy simple:

for(i=1,10^8,if(issquare(i-1)&&issquare(8*i+1),print1(i,", ")))

Aquí se exige que i sea triangular (issquare(8*i+1)) y que su anterior sea cuadrado (issquare(i-1))

En esta captura de pantalla se comprueba el resultado:


Ha sido interesante estudiar esta sucesión desde varios puntos de vista.

Oblongos del tipo n2+1

Es costumbre nuestra prolongar los estudios sobre triangulares a sus dobles, que son los números oblongos: O(n)=n(n+1). Nuestra sorpresa ha sido que solo existe la solución X=2=1*2 Y=12

No es difícil justificar esa ausencia. Si planteamos la ecuación lo razonaremos:

X(X+1)=Y2+1

X2+X=Y2+1

Y2-X2=X-1

Esta igualdad solo se cumple para X=1 y X=Y

En los demás casos, con X>1, la diferencia entre X2 y su siguiente cuadrado es 2X+1, siempre mayor que X-1, luego no habrá más soluciones.

Poligonales del tipo n2+1

Hemos estudiado ya los triangulares, y los cuadrados no se pueden considerar en este caso porque no tendría sentido, así que probaremos con los pentagonales. Nuestra función ESPOLIGONAL (ver, por ejemplo, https://hojaynumeros.blogspot.com/2021/09/consecutivos-que-son-poligonales.html) nos puede ayudar con la hoja de cálculo.

Con Excel

Usamos la fórmula de los pentagonales, P(n)=(3*n2-n)/2, y un algoritmo similar, obteniendo:

Pentagonal  Cuadrado

1                   0

5                   4

145             144

2501           2500

43265         43264

Comprobamos con este código PARI:

is(n)={my(m=1+24*n,b=(1+sqrt(m)));issquare(m)&&b%6==0&&issquare(n-1)}

 for(i=1,5*10^8,if(is(i),print1(i,", ")))

Obtenemos:

1, 5, 145, 2501, 43265, 1387685, 24010001, 415425925

Es muy costoso y lento seguir. Lo dejamos en este punto.

Invitamos a repetir el trabajo con hexagonales. Entre los primeros sólo hemos encontrado 1 y 325.

 

 

jueves, 13 de octubre de 2022

Regresos 5 – Un cuadrado y una unidad (1)

El día 5 de noviembre de 2008 se publicó en mi blog “Números y hoja de cálculo” una primera versión del tema de los números del tipo n2+1 (https://hojaynumeros.blogspot.com/2008/11/un-cuadrado-ms-una-unidad.html). Después se amplió algo, pero como es un tema interesante, regresamos a él con nuevas ideas y materiales


 

En este regreso estudiaremos números tipo n2+1 según su naturaleza. Lo normal es comenzar con los que son primos

Primos del tipo n2+1

Con cualquier buscador, exigiendo que un número sea primo y de la forma n2+1 obtendremos una lista con los primeros números de ese tipo. Por ejemplo, con Excel nos resultaría

En la tabla figuran los primos P y los valores de n tales que P=n2+1. Hemos usado nuestra función ESPRIMO y la condición de que P coincida con la parte entera de su raíz cuadrada incrementada después en una unidad, o bien que sea cuadrado P-1. Es lógico que el valor de n sea par, salvo el primer caso P=1.

Otra forma de caracterizarlos es que su función PHI (indicatriz de Euler) sea un cuadrado, ya que PHI(N) cuenta los coprimos con N menores que él incluido 1, y en los números primos PHI(P)=P-1, y de ahí que sea un cuadrado en este caso.

Estos números están publicados en http://oeis.org/A002496, y según una conocida conjetura, forman una sucesión infinita

(Ver mi documento “Conjeturas” en http://www.hojamat.es/publicaciones/conjeturas.pdf)

Salvo el caso de 2, todos serán de la forma 4K+1, por ser n par y, según el Teorema de Navidad de Fermat, se descompondrán en suma de cuadrados de forma única. Así que, además de la suma n2+12, no existirá otra similar. Efectivamente, si ampliamos la tabla anterior con nuestra función ESSUMACUAD, obtenemos un resultado único:

N2+1 y los restos cuadráticos

Otra forma de ver la igualdad P=n2+1 es considerar que -1 es un resto cuadrático de P. Puedes estudiar los restos cuadráticos en mi documento de Teoría de las congruencias (http://www.hojamat.es/sindecimales/congruencias/teoria/teorcong.pdf)

Para cada número primo impar P, los números menores que él se dividen en Restos cuadráticos, si son restos de un cuadrado, y No restos cuadráticos, si no existe un cuadrado que presente un resto con ese valor módulo P.

Nuestra hoja de cálculo Congruencias2, (descargable desde http://www.hojamat.es/sindecimales/congruencias/herramientas/herrcong.htm) clasifica los posibles restos en Restos (cuadráticos) y No restos. Por ejemplo, para el 17, que es igual a 42+1, el -1 (en este caso equivalente a 16) sí figura como resto cuadrático. Lo vemos en la imagen:



En la figura el 16 (-1) como resto, y el 4 (en rojo) como raíz cuadrada.

Los primos como el 23, que no figuran en nuestro listado, no poseerán -1 como resto cuadrático (en este caso 22):


Vemos que el 22 (o su equivalente -1) figura entre los
no restos, por lo que 23 no tiene la forma n2+1, como era de suponer.

Estas consideraciones son triviales para el caso de números primos, pero serán útiles más adelante en el apartado de números compuestos.

Compuestos del tipo n2+1

Otras veces n2+1 es  un compuesto, como 26 o 50. En ese caso la figura cuadrada se puede convertir en un rectángulo al añadirle un cuadradito más, pues se formaría uno de 2 por 13 o de 5 por 10 o 2*25.

Podíamos afirmar que estos compuestos son aquellos en los que n2+1 se puede convertir en un rectángulo de lados enteros.

Según la definición de resto cuadrático, si un compuesto del tipo C=n2+1 tiene un divisor primo p, -1 deberá ser resto cuadrático módulo p, tal como vimos en el caso de los primos. Esto es muy importante, porque ningún número compuesto n2+1 podrá ser múltiplo de p si este no admite resto -1. Sería el caso de 23: ningún elemento de la sucesión http://oeis.org/A002496 será múltiplo de 23.

En la sucesión http://oeis.org/A070303 figuran aquellos primos que no pueden ser divisores de un compuesto del tipo n2+1:

3, 7, 11, 13, 19, 23, 29, 31, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 103, 107, 109, 113, 127,…

Así que, por ejemplo, ningún número múltiplo de 7 puede convertirse en cuadrado al restarle una unidad.

Son aquellos que poseen la forma 4k+3, y no equivalen a una suma de cuadrados.

Lo puedes comprobar con este pequeño programa en PARI:

for(i=1,10^6,if(issquare(i*7-1),print(i)))

Al ejecutarlo descubrimos que no imprime nada, dentro del primer millón de primeros múltiplos de 7.

Resumiendo:

        Los restos cuadráticos clasifican, respecto a  expresiones del tipo n2+1, a los números primos en tres clases:

  •        Primos que no dividen a este tipo de expresiones: 3, 7, 11, 19, 23, 31, 43,…En la descomposición factorial de cuadrados más una unidad no figurarán estos números primos. Son los que presentan la forma 4N+3
  •       Números primos que sí son factores de expresiones del tipo n2+1: 2, 13, 29, 41, 53,…Se corresponden con los primos de la forma 4N+1. Por ejemplo, 52+1=26=2*13
  •      Por último, los que se pueden expresar como n2+1: 5, 17, 37, 101, 197,… que son un subconjunto de los anteriores.

Así, por ejemplo, se dan estas descomposiciones: 322+1=52*41; 572+1=2*53*13; 2112+1=2*113*197=2*113*(142+1)

Los números de la forma n2+1 tienen una propiedad muy elegante, y es que son divisores de otros números similares, y además, su cociente también es del tipo n2+1, es decir, que para todo n, existen m y p tales que (n2+1)(m2+1)= p2+1. En efecto, basta tomar m=n-1 y p=n2-n+1:



martes, 27 de septiembre de 2022

Números esfénicos

Definición

Los números esfénicos (del griego sphen, “cuña”) son aquellos naturales que equivalen a un producto de tres números primos diferentes, como 42=2*3*7. Si los factores son distintos, el número será “libre de cuadrados” y su número de divisores (función TAU) será 8, porque se calcula multiplicando los exponentes de sus factores primos aumentados todos en una unidad. Así, TAU(42)=(1+1)(1+1)(1+1)=2*2*2=8.

Todos los números esfénicos tienen ocho divisores.

Así, los divisores de 42 son ocho: 42, 21, 14, 7, 6, 3, 2 y 1

La afirmación inversa no es cierta. Por ejemplo, 24 no es esfénico (24=2³*3) y tiene ocho divisores, pues TAU(24)=(3+1)(1+1)=8.

En muchos lenguajes de programación se define la función OMEGA como el total de factores primos distintos que posee un número, y BIGOMEGA, al mismo total si se cuentan los primos repetidos. Esto nos da un criterio para conocer si un número N es esfénico, y es que OMEGA(N)=3 y BIGOMEGA(N)=3. Así se “prohíbe” que se repitan primos. Lo expresamos en lenguaje PARI:

print(omega(42)==3&&bigomega(42)==3)

Si ingresas esta expresión en su página web https://pari.math.u-bordeaux.fr/gp.html obtendrás un 1, que significa VERDADERO.

 


Si lo aplicas al 24 obtendrás un cero (FALSO).

Como este blog va de hoja de cálculo, podemos construir una función en VBASIC que determine, sin acudir a ninguna función, salvo ESPRIMO (la encuentras fácilmente en este blog), si un número es esfénico o no. Esta sería una función adecuada:

Public Function esfenico(n) As Boolean

Dim a, b, c, d, m

m = 0

a = 2

While a <= n / 2 And m = 0 ‘Busca un primo divisor de n

If esprimo(a) And n Mod a = 0 Then

b = n / a     ‘Cociente entre n y su divisor a

If Not esprimo(b) Then ‘Si el cociente b es compuesto, seguimos

c = a + 1 ‘Buscamos el segundo primo, que ha de ser distinto

While c <> a And c <= b / 2 And m = 0

If esprimo(c) And b Mod c = 0 Then

d = b / c ‘Si el cociente es primo, ya tenemos tres divisores

If esprimo(d) And d <> c And d <> a And a <> c Then m = 1 ‘Es esfénico, y m=1

End If

c = c + 1

Wend

End If

End If

a = a + 1

Wend

Si filtramos los primeros números naturales con esta función obtendremos el listado de los primeros esfénicos:

 


Observamos que todos son producto de tres primos (elevados a la unidad)

En forma de lista:

30, 42, 66, 70, 78, 102, 105, 110, 114, 130, 138, 154, 165, 170, 174, 182, 186, 190, 195,…

Coinciden con los publicados en http://oeis.org/A007304


Una curiosidad

Con nuestro programa Cartesius podemos encontrar los primeros esfénicos (http://www.hojamat.es/sindecimales/combinatoria/herramientas/hoja/cartesius.xlsm)

Usaremos el siguiente código:

xtotal=3

xt=1..73

xt=filtro(primo)

es (x2-x1)*(x3-x2)>0

Explicamos su significado: Declara que combinaremos tres números, que irán desde 1 hasta 73 (el primo de Sheldon). En la tercera línea se filtran solo los primos, y en la siguiente se exige que sean distintos y crecientes.

A continuación, en la hoja Producto, especificamos que el resultado que deseamos debe ser el producto.

 

Una vez programado, pulsamos el botón de Iniciar o el de Reiterar y aparecerán los primeros 2660 esfénicos, pero desordenados:


En el mismo Excel podemos ordenar la lista, con lo que coincidirá con la que conocemos.


Esfénicos con otro carácter más

Estos números, además de esfénicos podrán ser otros tipos

Cuadrados no pueden ser, ni cubos ni ninguna potencia, por ser libres de cuadrados.

Triangulares

Un esfénico puede ser triangular, del tipo N(N+1)/2. Basta con que N y N+1 sean ambos semiprimos libres de cuadrados. Ya que los números consecutivos son primos entre sí, los factores primos de N y N+1 serán diferentes. Como uno de ellos es par, al dividir su producto entre 2 quedarán tres primos diferentes. Por ejemplo, T(14)=14*15/2=2*7*3*5/2=3*5*7=105, que es esfénico. No es la única posibilidad, pero demuestra que es posible.

Los primeros esfénicos triangulares son:

66, 78, 105, 190, 231, 406, 435, 465, 561, 595, 741, 861, 903, 946,…

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

Se pueden obtener en PARI de esta forma:

esfetriang(n)={omega(n)==3&&bigomega(n)==3&&issquare(8*n+1)}

for(i=2,1000,if(esfetriang(i),print(i)))

Hay que recordar que el criterio para saber si N es triangular es que sea un cuadrado la expresión 8N+1

Oblongos

Existen oblongos, tipo N(N+1) que son esfénicos. Basta con que se cumpla que el que sea par entre ellos dos, N y N+1, sea semiprimo libre de cuadrados, y que el otro sea primo. Por ejemplo, 22*23=2*11*23.

Si en el código PARI anterior sustituimos 8*n+1 por 4*n+1 estaremos exigiendo que el número sea oblongo.

Estos son los primeros oblongos esfénicos:

En todos ellos, N o N+1 es primo, tal como razonamos más arriba.


Esfénicos “arolmar”

Nuestros números AROLMAR (http://oeis.org/A187073) son libres de cuadrados y el promedio de sus divisores primos es también primo. Nada se opone a que sean además esfénicos, si tienen tres divisores primos. Los primeros son estos

105, 195, 231, 465, 483, 609, 627, 645, 663, 861, 897, 915, 935, 969, 987, 1185, 1221, 1239, 1265, 1419, 1545, 1581, 1599, 1653, 1729, 1743, 1887

Por ejemplo, 1419=3*11*43 y (3+11+43)/3=19, que es primo.

Con PARI

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

is(n)=bigomega(n)==3&&omega(n)==3&&sopf(n)%3==0&&isprime(sopf(n)/3)

for(i=2,2000,if(is(i),print(i)))

Exige que OMEGA Y BIGOMEGA valgan 3, que el promedio de los primos sea entero y que sea primo.

El resultado es:

 

Esfénicos con factores consecutivos

Los factores de un esfénico pueden ser primos consecutivos. Es muy fácil encontrarlos, pues basta realizar un listado con

prime(k)*prime(k+1)*prime(k+2)

Estos serían los primeros:

Si los tres primos forman progresión aritmética, serán también de tipo AROLMAR.

 

Esfénicos consecutivos

En alguna publicación sobre esfénicos se destacan aquellos que son consecutivos, y se da como primer ejemplo el par 230 = 2*5*23 y 231 = 3*7*11 y como ejemplo de tres consecutivos la terna 1309 = 7*11*17, 1310 = 2*5*131, y 1311 = 3*19*23. También se razona que no puede haber cuatro, porque uno de ellos sería múltiplo de 4=2*2, con lo que no sería libre de cuadrados.

Con nuestra función ESFENICO se pueden completar estas búsquedas. Damos el resultado e invitamos a reproducirlo:

Dos esfénicos consecutivos:

En la tabla figuran los dos consecutivos y sus descomposiciones en tres primos (hay que recordar que los 1 que figuran son exponentes. Si no tuvieran ese valor no serían libres de cuadrados).

Tres esfénicos consecutivos

Los primeros son estos:

Un reto es prolongar estas dos tablas según lo aprendido en párrafos anteriores.

jueves, 30 de junio de 2022

Números con cifras crecientes o decrecientes (3)

Números con factores primos crecientes

Nos proponemos ahora una cuestión intrascendente con el solo objetivo de practicar algoritmos. Hemos estudiado las cifras de los números y los tipos de los mismos  (triangulares, cubos, de Fibonacci), y ahora nos dedicaremos a sus factores primos. La idea es construir un arreglo de factores en el que todas las cifras formen un conjunto creciente (o decreciente en su caso). Por ejemplo, 282=2*3*47.

Nos dedicaremos a los factores primos sin contar repeticiones, para simplificar la tarea. El orden que exigiremos será creciente en sentido amplio.

Para conseguir el conjunto creciente podemos dar los siguientes pasos:

  1. Descomponer el número en factores primos y usarlos ignorando sus exponentes
  2. Exigir que todos los factores tengan cifras crecientes (o decrecientes)
  3. Ordenar dichos factores según su primera cifra, porque si esto falla, no se puede seguir.
  4. Una vez todo ordenado, exigir también que la primera cifra de cada factor sea mayor o igual que la última del anterior.

1.- Los primos deben tener cifras crecientes

En Excel y Calc disponemos de la función sacaprimos, para obtener tanto los primos como sus exponentes. La salida de esa función es el número de primos distintos. Si la deseas reproducir, debes comenzar con la declaración de variables globales:

Global primo(50), expo(50)

Global numomega

Esta declaración te permite usar los primos en cualquier otra función. El vector primo(50) recoge los primos y expo(50) sus exponentes (máximo 50). La variable numomega cuenta los primos.

La función sacaprimos está diseñada así:

Public Function sacaprimos(n)

Dim f, a, e

a = n

f = 2: i = 0: numomega = 0

While f * f <= a

e = 0

While a / f = Int(a / f) ‘Busca primos y sus repeticiones

e = e + 1 ‘Se va formando el exponente

a = a / f

Wend

If e > 0 Then

numomega = numomega + 1 ‘Hay un primo más

primo(numomega) = f ‘Se guarda el primo

expo(numomega) = e ‘Se guarda el exponente

End If

If f = 2 Then f = 3 Else f = f + 2

Wend

If a > 1 Then

numomega = numomega + 1

primo(numomega) = a

expo(numomega) = 1

End If

sacaprimos = numomega

End Function

Con esta función obtenemos los vectores primo y expo para recoger los primos y los exponentes, y numomega para contar los primos. Es importante recordar que la salida de la función es esta variable.

Con el uso de esta función podemos responder a la primera cuestión: que todos los primos tengan cifras crecientes (o decrecientes en su caso):

Estudiaremos la función que hemos diseñado, concatpandigi, a trozos:

 

m=numomega

For i = 1 To m

If Not cifras_crecientes(primo(i)) Then concatpandigi = "": Exit Function

Next i

Se lee el número de primos y se almacena en la variable m. Se recorren los primos, y si uno no tiene cifras crecientes, salimos de la función.

2.- Ordenar los factores según su primera cifra:

El siguiente trozo de función ordena los primos según su primera cifra. En realidad es la última, porque nuestras funciones leen las cifras de derecha a izquierda. Puede ser este:

If m > 1 Then  ‘Si m=1, no se ordena

i = 2

Do Until i > m ‘Usamos una rutina de ordenación

j = i

‘Lo que sigue es complicado por tener que ordenar mediante la última cifra, que para nosotros es la primera

While j > 1 And cifra(primo(j), numcifras(primo(j))) < cifra(primo(j - 1), numcifras(primo(j - 1)))

v = primo(j): primo(j) = primo(j - 1): primo(j - 1) = v

j = j - 1

Wend

i = i + 1

Loop

End If

3.- Exigir  que la primera cifra de cada factor sea mayor o igual que la última del anterior.

vale = True

i = 1

While i < m And vale

If cifra(primo(i), 1) > cifra(primo(i + 1), numcifras(primo(i + 1))) Then vale = False

i = i + 1

Wend

4.- Si todo va bien, se recogen los primos en un string:

If vale Then For i = 1 To m: s$ = s$ + Str$(primo(i)): Next i

concatpandigi = s

En el Anexo de esta entrada incluimos la función completa.

 

Números que cumplen lo exigido

Con la función concatpandigi ya podemos discriminar los números que cumplen lo exigido y los que no lo cumplen. Estos son los primeros cuyos primos forman una escala creciente (en sentido amplio), en los que hemos eliminado los de un solo factor primo, como 4, 8 o 9:

En forma de lista:

6, 10, 12, 14, 15, 18, 20, 21, 22, 24, 28, 30, 33, 35, 36, 39, 40, 42, 44, 45, 46, 48, 50, 54, 55, 56, 58, 60, 63, 65, 66, 69, 70, 72, 74, 75, 77, 80, 84, 88, 90, 91, 92, 94, 96, 98, 99, 100, 105, 108, 110, 111, 112, 115, 116, 117, 118, 119, 120,...

Observamos que aparecen muchos ejemplos, más de los esperados.

Si restringimos, por ejemplo, a los que poseen cuatro divisores primos, nos quedan:


Como curiosidad, estos son los de más de cuatro primos:

 


Un ejercicio divertido es imaginar números con más factores, como 11*2*3*5*67*7*89=13774530

 ¿Podrá existir un ejemplo pandigital? Si prescidimos del 0 y el 1, podemos usar 2438778=2*3*4567*89, o bien 0+1*2*3*4567*89

Dejamos abiertas las variantes de cifras estrictamente crecientes o las de cifras decrecientes. Se manejarían de igual forma, adaptando los algoritmos. Queda como reto o ejercicio.

 Con esta entrada finalizamos el curso 2021-22. Después del verano, en septiembre, volveremos a buscar temas de interés. Saludos.

 

 

Anexo

 

Function concatpandigi$(n)

Dim s$

Dim v, m, i, j

Dim vale As Boolean

 

'Devuelve cadena vacía o un string con los primos

 

s$ = ""

m = sacaprimos(n)

'Todos los primos han de tener cifras crecientes

For i = 1 To m

If Not cifras_crecientes(primo(i)) Then concatpandigi = "": Exit Function

Next i

'Ordena los primos según su primera cifra

If m > 1 Then

i = 2

Do Until i > m

j = i

While j > 1 And cifra(primo(j), numcifras(primo(j))) < cifra(primo(j - 1), numcifras(primo(j - 1)))

v = primo(j): primo(j) = primo(j - 1): primo(j - 1) = v

j = j - 1

Wend

i = i + 1

Loop

End If

 

'Ve si la primera cifra es menor que la última anterior

vale = True

i = 1

While i < m And vale

If cifra(primo(i), 1) > cifra(primo(i + 1), numcifras(primo(i + 1))) Then vale = False

i = i + 1

Wend

If vale Then For i = 1 To m: s$ = s$ + Str$(primo(i)): Next i

concatpandigi = s

End Function