def _coerce_map_from_(self, S): """ This is called implicitly by arithmetic methods. EXAMPLES:: sage: k = GF(7) sage: e = k(6) sage: e * 2 # indirect doctest 5 sage: 12 % 7 5 sage: ZZ.residue_field(7).hom(GF(7))(1) # See trac 11319 1 sage: K.<w> = QuadraticField(337) # See trac 11319 sage: pp = K.ideal(13).factor()[0][0] sage: RF13 = K.residue_field(pp) sage: RF13.hom([GF(13)(1)]) Ring morphism: From: Residue field of Fractional ideal (w + 18) To: Finite Field of size 13 Defn: 1 |--> 1 Check that :trac:`19573` is resolved:: sage: Integers(9).hom(GF(3)) Natural morphism: From: Ring of integers modulo 9 To: Finite Field of size 3 sage: Integers(9).hom(GF(5)) Traceback (most recent call last): ... TypeError: natural coercion morphism from Ring of integers modulo 9 to Finite Field of size 5 not defined There is no coercion from a `p`-adic ring to its residue field:: sage: GF(3).has_coerce_map_from(Zp(3)) False """ if S is int: return integer_mod.Int_to_IntegerMod(self) elif S is ZZ: return integer_mod.Integer_to_IntegerMod(self) elif isinstance(S, IntegerModRing_generic): from .residue_field import ResidueField_generic if (S.characteristic() % self.characteristic() == 0 and (not isinstance(S, ResidueField_generic) or S.degree() == 1)): try: return integer_mod.IntegerMod_to_IntegerMod(S, self) except TypeError: pass to_ZZ = ZZ._internal_coerce_map_from(S) if to_ZZ is not None: return integer_mod.Integer_to_IntegerMod(self) * to_ZZ
def _coerce_map_from_(self, S): """ This is called implicitly by arithmetic methods. EXAMPLES:: sage: k = GF(7) sage: e = k(6) sage: e * 2 # indirect doctest 5 sage: 12 % 7 5 sage: ZZ.residue_field(7).hom(GF(7))(1) # See trac 11319 1 sage: K.<w> = QuadraticField(337) # See trac 11319 sage: pp = K.ideal(13).factor()[0][0] sage: RF13 = K.residue_field(pp) sage: RF13.hom([GF(13)(1)]) Ring morphism: From: Residue field of Fractional ideal (w - 18) To: Finite Field of size 13 Defn: 1 |--> 1 """ if S is int: return integer_mod.Int_to_IntegerMod(self) elif S is ZZ: return integer_mod.Integer_to_IntegerMod(self) elif isinstance(S, IntegerModRing_generic): from sage.rings.residue_field import ResidueField_generic if S.characteristic() == self.characteristic() and \ (not isinstance(S, ResidueField_generic) or S.degree() == 1): try: return integer_mod.IntegerMod_to_IntegerMod(S, self) except TypeError: pass to_ZZ = ZZ._internal_coerce_map_from(S) if to_ZZ is not None: return integer_mod.Integer_to_IntegerMod(self) * to_ZZ