Path: blob/master/src/sage/rings/finite_rings/finite_field_prime_modn.py
8820 views
"""1Finite Prime Fields23AUTHORS:45- William Stein: initial version67- Martin Albrecht (2008-01): refactoring89TESTS::1011sage: k = GF(3)12sage: TestSuite(k).run()13"""1415#*****************************************************************************16# Copyright (C) 2006 William Stein <[email protected]>17# Copyright (C) 2008 Martin Albrecht <[email protected]>18#19# Distributed under the terms of the GNU General Public License (GPL)20#21# This code is distributed in the hope that it will be useful,22# but WITHOUT ANY WARRANTY; without even the implied warranty of23# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU24# General Public License for more details.25#26# The full text of the GPL is available at:27#28# http://www.gnu.org/licenses/29#*****************************************************************************303132from sage.rings.finite_rings.finite_field_base import FiniteField as FiniteField_generic33from sage.categories.finite_fields import FiniteFields34_FiniteFields = FiniteFields()3536import sage.rings.finite_rings.integer_mod_ring as integer_mod_ring37import sage.rings.integer as integer38import sage.rings.finite_rings.integer_mod as integer_mod39import sage.rings.arith as arith4041from sage.rings.integer_ring import ZZ42from sage.rings.finite_rings.integer_mod_ring import IntegerModRing_generic43import sage.structure.factorization as factorization44from sage.structure.parent import Parent4546class FiniteField_prime_modn(FiniteField_generic, integer_mod_ring.IntegerModRing_generic):47r"""48Finite field of order `p` where `p` is prime.4950EXAMPLES::5152sage: FiniteField(3)53Finite Field of size 35455sage: FiniteField(next_prime(1000))56Finite Field of size 100957"""58def __init__(self, p, name=None, check=True):59"""60Return a new finite field of order `p` where `p` is prime.6162INPUT:6364- ``p`` -- an integer at least 26566- ``name`` -- ignored6768- ``check`` -- bool (default: ``True``); if ``False``, do not69check ``p`` for primality7071EXAMPLES::7273sage: F = FiniteField(3); F74Finite Field of size 375"""76p = integer.Integer(p)77if check and not arith.is_prime(p):78raise ArithmeticError, "p must be prime"79self.__char = p80self._kwargs = {}81# FiniteField_generic does nothing more than IntegerModRing_generic, and82# it saves a non trivial overhead83integer_mod_ring.IntegerModRing_generic.__init__(self, p, category = _FiniteFields)8485def __reduce__(self):86"""87For pickling.8889EXAMPLES::9091sage: k = FiniteField(5); type(k)92<class 'sage.rings.finite_rings.finite_field_prime_modn.FiniteField_prime_modn_with_category'>93sage: k is loads(dumps(k))94True95"""96return self._factory_data[0].reduce_data(self)9798def __cmp__(self, other):99r"""100Compare ``self`` with ``other``.101102Two finite prime fields are considered equal if their characteristic103is equal.104105EXAMPLES::106107sage: K = FiniteField(3)108sage: copy(K) == K109True110"""111if not isinstance(other, FiniteField_prime_modn):112return cmp(type(self), type(other))113# elif other.__class__ != FiniteField_prime_modn:114# return -cmp(other, self)115return cmp(self.__char, other.__char)116117def __richcmp__(left, right, op):118r"""119Compare ``self`` with ``right``.120121EXAMPLES::122123sage: k = GF(2)124sage: j = GF(3)125sage: k == j126False127128sage: GF(2) == copy(GF(2))129True130"""131return left._richcmp_helper(right, op)132133def _is_valid_homomorphism_(self, codomain, im_gens):134"""135This is called implicitly by the ``hom`` constructor.136137EXAMPLES::138139sage: k = GF(73^2,'a')140sage: f = k.modulus()141sage: r = f.change_ring(k).roots()142sage: k.hom([r[0][0]]) # indirect doctest143Ring endomorphism of Finite Field in a of size 73^2144Defn: a |--> 72*a + 3145"""146try:147return im_gens[0] == codomain._coerce_(self.gen(0))148except TypeError:149return False150151def _coerce_map_from_(self, S):152"""153This is called implicitly by arithmetic methods.154155EXAMPLES::156157sage: k = GF(7)158sage: e = k(6)159sage: e * 2 # indirect doctest1605161sage: 12 % 71625163sage: ZZ.residue_field(7).hom(GF(7))(1) # See trac 113191641165sage: K.<w> = QuadraticField(337) # See trac 11319166sage: pp = K.ideal(13).factor()[0][0]167sage: RF13 = K.residue_field(pp)168sage: RF13.hom([GF(13)(1)])169Ring morphism:170From: Residue field of Fractional ideal (w - 18)171To: Finite Field of size 13172Defn: 1 |--> 1173"""174if S is int:175return integer_mod.Int_to_IntegerMod(self)176elif S is ZZ:177return integer_mod.Integer_to_IntegerMod(self)178elif isinstance(S, IntegerModRing_generic):179from sage.rings.residue_field import ResidueField_generic180if S.characteristic() == self.characteristic() and \181(not isinstance(S, ResidueField_generic) or S.degree() == 1):182try:183return integer_mod.IntegerMod_to_IntegerMod(S, self)184except TypeError:185pass186to_ZZ = ZZ.coerce_map_from(S)187if to_ZZ is not None:188return integer_mod.Integer_to_IntegerMod(self) * to_ZZ189190def construction(self):191"""192Returns the construction of this finite field (for use by sage.categories.pushout)193194EXAMPLES::195196sage: GF(3).construction()197(QuotientFunctor, Integer Ring)198"""199return integer_mod_ring.IntegerModRing_generic.construction(self)200201def characteristic(self):202r"""203Return the characteristic of \code{self}.204205EXAMPLES::206207sage: k = GF(7)208sage: k.characteristic()2097210"""211return self.__char212213def modulus(self):214"""215Return the minimal polynomial of ``self``, which is always `x - 1`.216217EXAMPLES::218219sage: k = GF(199)220sage: k.modulus()221x + 198222"""223try:224return self.__modulus225except AttributeError:226x = self['x'].gen()227self.__modulus = x - 1228return self.__modulus229230def is_prime_field(self):231"""232Return ``True`` since this is a prime field.233234EXAMPLES::235236sage: k.<a> = GF(3)237sage: k.is_prime_field()238True239240sage: k.<a> = GF(3^2)241sage: k.is_prime_field()242False243"""244return True245246def polynomial(self, name=None):247"""248Returns the polynomial ``name``.249250EXAMPLES::251252sage: k.<a> = GF(3)253sage: k.polynomial()254x255"""256if name is None:257name = self.variable_name()258try:259return self.__polynomial[name]260except AttributeError:261from sage.rings.finite_rings.constructor import FiniteField262R = FiniteField(self.characteristic())[name]263f = self[name]([0,1])264try:265self.__polynomial[name] = f266except (KeyError, AttributeError):267self.__polynomial = {}268self.__polynomial[name] = f269return f270271def order(self):272"""273Return the order of this finite field.274275EXAMPLES::276277sage: k = GF(5)278sage: k.order()2795280"""281return self.__char282283def gen(self, n=0):284"""285Return generator of this finite field as an extension of its286prime field.287288.. NOTE::289290If you want a primitive element for this finite field291instead, use :meth:`multiplicative_generator()`.292293EXAMPLES::294295sage: k = GF(13)296sage: k.gen()2971298sage: k.gen(1)299Traceback (most recent call last):300...301IndexError: only one generator302"""303if n != 0:304raise IndexError, "only one generator"305return self(1)306307def __iter__(self):308"""309Return an iterator over ``self``.310311EXAMPLES::312313sage: list(GF(7))314[0, 1, 2, 3, 4, 5, 6]315316We can even start iterating over something that would be too big317to actually enumerate::318319sage: K = GF(next_prime(2^256))320sage: all = iter(K)321sage: all.next()3220323sage: all.next()3241325sage: all.next()3262327"""328yield self(0)329i = one = self(1)330while i:331yield i332i += one333334def degree(self):335"""336Returns the degree of the finite field, which is a positive337integer.338339EXAMPLES::340341sage: FiniteField(3).degree()3421343"""344return integer.Integer(1)345346347