Karim BELABAS on Sun, 19 Jul 1998 13:54:47 +0200 (MET DST)


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

Re: variable losing its value in 2.0.10


[Igor:]
> ? a=nextprime(2^129)
> 680564733841876926926749214863536422929
> ? a=nextprime(a+1);factorint(a*nextprime(a+1))
> ^C  ***   user interrupt after 1,053 ms.
>  
> ? a
> a
> 
> What happened to the value of a???

It's lost and it's a feature. A variable's value can be altered in 3
different way (there are some other marginal cases which don't matter here):

1) assignment (a=..., a++, etc.) and the former value is lost, unless it's
the initial value (monomial of degree 1).

2) it can be pushed down/poped out a stack when the frame changes. Ex:
  f(x)=...
  for(i=1,...)
x and i are preserved and their old values are restored when returning from
the function/loop.

3) When recovering from an error (user interrupt is an error). All stacks
arising from case 2 above are inspected and values that were pushed down
since the last input command (from the GP prompt) are poped out. 
[Technical note: This is analogous to case 2 above except that arrays/matrices
which haven't been changed as a whole (some components may have been) aren't
restored (n fact, this is a memory leak which I don't know how to fix
reliably, without a huge performance hit).]

Here the `a' stack is as follows (oldest values to the left)

i)    a <-- nextprime(2^129)                  (case 1, initial value)
ii)   a <-- nextprime(nextprime(2^129) + 1)   (case 1)
iii)  a                                       (case 3)

If you had written the code above as follows:

? f(a)= a=nextprime(a+1);factorint(a*nextprime(a+1))
? a=nextprime(2^129);
? f(a)

the value of a would have been restored.

  Hope it helps,

      Karim.

P.S: It would be easy to keep a stack of all values, regardless of the scope,
but that would be a memory hog and slow down all scripts for marginal
gain in interactive use.

A better solution, and relatively easy to implement at a slight performance
cost, would be to check how old the former value is before each assignment.
We'd save it somewhere if it was created before the current run, in case an
error would be raised later on. I'm not sure it's worth it, though...
--
Karim Belabas                    email: Karim.Belabas@math.u-psud.fr
Dep. de Mathematiques, Bat. 425
Universite Paris-Sud             Tel: (00 33) 1 69 15 57 48
F-91405 Orsay (France)           Fax: (00 33) 1 69 15 60 19
--
PARI/GP Home Page: http://pari.home.ml.org