# Solving a univariate polynomial after Grobner basis

I'm working on a simple exercise of homotopy continuation in sage maths as follows.

# Import necessary modules
from sage.all import *

# Define the polynomial ring
R.<x, y, t> = PolynomialRing(QQ, order='lex')

# Define the target system and start system as polynomials
f = [x^2 + 4*y^2 - 4, 2*y^2 - x]  # target system
g = [x^2 - 1, y^2 - 1]            # start system

# Define the homotopy
h = [t*fi + (1-t)*gi for fi, gi in zip(f, g)]

# Expand the homotopy
eh = [expand(hi) for hi in h]

# Compute the Jacobian matrix
jh = matrix([[diff(ehi, xi) for xi in [x, y]] for ehi in eh])

# Discriminant system: homotopy equations + determinant of the Jacobian matrix
sys = eh + [jh.det()]

# Convert the system to polynomials in the polynomial ring
sys_polynomials = [R(equation) for equation in sys]

# Compute the Groebner basis with lexicographic ordering
I = Ideal(sys_polynomials)
gb = I.groebner_basis()

# Extract the discriminant polynomial
discriminant_poly = gb[-1]

# Solve discriminant_poly
discriminant_poly.roots()


### My question

I'm getting the following error. could someone tell me how to solve this polynomial using a SageMaths function?

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
Cell In [1], line 34
31 discriminant_poly = gb[-Integer(1)]
33 # Solve discriminant_poly
---> 34 discriminant_poly.roots()

File /home/sc_serv/sage/src/sage/structure/element.pyx:489, in sage.structure.element.Element.__getattr__()
487         AttributeError: 'LeftZeroSemigroup_with_category.element_class' object has no attribute 'blah_blah'...
488     """
--> 489     return self.getattr_from_category(name)
490
491 cdef getattr_from_category(self, name) noexcept:

File /home/sc_serv/sage/src/sage/structure/element.pyx:502, in sage.structure.element.Element.getattr_from_category()
500     else:
501         cls = P._abstract_element_class
--> 502     return getattr_from_other_class(self, cls, name)
503
504 def __dir__(self):

File /home/sc_serv/sage/src/sage/cpython/getattr.pyx:362, in sage.cpython.getattr.getattr_from_other_class()
360     dummy_error_message.cls = type(self)
361     dummy_error_message.name = name
--> 362     raise AttributeError(dummy_error_message)
363 attribute = <object>attr
364 # Check for a descriptor (__get__ in Python)

AttributeError: 'sage.rings.polynomial.multi_polynomial_libsingular.MPolynomial_libsingular' object has no attribute 'roots'

edit retag close merge delete

Homework ?

Hint : roots is a method of symbolic expression (SR) elements. Univariate polynomials are not symbolic expressions ; solving them requires other methods...

( 2024-08-18 07:40:51 +0200 )edit

Sorry, I should have mentioned this earlier. I'm self-studying numerical algebraic geometry and am fairly new to this domain. So, googling by the error didn't lead to a fruitful finding... If you could describe how to implement other methods , I would greatly appreciate it!

( 2024-08-18 09:53:41 +0200 )edit
1

Oh, I think I found the solution!

# Convert the discriminant polynomial to a univariate polynomial by eliminating other variables
univariate_poly = discriminant_poly.univariate_polynomial()
print(univariate_poly)

# Solve the univariate polynomial
univariate_poly.roots()

( 2024-08-18 10:27:06 +0200 )edit

this works w/o runtime error!

( 2024-08-18 10:27:19 +0200 )edit

@Rowing0914 : you should answer your own question, for future ask.sagemath.org (per)users' sake.

( 2024-08-18 12:16:05 +0200 )edit

Sort by » oldest newest most voted

An alternate possibility is this atrocity :

sage: discriminant_poly.parent().ideal([x, y,]+[discriminant_poly]).dimension()
0
sage: discriminant_poly.parent().ideal([x, y,]+[discriminant_poly]).variety()
[]
sage: discriminant_poly.parent().ideal([x, y,]+[discriminant_poly]).variety(ring=QQbar)
[{t: 0.4023199380628143?, y: 0, x: 0},
{t: -0.2011599690314072? - 0.887728937282557?*I, y: 0, x: 0},
{t: -0.2011599690314072? + 0.887728937282557?*I, y: 0, x: 0},
{t: -0.8818537645672754? - 0.9177002576216003?*I, y: 0, x: 0},
{t: -0.8818537645672754? + 0.9177002576216003?*I, y: 0, x: 0},
{t: 0.006853764567275390? - 0.3927967328421505?*I, y: 0, x: 0},
{t: 0.006853764567275390? + 0.3927967328421505?*I, y: 0, x: 0}]


EDIT : Note that :

sage: R.ideal(gb).dimension()
0
sage: set(discriminant_poly.univariate_polynomial().roots(multiplicities=False))==set([d[t] for d in R.ideal(gb).variety()])
True
sage: set(discriminant_poly.univariate_polynomial().roots(ring=QQbar, multiplicities=False))==set([d[t] for d in R.ideal(gb).variety(ring=QQbar)])
True


HTH,

more

Here is the complete working code!

# Import necessary modules
from sage.all import *

# Define the polynomial ring
R.<x, y, t> = PolynomialRing(QQ, order='lex')

# Define the target system and start system as polynomials
f = [x^2 + 4*y^2 - 4, 2*y^2 - x]  # target system
g = [x^2 - 1, y^2 - 1]            # start system

# Define the homotopy
h = [t*fi + (1-t)*gi for fi, gi in zip(f, g)]

# Expand the homotopy
eh = [expand(hi) for hi in h]

# Compute the Jacobian matrix
jh = matrix([[diff(ehi, xi) for xi in [x, y]] for ehi in eh])

# Discriminant system: homotopy equations + determinant of the Jacobian matrix
sys = eh + [jh.det()]

# Convert the system to polynomials in the polynomial ring
sys_polynomials = [R(equation) for equation in sys]

# Compute the Groebner basis with lexicographic ordering
I = Ideal(sys_polynomials)
gb = I.groebner_basis()

# Extract the discriminant polynomial
discriminant_poly = gb[-1]

# Convert the discriminant polynomial to a univariate polynomial by eliminating other variables
univariate_poly = discriminant_poly.univariate_polynomial()
print(univariate_poly)

# Solve the univariate polynomial
univariate_poly.roots()

more