( uid_6201 | 2017. 08. 25., p – 12:01 )

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;
}