collect() eats fractions

Pearu Peterson pearu at cens.ioc.ee
Fri Apr 13 22:20:33 CEST 2001


Hi again,

I am now convinced that what's in the subject is a bug. It is related to
the assumption in the basic::collect function that

	this->ldegree(s)    <=   this->degree(s)

but it is not always true:

>>> ldegree(1/(1+x),x),degree(1/(1+x),x)
(0, -1)

As a fix, the collect function should be

ex basic::collect(const ex & s) const
{
        ex x;
        int ldeg = this->ldegree(s);
	int deg = this->degree(s);
	int n_start = min(ldeg,deg);
	int n_end = max(ldeg,deg);
        for (int n=n_start; n<=n_end; n++)
                x += this->coeff(s,n)*power(s,n);

        return x;
}

Note that then 

>>> coeff(1/(1+x),x,0),coeff(1/(1+x),x,-1)
(1 + x) ** (-1), 0

and consequently

	collect(1/(1+x),x)

will result correctly in

	(1+x) ** (-1)

Regards,
	Pearu

On Thu, 12 Apr 2001, Pearu Peterson wrote:

> 
> Hi!
> 
> In ginsh (ginac V0.8.0):
> 
> > x/(1+x);
> (1+x)^(-1)*x
> > collect(x/(1+x),x);
> 0                           <----???
> > collect(1+x/(1+x),x);
> 1                           <----???
> > collect(x+x/(1+x),x);
> (1+(1+x)^(-1))*x
> 
> Is this GiNaC bug or feature?
> 
> Pearu
> 
> -
> To UNSUBSCRIBE, email to ginac-list at ginac.de with a subject of "unsubscribe".
> 




More information about the GiNaC-devel mailing list