def field_extension(self, names): r""" Given a polynomial with base ring a quotient ring, return a 3-tuple: a number field defined by the same polynomial, a homomorphism from its parent to the number field sending the generators to one another, and the inverse isomorphism. INPUT: - ``names`` - name of generator of output field OUTPUT: - field - homomorphism from self to field - homomorphism from field to self EXAMPLES:: sage: R.<x> = PolynomialRing(QQ) sage: S.<alpha> = R.quotient(x^3-2) sage: F.<a>, f, g = alpha.field_extension() sage: F Number Field in a with defining polynomial x^3 - 2 sage: a = F.gen() sage: f(alpha) a sage: g(a) alpha Over a finite field, the corresponding field extension is not a number field:: sage: R.<x> = GF(25,'b')['x'] sage: S.<a> = R.quo(x^3 + 2*x + 1) sage: F.<b>, g, h = a.field_extension() sage: h(b^2 + 3) a^2 + 3 sage: g(x^2 + 2) b^2 + 2 We do an example involving a relative number field:: sage: R.<x> = QQ['x'] sage: K.<a> = NumberField(x^3-2) sage: S.<X> = K['X'] sage: Q.<b> = S.quo(X^3 + 2*X + 1) sage: F, g, h = b.field_extension('c') Another more awkward example:: sage: R.<x> = QQ['x'] sage: K.<a> = NumberField(x^3-2) sage: S.<X> = K['X'] sage: f = (X+a)^3 + 2*(X+a) + 1 sage: f X^3 + 3*a*X^2 + (3*a^2 + 2)*X + 2*a + 3 sage: Q.<z> = S.quo(f) sage: F.<w>, g, h = z.field_extension() sage: c = g(z) sage: f(c) 0 sage: h(g(z)) z sage: g(h(w)) w AUTHORS: - Craig Citro (2006-08-06) - William Stein (2006-08-06) """ #TODO: is the return order backwards from the magma convention? ## We do another example over $\ZZ$. ## sage: R.<x> = ZZ['x'] ## sage: S.<a> = R.quo(x^3 - 2) ## sage: F.<b>, g, h = a.field_extension() ## sage: h(b^2 + 3) ## a^2 + 3 ## sage: g(x^2 + 2) ## a^2 + 2 ## Note that the homomorphism is not defined on the entire ## ''domain''. (Allowing creation of such functions may be ## disallowed in a future version of Sage.): <----- INDEED! ## sage: h(1/3) ## Traceback (most recent call last): ## ... ## TypeError: Unable to coerce rational (=1/3) to an Integer. ## Note that the parent ring must be an integral domain: ## sage: R.<x> = GF(25,'b')['x'] ## sage: S.<a> = R.quo(x^3 - 2) ## sage: F, g, h = a.field_extension() ## Traceback (most recent call last): ## ... ## ValueError: polynomial must be irreducible R = self.parent() x = R.gen() F = R.modulus().root_field(names) alpha = F.gen() f = R.hom([alpha], F, check=False) if number_field_rel.is_RelativeNumberField(F): base_hom = F.base_field().hom([R.base_ring().gen()]) g = F.Hom(R)(x, base_hom) else: g = F.hom([x], R, check=False) return F, f, g