Ticket #1810: finite_field_refactor_doc.3.patch
File finite_field_refactor_doc.3.patch, 36.9 KB (added by , 15 years ago) |
---|
-
sage/coding/code_constructions.py
# HG changeset patch # User 'Martin Albrecht <malb@informatik.uni-bremen.de>' # Date 1204143565 28800 # Node ID 1691c70f15a5dcb8357a20c5e3eb31fb3926860d # Parent 3b0d22a6661d3303d10d5e43f910e36fb791c5a6 Finite Field documentation (rebasing #1810 again) diff -r 3b0d22a6661d -r 1691c70f15a5 sage/coding/code_constructions.py
a b from sage.interfaces.all import gap 14 14 from sage.interfaces.all import gap 15 15 #from sage.misc.preparser import * 16 16 from sage.matrix.matrix_space import MatrixSpace 17 from sage.rings.finite_field import GF17 from sage.rings.finite_field import FiniteField as GF 18 18 #from sage.groups.perm_gps.permgroup import * 19 19 from sage.groups.perm_gps.permgroup_named import SymmetricGroup 20 20 from sage.misc.sage_eval import sage_eval -
sage/coding/guava.py
diff -r 3b0d22a6661d -r 1691c70f15a5 sage/coding/guava.py
a b from sage.interfaces.all import gap 23 23 from sage.interfaces.all import gap 24 24 from sage.misc.preparser import * 25 25 from sage.matrix.matrix_space import MatrixSpace 26 from sage.rings.finite_field import * 26 from sage.rings.finite_field import FiniteField as GF 27 from sage.interfaces.gap import gfq_gap_to_sage as gap_to_sage 27 28 from sage.groups.perm_gps.permgroup import * 28 29 from sage.misc.sage_eval import sage_eval 29 30 from sage.misc.misc import prod, add … … def QuadraticResidueCode(n,F): 62 63 gap.eval("G:=GeneratorMat(C)") 63 64 k = eval(gap.eval("Length(G)")) 64 65 n = eval(gap.eval("Length(G[1])")) 65 G = [[g ap_to_sage(gap.eval("G["+str(i)+"]["+str(j)+"]"),F) for j in range(1,n+1)] for i in range(1,k+1)]66 G = [[gfq_gap_to_sage(gap.eval("G["+str(i)+"]["+str(j)+"]"),F) for j in range(1,n+1)] for i in range(1,k+1)] 66 67 MS = MatrixSpace(F,k,n) 67 68 return LinearCode(MS(G)) 68 69 … … def QuasiQuadraticResidueCode(p): 135 136 gap.eval("G:=GeneratorMat(C)") 136 137 k = eval(gap.eval("Length(G)")) 137 138 n = eval(gap.eval("Length(G[1])")) 138 G = [[g ap_to_sage(gap.eval("G["+str(i)+"]["+str(j)+"]"),F) for j in range(1,n+1)] for i in range(1,k+1)]139 G = [[gfq_gap_to_sage(gap.eval("G["+str(i)+"]["+str(j)+"]"),F) for j in range(1,n+1)] for i in range(1,k+1)] 139 140 MS = MatrixSpace(F,k,n) 140 141 return LinearCode(MS(G)) 141 142 … … def BinaryReedMullerCode(r,k): 180 181 gap.eval("G:=GeneratorMat(C)") 181 182 k = eval(gap.eval("Length(G)")) 182 183 n = eval(gap.eval("Length(G[1])")) 183 G = [[g ap_to_sage(gap.eval("G["+str(i)+"]["+str(j)+"]"),F) for j in range(1,n+1)] for i in range(1,k+1)]184 G = [[gfq_gap_to_sage(gap.eval("G["+str(i)+"]["+str(j)+"]"),F) for j in range(1,n+1)] for i in range(1,k+1)] 184 185 MS = MatrixSpace(F,k,n) 185 186 return LinearCode(MS(G)) 186 187 … … def RandomLinearCodeGuava(n,k,F): 212 213 gap.eval("G:=GeneratorMat(C)") 213 214 k = eval(gap.eval("Length(G)")) 214 215 n = eval(gap.eval("Length(G[1])")) 215 G = [[g ap_to_sage(gap.eval("G["+str(i)+"]["+str(j)+"]"),F) for j in range(1,n+1)] for i in range(1,k+1)]216 G = [[gfq_gap_to_sage(gap.eval("G["+str(i)+"]["+str(j)+"]"),F) for j in range(1,n+1)] for i in range(1,k+1)] 216 217 MS = MatrixSpace(F,k,n) 217 218 return LinearCode(MS(G)) 218 219 -
sage/coding/linear_code.py
diff -r 3b0d22a6661d -r 1691c70f15a5 sage/coding/linear_code.py
a b import sage.modules.module as module 177 177 import sage.modules.module as module 178 178 import sage.modules.free_module_element as fme 179 179 from sage.interfaces.all import gap 180 from sage.rings.finite_field import GF180 from sage.rings.finite_field import FiniteField as GF 181 181 from sage.groups.perm_gps.permgroup import PermutationGroup 182 182 from sage.matrix.matrix_space import MatrixSpace 183 183 from sage.rings.arith import GCD, rising_factorial, binomial … … def min_wt_vec(Gmat,F): 260 260 261 261 AUTHOR: David Joyner (11-2005) 262 262 """ 263 from sage. rings.finite_field importgap_to_sage263 from sage.interfaces.gap import gfq_gap_to_sage 264 264 gap.eval("G:="+Gmat) 265 265 k = int(gap.eval("Length(G)")) 266 266 q = F.order() … … def min_wt_vec(Gmat,F): 268 268 C = gap(Gmat).GeneratorMatCode(F) 269 269 n = int(C.WordLength()) 270 270 cg = C.MinimumDistanceCodeword() 271 c = [g ap_to_sage(cg[j],F) for j in range(1,n+1)]271 c = [gfq_gap_to_sage(cg[j],F) for j in range(1,n+1)] 272 272 V = VectorSpace(F,n) 273 273 return V(c) 274 274 ## this older code returns more info but may be slower: … … class LinearCode(module.Module): 474 474 False 475 475 476 476 """ 477 from sage. rings.finite_field importgap_to_sage477 from sage.interfaces.gap import gfq_gap_to_sage 478 478 F = self.base_ring() 479 479 q = F.order() 480 480 G = self.gen_mat() 481 481 n = len(G.columns()) 482 482 Cg = gap(G).GeneratorMatCode(F) 483 483 c = Cg.Random() 484 ans = [g ap_to_sage(c[i],F) for i in range(1,n+1)]484 ans = [gfq_gap_to_sage(c[i],F) for i in range(1,n+1)] 485 485 V = VectorSpace(F,n) 486 486 return V(ans) 487 487 … … class LinearCode(module.Module): 691 691 692 692 Does not work for very long codes since the syndrome table grows too large. 693 693 """ 694 from sage. rings.finite_field importgap_to_sage694 from sage.interfaces.gap import gfq_gap_to_sage 695 695 F = self.base_ring() 696 696 q = F.order() 697 697 G = self.gen_mat() … … class LinearCode(module.Module): 707 707 vstr = vstr[1:-1] # added by William Stein so const.tex works 2006-10-01 708 708 gap.eval("C:=GeneratorMatCode("+Gstr+",GF("+str(q)+"))") 709 709 gap.eval("c:=VectorCodeword(Decodeword( C, Codeword( "+vstr+" )))") # v->vstr, 8-27-2006 710 ans = [g ap_to_sage(gap.eval("c["+str(i)+"]"),F) for i in range(1,n+1)]710 ans = [gfq_gap_to_sage(gap.eval("c["+str(i)+"]"),F) for i in range(1,n+1)] 711 711 V = VectorSpace(F,n) 712 712 return V(ans) 713 713 -
sage/crypto/mq/mpolynomialsystem.py
diff -r 3b0d22a6661d -r 1691c70f15a5 sage/crypto/mq/mpolynomialsystem.py
a b from sage.structure.sage_object import S 32 32 from sage.structure.sage_object import SageObject 33 33 34 34 from sage.rings.integer_ring import ZZ 35 from sage.rings.finite_field import GF35 from sage.rings.finite_field import FiniteField as GF 36 36 37 37 from sage.rings.polynomial.multi_polynomial_ring import is_MPolynomialRing 38 38 from sage.rings.polynomial.multi_polynomial_ideal import MPolynomialIdeal -
sage/crypto/mq/sr.py
diff -r 3b0d22a6661d -r 1691c70f15a5 sage/crypto/mq/sr.py
a b REFERENCES: 77 77 Advanced Encryption Standard; Springer 2006; 78 78 """ 79 79 80 from sage.rings.finite_field import GF80 from sage.rings.finite_field import FiniteField as GF 81 81 from sage.rings.integer_ring import ZZ 82 82 from sage.rings.polynomial.polynomial_ring import PolynomialRing 83 83 -
sage/groups/perm_gps/cubegroup.py
diff -r 3b0d22a6661d -r 1691c70f15a5 sage/groups/perm_gps/cubegroup.py
a b from sage.interfaces.all import gap, is_ 74 74 from sage.interfaces.all import gap, is_GapElement, is_ExpectElement 75 75 from sage.groups.perm_gps.permgroup_element import PermutationGroupElement 76 76 import sage.structure.coerce as coerce 77 from sage.rings.finite_field import GF77 from sage.rings.finite_field import FiniteField as GF 78 78 from sage.rings.arith import factor 79 79 from sage.groups.abelian_gps.abelian_group import AbelianGroup 80 80 from sage.plot.plot import PolygonFactory, TextFactory -
sage/groups/perm_gps/permgroup.py
diff -r 3b0d22a6661d -r 1691c70f15a5 sage/groups/perm_gps/permgroup.py
a b from sage.interfaces.all import gap, is_ 91 91 from sage.interfaces.all import gap, is_GapElement, is_ExpectElement 92 92 from sage.groups.perm_gps.permgroup_element import PermutationGroupElement 93 93 import sage.structure.coerce as coerce 94 from sage.rings.finite_field import GF94 from sage.rings.finite_field import FiniteField as GF 95 95 from sage.rings.arith import factor 96 96 from sage.groups.abelian_gps.abelian_group import AbelianGroup 97 97 from sage.misc.functional import is_even, log -
sage/groups/perm_gps/permgroup_named.py
diff -r 3b0d22a6661d -r 1691c70f15a5 sage/groups/perm_gps/permgroup_named.py
a b from sage.rings.all import Rational 70 70 from sage.rings.all import RationalField, Integer 71 71 from sage.interfaces.all import gap, is_GapElement, is_ExpectElement 72 72 import sage.structure.coerce as coerce 73 from sage.rings.finite_field import GF73 from sage.rings.finite_field import FiniteField as GF 74 74 from sage.rings.arith import factor 75 75 from sage.groups.abelian_gps.abelian_group import AbelianGroup 76 76 from sage.misc.functional import is_even, log -
sage/interfaces/gap.py
diff -r 3b0d22a6661d -r 1691c70f15a5 sage/interfaces/gap.py
a b def is_GapElement(x): 736 736 def is_GapElement(x): 737 737 return isinstance(x, GapElement) 738 738 739 ########### 739 def gfq_gap_to_sage(x, F): 740 """ 741 INPUT: 742 x -- gap finite field element 743 F -- SAGE finite field 744 OUTPUT: 745 element of F 746 747 EXAMPLES: 748 sage: x = gap('Z(13)') 749 sage: F = GF(13, 'a') 750 sage: F(x) 751 2 752 sage: F(gap('0*Z(13)')) 753 0 754 sage: F = GF(13^2, 'a') 755 sage: x = gap('Z(13)') 756 sage: F(x) 757 2 758 sage: x = gap('Z(13^2)^3') 759 sage: F(x) 760 12*a + 11 761 sage: F.multiplicative_generator()^3 762 12*a + 11 763 764 AUTHOR: 765 -- David Joyner and William Stein 766 """ 767 from sage.rings.finite_field import FiniteField 768 769 s = str(x) 770 if s[:2] == '0*': 771 return F(0) 772 i1 = s.index("(") 773 i2 = s.index(")") 774 q = eval(s[i1+1:i2].replace('^','**')) 775 if q == F.order(): 776 K = F 777 else: 778 K = FiniteField(q, F.variable_name()) 779 if s.find(')^') == -1: 780 e = 1 781 else: 782 e = int(s[i2+2:]) 783 if F.degree() == 1: 784 g = int(gap.eval('Int(Z(%s))'%q)) 785 else: 786 g = K.multiplicative_generator() 787 return F(K(g**e)) 740 788 741 789 ############# 742 790 -
sage/libs/singular/singular.pyx
diff -r 3b0d22a6661d -r 1691c70f15a5 sage/libs/singular/singular.pyx
a b cdef extern from "limits.h": 21 21 long INT_MIN 22 22 23 23 from sage.rings.rational_field import RationalField 24 from sage.rings.finite_field import FiniteField_prime_modn24 from sage.rings.finite_field_prime_modn import FiniteField_prime_modn 25 25 from sage.rings.finite_field_ext_pari import FiniteField_ext_pari 26 26 from sage.libs.pari.all import pari 27 27 -
sage/matrix/matrix_rational_dense.pyx
diff -r 3b0d22a6661d -r 1691c70f15a5 sage/matrix/matrix_rational_dense.pyx
a b from sage.rings.integer cimport Integer 64 64 from sage.rings.integer cimport Integer 65 65 from sage.rings.ring import is_Ring 66 66 from sage.rings.integer_ring import ZZ, is_IntegerRing 67 from sage.rings.finite_field import GF67 from sage.rings.finite_field import FiniteField as GF 68 68 from sage.rings.integer_mod_ring import is_IntegerModRing 69 69 from sage.rings.rational_field import QQ 70 70 from sage.rings.arith import gcd -
sage/misc/flatten.py
diff -r 3b0d22a6661d -r 1691c70f15a5 sage/misc/flatten.py
a b def flatten(in_list, ltypes=(list, tuple 40 40 [0, 1, 2, 3, 4] 41 41 sage: flatten([GF(5)]) 42 42 [Finite Field of size 5] 43 sage: flatten([GF(5)], ltypes = (list, tuple, sage.rings.finite_field .FiniteField_prime_modn))43 sage: flatten([GF(5)], ltypes = (list, tuple, sage.rings.finite_field_prime_modn.FiniteField_prime_modn)) 44 44 [0, 1, 2, 3, 4] 45 45 46 46 Degenerate cases: -
sage/rings/all.py
diff -r 3b0d22a6661d -r 1691c70f15a5 sage/rings/all.py
a b Integers = IntegerModRing 65 65 66 66 # Finite fields 67 67 from finite_field import (FiniteField, is_FiniteField, is_PrimeFiniteField, 68 GF, conway_polynomial, exists_conway_polynomial) 68 conway_polynomial, exists_conway_polynomial) 69 GF = FiniteField 70 69 71 from finite_field_element import FiniteFieldElement, is_FiniteFieldElement 70 72 71 73 # Number field -
sage/rings/finite_field.py
diff -r 3b0d22a6661d -r 1691c70f15a5 sage/rings/finite_field.py
a b 1 """1 r""" 2 2 Finite Fields 3 3 4 \SAGE supports arithmetic in finite prime and extension fields. 5 Several implementation for prime fields are implemented natively in 6 \SAGE for several sizes of primes $p$. These implementations are 7 \begin{itemize} 8 \item \code{sage.rings.integer_mod.IntegerMod_int}, 9 \item \code{sage.rings.integer_mod.IntegerMod_int64}, and 10 \item \code{sage.rings.integer_mod.IntegerMod_gmp}. 11 \end{itemize} 12 Small extension fields 13 of cardinality $< 2^{16}$ are implemented using tables of Zech logs 14 via the Givaro C++ library 15 (\code{sage.rings.finite_field_givaro.FiniteField_givaro}). While this 16 representation is very fast it is limited to finite fields of small 17 cardinality. Larger finite extension fields of order $q >= 2^{16}$ are 18 internally represented as polynomials over a smaller finite prime 19 fields. If the characteristic of such a field is 2 then NTL is used 20 internally to represent the field 21 (\code{sage.rings.finite_field_ntl_gf2e.FiniteField_ntl_gf2e}). In all 22 other case the PARI C library is used 23 (\code{sage.rings.finite_field_ext_pari.FiniteField_ext_pari}). 24 25 However, this distinction is internal only and the user usually does 26 not have to worry about it because consistency across all 27 implementations is aimed for. In all extension field implementations 28 the user may either specify a minimal polynomial or leave the choice 29 to \SAGE. 30 31 For small finite fields the default choice are Conway polynomials. 32 33 The Conway polynomial $C_n$ is the lexicographically first monic 34 irreducible, primitive polynomial of degree $n$ over $GF(p)$ with the 35 property that for a root $\alpha$ of $C_n$ we have that $\beta= 36 \alpha^{(p^n - 1)/(p^m - 1)}$ is a root of $C_m$ for all $m$ dividing 37 $n$. \SAGE contains a database of conway polynomials which also can be 38 queried independendtly of finite field construction. 39 40 While \SAGE supports basic arithmetic in finite fields some more 41 advanced features for computing with finite fields are still not 42 implemented. For instance, \SAGE does not calculate embeddings of 43 finite fields yet. 4 44 5 45 EXAMPLES: 46 sage: k = GF(5); type(k) 47 <class 'sage.rings.finite_field_prime_modn.FiniteField_prime_modn'> 48 49 sage: k = GF(5^2,'c'); type(k) 50 <type 'sage.rings.finite_field_givaro.FiniteField_givaro'> 51 52 sage: k = GF(2^16,'c'); type(k) 53 <type 'sage.rings.finite_field_ntl_gf2e.FiniteField_ntl_gf2e'> 54 55 sage: k = GF(3^16,'c'); type(k) 56 <class 'sage.rings.finite_field_ext_pari.FiniteField_ext_pari'> 57 6 58 Finite Fields support iteration, starting with 0. 59 7 60 sage: k = GF(9, 'a') 8 61 sage: for i,x in enumerate(k): print i,x 9 62 0 0 … … Finite Fields support iteration, startin 24 77 4 25 78 26 79 We output the base rings of several finite fields. 80 27 81 sage: k = GF(3); type(k) 28 <class 'sage.rings.finite_field .FiniteField_prime_modn'>82 <class 'sage.rings.finite_field_prime_modn.FiniteField_prime_modn'> 29 83 sage: k.base_ring() 30 84 Finite Field of size 3 31 85 … … Further examples: 48 102 True 49 103 sage: GF(8,'a').is_field() 50 104 True 105 106 AUTHORS: 107 -- William Stein: initial version 108 -- Robert Bradshaw: prime field implementation 109 -- Martin Albrecht: Givaro and ntl.GF2E implementations 51 110 """ 52 111 53 112 #***************************************************************************** … … import random 68 127 import random 69 128 import weakref 70 129 130 from ring import is_FiniteField 131 from sage.structure.parent_gens import normalize_names 132 71 133 import arith 72 73 134 import integer 74 import rational75 import integer_mod76 77 import integer_mod_ring78 from ring import is_FiniteField79 from ring import FiniteField as FiniteField_generic80 from finite_field_givaro import FiniteField_givaro81 135 82 136 import polynomial.polynomial_ring as polynomial_ring 83 137 import polynomial.polynomial_element as polynomial_element 84 138 import polynomial.multi_polynomial_element as multi_polynomial_element 85 139 86 from sage.structure.parent_gens import normalize_names, ParentWithGens 140 # We don't late import this because this means trouble with the Givaro library 141 # TODO: figure out why 142 from finite_field_givaro import FiniteField_givaro 87 143 88 144 import sage.interfaces.gap 89 145 import sage.databases.conway … … def FiniteField(order, name=None, modulu 152 208 sage: F.<x> = GF(5)[] 153 209 sage: K.<a> = GF(5**2, name='a', modulus=x^2 + 2, check_irreducible=False) 154 210 155 For example, you may print finite field elements as integers via 156 the Givaro implementation. But the constructor parameter to allow 157 this is not passed to the actual implementation so far. 211 For example, you may print finite field elements as integers. This 212 currently only works if the order of field is $<2^{16}$, though. 158 213 159 214 sage: k.<a> = GF(2^8,repr='int') 160 215 sage: a 161 216 2 162 217 163 218 The order of a finite field must be a prime power: 219 164 220 sage: GF(100) 165 221 Traceback (most recent call last): 166 222 ... … … def FiniteField(order, name=None, modulu 179 235 if not K is None: 180 236 return K 181 237 if arith.is_prime(order): 238 from finite_field_prime_modn import FiniteField_prime_modn 182 239 K = FiniteField_prime_modn(order,*args,**kwds) 183 240 else: 184 241 if not arith.is_prime_power(order): … … def FiniteField(order, name=None, modulu 210 267 211 268 def is_PrimeFiniteField(x): 212 269 """ 213 Returns True if x is a prime finite field (which is a specific 214 data type). 270 Returns True if x is a prime finite field. 215 271 216 272 EXAMPLES: 217 273 sage: is_PrimeFiniteField(QQ) … … def is_PrimeFiniteField(x): 223 279 sage: is_PrimeFiniteField(GF(next_prime(10^90,proof=False))) 224 280 True 225 281 """ 226 return isinstance(x, FiniteField_prime_modn) 282 from finite_field_prime_modn import FiniteField_prime_modn 283 from ring import FiniteField as FiniteField_generic 284 285 return isinstance(x, FiniteField_prime_modn) or \ 286 (isinstance(x, FiniteField_generic) and x.degree() == 1) 227 287 228 GF = FiniteField229 230 288 ################################################################## 231 289 232 290 def conway_polynomial(p, n): 233 """291 r""" 234 292 Return the Conway polynomial of degree n over GF(p), which is 235 293 loaded from a table. 236 294 … … def conway_polynomial(p, n): 248 306 disk, which takes a fraction of a second. Subsequent calls do not 249 307 require reloading the table. 250 308 251 See also the ConwayPolynomials()object, which is a table of252 Conway polynomials. For example, if c=ConwayPolynomials, then253 c.primes()is a list of all primes for which the polynomials are254 known, and for a given prime p, c.degree(p)is a list of all309 See also the \code{ConwayPolynomials()} object, which is a table of 310 Conway polynomials. For example, if \code{c=ConwayPolynomials}, then 311 \code{c.primes()} is a list of all primes for which the polynomials are 312 known, and for a given prime $p$, \code{c.degree(p)} is a list of all 255 313 degrees for which the Conway polynomials are known. 256 314 257 315 EXAMPLES: … … def conway_polynomial(p, n): 265 323 RuntimeError: requested conway polynomial not in database. 266 324 """ 267 325 (p,n)=(int(p),int(n)) 268 R = polynomial_ring.PolynomialRing( GF(p), 'x')326 R = polynomial_ring.PolynomialRing(FiniteField(p), 'x') 269 327 try: 270 328 return R(sage.databases.conway.ConwayPolynomials()[p][n]) 271 329 except KeyError: 272 330 raise RuntimeError, "requested conway polynomial not in database." 273 331 274 332 def exists_conway_polynomial(p, n): 275 """276 Return True if the Conway polynomial over F_p of degree nis in the333 r""" 334 Return True if the Conway polynomial over $F_p$ of degree $n$ is in the 277 335 database and False otherwise. 278 336 279 337 If the Conway polynomial is in the database, to obtain it use the 280 command conway_polynomial(p,n).338 command \code{conway_polynomial(p,n)}. 281 339 282 340 EXAMPLES: 283 341 sage: exists_conway_polynomial(2,3) … … def exists_conway_polynomial(p, n): 291 349 """ 292 350 return sage.databases.conway.ConwayPolynomials().has_polynomial(p,n) 293 351 294 def gap_to_sage(x, F):295 """296 INPUT:297 x -- gap finite field element298 F -- SAGE finite field299 OUTPUT:300 element of F301 302 EXAMPLES:303 sage: x = gap('Z(13)')304 sage: F = GF(13, 'a')305 sage: F(x)306 2307 sage: F(gap('0*Z(13)'))308 0309 sage: F = GF(13^2, 'a')310 sage: x = gap('Z(13)')311 sage: F(x)312 2313 sage: x = gap('Z(13^2)^3')314 sage: F(x)315 12*a + 11316 sage: F.multiplicative_generator()^3317 12*a + 11318 319 AUTHOR:320 -- David Joyner and William Stein321 """322 s = str(x)323 if s[:2] == '0*':324 return F(0)325 i1 = s.index("(")326 i2 = s.index(")")327 q = eval(s[i1+1:i2].replace('^','**'))328 if q == F.order():329 K = F330 else:331 K = FiniteField(q, F.variable_name())332 if s.find(')^') == -1:333 e = 1334 else:335 e = int(s[i2+2:])336 if F.degree() == 1:337 g = int(sage.interfaces.gap.gap.eval('Int(Z(%s))'%q))338 else:339 g = K.multiplicative_generator()340 return F(K(g**e))341 342 343 class FiniteField_prime_modn(FiniteField_generic, integer_mod_ring.IntegerModRing_generic):344 def __init__(self, p, name=None):345 p = integer.Integer(p)346 if not arith.is_prime(p):347 raise ArithmeticError, "p must be prime"348 integer_mod_ring.IntegerModRing_generic.__init__(self, p)349 self._kwargs = {}350 self.__char = p351 self.__gen = self(1) # self(int(pari.pari(p).znprimroot().lift()))352 ParentWithGens.__init__(self, self, ('x',), normalize=False)353 354 def __cmp__(self, other):355 if not isinstance(other, FiniteField_prime_modn):356 return cmp(type(self), type(other))357 return cmp(self.__char, other.__char)358 359 def _is_valid_homomorphism_(self, codomain, im_gens):360 """361 This is called implicitly by the hom constructor.362 363 EXAMPLES:364 sage: k = GF(73^2,'a')365 sage: f = k.modulus()366 sage: r = f.change_ring(k).roots()367 sage: k.hom([r[0][0]])368 Ring endomorphism of Finite Field in a of size 73^2369 Defn: a |--> 72*a + 3370 """371 try:372 return im_gens[0] == codomain._coerce_(self.gen(0))373 except TypeError:374 return False375 376 def _coerce_impl(self, x):377 if isinstance(x, (int, long, integer.Integer)):378 return self(x)379 if isinstance(x, integer_mod.IntegerMod_abstract) and \380 x.parent().characteristic() == self.characteristic():381 return self(x)382 raise TypeError, "no canonical coercion of x"383 384 def characteristic(self):385 return self.__char386 387 def modulus(self):388 try:389 return self.__modulus390 except AttributeError:391 x = polynomial_ring.PolynomialRing(self, 'x').gen()392 self.__modulus = x - 1393 return self.__modulus394 395 def is_prime_field(self):396 return True397 398 def is_prime(self):399 return True400 401 def polynomial(self, name=None):402 if name is None:403 name = self.variable_name()404 try:405 return self.__polynomial[name]406 except AttributeError:407 R = polynomial_ring.PolynomialRing(FiniteField(self.characteristic()), name)408 f = polynomial_ring.PolynomialRing(self, name)([0,1])409 try:410 self.__polynomial[name] = f411 except (KeyError, AttributeError):412 self.__polynomial = {}413 self.__polynomial[name] = f414 return f415 416 def order(self):417 return self.__char418 419 def gen(self, n=0):420 """421 Return generator of this finite field.422 423 EXAMPLES:424 sage: k = GF(13)425 sage: k.gen()426 1427 sage: k.gen(1)428 Traceback (most recent call last):429 ...430 IndexError: only one generator431 """432 if n != 0:433 raise IndexError, "only one generator"434 return self.__gen435 436 def __iter__(self):437 for i in xrange(self.order()):438 yield self(i)439 440 def degree(self):441 """442 Returns the degree of the finite field, which is a positive443 integer.444 445 EXAMPLES:446 sage: FiniteField(3).degree()447 1448 sage: FiniteField(3^20, 'a').degree()449 20450 """451 return 1452 352 453 353 zech_log_bound = 2**16 -
sage/rings/finite_field_ext_pari.py
diff -r 3b0d22a6661d -r 1691c70f15a5 sage/rings/finite_field_ext_pari.py
a b class FiniteField_ext_pari(FiniteField_g 181 181 raise ArithmeticError, "q must be a prime power" 182 182 183 183 if F[0][1] > 1: 184 from finite_field import GF184 from finite_field import FiniteField as GF 185 185 base_ring = GF(F[0][0]) 186 186 else: 187 187 raise ValueError, "The size of the finite field must not be prime." … … class FiniteField_ext_pari(FiniteField_g 207 207 # self.__pari_modulus = pari.pari.finitefield_init(self.__char, self.__degree, self.variable_name()) 208 208 # So instead we iterate through random polys until we find an irreducible one. 209 209 210 from finite_field import GF210 from finite_field import FiniteField as GF 211 211 R = polynomial_ring.PolynomialRing(GF(self.__char), 'x') 212 212 while True: 213 213 modulus = R.random_element(self.__degree) … … class FiniteField_ext_pari(FiniteField_g 433 433 raise TypeError, "no coercion defined" 434 434 435 435 elif sage.interfaces.gap.is_GapElement(x): 436 from finite_field importgap_to_sage436 from sage.interfaces.gap import gfq_gap_to_sage 437 437 try: 438 return g ap_to_sage(x, self)438 return gfq_gap_to_sage(x, self) 439 439 except (ValueError, IndexError, TypeError): 440 440 raise TypeError, "no coercion defined" 441 441 … … class FiniteField_ext_pari(FiniteField_g 569 569 try: 570 570 return self.__polynomial[name] 571 571 except (AttributeError, KeyError): 572 from finite_field import GF572 from finite_field import FiniteField as GF 573 573 R = polynomial_ring.PolynomialRing(GF(self.characteristic()), name) 574 574 f = R(self._pari_modulus()) 575 575 try: -
sage/rings/finite_field_givaro.pyx
diff -r 3b0d22a6661d -r 1691c70f15a5 sage/rings/finite_field_givaro.pyx
a b r""" 1 1 r""" 2 Finite Non-primeFields of cardinality up to $2^{16}$2 Finite Extension Fields of cardinality up to $2^{16}$ 3 3 4 4 SAGE includes the Givaro finite field library, for highly optimized 5 5 arithmetic in finite fields. … … using the PARI implementation. 14 14 15 15 EXAMPLES: 16 16 sage: k = GF(5); type(k) 17 <class 'sage.rings.finite_field .FiniteField_prime_modn'>17 <class 'sage.rings.finite_field_prime_modn.FiniteField_prime_modn'> 18 18 sage: k = GF(5^2,'c'); type(k) 19 19 <type 'sage.rings.finite_field_givaro.FiniteField_givaro'> 20 20 sage: k = GF(2^16,'c'); type(k) … … cdef class FiniteField_givaro(FiniteFiel 516 516 e = e._pari_() 517 517 518 518 elif sage.interfaces.gap.is_GapElement(e): 519 from sage. rings.finite_field importgap_to_sage520 return g ap_to_sage(e, self)519 from sage.interfaces.gap import gfq_gap_to_sage 520 return gfq_gap_to_sage(e, self) 521 521 522 522 else: 523 523 raise TypeError, "unable to coerce" … … cdef class FiniteField_givaro(FiniteFiel 608 608 sage: S.prime_subfield() 609 609 Finite Field of size 5 610 610 sage: type(S.prime_subfield()) 611 <class 'sage.rings.finite_field .FiniteField_prime_modn'>611 <class 'sage.rings.finite_field_prime_modn.FiniteField_prime_modn'> 612 612 """ 613 613 return self.prime_subfield_C() 614 614 -
sage/rings/finite_field_ntl_gf2e.pyx
diff -r 3b0d22a6661d -r 1691c70f15a5 sage/rings/finite_field_ntl_gf2e.pyx
a b cdef void late_import(): 115 115 FreeModuleElement = sage.modules.free_module_element.FreeModuleElement 116 116 117 117 import sage.rings.finite_field 118 GF = sage.rings.finite_field. GF118 GF = sage.rings.finite_field.FiniteField 119 119 120 120 cdef extern from "arpa/inet.h": 121 121 unsigned int htonl(unsigned int) … … cdef class FiniteField_ntl_gf2e(FiniteFi 364 364 e = e._pari_() 365 365 366 366 elif is_GapElement(e): 367 from finite_field importgap_to_sage368 return g ap_to_sage(e, self)367 from sage.interfaces.gap import gfq_gap_to_sage 368 return gfq_gap_to_sage(e, self) 369 369 else: 370 370 raise TypeError, "unable to coerce" 371 371 -
sage/rings/integer_mod_ring.py
diff -r 3b0d22a6661d -r 1691c70f15a5 sage/rings/integer_mod_ring.py
a b def IntegerModRing(order=0): 103 103 if _objsIntegerModRing.has_key(order): 104 104 x = _objsIntegerModRing[order]() 105 105 if not x is None: return x 106 #if check_prime and arith.is_prime(order):107 # R = sage.rings.finite_field.FiniteField_prime_modn(order)108 #else:109 106 R = IntegerModRing_generic(order) 110 107 _objsIntegerModRing[order] = weakref.ref(R) 111 108 return R … … class IntegerModRing_generic(quotient_ri 584 581 return TypeError, "error coercing to finite field" 585 582 except TypeError: 586 583 if sage.interfaces.all.is_GapElement(x): 587 import finite_field584 from sage.interfaces.gap import gfq_gap_to_sage 588 585 try: 589 return finite_field.gap_to_sage(x, self)586 return gfq_gap_to_sage(x, self) 590 587 except (ValueError, IndexError, TypeError), msg: 591 588 raise TypeError, "%s\nerror coercing to finite field"%msg 592 589 else: -
sage/rings/padics/factory.py
diff -r 3b0d22a6661d -r 1691c70f15a5 sage/rings/padics/factory.py
a b def Qq(q, prec = 20, type = 'capped-rel' 169 169 return Qp(q, prec, type, print_mode, halt, names, check) 170 170 base = Qp(F[0][0], prec, type, print_mode, halt, qp_name, check = False) 171 171 if modulus is None: 172 from sage.rings.finite_field import GF172 from sage.rings.finite_field import FiniteField as GF 173 173 from sage.rings.integer_ring import ZZ 174 174 from sage.rings.polynomial.polynomial_ring import PolynomialRing 175 175 if qp_name is None: … … def Zq(q, prec = 20, type = 'capped-abs' 417 417 return Zp(q, prec, type, print_mode, halt, names, check) 418 418 base = Zp(F[0][0], prec, type, print_mode, halt, zp_name, check = False) 419 419 if modulus is None: 420 from sage.rings.finite_field import GF420 from sage.rings.finite_field import FiniteField as GF 421 421 if zp_name is None: 422 422 zp_name = (str(F[0][0]),) 423 423 modulus = PolynomialRing(base, 'x')(GF(q, names).modulus().change_ring(ZZ)) -
sage/rings/padics/padic_generic.py
diff -r 3b0d22a6661d -r 1691c70f15a5 sage/rings/padics/padic_generic.py
a b class pAdicGeneric(sage.rings.ring.Princ 254 254 sage: k 255 255 Finite Field of size 3 256 256 """ 257 return sage.rings.finite_field. GF(self.prime())257 return sage.rings.finite_field.FiniteField(self.prime()) 258 258 259 259 residue_field = residue_class_field 260 260 … … class pAdicGeneric(sage.rings.ring.Princ 491 491 else: 492 492 raise ValueError, "No, %sth root of unity in self"%n 493 493 else: 494 return self.teichmuller(sage.rings.finite_field. GF(self.prime()).zeta(n).lift())494 return self.teichmuller(sage.rings.finite_field.FiniteField(self.prime()).zeta(n).lift()) 495 495 496 496 def zeta_order(self): 497 497 """ -
sage/rings/padics/unramified_extension_generic.py
diff -r 3b0d22a6661d -r 1691c70f15a5 sage/rings/padics/unramified_extension_generic.py
a b pAdicExtensionGeneric = padic_extension_ 17 17 pAdicExtensionGeneric = padic_extension_generic.pAdicExtensionGeneric 18 18 #UnramifiedExtensionGenericElement = sage.rings.padics.unramified_extension_generic_element.UnramifiedExtensionGenericElement 19 19 PolynomialRing = sage.rings.polynomial.polynomial_ring.PolynomialRing 20 GF = sage.rings. finite_field.GF20 GF = sage.rings.ring.FiniteField 21 21 #pAdicGeneric = sage.rings.padics.padic_generic.pAdicGeneric 22 22 23 23 class UnramifiedExtensionGeneric(pAdicExtensionGeneric): -
sage/rings/polynomial/multi_polynomial_libsingular.pyx
diff -r 3b0d22a6661d -r 1691c70f15a5 sage/rings/polynomial/multi_polynomial_libsingular.pyx
a b from sage.rings.polynomial.pbori import 50 50 51 51 # base ring imports 52 52 from sage.rings.rational_field import RationalField 53 from sage.rings.finite_field import FiniteField_prime_modn54 from sage.rings. finite_field importFiniteField_generic53 from sage.rings.finite_field_prime_modn import FiniteField_prime_modn 54 from sage.rings.ring import FiniteField as FiniteField_generic 55 55 from sage.rings.finite_field_givaro cimport FiniteField_givaroElement 56 56 from sage.rings.finite_field_givaro cimport FiniteField_givaro 57 57 from sage.rings.number_field.number_field import NumberField_generic -
sage/rings/polynomial/pbori.pyx
diff -r 3b0d22a6661d -r 1691c70f15a5 sage/rings/polynomial/pbori.pyx
a b from sage.rings.polynomial.polynomial_el 31 31 32 32 from sage.rings.polynomial.multi_polynomial_ideal import MPolynomialIdeal 33 33 from sage.rings.polynomial.term_order import TermOrder 34 from sage.rings.finite_field import GF34 from sage.rings.finite_field import FiniteField as GF 35 35 from sage.monoids.monoid import Monoid_class 36 36 37 37 from sage.structure.sequence import Sequence -
sage/rings/residue_field.pyx
diff -r 3b0d22a6661d -r 1691c70f15a5 sage/rings/residue_field.pyx
a b from sage.rings.all import ZZ, QQ, Integ 65 65 from sage.rings.all import ZZ, QQ, Integers 66 66 from sage.rings.number_field.number_field_ideal import is_NumberFieldIdeal 67 67 import weakref 68 from sage.rings.finite_field import FiniteField as GF 68 69 from sage.rings.finite_field_givaro import FiniteField_givaro 69 from sage.rings.finite_field import FiniteField_prime_modn, GF70 from sage.rings.finite_field_prime_modn import FiniteField_prime_modn 70 71 from sage.rings.finite_field_ext_pari import FiniteField_ext_pari 71 72 from sage.structure.parent_base import ParentWithBase 72 73 -
sage/rings/ring.pyx
diff -r 3b0d22a6661d -r 1691c70f15a5 sage/rings/ring.pyx
a b cdef class FiniteFieldIterator: 1120 1120 return self.parent(self.iter.next()) 1121 1121 1122 1122 cdef class FiniteField(Field): 1123 """1124 """1125 1126 1123 def __init__(self): 1127 1124 """ 1128 1125 EXAMPLES: … … cdef class FiniteField(Field): 1514 1511 Univariate Polynomial Ring in alpha over Finite Field of size 3 1515 1512 """ 1516 1513 from sage.rings.polynomial.polynomial_ring_constructor import PolynomialRing 1517 from sage.rings.finite_field import GF1514 from sage.rings.finite_field import FiniteField as GF 1518 1515 1519 1516 if variable_name is None and self.__polynomial_ring is not None: 1520 1517 return self.__polynomial_ring