Entradas etiquetadas con matemáticas
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;
}
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