Bill Allombert on Wed, 05 Apr 2017 16:51:06 +0200

 Re: writing a "module" in pari-gp

On Wed, Apr 05, 2017 at 02:30:04PM +0100, Kevin Buzzard wrote:
> The second thing I do is to read in my module code, called
> drinfeldslopes.g, which implements all the functions I want. The code
> looks like this
>
> q=9
> B=100
> \\
> \\ that's the global variables set
> \\
> del()=[some pari function which will return a power series in t to
> precision O(t^B)]
> etc etc
>
> so the first thing I do is to edit drinfeldslopes.g and change the
> inbuilt values of q and B so they're the values I want.
>
> I then \r the file drinfeldslopes.g in the fresh session and then I
> have all my functions producing Drinfeld forms etc etc and I can do
> calculations. For example I can run del() and it prints out the
> Drinfeld modular form version of the Delta function for F_q[T] to
> precision t^B; I didn't need q or B as an input because they're
> globally fixed for the session.
>
> This worked fine in the 1990s but I do wonder whether nowadays I could
> be doing something more sophisticated. In python or sage I could
> imagine importing a module and then running some initial code to set
> some parameters.

Well fundamentally, you can use the same underlying technique:
write a function initmodule:

initmodule(q0,B0)=...
that set q and B and run whathever initialization code is necessary.

(You can also use 't instead of t so that the value of t
does not interfer with the polynomial variable t.)

Then do
\r drinfeldslopes.g
initmodule(9,200)

> Another thing I'd really like is that certain functions can take a
> long time to run (e.g. computing del() when B is large) so I would
> ideally like to remember the values of computations if they have been
> done already. This is an independent question but is this sort of
> thing possible or easy nowadays? This should just be a quick look-up
> -- do I have to write this myself?

Do you want to remember it across a session or to save it to keep it
between sessions ?

You can use maps, see ??call for a (too) generic example.
A simpler version:

delcache=Map(); \\in initmodule

delm(n)=
{
my(res);
if(mapisdefined(delcache, n, &res)
,return(res));
res=del(n);
mapput(delcache,n,res);
res;
}

Cheers,
Bill.