# 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

( 2015-12-22 23:35:20 +0200 )edit

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?

( 2015-12-22 23:58:28 +0200 )edit

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.

( 2015-12-23 00:55:09 +0200 )edit

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!

( 2015-12-23 02:16:29 +0200 )edit

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

( 2015-12-23 03:04:37 +0200 )edit