Skip to content
This repository was archived by the owner on Jan 30, 2023. It is now read-only.

Commit b28381a

Browse files
committed
conversion of number field elts with real/complex embeddings to algebraic numbers
1 parent 930e35e commit b28381a

File tree

3 files changed

+61
-1
lines changed

3 files changed

+61
-1
lines changed

src/sage/rings/number_field/number_field_element.pyx

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2316,6 +2316,43 @@ cdef class NumberFieldElement(FieldElement):
23162316
ZZX_getitem_as_mpz(num.value, &self.__numerator, 0)
23172317
return num / (<IntegerRing_class>ZZ)._coerce_ZZ(&self.__denominator)
23182318

2319+
def _algebraic_(self, parent):
2320+
r"""
2321+
Convert this element to an algebraic number, if possible.
2322+
2323+
EXAMPLES::
2324+
2325+
sage: NF.<alpha> = NumberField(x^5 + 7*x + 3, embedding=CC(0,1))
2326+
sage: QQbar(alpha)
2327+
-1.032202770009288? + 1.168103873894207?*I
2328+
sage: AA(alpha)
2329+
Traceback (most recent call last):
2330+
...
2331+
ValueError: Cannot coerce algebraic number with non-zero imaginary
2332+
part to algebraic real
2333+
2334+
sage: NF.<alpha> = NumberField(x^5 + 7*x + 3)
2335+
sage: QQbar(alpha)
2336+
Traceback (most recent call last):
2337+
...
2338+
ValueError: need a real or complex embedding to convert number
2339+
field element to algebraic number
2340+
2341+
TESTS::
2342+
2343+
sage: C.<z> = CyclotomicField(7)
2344+
sage: a = 2*z^2 + 5*z^4
2345+
sage: E = C.algebraic_closure()
2346+
sage: E(a)
2347+
-4.949886207424724? - 0.2195628712241434?*I
2348+
"""
2349+
emb = self._parent.coerce_embedding()
2350+
if emb is None:
2351+
raise ValueError("need a real or complex embedding to convert "
2352+
"number field element to algebraic number")
2353+
emb = number_field.refine_embedding(emb, infinity)
2354+
return parent(emb(self))
2355+
23192356
def _symbolic_(self, SR):
23202357
"""
23212358
If an embedding into CC is specified, then a representation of this

src/sage/rings/number_field/number_field_element_quadratic.pyx

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1371,6 +1371,29 @@ cdef class NumberFieldElement_quadratic(NumberFieldElement_absolute):
13711371
mpq_canonicalize(res.value)
13721372
return res
13731373

1374+
def _algebraic_(self, parent):
1375+
r"""
1376+
Convert this element to an algebraic number, if possible.
1377+
1378+
EXAMPLES::
1379+
1380+
sage: NF.<i> = QuadraticField(-1)
1381+
sage: QQbar(1+i)
1382+
I + 1
1383+
sage: NF.<sqrt3> = QuadraticField(2)
1384+
sage: AA(sqrt3)
1385+
1.414213562373095?
1386+
"""
1387+
import sage.rings.qqbar as qqbar
1388+
if (parent is qqbar.QQbar
1389+
and list(self._parent.polynomial()) == [1, 0, 1]):
1390+
# AlgebraicNumber.__init__ does a better job than
1391+
# NumberFieldElement._algebraic_ in this case, but
1392+
# QQbar._element_constructor_ calls the latter first.
1393+
return qqbar.AlgebraicNumber(self)
1394+
else:
1395+
return NumberFieldElement._algebraic_(self, parent)
1396+
13741397
cpdef bint is_one(self):
13751398
r"""
13761399
Check whether this number field element is `1`.

src/sage/rings/qqbar.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@
121121
sage: AA(I)
122122
Traceback (most recent call last):
123123
...
124-
TypeError: Illegal initializer for algebraic number
124+
ValueError: Cannot coerce algebraic number with non-zero imaginary part to algebraic real
125125
sage: QQbar(I * golden_ratio)
126126
1.618033988749895?*I
127127
sage: AA(golden_ratio)^2 - AA(golden_ratio)

0 commit comments

Comments
 (0)