martes, 24 de septiembre de 2019

Múltiplos anagramáticos



Llegamos hoy a otra entrada de este blog que se basa en un “twitt” publicado en nuestra cuenta de Twitter (@connumeros) el 11/6/19.

El número de fecha de hoy, 11619, presenta dos múltiplos sencillos anagramáticos (mismas cifras en distinto orden):
11619*13 = 151047
11619*9 = 104571

Se puede sospechar que todo número puede cumplir el tener dos múltiplos anagramáticos para factores convenientemente grandes, pero como no tenemos herramientas para este tipo de búsquedas nos limitaremos a múltiplos que usan factores no mayores que un número determinado. Después nos podemos plantear una extensión del estudio.

Para investigar esta cuestión necesitamos una función que nos indique si dos números poseen las mismas cifras y con la misma frecuencia pero en distinto orden. Contamos con dos versiones de esta función. La primera, de hace años, se basa en la conversión de cada número en cadena de texto, para después investigar si cada carácter de uno se encuentra en el otro. Las frecuencias las tiene en cuenta borrando cada carácter encontrado en ambas cadenas. La puedes consultar en una entrada de 2012 de este blog:


Aquí usaremos otra versión, que no necesita funciones de texto, pero sí varias memorias que almacenen las cifras de cada uno de los números.

Public Function cifras_identicas(m, n) As Boolean

Dim i, h, s
Dim ci As Boolean
Dim ca(10), cb(10)

For i = 1 To 10: ca(i) = 0: cb(i) = 0: Next i ‘Prepara memorias para recibir frecuencias de cifras

h = m ‘Extracción de cifras del primer número
While h > 0
i = Int(h / 10)
s = h - i * 10
h = i
ca(s + 1) = ca(s + 1) + 1 ‘Almacenamiento de las frecuencia de una cifra
Wend

h = n ‘El mismo proceso para el otro número
While h > 0
i = Int(h / 10)
s = h - i * 10
h = i
cb(s + 1) = cb(s + 1) + 1
Wend


ci = True
For i = 1 To 10
If ca(i) <> cb(i) Then ci = False ‘Si una de las frecuencias no coincide, las cifras no son idénticas
Next i
cifras_identicas = ci
End Function

Con esta función podemos encontrar dos múltiplos de un número que presenten las mismas cifras.

En PARI es mucho más simple, pues permite la ordenación de los dígitos de un número en forma de vector:

anagram(a,b)=vecsort(digits(a))==vecsort(digits(b))


Listado de soluciones

Podemos investigar si un número dado posee dos múltiplos anagramáticos al menos. Tal como explicamos más arriba, solo buscaremos múltiplos hasta un factor dado, para no alargar ni bloquear el proceso. Hemos creado la función multianagram, que busca los múltiplos anagramáticos hasta una cota k.

Como lo que nos interesa es saber si existe solución o no, está construida de forma que detiene el proceso cuando encuentra la primera solución. Sus parámetros son n, el número dado, y k, la cota para los factores que formarán los múltiplos pedidos.

Public Function multianagram(n, k) As String
Dim s$
Dim i, j, a, b, l

s$ = "" ‘Si no hay solución, devuelve un string vacío.
i = 2
While i <= k And s$ = ""   ‘Recorre los factores hasta una cota k
j = 1
While j < i And s$ = ""  ’Busca el segundo múltiplo
If i <> j Then
a = n * i: b = n * j
If cifras_identicas(a, b) Then s$ = s$ + Str$(i) + Str$(j) + Str$(a) + Str$(b)
‘Si las cifras son idénticas, devuelve los dos factores y los múltiplos resultantes
End If
j = j + 1
Wend
i = i + 1
Wend
multianagram = s$
End Function

Hemos preparado varias búsquedas con la cota 1000 para los factores que producirán los múltiplos anagramáticos. Parece que todos los primeros números presentan la propiedad.

Por ejemplo, entre 30 y 45, todos poseen un par al menos de múltiplos anagramáticos. En el listado figura cada número, después el par de factores necesarios y al final los dos múltiplos pedidos, que presentan las mismas cifras:


