Gottfried Helms on Fri, 18 Nov 2022 00:18:49 +0100


[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]

Re: Conversion of a function/closure with rational coefficients into one with real coefficients


Am 17.11.2022 um 20:02 schrieb Bill Allombert:
> Well, if you define
> p[4] =  1/4*x^2-2/3*x+1/6
> then you can define
> my(f=p[4]);(pp[4]=x->eval(f));
> my(f=p[4]*1.);(pr[4]=x->eval(f));
> 
> or
> if you really want to use pp[4](x) =  1/4*x^2-2/3*x+1/6,
> then you can do
> 
> my(f=pp[4](x)*1.);ppr[4]=x->eval(f);
> 
Bill -

 many thanks for your help. Unfortunately I couldn't
 get your ideas working as I have it intended.
 After rethinking (and consultation of the user.pdf)
 I understand now, that my intention would best be
 described by the (impossible) construction

 {for(k=1,4,
    component(ppr[4](x))[k] = 1.0*component(pp[4](x)[k];
  );}

 this means, the creation or alteration of the components
 of the closure programmatically. But this idea belongs
 to the old 70'ies programming in PL/I where you have
 pointers and I would have found how to access the internal
 constants of a function/closure...
 But this is impossible (and likely not wanted: protected
 memory and so on) here in Pari/GP.

 What I do at the moment is to use the 'eval(Str("..."))'-
 construct to define the function-array, where I already
 have the polynomials with rational coefficients in
 array of closures 'pp[1..128]'
 so

  {default(realprecision,60);
   default(format,"g0.60");\\ or something I want
   ppr=vectorv(128);
   for(r=1,128,
     st=Str("ppr[",r,"]=x->",1.0*pp[r](x));
     eval(st);
     );
   default(format,"g0.12");
   default(realprecision,200); \\ resetting to my standard
     }

 With this I can give it another try; my implementation
 with the rational 'pp[r](x)' polynomials needed in a
 certain loop with call on various 'x' 20 sec, while a
 concurring implementation from someone else using
 real valued (50 dec digits) coefficients/polynomials
 ran with 0.2 secs... or so...
 I think this shows also the way to implement it as
 program-initialization; the strings 'st' in the 'for'-
 loop shall be stored as strings in a file which should
 then be loaded/read at programinititalization.


 Thanks for help and making me rethink the problem!

 Kind regards-

 Gottried