Ask Your Question
1

nearby algebraic number / convert polynomial type to expression type

asked 2020-06-29 16:17:05 -0500

b897069 gravatar image

Given a real number, I am trying to find a nearby algebraic number. This can be done in Mathematica with the RootApproximant function.

I couldn't find a similar function in Sage, so I am using algdep() to find an irreducible polynomial that is approximately satisfied by that number. Then I am using roots() to find the roots of that polynomial, and I can identify which root is closest to my number.

The problem is that the output of algdep() has a type that seems to be incompatible with roots().

When I execute this code, p.roots() returns an empty list:

p=algdep(sqrt(5), 10);
print(p.roots())

When I execute this code, a list of the roots is returned:

q = x^2 - 5
print(q.roots())

The output of algdep() has type sage.rings.polynomial.polynomial_integer_dense_flint.Polynomial_integer_dense_flint

In the second block of code, q has type sage.symbolic.expression.Expression

Is there a way to convert the first type into the Expression type?

edit retag flag offensive close merge delete

1 answer

Sort by ยป oldest newest most voted
1

answered 2020-06-30 16:42:57 -0500

tmonteil gravatar image

updated 2020-06-30 16:43:17 -0500

Since there are no integer roots, p.roots() does not gies anything since it is a polynomial over the integers:

sage: p.parent()
Univariate Polynomial Ring in x over Integer Ring

You can however ask for its roots as algebraic numbers:

sage: p.roots(QQbar)
[(-2.236067977499790?, 1), (2.236067977499790?, 1)]

or as symbolic expressions:

sage: p.roots(SR)
[(-sqrt(5), 1), (sqrt(5), 1)]

or even as floating-point real numbers:

sage: p.roots(RDF)
[(-2.23606797749979, 1), (2.23606797749979, 1)]
edit flag offensive delete link more

Your Answer

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

Add Answer

Question Tools

Stats

Asked: 2020-06-29 16:17:05 -0500

Seen: 90 times

Last updated: Jun 30