Search code examples
cparipari-gp

Creating an initialization file in pari-gp


This question is definitely a stupid question. But, coming from C; I'm having trouble adding header files or "an initialization" file to my pari-gp code. This is to mean; I have a 1hr compile of code to make one vector; and I can use that vector once initialized; but I want to make a file of this vector such that I can access it once it's compiled once.

Here's the code without a header file; which takes about an hour to compile (given the series precision/numerical precision which are set to 100).

\p 100
\ps 100
Phi_Inv(w,l,{n=100}) =
{
    my(out = 0);
    for(i=0,n,
        out = w*exp(out)/(exp(l*(n+1-i))+w)
    );
    out;
}




beta_init(n) = {
    beta_taylor = vector(100,i,polcoef(Phi_Inv(w,l,n),i-1,w));
    print(beta_taylor);
}

Rather than the brutal assignment of beta_taylor; and the caveman like print(beta_taylor), how can I write this to an initialization file I can package with the script. That is; an X mb file with all the coefficients neatly packed together. And if the file is lost, just run the code (which will take an hour) to write the initialization file again.

I mean, how would I properly do #include test.h where test.h is just a very long list of Taylor series values. So that I can just include this file, and write beta_taylor[i] for the i'th function. Such that it's as simple as including variables, like in C. I know I'm missing something simple and it's frustrating--making me feel stupid.

I'm mostly just asking about the syntax to go about and do this. I think I know how; but I imagine it's not the best way.

Any help or suggestions are greatly (And I really mean it, Greatly) appreciated.

To make a long story short; how do I save beta_taylor as a file we load when we initialize the program, and if the file is deleted we can save the program again by running the code for an hour?

Regards


Solution

  • So you want to serialize your vector of numbers to a file and read it back in later?

    writebin() to the rescue. Something like

    beta_init(n) = {
        beta_taylor = vector(100,i,polcoef(Phi_Inv(w,l,n),i-1,w));
        writebin("beta_taylor.dat", beta_taylor);
    }
    

    Run the function in one gp session, and then in another session, beta_taylor=read("beta_taylor.dat").


    Compiling your code first with gp2c before running it to calculate the numbers will speed things up if you're not already doing that, btw. gp2c-run makes it easy by compiling a file and starting a new gp session with the resulting shared library already loaded. You might also look into if the parallel operations can be used here to speed up the initial computation; reading the documentation for parvector() I don't think it can be, though, because of that mysterious l variables used in beta_init() that I don't see you define anywhere, but you might be able to re-phrase your equation with hardcoded constants or something.