Ask Your Question

Number field containing real/imaginary part of algebraic number

asked 2015-02-13 19:47:13 +0200

matthias gravatar image

I have a number field N with an embedding into C (e.g., NumberField(x^3+3, 'z', 0.7+1.2j)). I would like the smallest number field N' that contains all Re(z) and Im(z) for z in N. I would also like a mapping from x in N to (Re(x), Im(x) in N'xN' - or at least know what Re(z) and Im(z) is in N' for the generator z of N.

What is a good way of doing this?

I was thinking along the lines of N.composite_fields(NumberField(N.defining_polynomial, 'z', embedding=ComplexField()(N.gen_embedding()).conjugate()),both_maps=True). But I ran into with this occasionally. Is there a better way of doing it?

edit retag flag offensive close merge delete

2 Answers

Sort by ยป oldest newest most voted

answered 2015-02-15 17:17:44 +0200

vdelecroix gravatar image

updated 2015-02-15 17:18:31 +0200

Here is a solution going through QQbar. You first need to create your element as an element of QQbar as follows

sage: x = polygen(ZZ)
sage: a = QQbar.polynomial_root(x^3 + 3, CIF((0.6,0.8),(1.1,1.3)))
sage: a
0.7211247851537042? + 1.249024766483407?*I

Then, there is a ready made function to build the number field that contain a given number of elements

sage: number_field_elements_from_algebraics([a.real(), a.imag()], minimal=True)
(Number Field in a with defining polynomial y^6 - 3,
 [1/2*a^2, 1/2*a^5],
 Ring morphism:
   From: Number Field in a with defining polynomial y^6 - 3
   To:   Algebraic Real Field
   Defn: a |--> 1.200936955176003?)

The output is a triple that consists of a number field, the two elements you are looking for and a morphism to QQbar.


edit flag offensive delete link more


Thanks so much, I got it to work with: QQbar.polynomial_root(number_field.defining_polynomial(), CIF(number_field.gen_embedding())

matthias gravatar imagematthias ( 2015-02-21 04:57:32 +0200 )edit

answered 2015-02-15 18:28:41 +0200

tmonteil gravatar image

updated 2015-02-16 01:29:05 +0200

I guess you want to stay within the framework of number fields that Sage offers. What you need is to get the generator of your embedded field F as an algebraic number. You can try to get it as follows:

sage: F = NumberField(x^3+3, 'z', embedding=0.7+1.2j)
sage: F.gen_embedding()
0.7211247851537042? + 1.249024766483407?*I

Unfortunately, this number is not an algebraic number but a kind of infinite sequence of digits, known as lazy expansion, for which you can not easily recover the algebraic number it comes from:

sage: F.gen_embedding().parent()
Complex Lazy Field
sage: QQbar(F.gen_embedding())
TypeError: Illegal initializer for algebraic number

So, we have to look at others methods your (embedded) number field offers. If we have the embedding as morphism from F to the Algebraic Field we would be done. Let us try:

sage: F.embeddings(QQbar)
Ring morphism:
  From: Number Field in z with defining polynomial x^3 + 3
  To:   Algebraic Field
  Defn: z |--> -1.442249570307409?,
Ring morphism:
  From: Number Field in z with defining polynomial x^3 + 3
  To:   Algebraic Field
  Defn: z |--> 0.7211247851537042? - 1.249024766483407?*I,
Ring morphism:
  From: Number Field in z with defining polynomial x^3 + 3
  To:   Algebraic Field
  Defn: z |--> 0.7211247851537042? + 1.249024766483407?*I

While the documentation F.embeddings? says "If possible, the most natural embedding of self into K is put first in the list.", you can see that this method do not care about the embedding you provided (which should have been considerd as the most natural) since it did not put that embedding first, it just chosed the fanciest one.

There should be a method that is able to select the embedding you provided as a morphism into QQbar !!!

Note that we have:

sage: F.coerce_embedding()
Generic morphism:
  From: Number Field in z with defining polynomial x^3 + 3
  To:   Complex Lazy Field
  Defn: z -> 0.7211247851537042? + 1.249024766483407?*I

But again, it falls into the ComplexLazyField, so it is useless for our purpose.

For me, the general issue with embedded number fields in Sage is that the number field does not care much about the embedding you provided. This issue points a general problem with number fields in Sage: there is no specific class for "embedded number field", the fact that a number field is embedded or not is just a ._embedding attribute within the same class NumberField (while the mathematical objects are really different), so you can define an embedding, but then the number field does not offer additional specific methods for that (in particular, it can not select the correct embedding from within F.embeddings(QQbar), which is a pity).

What you can do is to discover by yourself which embedding into QQbar from the list corresponds to the single embedding into CLF (stands for ComplexLazyField). A trick is to extend the morphism from QQbar to CLF and check for equality:

sage: def my_embedding_as_qqbar(K):
....:     for f in F.embeddings(QQbar):
....:         if f.extend_codomain(CLF ...
edit flag offensive delete link more


This is insightful, but the other solution is ultimately much shorter.

matthias gravatar imagematthias ( 2015-02-21 04:58:34 +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: 2015-02-13 19:47:13 +0200

Seen: 621 times

Last updated: Feb 16 '15