Modificando ligeramente la función multianagram podemos tener una idea del máximo factor necesario para lograr el par de múltiplos anagramáticos. Para los número del 1 al 100, el máximo es 137, necesario para el número 95 y sus múltiplos 95*137=13015 y 95*119=11305.

Hasta el 500 el número que necesita un factor mayor es el 425, que forma los múltiplos 12750 y 70125 con un factor máximo de 165. De este orden de magnitud suelen ser los factores. Por eso, para cota 1000 todos los primeros números poseen múltiplos anagramáticos.

Con PARI podemos investigar qué factor presenta cada número de los dados (que por ahora son todos). Con este listado se logra:

anagram(a,b)=vecsort(digits(a))==vecsort(digits(b))
for(n=200,500,k=2;e=0;while(k<=200&&e==0,h=1;while(h<=k-1&&e==0,a=n*k;b=n*h;e=anagram(a,b);if(e<>0,print(n,", ",k));h+=1);k+=1))

En primer lugar definimos anagram(a,b), que devuelve 1 si los números son anagramáticos y 0 si no lo son. Después construimos los múltiplos posibles e investigamos si existen anagramáticos y cuál es el factor máximo. En el ejemplo buscamos entre 2 y 200 con un factor máximo de 200 (Observa k<=200) Después se pueden cambiar los parámetros. Estos serían los resultados desde 420 a 430:

420, 22
421, 65
422, 74
423, 4
424, 84
425, 165
426, 58
427, 45
428, 147
429, 47
430, 41

Comprobamos que 425 es el que necesita un factor mayor (dentro de la cota 200)

Problema contrario

Podemos plantear el problema contrario, y es la búsqueda de números que no posean múltiplos anagramáticos para una cota razonable, como puede ser 1000. Si encontramos alguno, subimos la cota.

Podemos usar nuestro buscador en Excel o el código anterior de PARI ligeramente modificado.

anagram(a,b)=vecsort(digits(a))==vecsort(digits(b))
for(n=2,5000,k=2;e=0;while(k<=1000&&e==0,h=1;while(h<=k-1&&e==0,a=n*k;b=n*h;e=anagram(a,b);h+=1);k+=1);if(e==0,print(n)))

En este caso solo imprimimos resultados si después de recorrer los múltiplos no se encuentra ningún par anagramático. Usamos cota 1000, a ver qué ocurre. Hasta 5000 no hemos encontrado ninguno. Vamos aumentando el rango de búsqueda, aunque se va lentificando el proceso. Hasta una cota de 100000, con un factor máximo de 1000, no ha aparecido ningún caso. Es arriesgado conjeturar nada, porque si aumenta el factor, también lo hace el número de cifras del múltiplo, lo que dificulta la coincidencia. Lo dejamos aquí.



lunes, 16 de septiembre de 2019

Números de Polignac



Estos números se definen a partir de la conjetura de Polignac, que pronto se descubrió que era falsa. Afirma que todo número impar es suma de un primo y de una potencia de 2. Números tan pequeños como 127 no la cumplen, por lo que duró poco como conjetura.

Llamaremos número de Polignac a aquel número impar que no cumpla la conjetura explicada, que no pueda expresarse como p+2x. Se supone implícitamente que x puede valer 0, porque en ningún listado se toma el 3 como número de Polignac, ya que 3=2+2⁰

Son números de Polignac el 1 y el ya citado 127.

En este blog insertamos cuanto antes elementos de búsqueda, por lo que procede ahora el diseñar una función que nos indique si un número es de Polignac o no. 

No resulta difícil, porque las potencias de 2 crecen con rapidez y su cota es la llamada valuación del número N respecto a 2, que es el máximo exponente de una potencia de 2 que sea igual o menor que el número. Es fácil ver que se obtiene como INT(log(N)/LOG(2)). Con esa cota, vamos construyendo potencias de 2, y si al restar del número N resulta un número primo, será señal de que no es un número de Polignac.

El listado de la función puede ser el siguiente:

Function espolignac(n) as boolean
dim x
dim vale as boolean

vale=false:x=1 ‘El valor 1 es el inicio de las potencias de 2
if n/2<>n\2 then ‘Examina si el número es impar
while x<=n and not vale ‘Se recorren las potencias de 2
if esprimo(n-x) then vale=true ‘Criterio de Polignac
x=x*2 ‘Siguiente potencia de 2
wend
espolignac=not vale
else
espolignac=false ‘Si es par, no es de Polignac
end if

