martes, 28 de febrero de 2012

Acertijos con Mathematica

Vamos a ver hoy para empezar, y mientras me aclaro con los applets, vídeos, LaTeX y demás, cómo se puede usar Mathematica para resolver acertijos numéricos.

Antes que nada, si no conoces Mathemática (http://www.wolfram.com/mathematica) te comento que es un estupendo programa de propósito prácticamente general en Matemáticas; eso sí, es de pago, ya le tocará el turno a herramientas similares free como wxMaxima, con las que me voy familiarizando. Así que, si no controlas nada o poco Mathemática, esta puede ser una forma de empezar, y si lo controlas seguro que se te ocurre cómo mejorar la búsqueda.


Bueno, vamos al lío. Por ejemplo, el otro día conocí el blog acertijos y más cosas (échale un ojo http://acertijosymascosas.com), donde se plateaba el siguiente acertijo (copiado y pegado):

Estoy pensando en un número de 6 dígitos. La suma de los dígitos es 43. 
Y sólo dos de las siguientes tres afirmaciones sobre el número son ciertas: 
(1) es un número cuadrado,
(2) es un número cubo
(3) el número es menor de 500.000.


Puedes verlo en el siguiente enlace: http://acertijosymascosas.com/acertijo-encuentra-el-numero-2/

Bien, resolver esto probando a mano, pues como que no, una idea feliz quizá lo resuelva rápidamente sin Mathematica ni leches, pero vamos a ver cómo se podría hacer con este programa.

Primero vamos con lo más sencillo, veamos que números cumplen (1) y (2), es decir, que números de 6 cifras son cuadrado y cubos a la vez, en fin, sextas potencias para los amigos. El código podría ser:

Do[Print["Cuadrado y cubo:",n^6],{n,7,9}]

Obtenemos:

Cuadrado y cubo: 117649
Cuadrado y cubo: 262144
Cuadrado y cubo: 531441

Es sencillito de entender desde dentro hacia afuera, le decimos a Mathematica que muestre en pantalla las sextas potencias de los números desde 7 hasta 9 (el menor y el mayor que produce números de 6 cifras al elevarlos a 6), precedidas de un texto para que quede más claro.

Sólo puede ser el tercero, ya que los dos primeros son menores que 500000, con lo que se cumplirían las 3 condiciones en lugar de dos. Y ahora toca sumar “a mano” las cifras de este último a ver si da 43 y asunto resuelto. Lo ideal es que ya que estamos haga esto el programa, ¿verdad? Lo podemos conseguir añadiendo esto que pongo en rojo al código:

Do[Print["Cuadrado y cubo:",n^6," ",
      Apply[Plus,IntegerDigits[n^6]]],{n,7,9}]

Donde Apply[Plus,IntegerDigits[n^6]] lo que hace es aplicar la función suma con todos los dígitos enteros de las sextas potencias (Si se pone Times por ejemplo en lugar de Plus se obtiene el producto).

Lo de “ “ es solo para mediar un espacio entre el número y la suma de sus cifras.

Obtenemos ahora:

Cuadrado y cubo: 117649 28 
Cuadrado y cubo: 262144 19 
Cuadrado y cubo: 531441 18

Donde cada número viene acompañado de la suma der sus cifras. Nada, por aquí no anda el condenado.

Ok, entendido esto hacer las comprobaciones para las otras dos parejas de condiciones será fácil. Si queremos los cubos de 6 cifras menores de 500000 (o sea, entre ${{47}^{3}}$ y ${{79}^{3}}$):

Do[Print["Cubo < 500000:",n^3," ",
      Apply[Plus,IntegerDigits[n^3]]],{n,47,79}]

Si queremos reducir la lista de números que aparecerá, podemos usar el hecho de que el resto que da un número al dividirlo entre 9 coincide con el que daría la suma de sus cifras, hecha tantas veces como sea necesario para quedarnos con un número de una cifra; así que, como 4+3=7, nos podemos limitar a mostrar solo los números cuyo resto al dividirlo entre 9 sea 7. Esto se haría con una estructura condicional, que añado en rojo al código anterior.

Do[If[Mod[n^3,9]==7,Print["Cubo < 500000:",n^3," ",
      Apply[Plus,IntegerDigits[n^3]]]],{n,47,79}]

Bien, resulta que no hay ni un número que cumpla esto. Mejor ;)

Ahora hacemos la misma prueba prácticamente para los cuadrados de 6 cifras menores que 500000:

Do[If[Mod[n^2,9]==7,Print["Cuadrado <500000:",n^2,"",
      Apply[Plus,IntegerDigits[n^2]]]],{n,317,707}]

Aquí si hay una buena cantidad de números que cumplen. Se podría haber incluido una condición para sólo mostrar el que cumple que la suma de sus cifras es 43, pero, aparte de que el código quedaría ya muy retorcido, buscar la solución en la lista también tiene su gracia XD.

Al final de una buena lista de números podemos encontrar:

Cuadrado < 500000: 499849 43

Y ahí lo tenemos. Me ha quedado demasiado ladrillo pero bueno, es mi primera entrada, y he intentado que quede comprensible; ya las iré puliendo. Si quieres alguna aclaración sobre el código, no dudes en poner un comentario. Si se te ocurre una manera de mejorar la búsqueda, genial también, coméntala. ¡O comenta lo que te dé la gana!

No hay comentarios:

Publicar un comentario

Comenta, comenta... Puedes usar LaTeX entre signos de $.