De ez is kis trükkel felezhető. Hagyjuk el a GMP-beli másolást.
#include <gmp.h>
#include <time.h>
#include <stdio.h>
mpz_t *f(int n) {
static mpz_t prev[4];
mpz_init_set_ui(prev[0], 1);
mpz_init(prev[1]);
mpz_init(prev[2]);
mpz_init(prev[3]);
int i;
for (i = 1; i < n; i++) {
mpz_add(prev[i&3], prev[(i-2)&3], prev[(i-1)&3]);
}
return &prev[(i-1)&3];
}
int main() {
struct timespec gstart, gend;
clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &gstart);
mpz_t *res = f(500000);
clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &gend);
mpz_out_str(stdout, 10, res); puts("");
double eltime = (gend.tv_sec - gstart.tv_sec) + (gend.tv_nsec - gstart.tv_nsec)/1000./1000./1000.;
printf("ido: %f mp\n", eltime);
return 0;
}