# Error computing the primitive part of a monovariate integer polynomial

Consider the following code:

primitive_part = lambda f : f / f.content()

# Primitive Euclidean Algorithm
def primitive_euclides(f,g):
r0 = f; r1 = g;

assert(f.degree() >= g.degree())

while r1 != 0:
print(r1)
delta = r0.degree() - r1.degree() + 1
aux = primitive_part(aux)
r0, r1 = r1, aux

return r0 #TODO: normal form

# Example: Z[x]
ZX = PolynomialRing(ZZ, 'x')
f = ZX(x^8+2*x^7+4*x^6-2*x^5-3*x^4+4*x^3+9*x^2-2*x-5)
g = ZX(5*x^5-2*x^4-13*x^3-11*x^2+7*x+6)
r = primitive_euclides(f,g)
print(r)


When I execute this code, I get the following output:

5*x^5 - 2*x^4 - 13*x^3 - 11*x^2 + 7*x + 6
15201*x^4 + 25424*x^3 + 10223*x^2 - 15201*x - 10223
Error in lines 15-15
Traceback (most recent call last):
File "/cocalc/lib/python2.7/site-packages/smc_sagews/sage_server.py", line 1188, in execute
flags=compile_flags) in namespace, locals
File "", line 1, in <module>
File "", line 8, in primitive_euclides
File "", line 1, in <lambda>
File "sage/rings/polynomial/polynomial_element.pyx", line 2237, in sage.rings.polynomial.polynomial_element.Polynomial.__div__ (build/cythonized/sage/rings/polynomial/polynomial_element.c:24826)
return PyNumber_TrueDivide(left, right)
File "sage/rings/polynomial/polynomial_element.pyx", line 2233, in sage.rings.polynomial.polynomial_element.Polynomial.__truediv__ (build/cythonized/sage/rings/polynomial/polynomial_element.c:24752)
return wrapperdescr_fastcall(RingElement.__truediv__,
File "sage/cpython/wrapperdescr.pyx", line 102, in sage.cpython.wrapperdescr.wrapperdescr_fastcall (build/cythonized/sage/cpython/wrapperdescr.c:1472)
return slotdef.wrapper(self, args, slotwrapper.d_wrapped)
File "sage/structure/element.pyx", line 1724, in sage.structure.element.Element.__truediv__ (build/cythonized/sage/structure/element.c:13086)
return coercion_model.bin_op(left, right, truediv)
File "sage/structure/coerce.pyx", line 1228, in sage.structure.coerce.CoercionModel_cache_maps.bin_op (build/cythonized/sage/structure/coerce.c:10935)
raise bin_op_exception(op, x, y)
TypeError: unsupported operand parent(s) for /: 'Univariate Polynomial Ring in x over Rational Field' and 'Monoid of ideals of Rational Field'


However, when I try isolating the error as follows:

r0 = ZX(5*x^5 - 2*x^4 - 13*x^3 - 11*x^2 + 7*x + 6)
r1 = ZX(15201*x^4 + 25424*x^3 + 10223*x^2 - 15201*x - 10223)

delta = r0.degree() - r1.degree() + 1
aux = primitive_part(aux)
aux


I get the output I expected, x^3 + x^2 - 1

What is going on? How do I fix this?

edit retag close merge delete

Sort by ยป oldest newest most voted

If you add some debugging print, you will notice that arent(aux) is first Univariate Polynomial Ring in x over Integer Ring but then Univariate Polynomial Ring in x over Rational Field, because you made a division, and though the resulting coefficient remain integers, they now belong to the rational field, see:

sage: parent(2)
Integer Ring
sage: 4/2
2
sage: parent(4/2)
Rational Field


So what you have to do is to convert the result back into ZX:

sage: primitive_part = lambda f : ZX(f / f.content())


Or, since ZX is the parent of f, you can do more generically:

sage: primitive_part = lambda f : parent(f)(f / f.content())

more