Bill Allombert on Sun, 08 Oct 2006 16:33:42 +0200 |
[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]
Defining variable priority [alternative solution] |
On Wed, Sep 20, 2006 at 12:23:14AM +0200, Bill Allombert wrote: > Hello PARI-dev, > > This is an experimental patch that allow to define new variables with > specified priority under GP. This is an alternative patch toward the same goal. The interface is the same but this is quite different internally: Instead of supplementing variable numbers by priority, we simply allow the user to create new variable with prescribed variable number. The result is a patch which is much less intrusive (in particular it does not break binary storage) but less powerful: Variable numbers are quite constrained and cannot be changed. For example, if you have a variable x of priority 0 and another of priority 1, you cannot create a new variable between x and y because there is no available integer and you cannot renumber y to 2 either. Also since variable numbers are non-negative and x priority is 0 you cannot create variable with higher priority than x. That could be fixed by changing variable numbers to be between [-MAXVARN/2,MAXVARN/2]. I am posting this patch in the hope we find an intermediate solution between both approach. An example of usage : parisize = 4000000, primelimit = 500000 ? newvar(y,2); ? newvar(z,1); ? y+z %1 = z + y Cheers, Bill.
Index: src/headers/paridecl.h =================================================================== RCS file: /home/cvs/pari/src/headers/paridecl.h,v retrieving revision 1.602 diff -u -r1.602 paridecl.h --- src/headers/paridecl.h 8 Oct 2006 13:11:33 -0000 1.602 +++ src/headers/paridecl.h 8 Oct 2006 13:11:59 -0000 @@ -263,6 +263,7 @@ void kill0(entree *ep); long manage_var(long n, entree *ep); void name_var(long n, char *s); +void newvar(char *s, long p); GEN readseq(char *t); GEN strtoGENstr(const char *s); GEN strtoi(char *s); Index: src/language/anal.c =================================================================== RCS file: /home/cvs/pari/src/language/anal.c,v retrieving revision 1.259 diff -u -r1.259 anal.c --- src/language/anal.c 2 Oct 2006 09:45:37 -0000 1.259 +++ src/language/anal.c 8 Oct 2006 13:14:37 -0000 @@ -2601,11 +2601,24 @@ return *table = ep; } +static long nvar; /* first GP free variable */ + +void create_var(entree *ep, long var) +{ + GEN p = (GEN)ep->value; + /* create pol_x[var] */ + p[0] = evaltyp(t_POL) | evallg(4); + p[1] = evalsigne(1) | evalvarn(var); + gel(p,2) = gen_0; + gel(p,3) = gen_1; + varentries[var] = ep; +} + + long manage_var(long n, entree *ep) { static long max_avail = MAXVARN; /* max variable not yet used */ - static long nvar; /* first GP free variable */ long var; switch(n) { @@ -2625,24 +2638,35 @@ default: pari_err(talker, "panic"); } - if (nvar == max_avail) pari_err(talker2,"no more variables available", - mark.identifier, mark.start); if (ep) { - GEN p = (GEN)ep->value; + while (nvar<max_avail && varentries[nvar]) nvar++; + if (nvar == max_avail) pari_err(talker2,"no more variables available", + mark.identifier, mark.start); var = nvar++; - /* create pol_x[var] */ - p[0] = evaltyp(t_POL) | evallg(4); - p[1] = evalsigne(1) | evalvarn(var); - gel(p,2) = gen_0; - gel(p,3) = gen_1; - varentries[var] = ep; + create_var(ep,var); } else var = max_avail--; return var; } +void +newvar(char *s, long p) +{ + char *t = s; + entree **funhash = functions_hash + hashvalue(&t); + entree *ep = findentry(s, t - s, *funhash); + if (ep) + pari_err(talker, "%s already exists", s); + if (p<0 || p>MAXVARN) + pari_err(talker, "invalid priority %ld", p); + if (varentries[p]) + pari_err(talker, "priority %ld already in use", p); + ep = installep(NULL,s,strlen(s),EpVAR, SIZEOF_VAR_POLS, funhash); + create_var(ep,p); +} + long fetch_var(void) { --- /dev/null 2006-05-11 11:25:12.000000000 +0200 +++ src/functions/programming/newvar 2006-09-19 23:51:01.000000000 +0200 @@ -0,0 +1,6 @@ +Function: newvar +Section: programming +C-Name: newvar +Prototype: vrL +Help: newvar(var,p): create a new variable named var of priority p. +