Hide keyboard shortcuts

Hot-keys on this page

r m x p   toggle line displays

j k   next/prev highlighted chunk

0   (zero) top of page

1   (one) first highlighted chunk

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

174

175

176

177

178

179

180

181

182

183

184

185

186

187

188

189

190

191

192

193

194

195

196

197

198

199

200

201

202

203

204

205

206

207

208

209

210

211

212

213

214

215

216

217

218

219

220

221

222

223

224

225

226

227

228

229

230

231

232

233

234

235

236

237

238

239

240

241

242

243

244

245

246

247

248

249

250

251

252

253

254

255

256

257

258

259

260

261

262

263

264

265

266

267

268

269

270

271

272

273

274

275

276

277

278

279

280

281

282

283

284

285

286

287

288

289

290

291

292

293

294

295

296

297

298

299

300

301

302

303

304

305

306

307

308

309

310

311

312

313

314

315

316

317

318

319

320

321

322

323

324

325

326

327

328

329

330

331

332

333

334

335

336

337

338

339

340

""" 

Finite Prime Fields 

 

AUTHORS: 

 

- William Stein: initial version 

 

- Martin Albrecht (2008-01): refactoring 

 

TESTS:: 

 

sage: k = GF(3) 

sage: TestSuite(k).run() 

""" 

from __future__ import absolute_import 

 

#***************************************************************************** 

# Copyright (C) 2006 William Stein <wstein@gmail.com> 

# Copyright (C) 2008 Martin Albrecht <malb@informatik.uni-bremen.de> 

# 

# This program is free software: you can redistribute it and/or modify 

# it under the terms of the GNU General Public License as published by 

# the Free Software Foundation, either version 2 of the License, or 

# (at your option) any later version. 

# http://www.gnu.org/licenses/ 

#*****************************************************************************` 

 

from sage.rings.finite_rings.finite_field_base import FiniteField as FiniteField_generic 

from sage.categories.finite_fields import FiniteFields 

_FiniteFields = FiniteFields() 

 

import sage.rings.finite_rings.integer_mod_ring as integer_mod_ring 

from sage.rings.integer import Integer 

import sage.rings.finite_rings.integer_mod as integer_mod 

 

from sage.rings.integer_ring import ZZ 

from sage.rings.finite_rings.integer_mod_ring import IntegerModRing_generic 

 

from sage.structure.sage_object import register_unpickle_override 

 

 

class FiniteField_prime_modn(FiniteField_generic, integer_mod_ring.IntegerModRing_generic): 

r""" 

Finite field of order `p` where `p` is prime. 

 

EXAMPLES:: 

 

sage: FiniteField(3) 

Finite Field of size 3 

 

sage: FiniteField(next_prime(1000)) 

Finite Field of size 1009 

""" 

def __init__(self, p, check=True, modulus=None): 

""" 

Return a new finite field of order `p` where `p` is prime. 

 

INPUT: 

 

- ``p`` -- an integer at least 2 

 

- ``check`` -- bool (default: ``True``); if ``False``, do not 

check ``p`` for primality 

 

EXAMPLES:: 

 

sage: F = FiniteField(3); F 

Finite Field of size 3 

""" 

p = Integer(p) 

if check and not p.is_prime(): 

raise ArithmeticError("p must be prime") 

self.__char = p 

# FiniteField_generic does nothing more than IntegerModRing_generic, and 

# it saves a non trivial overhead 

integer_mod_ring.IntegerModRing_generic.__init__(self, p, category=_FiniteFields) 

 

# If modulus is None, it will be created on demand as x-1 

# by the modulus() method. 

if modulus is not None: 

self._modulus = modulus 

 

def __reduce__(self): 

""" 

For pickling. 

 

EXAMPLES:: 

 

sage: k = FiniteField(5); type(k) 

<class 'sage.rings.finite_rings.finite_field_prime_modn.FiniteField_prime_modn_with_category'> 

sage: k is loads(dumps(k)) 

True 

""" 

return self._factory_data[0].reduce_data(self) 

 

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 _convert_map_from_(self, R): 

""" 

Conversion from p-adic fields. 

 

EXAMPLES:: 

 

sage: GF(3).convert_map_from(Qp(3)) 

Reduction morphism: 

From: 3-adic Field with capped relative precision 20 

To: Finite Field of size 3 

sage: GF(3).convert_map_from(Zp(3)) 

Reduction morphism: 

From: 3-adic Ring with capped relative precision 20 

To: Finite Field of size 3 

""" 

