# Discriminant of multivariate polynomials with complex coefficients

I would like to compute the discriminant of some polynomial in two variables, x and z, the discriminant should be computed with respect to x. I am able to do so in certain cases, but not when the coefficients are complex numbers written in a certain way. For example, this works:

R.<z> = QQ[]
S.<x> = R[]
p = x**2 - z**2
p.discriminant()


gives:

4*z^2


But when I try to use a complex coefficient, discriminant fails because the expression is regarded as a symbolic expression, instead of a polynomial

q = x**2 - z**2 * I
q.discriminant()

AttributeError: 'sage.symbolic.expression.Expression' object has no attribute 'discriminant'


q = x**2 - z**2 * 1j
q.discriminant()


this gives the correct answer. Now for particular reasons I really need to deal with 'I' as the complex unit, and cannot use 'j'. What's wrong with 'I'?

edit retag close merge delete

Sort by » oldest newest most voted

One solution

sage: K.<I> = QuadraticField(-1)
sage: R.<z> = K[]
sage: S.<x> = R[]
sage: q = x**2 - z**2 * I
sage: q.discriminant()
4*I*z^2


The default I in Sage is (for now) a symbolic expression.

more

Thanks! Especially for explaining what is the issue with 'I'. Also nice simple solution

On further inspection, while this definitely works, it seems that sticking to 'I' does have some drawback apparently. For instance, computing the discriminant of a slightly more complicated polynomial like

-108*x**27*z**26 - 540*I*x**15*z**15 + 540*I*x**15*z**13 - x**3*z**4 + 2*x**3*z**2 - x**3


is much slower than computing the same discriminant with

-108*x**27*z**26 - 540*1j*x**15*z**15 + 540*1j*x**15*z**13 - x**3*z**4 + 2*x**3*z**2 - x**3


So it seems that I should really find a way of converting I to 1j, in the end. Any trick for this?

If you only want some approximate value of the discriminant, you can also do

sage: I = CC(0,1)
sage: R.<z> = CC[]
sage: S.<x> = R[]


Might be faster than what I proposed.

Indeed, it is. It seems that CC(0,1) = 1.000000 I, still employs 'I'. So why is it so much faster? I guess previously sage was trying to solve exactly, since coefficients were integers, while now the rational coefficient triggers approximate solution? Thanks again!

No no. CC does not use the symbolic I it is just a matter of notation. If you want to know "where" your object lives you can use the magic .parent() method

sage: I.parent()
Symbolic Ring
sage: I = CC(0,1)
sage: R.<z> = CC[]
sage: p = I*z
sage: p.parent()
Univariate Polynomial Ring in z over Complex Field with 53 bits of precision