Path: blob/master/sage/rings/finite_rings/finite_field_prime_modn.py
4122 views
"""1Finite Prime Fields23AUTHORS:45- William Stein: initial version6- Martin Albrecht (2008-01): refactoring78TESTS::910sage: k = GF(3)11sage: TestSuite(k).run()12"""1314#*****************************************************************************15# Copyright (C) 2006 William Stein <[email protected]>16# Copyright (C) 2008 Martin Albrecht <[email protected]>17#18# Distributed under the terms of the GNU General Public License (GPL)19#20# This code is distributed in the hope that it will be useful,21# but WITHOUT ANY WARRANTY; without even the implied warranty of22# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU23# General Public License for more details.24#25# The full text of the GPL is available at:26#27# http://www.gnu.org/licenses/28#*****************************************************************************293031from sage.rings.finite_rings.finite_field_base import FiniteField as FiniteField_generic32from sage.categories.finite_fields import FiniteFields33_FiniteFields = FiniteFields()3435import sage.rings.finite_rings.integer_mod_ring as integer_mod_ring36import sage.rings.integer as integer37import sage.rings.finite_rings.integer_mod as integer_mod38import sage.rings.arith as arith3940from sage.rings.integer_ring import ZZ41from sage.rings.finite_rings.integer_mod_ring import IntegerModRing_generic42import sage.structure.factorization as factorization43from sage.structure.parent import Parent4445class FiniteField_prime_modn(FiniteField_generic, integer_mod_ring.IntegerModRing_generic):46def __init__(self, p, name=None, check=True):47"""48Return a new finite field of order $p$ where $p$ is prime.4950INPUT:5152- p -- an integer >= 253- ``name`` -- ignored54- ``check`` -- bool (default: True); if False, do not55check p for primality5657EXAMPLES::5859sage: FiniteField(3)60Finite Field of size 36162sage: FiniteField(next_prime(1000))63Finite Field of size 100964"""65p = integer.Integer(p)66if check and not arith.is_prime(p):67raise ArithmeticError, "p must be prime"68self.__char = p69self._IntegerModRing_generic__factored_order = factorization.Factorization([(p,1)], integer.Integer(1))70self._kwargs = {}71# FiniteField_generic does nothing more than IntegerModRing_generic, and72# it saves a non trivial overhead73integer_mod_ring.IntegerModRing_generic.__init__(self, p, category = _FiniteFields)7475def __reduce__(self):76"""77EXAMPLES::7879sage: k = FiniteField(5); type(k)80<class 'sage.rings.finite_rings.finite_field_prime_modn.FiniteField_prime_modn_with_category'>81sage: k is loads(dumps(k))82True83"""84return self._factory_data[0].reduce_data(self)8586def __cmp__(self, other):87r"""88Compare \code{self} with \code{other}. Two finite prime fields89are considered equal if their characteristic is equal.9091EXAMPLES::9293sage: K = FiniteField(3)94sage: copy(K) == K95True96"""97if not isinstance(other, FiniteField_prime_modn):98return cmp(type(self), type(other))99# elif other.__class__ != FiniteField_prime_modn:100# return -cmp(other, self)101return cmp(self.__char, other.__char)102103def __richcmp__(left, right, op):104r"""105Compare \code{self} with \code{right}.106107EXAMPLES::108109sage: k = GF(2)110sage: j = GF(3)111sage: k == j112False113114sage: GF(2) == copy(GF(2))115True116"""117return left._richcmp_helper(right, op)118119def _is_valid_homomorphism_(self, codomain, im_gens):120"""121This is called implicitly by the hom constructor.122123EXAMPLES::124125sage: k = GF(73^2,'a')126sage: f = k.modulus()127sage: r = f.change_ring(k).roots()128sage: k.hom([r[0][0]]) # indirect doctest129Ring endomorphism of Finite Field in a of size 73^2130Defn: a |--> 72*a + 3131"""132try:133return im_gens[0] == codomain._coerce_(self.gen(0))134except TypeError:135return False136137def _coerce_map_from_(self, S):138"""139This is called implicitly by arithmetic methods.140141EXAMPLES::142143sage: k = GF(7)144sage: e = k(6)145sage: e * 2 # indirect doctest1465147sage: 12 % 71485149sage: ZZ.residue_field(7).hom(GF(7))(1) # See trac 113191501151sage: K.<w> = QuadraticField(337) # See trac 11319152sage: pp = K.ideal(13).factor()[0][0]153sage: RF13 = K.residue_field(pp)154sage: RF13.hom([GF(13)(1)])155Ring morphism:156From: Residue field of Fractional ideal (w - 18)157To: Finite Field of size 13158Defn: 1 |--> 1159"""160if S is int:161return integer_mod.Int_to_IntegerMod(self)162elif S is ZZ:163return integer_mod.Integer_to_IntegerMod(self)164elif isinstance(S, IntegerModRing_generic):165from sage.rings.residue_field import ResidueField_generic166if S.characteristic() == self.characteristic() and \167(not isinstance(S, ResidueField_generic) or S.degree() == 1):168try:169return integer_mod.IntegerMod_to_IntegerMod(S, self)170except TypeError:171pass172to_ZZ = ZZ.coerce_map_from(S)173if to_ZZ is not None:174return integer_mod.Integer_to_IntegerMod(self) * to_ZZ175176def characteristic(self):177r"""178Return the characteristic of \code{self}.179180EXAMPLES::181182sage: k = GF(7)183sage: k.characteristic()1847185"""186return self.__char187188def modulus(self):189"""190Return the minimal polynomial of self, which is always $x - 1$.191192EXAMPLES::193194sage: k = GF(199)195sage: k.modulus()196x + 198197"""198try:199return self.__modulus200except AttributeError:201x = self['x'].gen()202self.__modulus = x - 1203return self.__modulus204205def is_prime_field(self):206"""207Return True208209EXAMPLES::210211sage: k.<a> = GF(3)212sage: k.is_prime_field()213True214215sage: k.<a> = GF(3^2)216sage: k.is_prime_field()217False218"""219return True220221def polynomial(self, name=None):222"""223Returns the polynomial \var{name}.224225EXAMPLES::226227sage: k.<a> = GF(3)228sage: k.polynomial()229x230"""231if name is None:232name = self.variable_name()233try:234return self.__polynomial[name]235except AttributeError:236from sage.rings.finite_rings.constructor import FiniteField237R = FiniteField(self.characteristic())[name]238f = self[name]([0,1])239try:240self.__polynomial[name] = f241except (KeyError, AttributeError):242self.__polynomial = {}243self.__polynomial[name] = f244return f245246def order(self):247"""248Return the order of this finite field.249250EXAMPLES::251252sage: k = GF(5)253sage: k.order()2545255"""256return self.__char257258def gen(self, n=0):259"""260Return generator of this finite field as an extension of its261prime field.262263NOTE: If you want a primitive element for this finite field264instead, use \code{self.multiplicative_generator()}.265266EXAMPLES::267268sage: k = GF(13)269sage: k.gen()2701271sage: k.gen(1)272Traceback (most recent call last):273...274IndexError: only one generator275"""276if n != 0:277raise IndexError, "only one generator"278return self(1)279280def __iter__(self):281"""282EXAMPLES::283284sage: list(GF(7))285[0, 1, 2, 3, 4, 5, 6]286287We can even start iterating over something that would be too big288to actually enumerate::289290sage: K = GF(next_prime(2^256))291sage: all = iter(K)292sage: all.next()2930294sage: all.next()2951296sage: all.next()2972298"""299yield self(0)300i = one = self(1)301while i:302yield i303i += one304305def degree(self):306"""307Returns the degree of the finite field, which is a positive308integer.309310EXAMPLES::311312sage: FiniteField(3).degree()3131314"""315return integer.Integer(1)316317318