end function
Puedes conseguir nuestra función “esprimo” si buscas en Google “función esprimo hoja

Con esta función es fácil encontrar números de Polignac. En la imagen tienes los primeros, obtenidos con hoja de cálculo:



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

A006285                            Odd numbers not of form p + 2^x (de Polignac numbers).
(Formerly M5390)                          
1, 127, 149, 251, 331, 337, 373, 509, 599, 701, 757, 809, 877, 905, 907, 959, 977, 997, 1019, 1087, 1199, 1207, 1211, 1243, 1259, 1271, 1477, 1529, 1541, 1549, 1589, 1597, 1619, 1649, 1657, 1719, 1759, 1777, 1783, 1807, 1829, 1859, 1867, 1927, 1969, 1973 (list; graph; refs; listen; history; text; internal format)

Esta lista se puede reproducir con el lenguaje PARI. El código propuesto en la página citada es algo difícil de entender, por lo que se puede acudir  a este otro:

espolignac(n)={x=1;if(n/2 <> n\2,v=0;while(x<=n&&v==0, r=n-x; if(isprime(r), v=1); x=2*x);e=1-v,e=0);e}
for(n=1,1000,if(espolignac(n),print(n)))
Entre ellos existen primos y compuestos. También figuran en el listado algunos números impares consecutivos, como 905 y 907.

Erdös probó que existen infinitos números de este tipo, como los que tienen la forma 1260327937 + 2863311360k. Puedes leer su fórmula en http://www.bitman.name/math/article/388

Disponiendo de la función espolignac no es difícil encontrar los pares de números de Polignac consecutivos en este listado. Los primeros, menores de 10000, son estos:


Entre los números de Polignac, como ya se ha indicado, existen muchos primos. Los primeros son los siguientes:

127, 149, 251, 331, 337, 373, 509, 599, 701, 757, 809, 877, 907, 977, 997, 1019, 1087, 1259, 1549, 1597, 1619, 1657, 1759, 1777, 1783, 1867, 1973, 2203, 2213, 2293, 2377, 2503,...

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


Aportación de este blog

Semiprimos

También hay semiprimos entre los números de Polignac. Los primeros son:

905, 959, 1199, 1207, 1211, 1243, 1271, 1477, 1529, 1541, 1589, 1649, 1807, 1829, 1927, 1969, 1985…

Basta añadir a la condición espolignac la de ser semiprimo.

Con PARI podemos ampliar la lista, ya que los semiprimos se identifican porque su función bigomega es igual a 2.

espolignac(n)={x=1;if(n/2 <> n\2,v=0;while(x<=n&&v==0, r=n-x; if(isprime(r), v=1); x=2*x);e=1-v,e=0);e}
for(n=1,10000,if(espolignac(n)&&bigomega(n)==2,write1("final.txt",n,", ")))


Así quedaría el listado hasta 10000:

905, 959, 1199, 1207, 1211, 1243, 1271, 1477, 1529, 1541, 1589, 1649, 1807, 1829, 1927, 1969, 1985, 2171, 2231, 2263, 2279, 2429, 2669, 2983, 2993, 3029, 3149, 3215, 3239, 3341, 3353, 3431, 3505, 3665, 3817, 3845, 3985, 4063, 4151, 4195, 4573, 4589, 4633, 4717, 4781, 4811, 4841, 4843, 4855, 5143, 5609, 5617, 5729, 5731, 5755, 5761, 5771, 5917, 5951, 6001, 6065, 6119, 6161, 6193, 6283, 6403, 6433, 6463, 6509, 6535, 6539, 6731, 6757, 6821, 6941, 7169, 7199, 7289, 7319, 7343, 7379, 7387, 7405, 7431, 7747, 7783, 7799, 7807, 7811, 7813, 7913, 7961, 8023, 8031, 8141, 8159, 8257, 8399, 8411, 8587, 8621, 8873, 8915, 8921, 8981, 9101, 9115, 9307, 9517, 9557, 9569, 9641, 9809, 9959,

