main(){int i=1,p=10000000;complex c=-3./4+I/p,z=c;for(;++i<5*p;)if(pow(creal(z=z*z+c),2)+pow(cimag(z),2)>=4)exit(printf("%i\n",i));}
Require as seguintes cabeceiras:
// Totalmente necesarias #include <complex.h> // Estándar, para evitar queixas do compilador #include <stdio.h> #include <stdlib.h> #include <math.h>
Que fai? Calcula os dixitos de PI con un número `p` de dixitos, baseandose no Conxunto de Mandelbrot (un fractal) [ explicación do "algoritmo" por gaussianos ].
Código desenrrolado:
// Números complexos? librería que te criu
#include <complex.h>
int main(){
int i = 1, // Inicializamos o contador de iteracións
p = 10000000; // E especificamo-la precisión
complex c = -3./4+I/p, // Poñemo-lo C no punto -3/4 (1/p)*I (sendo I a raíz cadrada de -1)
z = c; // É inicializamos Z dende C
for(i++;i < (5 * p);i++){ // Mentres podamos seguir adiante (se nos pasamos de p*5 algo fallou)
z = z * z + c; // Adiantamos o Z ó seguinte punto
if(pow(creal(z),2) + pow(cimag(z),2) >= 4){ // Comprobamos se "escapa"
printf("%i\n", i); // Se escapa, xa temos o número
exit(0);
}
}
}
Saída: 31415928 (o último díxito non é moi preciso ;)
Saúdos
No hay comentarios:
Publicar un comentario