/* mpf_deriv.c multiple precision derivative coefficients */ /* has mpz_deriv and mpf_deriv does rderiv */ #include #include "mpf_deriv.h" /* includes gmp and digits */ static mpf_t atemp; static mpf_t btemp; static int debug = 0; void mpz_deriv(int order, int npoints, int point, mpz_t a[], mpz_t bb); void mpf_rderiv(int order, int npts, int point, mpf_t h, mpf_t cx[]) { int i, j; mpz_t a[50], b; mpz_init(b); for(i=0; i<50; i++) mpz_init(a[i]); mpf_set_default_prec(digits*3.32); /* in bits */ mpf_init(atemp); mpf_init(btemp); mpz_deriv(order, npts, point, a, b); mpf_set_z(btemp, b); for(i=0; i=1, npoints>=order+1, 0 <= point < npoints, */ /* 'a' array returned with numerator of coefficients, */ /* 'bb' returned with denominator of h^order */ mpz_t h[50]; /* coefficients of h */ mpz_t x[50]; /* coefficients of x, variable for differentiating */ mpz_t numer[50][50]; /* numerator of a term numer[term][pos] */ mpz_t denom[50]; /* denominator of coefficient */ int i, j, k, term, jorder, iat, jterm; mpz_t ipower, isum, r, tmp, tmp2; mpz_init(ipower); mpz_init(isum); mpz_init(r); mpz_init(tmp); mpz_init(tmp2); if(npoints<=order || npoints>=49) { printf("ERROR in call to deriv, npoints=%d >=49 || < order=%d+1=%d \n\n", npoints, order, order+1); return; } for(i=0; i<=npoints; i++) { mpz_init(a[i]); mpz_init(h[i]); mpz_init(x[i]); mpz_init(denom[i]); for(j=0; j<=npoints; j++) mpz_init(numer[i][j]); } for(term=0; term0) for(i=0; i0) for(i=0; i0) gmp_printf("f^(%d)(x[%d]) = (1/h^%d) (%Zd/%Zd f(x[%d]) + \n", order, iat, order, a[jterm], denom[jterm], jterm); } if(debug>0) printf("\n"); mpz_set_si(bb, 0); for(jterm=0; jterm0) mpz_set(bb, denom[jterm]); /* largest denominator */ } for(jterm=0; jterm0) gmp_printf("f^(%d)(x[%d])=(1/%Ddh^%d)(%Dd f(x[%d]) + \n", order, iat, bb, order, a[jterm], jterm); } /* end computing terms of coefficients */ } /* end mpz_deriv */