Ask Your Question

Convert element from fraction field of polynomial ring to number field

asked 2021-04-22 10:06:15 +0200

philipp7 gravatar image

Consider the following

F.<u> = NumberField(x^2-3)
R.<y> = PolynomialRing(F)
Q = R.fraction_field()

Then, F(Q(2*u)) yields an error since

TypeError: unable to convert 2*u to Number Field in u with defining polynomial x^2 - 3

Of course one could expect that this conversion should be not a problem. Doing the same over the base field QQ instead of a number field works as expected.

This problem can be fixed (in this case) by converting first to the polynomial ring and then to the number field, i.e., F(R(Q(2*u))) works fine. However, in practice, if we want to convert some a (where we know it "should" be in F but it might technically not) to F, it is very unpractical to check first whether a belongs in some certain ring and then convert it by going via the polynomial ring.

Is there a good built in way to do this? So we are given some a (which might be already in F or in some construction built upon F) and want to have a in F.

edit retag flag offensive close merge delete



Good question. You may want to open a trac ticket for this. It should be a matter of adding an extra case to the _convert_non_number_field_element method of NumberField.

rburing gravatar imagerburing ( 2021-04-22 11:48:36 +0200 )edit

Instead of going via _convert_non_number_field_elementI would rather stick in a converter on the fraction field element following See the fix I propose in

vdelecroix gravatar imagevdelecroix ( 2021-04-22 15:22:09 +0200 )edit

2 Answers

Sort by ยป oldest newest most voted

answered 2021-04-22 16:20:50 +0200

vdelecroix gravatar image

This is fixed in

In the meantime, I would convert elt via F(elt.numerator()) / F(elt.denominator()). With your example

sage: elt = Q(u)
sage: F(elt.numerator()) / F(elt.denominator())
edit flag offensive delete link more


Thank you very much to everyone! I'm glad this was a quick fix in Sage!

philipp7 gravatar imagephilipp7 ( 2021-04-23 21:02:37 +0200 )edit

And also thank you for the report.

vdelecroix gravatar imagevdelecroix ( 2021-04-24 22:27:45 +0200 )edit

answered 2021-04-22 12:21:50 +0200

slelievre gravatar image

As a workaround, evaluate a rational function at zero to get its constant term as a number field element.

Below some musings around the question, including the workaround already suggested in the question.

Define the number field, the polynomial ring, and the field of rational functions:

sage: x = polygen(ZZ)
sage: F.<u> = NumberField(x^2 - 3)
sage: R.<y> = PolynomialRing(F)
sage: Q = R.fraction_field()

A constant rational function:

sage: a = Q(2*u)
sage: a

Membership tests, with one surprise:

sage: a in Q, a in R, a in F
(True, True, False)

Forcing a into F does not work:

sage: F(a)
Traceback (most recent call last)
TypeError: unable to convert 2*u to Number Field in u with defining polynomial x^2 - 3

Going through the polynomial ring:

sage: b = R(a)
sage: b
sage: b in Q, b in R, b in F
(True, True, True)

Evaluating at zero to get the constant term as a base field element:

sage: c = a(0)
sage: c
sage: c in Q, c in R, c in F
(True, True, True)
edit flag offensive delete link more

Comments changes the surprise to

sage: a in Q, a in R, a in F
(True, True, True)
vdelecroix gravatar imagevdelecroix ( 2021-04-23 09:33:15 +0200 )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: 2021-04-22 10:06:15 +0200

Seen: 47 times

Last updated: Apr 22