Matemáticas y números
El conjunto de Mandelbrot
27 jul
Un fractal, como muchos sabréis, es una estructura que se repite a diferentes escalas. El fractal más conocido es el de Mandelbrot, estudiado por el matemático polaco, ya fallecido, Benoît Mandelbrot, recientemente fallecido, en la década de los 70 del siglo pasado. Mandelbrot pensaba que lo que él estaba estudiando no interesaba a nadie, ya que todos los demás matemáticos se centraban en estructuras "suaves y regulares". Para definir estas nuevas estructuras acudió a un diccionario de latín, hasta encontrar un adjetivo que describía las piezas irregulares de una piedra que ha sido lanzada: «fractus, fracta, fractum».
Los fractales no son sólo cosa de las matemáticas, sino que aparecen en muchos lugares de la naturaleza, como en las hojas de los helechos, en las ramas de los árboles, en el brécol, etc. Un caso extraordinario de fractal lo podemos encontrar en el Romanescu, una mezcla de brécol y coliflor.
[latexpage]
Matemáticamente, el conjunto de Mandelbrot se define como:
- Tenemos c, un número complejo cualquiera.
- Tenemos la sucesión por inducción siguiente $\left \{ \begin{matrix} z_0 & = & 0 \qquad \ & \qquad \\ z_{n+1} & = & z_n^2 + c & \end{matrix} \right.$
Si la sucesión queda acotada, podemos decir que el punto c es parte del conjunto.
Pero dejemos las matemáticas y vamos a ver como se ve el conjunto gráficamente. Lo he generado utilizando jQuery y HTML5. Podéis aumentarlo para ver la autosimilitud haciendo clic encima. Es probable que no lo podáis leer desde el lector RSS o utilizando un navegador antiguo.
Para acabar, la entrevista de Benoît en el programa Redes
Como siempre, dejo el código para los programadores curiosos
[cc lang="js"] // Clase timer para contar el tiempo de ejecucion var timer = { time: 0, now: function(){ return (new Date()).getTime(); }, start: function(){ this.time = this.now(); }, since: function(){ return this.now()-this.time; } } // Variables globales // Variables del tamaño de Canvas var width = 500; var height = 500; // Precisión de los pixels (1 es lo más preciso) var pixels = 1; // Coordenadas iniciales var xmin = -2; var xmax = 1; var ymin = -1.5; var ymax = 1.5; // Stride var stridex = ((xmax - xmin) / height) * pixels; var stridey = ((ymax - ymin) / width) * pixels; // Aumentos var zoom = 4; var aumentos = 0; // Iteraciones var maxIt = 200; function render() { timer.start(); // Cargamos canvas // Obtenemos el objeto Canvas var canvas = document.getElementById('canvas'); var context = false; // Obtenemos el contexto 2d if(canvas && canvas.getContext('2d')) { context = canvas.getContext('2d'); } if(context){ // Si existe empezamos a dibujar // Cambiamos el tamaño, por si este ha cambiado canvas.width = width; canvas.height = height; for(var x0 = xmin, i = 0; i < height; i += pixels, x0 += stridex){ for(var y0 = ymin, j = 0; j < width; j += pixels, y0 += stridey) { var x = 0; var y = 0; var it; for(it = 0; x*x + y*y < 4 && it < maxIt; ++it) { var xtemp = x*x - y*y + x0; y = 2*x*y + y0; x = xtemp; } if(it >= maxIt) { context.fillStyle = "rgba(0,0,0,1)"; context.fillRect(i,j,pixels,pixels); } else { context.fillStyle = "rgba(0,0,0," + it / maxIt + ")"; context.fillRect(i,j,pixels,pixels); } } } } return timer.since(); } $(document).ready(function() { var since = render(); $("#mandInfo").append("Renderizado en " + since + " ms"); $("#canvas").click(function(e){ // Obtengo las coordenadas del clic dentro de canvas var x = Math.floor((e.pageX-$("#canvas").offset().left)); var y = Math.floor((e.pageY-$("#canvas").offset().top)); // Las transformo a las coordenadas actuales var realx = xmin + x * stridex; var realy = ymin + y * stridey; // Pongo los nuevos límites de las coordenadas var temp_xmin = xmin; var temp_xmax = xmax; var temp_ymin = ymin; var temp_ymax = ymax; xmin = realx - (temp_xmax - temp_xmin) / zoom; xmax = realx + (temp_xmax - temp_xmin) / zoom; ymin = realy - (temp_ymax - temp_ymin) / zoom; ymax = realy + (temp_ymax - temp_ymin) / zoom; // Recalculo los Strides stridex = ((xmax - xmin) / height) * pixels; stridey = ((ymax - ymin) / width) * pixels; ++aumentos; since = render(); $("#mandInfo").append("Aumentado en " + since + " ms"); }); }); [/cc] Para que funcione, en el HTML hay que importar la librería jQuery. Después necesitamos el canvas de HTML5: [cci lang="html"][/cci] (tiene que tener identificador canvas). Por último y opcionalmente, un div donde se muestra el tiempo de renderizado: [cci lang="html"][/cci].Pasatiempos Collatz
3 oct
La conjetura de Collatz dice que si cogemos un número al azar y si es par lo dividimos entre 2 o si es impar lo multiplicamos por 3 y le sumamos uno siempre llegaremos a 1 si repetimos este paso indefinidas veces. ¿Cuál es su utilidad? Que yo sepa, ninguna. Ni siquiera se ha demostrado que sea cierto, o falso, pero es entretenido.
Viñeta sobre Collatz en xkcd
es.xkcd.com/xkcd-es/strips/conjetura-de-collatz/
¿Cuántas veces creéis que hay que repetirlo con estos números para llegar a 1?
- 13
- 23
- 72
- 280
Es difícil imaginarse cuantas veces tenemos que repetir la operación para llegar a 1, calcularlo no tanto, pero podemos acabar como el personaje de la tira cómica. A los ordenadores no les cuesta tanto. Podéis probar cuantas veces hacen falta poniendo el número aquí debajo.
Los que leéis desde un lector de feeds es posible que no lo veáis.
Introduce el número que quieras
El 280 parece que tendría más pasos que el 72, pero no. Normalmente contra más grande es el número, más pasos necesita, pero esto no se cumple siempre. Por ejemplo, 1.000 necesita 111 pasos pero 10.000 sólo necesita 29, de hecho, el número que necesita más iteraciones entre 1 y 10.000 (lo máxima que deja calcular nuestro programa) está más o menos por la mitad, 6.171 y 271 iteraciones, os dejo a vosotros que calculéis el máximo hasta 100.000.
Como siempre, información para los más técnicos, aquí tenéis el código Javascript utilizando la librería Jquery que calcula las iteraciones.
Después del script necesitamos un textbox con identificador #cuadro_Collatz y un span (por ejemplo) con identificador #resultado_Collatz.
Introduce el número que quieras
El cifrado César
2 jun
El cifrado César o por desplazamiento es una de las formas más simples de ocultar mensajes, aunque también una de las más fáciles de descifrar. El método no tiene más misterio que desplazar cada letra un número determinado de posiciones dentro del alfabeto de forma cíclica, es decir, si se llega al final se vuelve a empezar por el principio. Por ejemplo, con un desplazamiento de 3 posiciones a la derecha.
Alfabeto sin cifrar: ABCDEFGHIJKLMNÑOPQRSTUVWXYZ.
Alfabeto cifrado: DEFGHIJKLMNÑOPQRSTUVWXYZABC.
Texto sin cifrar: Estoy leyendo Okashini.
Texto cifrado: Hvwrb ohbhqgr Rndvklql.
El origen del cifrado lo encontramos hace más de 2.000 años. Corría el siglo I a.C cuando Julio César utilizó este cifrado con un desplazamiento de 3 posiciones a la derecha para ocultar mensajes en tiempos de guerra.
El descifrado es igual de sencillo si se conoce el número de desplazamientos que hay que realizar. Si no se conoce hay que trabajar algo más, aunque solamente habría que probar todas las combinaciones posibles, probando las primeras palabras hasta encontrar alguna frase coherente, y después traducir todo el texto. Podrían parecer demasiadas combinaciones, pero en el caso de nuestro alfabeto actual son solamente 27 posibilidades, pocas en comparación con otros cifrados. ¿Os imagináis que hubiera la misma cantidad que kanjis japoneses o hanzis chinos?
- Vjkf vj le kvokf tzwiruf r kirmvj uvc dvkfuf Tvjri tfe 43 gfjztzfevj uv uvjgcrqrdzvekf r cr uvivtyr.
¿Podéis descifrarlo?
Como curiosidad, este cifrado se utiliza para otros más complejos como el de Vigenère.
¿Conocéis otros sistemas de cifrado?
Para los más técnicos, os dejo un programa en C++ que codifica textos.
// Cifrado César
// No se cifran letras con tilde, ñ, ç, ...
#include
#include
using namespace std;
void cesar(const string& s, int n) {
for(int i = 0; i < s.size(); ++i) {
char c = s[i];
if(c >= 'a' and c <= 'z') { // Minúsculas
if(c+n>'z') cout << char('a'+c+n-'z'-1);
else cout << char(c+n);
}
else if(c >= 'A' and c <= 'Z') { // Mayúsculas
if(c+n>'Z') cout << char('A'+c+n-'Z'-1);
else cout << char(c+n);
}
else cout << c;
}
}
int main() {
int n; // Número de posiciones a desplazar
cin >> n;
n %= 26;
string s;
while(cin >> s) {
cesar(s, n);
cout << ' ';
}
cout << endl;
}
Santa Claus, según la física
22 ago
Santa Claus, el gordo barbudo, ¿existe? la física no dice que no directamente sin proponerse un estudio sobre este ser. Y aquí están las conclusiones.
1. Ninguna especie conocida de reno puede volar, pero hay 300.000 especies de organismos con vida que aún no han sido clasificados, muchos de ellos insectos y gérmenes. Muchos, que no todos. Esto no excluye que pueda haber renos con la capacidad de elevarse hacia el cielo.
2. Hay 2.000 millones de niños (personas con menos de 18 años) en todo el planeta. Pero como Santa Claus no da regalos a musulmanes, hindúes, judíos o budistas (xenofobia?), eso reduce el trabajo hasta un 15% aproximadamente (378 millones). Con una media de 3.5 niños por casa, según el censo, eso significa que Santa tendría que visitas unos 91.8 millones de hogares. Intentemos pensar que hay por lo menos un niño que ha sido bueno en cada uno de ellos, si no tendríamos que reducir ese número...
3.Santa Claus tiene 31 horas de navidad para trabajar, gracias a las diferencias horarias y asumiendo que viaja de este a oeste, lo más lógico.
Eso significa que tiene que visitar 822.6 casas por segundo. Es decir, el gordito tiene una milésima parte de segundo para llegar a la casa cristiana (con un niño bueno), aparcar, salir del trineo, bajar por la chimenea, llenar los calcetines, distribuir los regalos restantes bajo el árbol, comerse los regalos que le han dejado a él (vaya empacho), subir por la chimenea, subirse de nuevo al trineo y ir a visitar la siguiente casa.
Asumiendo que esas 91.8 millones de casas están regularmente distribuidas por el planeta (falso, pero podemos aceptarlo en nuestros 'cálculos'), estamos hablando ahora de una distancia de separación de 125.5 kilómetros por cada parada, un viaje total de 121.5 millones de kilómetros, sin contar las paradas de lo que nosotros ya sabemos, comer, etc...
Esto significa que el trineo del gordo se mueve a 1046 Km/s (3.765.600 Km/h), unas 3.000 veces la velocidad del sonido, o 300 veces menor a la de la luz. Para comparar, el vehículo más rápido construido por el hombre (el Ulyses Space Probe), se mueve a 44.1 Km/s (unos 158.760 Km/h). Un reno convencional (no el volador) puede correr a 24 kilómetros por hora.
4.La carga en el trineo añade otro elemento interesante. Asumiendo que cada niño recibiera nada más que un paquete mediano de lego (1 Kg aprox.), el trineo tendría que aguantar un peso de 321.300 toneladas, eso sin contar al ya mencionado gordito.
En tierra, un reno convencional puede llevar un máximo de 136 Kg. Si suponemos que el super-reno volador pudiera llevar 10 veces más peso (1360 Kg), necesitaríamos 214.200 renos. Esto aumenta el peso, sin contar el peso del trineo, a 356.430 toneladas. De nuevo, para comparar, es cuatro veces el peso de el Queen Elizabeth (un barco).
5. 356.000 toneladas a 1.056 Km/s crea una gran resistencia al aire, que provocará que los renos reciban un calor proporcional al de una nave espacial entrando en la atmósfera terrestre.
Resumiendo, los primeros renos se incendiarían casi instantaneamente, exponiendo a la resistencia a los de detrás, causando, también, explosiones sónicas a su paso. Todos los renos habrían sido vaporizados en menos de 4.26 milésimas de segundo.
mientras, Santa Claus estaría recibiendo una fuerza de 17500.06G. Un Santa de unos 100 Kg (algo no muy gordo) sería llevado hasta el final de su trineo con una fuerza de 1957257 Kg.
En conclusión, es físicamente imposible que alguien aguante esas fuerzas, a parte de que Santa Claus fuera un robot, como en Futurama.
Vía: Traducción y adaptación de Physlink (El cambio de medidas puede alterar los resultados).
Números
21 ago
16: Es el único número donde X^Y=Y^X, siendo X y Y enteros distintos.
28: Es el 2º número perfecto.
53: Único número de dos cifras que se escribe opuesto en hexadecimal.
94: Es un número de Smith.
135: 1^1+3^2+5^3.
198: 11 + 99 + 88.
240: Es el número más pequeño con 20 divisores.
9945: 17!!!!
...
Vía: Stetson (Inglés). Curiosidades de números del 0 hasta el 9999, hasta cansarte.


Comentarios