from sage.rings.padics.padic_generic import pAdicGeneric, ResidueReductionMap 

if isinstance(R, pAdicGeneric) and R.residue_field() is self: 

return ResidueReductionMap._create_(R, self) 

 

def construction(self): 

""" 

Returns the construction of this finite field (for use by sage.categories.pushout) 

 

EXAMPLES:: 

 

sage: GF(3).construction() 

(QuotientFunctor, Integer Ring) 

""" 

return integer_mod_ring.IntegerModRing_generic.construction(self) 

 

def characteristic(self): 

r""" 

Return the characteristic of \code{self}. 

 

EXAMPLES:: 

 

sage: k = GF(7) 

sage: k.characteristic() 

7 

""" 

return self.__char 

 

def is_prime_field(self): 

""" 

Return ``True`` since this is a prime field. 

 

EXAMPLES:: 

 

sage: k.<a> = GF(3) 

sage: k.is_prime_field() 

True 

 

sage: k.<a> = GF(3^2) 

sage: k.is_prime_field() 

False 

""" 

return True 

 

def polynomial(self, name=None): 

""" 

Returns the polynomial ``name``. 

 

EXAMPLES:: 

 

sage: k.<a> = GF(3) 

sage: k.polynomial() 

x 

""" 

if name is None: 

name = self.variable_name() 

try: 

return self.__polynomial[name] 

except AttributeError: 

from sage.rings.finite_rings.finite_field_constructor import FiniteField 

R = FiniteField(self.characteristic())[name] 

f = self[name]([0,1]) 

try: 

self.__polynomial[name] = f 

except (KeyError, AttributeError): 

self.__polynomial = {} 

self.__polynomial[name] = f 

return f 

 

def order(self): 

""" 

Return the order of this finite field. 

 

EXAMPLES:: 

 

sage: k = GF(5) 

sage: k.order() 

5 

""" 

return self.__char 

 

def gen(self, n=0): 

""" 

Return a generator of ``self`` over its prime field, which is a 

root of ``self.modulus()``. 

 

Unless a custom modulus was given when constructing this prime 

field, this returns `1`. 

 

INPUT: 

 

- ``n`` -- must be 0 

 

OUTPUT: 

 

An element `a` of ``self`` such that ``self.modulus()(a) == 0``. 

 

.. WARNING:: 

 

This generator is not guaranteed to be a generator for the 

multiplicative group. To obtain the latter, use 

:meth:`~sage.rings.finite_rings.finite_field_base.FiniteFields.multiplicative_generator()` 

or use the ``modulus="primitive"`` option when constructing 

the field. 

 

EXAMPLES:: 

 

sage: k = GF(13) 

sage: k.gen() 

1 

sage: k = GF(1009, modulus="primitive") 

sage: k.gen() # this gives a primitive element 

11 

sage: k.gen(1) 

Traceback (most recent call last): 

... 

IndexError: only one generator 

""" 

if n: 

raise IndexError("only one generator") 

try: 

return self.__gen 

except AttributeError: 

pass 

 

try: 

self.__gen = -(self._modulus[0]) 

except AttributeError: 

self.__gen = self.one() 

return self.__gen 

 

def __iter__(self): 

""" 

Return an iterator over ``self``. 

 

EXAMPLES:: 

 

sage: list(GF(7)) 

[0, 1, 2, 3, 4, 5, 6] 

 

We can even start iterating over something that would be too big 

to actually enumerate:: 

 

sage: K = GF(next_prime(2^256)) 

sage: all = iter(K) 

sage: next(all) 

0 

sage: next(all) 

1 

sage: next(all) 

2 

""" 

yield self(0) 

i = one = self(1) 

while i: 

yield i 

i += one 

 

def degree(self): 

""" 

Return the degree of ``self`` over its prime field. 

 

This always returns 1. 

 

EXAMPLES:: 

 

sage: FiniteField(3).degree() 

1 

""" 

return Integer(1) 

 

register_unpickle_override( 

'sage.rings.finite_field_prime_modn', 'FiniteField_prime_modn', 

FiniteField_prime_modn)