Hi,

On Thu, Aug 05, 2010 at 05:09:26PM -0600, Aaron S. Meurer wrote:
> I didn't want to open an issue before asking here, because for all I know 
> there could be a very good reason for this.
> 
> In [1]: Poly(-5*x**3, x).div(Poly(3*x, x))
> Out[1]: (Poly(0, x, domain='ZZ'), Poly(-5*x**3, x, domain='ZZ'))
> 
> In [2]: Poly(-5*x**3, x, field=True).div(Poly(3*x, x, field=True))
> Out[2]: (Poly(-5/3*x**2, x, domain='QQ'), Poly(0, x, domain='QQ'))
> 
> I understand that it doesn't want to create field coefficients, but I thought 
> that the definition of polynomial division and remainder was that a.div(b) 
> returns q and r such that a == b*q + r and **either r == 0 or deg(r) < 
> deg(b)**.  [1] obviously does not satisfy this second condition.  So what 
> definition does it use?  
> 
> This is causing problems in the Risch algorithm.  It seems like I need to be 
> using field=True every time I create a Poly, or else I will get wrong 
> results. But then that gives things like gcd() problems.  
> 
> By the way, I know about pdiv.  But I think regular div() should be returning 
> results with field coefficients if it must to satisfy the definition, unless 
> I am seriously missing something.
> 

The conditions are met only over a field or when b is monic. Over
integers with non-monic b you arrive with the problem you showed.
If you rely on those conditions (e.g. you are creating a sequence
of polynomials with decreasing degrees) then you have to perform
computations over a field (unless your polynomials are monic ---
not a very interesting case in general).

I guess you run into this problem somewhere around EEA (Extended
Euclidean algorithm). In this case (and a few other, e.g. Strum
sequences) user-level polynomial manipulation functions switch
ground domain to a field automatically (on lower levels you get
DomainError exception to avoid infinite loops).

So, you will have to use field=True whenever the conditions must
be met. We may also think about adding this automatic behaviour
to div() (as it is done in gcdex(), half_gcdex(), sturm() ...).

You said that there are problems with gcd() computations. What
is specifically wrong here? Maybe it's an issue that GCD over
a field is always monic in SymPy?

> Aaron Meurer
> 
> -- 
> You received this message because you are subscribed to the Google Groups 
> "sympy" group.
> To post to this group, send email to sy...@googlegroups.com.
> To unsubscribe from this group, send email to 
> sympy+unsubscr...@googlegroups.com.
> For more options, visit this group at 
> http://groups.google.com/group/sympy?hl=en.
> 

-- 
Mateusz

Attachment: signature.asc
Description: This is a digitally signed message part

Reply via email to