Como curiosidad, ninguno de los primeros números del listado es múltiplo de 3. Hay que esperar a llegar a 7431 y 8031 para que aparezca.

De igual forma se pueden buscar otros tipos.

Cuadrados:



Triangulares



Entre la sucesión de Fibonacci solo hemos encontrado dos (con cota 100000), el 1 y el 1597.

Como no se advierte ninguna propiedad especial, lo dejamos por ahora.


miércoles, 4 de septiembre de 2019

Sigue el mismo tipo al duplicar las unidades



El número 144 es cuadrado, 144=122, y si duplicamos su última cifra resulta otro cuadrado, pues 1444=38¿Ocurrirá esto con otros cuadrados? ¿Existirán ejemplos similares con números primos, triangulares y de otro tipo? Lo estudiamos.

Cuadrados
Los únicos cuadrados que presentan duplicadas sus dos últimas cifras son los terminados en 44 o en 00. No existirán casos con otras cifras. Lo vemos detenidamente:
Las terminaciones de los números cuadrados son 0, 1, 4, 5, 6 y 9. En los casos 1, 5, 6 y 9 es imposible la terminación en 11, 55, 66 o 99. En todos los razonamientos llamaremos a a la cifra de las decenas de la posible raíz cuadrada.
Un número terminado en 1 o en 9 no puede producir un cuadrado terminado en 11, pues si termina en a1, su cuadrado lo hará en (2a)1, y 2a no puede valer 1, y si termina en 9, el cuadrado de a9 terminaría en (18a+8)1, y tampoco podría terminar en 11. Desechamos, pues la terminación 11.
La 55 tampoco es posible terminación de cuadrado, pues si un número termina en a5, su cuadrado lo hará en (10a+2)5, y el paréntesis par no puede producir un 5 en las decenas.
Para producir un 66 la raíz cuadrada ha de terminar en a6 o en a4. En el primer caso el cuadrado terminaría en (12a+3)6, y el paréntesis no puede terminar en 6. En el otro caso sería (8a+1)6, que tampoco produce 66.
La 99 provendría de un número terminado en a3 o en a7, y su cuadrado terminaría en (6a)9 en el primer caso y (14a+4)9 en el segundo, lo que imposibilita el 99 como terminación.
La terminación en 00 para un cuadrado provendría de una raíz cuadrada terminada en 0. Hasta aquí bien, pero para la cuestión que nos ocupa debería también ser un cuadrado, con lo que tendría un número par de ceros, y al añadirle otro cero sería un número impar, que no podría ser cuadrado.
Por tanto, la única duplicación de unidades que produce un cuadrado es la 44. Si deseamos más casos además del 144 deberemos buscar entre los cuadrados terminados en 4.
Búsqueda de cuadrados del tipo dado
Lo iniciaremos en Basic de Excel para abordar el tema y extenderlo más tarde a otros casos. Usaremos la función sigueigual, que iremos adaptando a lo largo del estudio. Para cuadrados puede ser esta:
Public Function sigueigual(n) as boolean
Dim a, c

c = n Mod 10 ‘Encuentra la cifra de las unidades
If c <> 4 Then sigueigual = False: Exit Function ‘Si no termina en 4, lo dejamos
a = n * 10 + c ‘Formamos la duplicación de las unidades
If escuad(n) And escuad(a) Then sigueigual = True Else sigueigual = False
‘Si el número es cuadrado antes y después de duplicar, vale
End Function

La función escuad puede tener este código:
Public Function escuad(n) As Boolean
'Determina si n es un cuadrado

If n < 0 Then
escuad = False
Else
If n = Int(Sqr(n)) ^ 2 Then escuad = True Else escuad = False
End If
End Function

