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