Ask Your Question

Discriminant of multivariate polynomials with complex coefficients

asked 2015-12-22 20:31:47 +0100

physicist gravatar image

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



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

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

Curiously, if I use instead

q = x**2 - z**2 * 1j

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 flag offensive close merge delete

1 Answer

Sort by ยป oldest newest most voted

answered 2015-12-22 21:31:24 +0100

vdelecroix gravatar image

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()

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

edit flag offensive delete link more


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

physicist gravatar imagephysicist ( 2015-12-22 23:35:20 +0100 )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?

physicist gravatar imagephysicist ( 2015-12-22 23:58:28 +0100 )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.

vdelecroix gravatar imagevdelecroix ( 2015-12-23 00:55:09 +0100 )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!

physicist gravatar imagephysicist ( 2015-12-23 02:16:29 +0100 )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
vdelecroix gravatar imagevdelecroix ( 2015-12-23 03:04:37 +0100 )edit

Your Answer

Please start posting anonymously - your entry will be published after you log in or create a new account.

Add Answer

Question Tools

1 follower


Asked: 2015-12-22 20:31:47 +0100

Seen: 1,654 times

Last updated: Dec 22 '15