Ilya Zakharevich on Fri, 24 Apr 1998 23:21:02 +0200


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

Re: Missing API in PARI? (fwd)


Forwarded message:
> [Ilya:]
> > No, this is not what I had in mind.  (At least in 1.36 or around)
> > calculator knows that aa[2,4] is placed after aa[2,3], so one can find
> > the allocation size of aa[2,3] by subtracting addresses of aa[2,4] and
> > aa[2,3].  If the size of aa[2,3] is big enough (bigger than size
> > needed to store 4 in the above example ;-), the calculator will write
> > GEN(4) in the chunk of memory occupied by aa[2,3] - without reallocing
> > aa.
> 
> Not anymore. This was cancelled a long time ago (around 1.38) since it led to
> a HUGE number of fatal errors (SIGBUS mostly) in perfectly valid (and
> previously working) scripts. Basically, it only worked under some additional
> conditions on the _values_ themselves (non-recursive ones were always ok).

You mean that there was a way to put a vector into a variable so that
it the components do not occupy consequent chunks of memory?  Or is

  (blah(foo))[73] = bar

allowed?

> I removed the whole thing in 2.0 (in fact 1.905, but few people have actually
> used these pre-alpha releases...). Now GP does not assume anything except
> that he expects all components to be either part of the stack (no CLONEBIT)
> or clones (with the CLONEBIT set). Whenever a component is changed, its
> previous value is freed (recursively, it may be a complicated array itself)
> if it was a clone, and we then insert a clone of the new value to replace it.
> So far, this has proven reliable, and the loss of efficiency due to data
> fragmentation is negligible.

Leaving the technobabble (which I cannot follow) aside, is it true
that the default way to assign to arrays element-wise takes O(n^2) now?

Ilya