Eräs kaveri kysyi Facebookissa, miten Linuxissa voi kääntää seuraavan c-ohjelman, joka löytyy osoitteesta http://fredrikj.net/blog/2013/03/testing-lis-criterion/ .
#include "fmprb.h" #include "fmpcb.h" #include "fmprb_poly.h" #include "zeta.h" #include "profiler.h" void log_zeta(fmprb_struct * z, long n, long prec) { fmpcb_struct * w; fmprb_struct * t; fmpcb_t s, a; long i; t = _fmprb_vec_init(n); w = _fmpcb_vec_init(n); fmpcb_init(s); fmpcb_init(a); fmpcb_zero(s); fmpcb_one(a); zeta_series(w, s, a, 0, n, prec); for (i = 0; i < n; i++) fmprb_neg(t + i, fmpcb_realref(w + i)); _fmprb_poly_log_series(z, t, n, prec); fmpcb_clear(s); fmpcb_clear(a); _fmpcb_vec_clear(w, n); _fmprb_vec_clear(t, n); } void log_gamma(fmprb_struct * z, long n, long prec) { long i; if (n > 0) fmprb_zero(z); if (n > 1) fmprb_const_euler(z + 1, prec); if (n > 2) zeta_ui_vec(z + 2, 2, n - 2, prec); for (i = 2; i < n; i++) fmprb_div_ui(z + i, z + i, i, prec); for (i = 1; i < n; i += 2) fmprb_neg(z + i, z + i); for (i = 0; i < n; i++) fmprb_mul_2exp_si(z + i, z + i, -i); } void log_1s(fmprb_struct * z, long n, long prec) { long i; if (n > 0) fmprb_zero(z); if (n > 1) { fmprb_const_pi(z + 1, prec); fmprb_log(z + 1, z + 1, prec); fmprb_mul_2exp_si(z + 1, z + 1, -1); fmprb_add_ui(z + 1, z + 1, 1, prec); } for (i = 2; i < n; i++) { fmprb_one(z + i); fmprb_div_ui(z + i, z + i, i, prec); } _fmprb_vec_neg(z, z, n); } int main() { fmprb_struct *z, *t, *a; timeit_t t0; long i, n, prec; n = 100 + 1; prec = 6 * n; /* must choose wisely */ z = _fmprb_vec_init(n); t = _fmprb_vec_init(n); a = _fmprb_vec_init(n); timeit_start(t0); log_zeta(z, n, prec); timeit_stop(t0); printf("zeta: %ld ms\n", t0->cpu); timeit_start(t0); log_gamma(t, n, prec); timeit_stop(t0); printf("gamma: %ld ms\n", t0->cpu); _fmprb_vec_add(z, z, t, n, prec); log_1s(t, n, prec); _fmprb_vec_add(z, z, t, n, prec); for (i = 0; i < n; i++) fmprb_set_si(t + i, (i == 0) ? 0 : -1); timeit_start(t0); _fmprb_poly_compose_series(a, z, n, t, n, n, prec); timeit_stop(t0); printf("composition: %ld ms\n", t0->cpu); for (i = 0; i < n; i++) { printf("%ld: ", i); fmprb_printd(a + i, 15); printf("\n"); } _fmprb_vec_clear(z, n); _fmprb_vec_clear(t, n); _fmprb_vec_clear(a, n); }
Kokeilin itse, mutta sain valituksen
/usr/local/include/fmpr.h:33:19: fatal error: flint.h: No such file or directory #include "flint.h" ^ compilation terminated.
vaikka käänsin hakemistossa /home/jaakko/programming/flint-2.4.4 ja siellä on tuo tiedosto flint.h.
En ymmärrä mitään Linuxista, mutta pitäisikö flint.h:n olla /usr/local/include/ -kansiossa?
Kyllä kai, mutta ei auttanut kääntämään ohjelmaa.
Aihe on jo aika vanha, joten et voi enää vastata siihen.