Karim BELABAS on Wed, 2 Jul 2003 23:36:46 +0200 (MEST) |
[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]
Re: using zbrent in C mode |
On Wed, 2 Jul 2003, Bill Allombert wrote: > On Wed, Jul 02, 2003 at 08:58:55PM +0200, Olivier Ramare wrote: >> I'll be able to program in pari-C one day ... >> Just now, can anyone tell me how to program that >> >> x=solve(t=a,b,sin(t)) > > Short answer: You cannot. > > Long answer: You can try to use lisexpr(): Intermediate answer: it was a 2 minutes job to convert the existing zbrent into GEN zbrent(void *dat, GEN (*f)(GEN, void*), GEN a, GEN b, long prec) where f(x) is computed by f(x, dat) [ to cater for functions requiring external parameters: dat being a pointer to an arbitrary data structure, typecast to void *, reinterpreted within f(). Possibly dat = NULL ]. This will be cleaner and much faster than using lisexpr() for simple functions. It's not GP2C-friendly [ iterators would be better ], but at least it is usable in libpari, and requires tiny code changes [ I wrote a few iterators when fiddling with intnum(), the resulting code would be a nightmare to maintain ] It's not mandatory that f be stack-clean [ although it won't hurt if it is! ] Example: GEN myfun(GEN x, void *dat) { return gsub(gsqr(x), gdeux); } GEN test() { return zbrent(NULL, &myfun, gzero, gdeux, DEFAULTPREC); } Warning: all this is untested, but it should work. Provided you update from CVS, that is... Karim. -- Karim Belabas Tel: (+33) (0)1 69 15 57 48 Dép. de Mathématiques, Bât. 425 Fax: (+33) (0)1 69 15 60 19 Université Paris-Sud http://www.math.u-psud.fr/~belabas/ F-91405 Orsay (France) http://www.parigp-home.de/ [PARI/GP]