Possible memory leak? (was: update on fast mult benchmark (fwd))
Richard Fateman
fateman at cs.berkeley.edu
Sun Mar 24 18:01:57 CET 2002
Richard B. Kreckel wrote:
> Hi,
>
> On Sat, 23 Mar 2002, Pearu Peterson wrote:
>
>>I have tried to run Richard Fateman's multiplication benchmark also with
>>GiNaC (1.0.2,1.0.6)
<<<snip>>>
> The culprit is mul::expand(), where two expanded polynomials (class
> add), one with n1 terms and another with n2 terms are first written out by
> brute force in an n1*n2 vector. This is then returned through an add
> constructor which sorts it (calling expairseq::canonize()) and then
> compacitifies it (calling expairseq::combine_same_terms_sorted_seq()).
This seems to me to be a design that should be revisited. For
the univariate case it is particularly bad since multiplying polynomials
of degree u and v gives you only degree u+v, and you will have
allocated (u+1)*(v+1) cells.
>
> For two large input polynomials this is clearly bogus, because it does not
> allow for early cancellations. It was done this way because the compexity
> of sorting is asymptotically ideal (n*log(n) comparisons). This seems
> to have been a short-sighted decision.
The sorting cost is going to be dominated by the coefficient operations
most likely, even if it is n^2. Note that Maple doesn't bother to
sort at all. I think that if you test the others against sorting of
Maple's results, Maple will look far worse.
>
> I can think of a gazillion ways how to repair this and will try to provide
> a fix really soon now. It needs some careful balancing, however.
> (Incidentally, I already had some trial-code in my private tree which
> performs much better.)
>
> To me it appears that this test per se does not tell us very much about
> representation. Besides questions of representation, the actual
> implementation of expand() might differ between the systems compared by
> Richard Fateman.
There are not too many ways of multiplying sparse polynomials without
using u*v multiplies and about u*v -size(answer) adds. For dense
polynomials in a finite field, FFT can be used. My guess is that
an FFT approach would not be faster on such a small ( :) ) problem
as this one. But a careful implementation might win. In order
to represent the inputs and the outputs, the FFT would probably
have to be done quite a few times since the bignum coefficients
would need to be built up by Chinese Remainder.
In particular, I am amazed to see the difference between
> Maple, Mathematica and MuPAD being so tiny. This contradicts my own
> experience with handling polynomials in these three systems. The pattern
> t(MuPAD) > t(Maple) > t(Mma) looks reasonable, but the differnece is
> usually *much* bigger.
>
> Geez, and we thought polynomial expansion was trivial...
Incidentally, you should be able to do w^2 much faster than w*w.
RJF
>
> Regards
> -richy.
>
> PS: Richard: 1234567890 < (2^31)-1, on page 1, third paragraph.
>
Thanks. I changed it. That number is large enough so that in my
Lisp it is not a single-word "fixnum" .. some bits are used for
type tags. I don't know anything about GiNaC internals, but
such design decisions involving a unified treatment of arbitrary
size integers can affect time, programmer convenience, data size
etc. in a very complicated way.
When this problem works on GiNaC I'd like to know its speed!
RJF
More information about the GiNaC-devel
mailing list