Probamos los primeros números con esta función y solo nos resulta la solución 144 y 1444, por lo que necesitamos una herramienta más potente, como el lenguaje PARI. Usaremos solo cuadrados, con lo que la búsqueda será más rápida. El listado que usaremos es este:
for(i=1, 1000000000, n=i*i; q=n%10; if( q==4, r=q+n*10; if(issquare(r),  print1(n,", ",sqrtint(n),", ",r,", ",sqrtint(r)))))
Para cada valor de la variable i forma su cuadrado n. Si termina en 4, se duplica la cifra de las unidades para formar la variable r y si es un cuadrado, hemos encontrado la solución. Con este código aparece la solución 144, 1444, y también dos más:
144, 12, 1444, 38, 432374632704, 657552, 4323746327044, 2079362, 899063381008862784, 948189528, 8990633810088627844, 2998438562,…
(Escribimos en cursiva las raíces cuadradas del término anterior)
Vemos que son escasos los cuadrados con esta propiedad. Con un poco de paciencia se podrían buscar más soluciones, pero con las tres dadas se advierte su rareza.
Estos números (los que son raíces cuadradas del segundo cuadrado, como 2998438562) pertenecen a la sucesión http://oeis.org/A239364, que son soluciones de la ecuación de Pell x2-10y2=4, que viene a exigir que al añadir un 4 a un cuadrado y2 se convierta en otro cuadrado x2, pero en la sucesión indicada figuran otras soluciones, que son las que no terminan en 44.

Primos

Podemos ir adaptando la función sigueigual según el tipo de números que estudiemos. En el caso de los primos podría ser:

Public Function sigueigual(n)
Dim a, c

c = n Mod 10
a = n * 10 + c
If esprimo(n) And esprimo(a) Then sigueigual = True Else sigueigual = False
End Function

Resultan estos primeros ejemplos, que, como vemos, son mucho más frecuentes que los cuadrados:
19, 23, 31, 43, 59, 67, 73, 97, 103, 127, 139, 149, 151, 173, 181, 193, 199, 211, 233, 239, 241, 263, 269, 271, 277, 283, 349, 353, 367, 373, 383, 409, 421, 479, 487, 499, 509, 523, 547, 571, 601, 613, 619, 631,…

Por ejemplo, 173 es primo y 1733 también.

Con PARI basta con un código muy simple:

forprime(n=2, 2000, p=(n%10)+n*10; if(isprime(p), print(n,", ")))

Puedes experimentar con él aumentando el rango de búsqueda, que en el listado va de 2 a 2000. Observa lo útil que es la instrucción forprime.

Triangulares

En el caso de los triangulares volvemos a la escasez de resultados. En la siguiente versión de sigueigual usamos la condición para que n sea triangular, y es que 8*n+1 sea cuadrado:

Public Function sigueigual(n)
Dim a, c

c = n Mod 10
a = n * 10 + c
If escuad(8 * n + 1) And escuad(8 * a + 1) Then sigueigual = True Else sigueigual = False
End Function

En una primera búsqueda obtenemos cuatro soluciones: 6, 66, 171 y 1540.
Para encontrar otros ejemplos necesitamos usar PARI, como es costumbre en este blog:

for(i=1, 10000000000, n=i*(i+1)/2;q=n%10;r=q+n*10; if(issquare(8*r+1), print1(n,", ")))

En primer lugar construimos un triangular mediante su definición, n=i*(i+1)/2, y después le adosamos el último dígito y comprobamos que sigue siendo triangular mediante la prueba issquare(8*r+1).

De esta forma obtenemos más soluciones:

6, 66, 171, 1540, 21454525, 43809480, 1395379509846, 5671003058155, 337549427259780, 39693585656707986,…

No son tan escasos como los cuadrados, pero se ve que aparecerán de forma aislada.

Oblongos

Ya que hemos recorrido los tipos más estudiados, completamos con alguno más. Por ejemplo, con los oblongos.

Como estos números son dobles de un triangular, el criterio del 8*n+1 que estudiamos anteriormente se modifica en que sea cuadrada la expresión 4*n+1. Así quedaría sigueigual:

Public Function sigueigual(n)
Dim a, c

c = n Mod 10
a = n * 10 + c
If escuad(4 * n + 1) And escuad(4 * a + 1) Then sigueigual = True Else sigueigual = False
End Function

Las dos primeras soluciones que nos da esta función, 342 y 3080, resultan ser dobles de dos soluciones para triangulares, como son 171 y 1540.

Si ampliamos usando PARI comprobamos que estos ejemplos son también escasos:

342, 3080, 225150, 87618960, 711635652, 6404720870, 182191536189390, 675098854519560,…

Con esto ya tenemos una idea de lo que da de sí esta cuestión. Lo dejamos aquí.