Ticket #1810: finite_field_refactor_doc.2.patch
File finite_field_refactor_doc.2.patch, 38.0 KB (added by , 15 years ago) |
---|
-
sage/coding/guava.py
# HG changeset patch # User Martin Albrecht <malb@informatik.uni-bremen.de> # Date 1204137744 0 # Node ID a1755ae00b9c6505540e269dd3512e0ec743a4a6 # Parent 59538ebc8f3bc9e36d8e847c5c15a8cad5a90791 Finite Fields documentation cleanup (#1810) this involves refactoring such that minor stuff doesn't show up in the reference manual diff -r 59538ebc8f3b -r a1755ae00b9c 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 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 HammingCode(r,F): 77 78 gap.eval("G:=GeneratorMat(C)") 78 79 k = eval(gap.eval("Length(G)")) 79 80 n = eval(gap.eval("Length(G[1])")) 80 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)]81 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)] 81 82 MS = MatrixSpace(F,k,n) 82 83 return LinearCode(MS(G)) 83 84 … … def QuadraticResidueCode(n,F): 111 112 gap.eval("G:=GeneratorMat(C)") 112 113 k = eval(gap.eval("Length(G)")) 113 114 n = eval(gap.eval("Length(G[1])")) 114 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)]115 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)] 115 116 MS = MatrixSpace(F,k,n) 116 117 return LinearCode(MS(G)) 117 118 … … def ExtendedQuadraticResidueCode(n,F): 146 147 gap.eval("G:=GeneratorMat(XC)") 147 148 k = eval(gap.eval("Length(G)")) 148 149 n = eval(gap.eval("Length(G[1])")) 149 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)]150 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)] 150 151 MS = MatrixSpace(F,k,n) 151 152 return LinearCode(MS(G)) 152 153 … … def QuasiQuadraticResidueCode(p): 184 185 gap.eval("G:=GeneratorMat(C)") 185 186 k = eval(gap.eval("Length(G)")) 186 187 n = eval(gap.eval("Length(G[1])")) 187 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)]188 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)] 188 189 MS = MatrixSpace(F,k,n) 189 190 return LinearCode(MS(G)) 190 191 … … def BinaryReedMullerCode(r,k): 229 230 gap.eval("G:=GeneratorMat(C)") 230 231 k = eval(gap.eval("Length(G)")) 231 232 n = eval(gap.eval("Length(G[1])")) 232 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)]233 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)] 233 234 MS = MatrixSpace(F,k,n) 234 235 return LinearCode(MS(G)) 235 236 … … def RandomLinearCodeGuava(n,k,F): 261 262 gap.eval("G:=GeneratorMat(C)") 262 263 k = eval(gap.eval("Length(G)")) 263 264 n = eval(gap.eval("Length(G[1])")) 264 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)]265 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)] 265 266 MS = MatrixSpace(F,k,n) 266 267 return LinearCode(MS(G)) 267 268 … … def CyclicCode(g,n,F): 291 292 gap.eval("G:=GeneratorMat(C)") 292 293 k = eval(gap.eval("Length(G)")) 293 294 n1 = eval(gap.eval("Length(G[1])")) 294 G = [[g ap_to_sage(gap.eval("G["+str(i)+"]["+str(j)+"]"),F) for j in range(1,n1+1)] for i in range(1,k+1)]295 G = [[gfq_gap_to_sage(gap.eval("G["+str(i)+"]["+str(j)+"]"),F) for j in range(1,n1+1)] for i in range(1,k+1)] 295 296 MS = MatrixSpace(F,k,n1) 296 297 return LinearCode(MS(G)) -
sage/coding/linear_code.py
diff -r 59538ebc8f3b -r a1755ae00b9c sage/coding/linear_code.py
a b import sage.modules.module as module 176 176 import sage.modules.module as module 177 177 import sage.modules.free_module_element as fme 178 178 from sage.interfaces.all import gap 179 from sage.rings.finite_field import GF179 from sage.rings.finite_field import FiniteField as GF 180 180 from sage.groups.perm_gps.permgroup import PermutationGroup 181 181 from sage.matrix.matrix_space import MatrixSpace 182 182 from sage.rings.arith import GCD, rising_factorial, binomial … … def min_wt_vec(Gmat,F): 259 259 260 260 AUTHOR: David Joyner (11-2005) 261 261 """ 262 from sage. rings.finite_field importgap_to_sage262 from sage.interfaces.gap import gfq_gap_to_sage 263 263 gap.eval("G:="+Gmat) 264 264 k = int(gap.eval("Length(G)")) 265 265 q = F.order() … … def min_wt_vec(Gmat,F): 267 267 C = gap(Gmat).GeneratorMatCode(F) 268 268 n = int(C.WordLength()) 269 269 cg = C.MinimumDistanceCodeword() 270 c = [g ap_to_sage(cg[j],F) for j in range(1,n+1)]270 c = [gfq_gap_to_sage(cg[j],F) for j in range(1,n+1)] 271 271 V = VectorSpace(F,n) 272 272 return V(c) 273 273 ## this older code returns more info but may be slower: … … class LinearCode(module.Module): 495 495 False 496 496 497 497 """ 498 from sage. rings.finite_field importgap_to_sage498 from sage.interfaces.gap import gfq_gap_to_sage 499 499 F = self.base_ring() 500 500 q = F.order() 501 501 G = self.gen_mat() 502 502 n = len(G.columns()) 503 503 Cg = gap(G).GeneratorMatCode(F) 504 504 c = Cg.Random() 505 ans = [g ap_to_sage(c[i],F) for i in range(1,n+1)]505 ans = [gfq_gap_to_sage(c[i],F) for i in range(1,n+1)] 506 506 V = VectorSpace(F,n) 507 507 return V(ans) 508 508 … … class LinearCode(module.Module): 718 718 719 719 Does not work for very long codes since the syndrome table grows too large. 720 720 """ 721 from sage. rings.finite_field importgap_to_sage721 from sage.interfaces.gap import gfq_gap_to_sage 722 722 F = self.base_ring() 723 723 q = F.order() 724 724 G = self.gen_mat() … … class LinearCode(module.Module): 734 734 vstr = vstr[1:-1] # added by William Stein so const.tex works 2006-10-01 735 735 gap.eval("C:=GeneratorMatCode("+Gstr+",GF("+str(q)+"))") 736 736 gap.eval("c:=VectorCodeword(Decodeword( C, Codeword( "+vstr+" )))") # v->vstr, 8-27-2006 737 ans = [g ap_to_sage(gap.eval("c["+str(i)+"]"),F) for i in range(1,n+1)]737 ans = [gfq_gap_to_sage(gap.eval("c["+str(i)+"]"),F) for i in range(1,n+1)] 738 738 V = VectorSpace(F,n) 739 739 return V(ans) 740 740 -
sage/crypto/mq/mpolynomialsystem.py
diff -r 59538ebc8f3b -r a1755ae00b9c 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 59538ebc8f3b -r a1755ae00b9c 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 59538ebc8f3b -r a1755ae00b9c 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 59538ebc8f3b -r a1755ae00b9c 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 59538ebc8f3b -r a1755ae00b9c 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 59538ebc8f3b -r a1755ae00b9c 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 59538ebc8f3b -r a1755ae00b9c 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 59538ebc8f3b -r a1755ae00b9c 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 59538ebc8f3b -r a1755ae00b9c 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 59538ebc8f3b -r a1755ae00b9c 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 59538ebc8f3b -r a1755ae00b9c 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 86 from sage.structure.parent_gens import normalize_names, ParentWithGens87 139 88 140 import sage.interfaces.gap 89 141 import sage.databases.conway … … def FiniteField(order, name=None, modulu 152 204 sage: F.<x> = GF(5)[] 153 205 sage: K.<a> = GF(5**2, name='a', modulus=x^2 + 2, check_irreducible=False) 154 206 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. 207 For example, you may print finite field elements as integers. This 208 currently only works if the order of field is $<2^{16}$, though. 158 209 159 210 sage: k.<a> = GF(2^8,repr='int') 160 211 sage: a 161 212 2 162 213 163 214 The order of a finite field must be a prime power: 215 164 216 sage: GF(100) 165 217 Traceback (most recent call last): 166 218 ... … … def FiniteField(order, name=None, modulu 179 231 if not K is None: 180 232 return K 181 233 if arith.is_prime(order): 234 from finite_field_prime_modn import FiniteField_prime_modn 182 235 K = FiniteField_prime_modn(order,*args,**kwds) 183 236 else: 184 237 if not arith.is_prime_power(order): … … def FiniteField(order, name=None, modulu 195 248 # DO *NOT* use for prime subfield, since that would lead to 196 249 # a circular reference in the call to ParentWithGens in the 197 250 # __init__ method. 251 from finite_field_givaro import FiniteField_givaro 198 252 K = FiniteField_givaro(order, name, modulus, cache=elem_cache, *args,**kwds) 199 253 else: 200 254 if integer.Integer(order).factor()[0][0] == 2: … … def FiniteField(order, name=None, modulu 210 264 211 265 def is_PrimeFiniteField(x): 212 266 """ 213 Returns True if x is a prime finite field (which is a specific 214 data type). 267 Returns True if x is a prime finite field. 215 268 216 269 EXAMPLES: 217 270 sage: is_PrimeFiniteField(QQ) … … def is_PrimeFiniteField(x): 223 276 sage: is_PrimeFiniteField(GF(next_prime(10^90,proof=False))) 224 277 True 225 278 """ 226 return isinstance(x, FiniteField_prime_modn) 279 from finite_field_prime_modn import FiniteField_prime_modn 280 from ring import FiniteField as FiniteField_generic 281 282 return isinstance(x, FiniteField_prime_modn) or \ 283 (isinstance(x, FiniteField_generic) and x.degree() == 1) 227 284 228 GF = FiniteField229 230 285 ################################################################## 231 286 232 287 def conway_polynomial(p, n): 233 """288 r""" 234 289 Return the Conway polynomial of degree n over GF(p), which is 235 290 loaded from a table. 236 291 … … def conway_polynomial(p, n): 248 303 disk, which takes a fraction of a second. Subsequent calls do not 249 304 require reloading the table. 250 305 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 all306 See also the \code{ConwayPolynomials()} object, which is a table of 307 Conway polynomials. For example, if \code{c=ConwayPolynomials}, then 308 \code{c.primes()} is a list of all primes for which the polynomials are 309 known, and for a given prime $p$, \code{c.degree(p)} is a list of all 255 310 degrees for which the Conway polynomials are known. 256 311 257 312 EXAMPLES: … … def conway_polynomial(p, n): 265 320 RuntimeError: requested conway polynomial not in database. 266 321 """ 267 322 (p,n)=(int(p),int(n)) 268 R = polynomial_ring.PolynomialRing( GF(p), 'x')323 R = polynomial_ring.PolynomialRing(FiniteField(p), 'x') 269 324 try: 270 325 return R(sage.databases.conway.ConwayPolynomials()[p][n]) 271 326 except KeyError: 272 327 raise RuntimeError, "requested conway polynomial not in database." 273 328 274 329 def exists_conway_polynomial(p, n): 275 """276 Return True if the Conway polynomial over F_p of degree nis in the330 r""" 331 Return True if the Conway polynomial over $F_p$ of degree $n$ is in the 277 332 database and False otherwise. 278 333 279 334 If the Conway polynomial is in the database, to obtain it use the 280 command conway_polynomial(p,n).335 command \code{conway_polynomial(p,n)}. 281 336 282 337 EXAMPLES: 283 338 sage: exists_conway_polynomial(2,3) … … def exists_conway_polynomial(p, n): 291 346 """ 292 347 return sage.databases.conway.ConwayPolynomials().has_polynomial(p,n) 293 348 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 349 453 350 zech_log_bound = 2**16 -
sage/rings/finite_field_ext_pari.py
diff -r 59538ebc8f3b -r a1755ae00b9c 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 59538ebc8f3b -r a1755ae00b9c 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 59538ebc8f3b -r a1755ae00b9c 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 59538ebc8f3b -r a1755ae00b9c sage/rings/integer_mod_ring.py
a b def IntegerModRing(order=0): 99 99 if _objsIntegerModRing.has_key(order): 100 100 x = _objsIntegerModRing[order]() 101 101 if not x is None: return x 102 #if check_prime and arith.is_prime(order):103 # R = sage.rings.finite_field.FiniteField_prime_modn(order)104 #else:105 102 R = IntegerModRing_generic(order) 106 103 _objsIntegerModRing[order] = weakref.ref(R) 107 104 return R … … class IntegerModRing_generic(quotient_ri 580 577 return TypeError, "error coercing to finite field" 581 578 except TypeError: 582 579 if sage.interfaces.all.is_GapElement(x): 583 import finite_field580 from sage.interfaces.gap import gfq_gap_to_sage 584 581 try: 585 return finite_field.gap_to_sage(x, self)582 return gfq_gap_to_sage(x, self) 586 583 except (ValueError, IndexError, TypeError), msg: 587 584 raise TypeError, "%s\nerror coercing to finite field"%msg 588 585 else: -
sage/rings/padics/factory.py
diff -r 59538ebc8f3b -r a1755ae00b9c 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 59538ebc8f3b -r a1755ae00b9c 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 59538ebc8f3b -r a1755ae00b9c 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 59538ebc8f3b -r a1755ae00b9c 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 59538ebc8f3b -r a1755ae00b9c 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 59538ebc8f3b -r a1755ae00b9c 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 59538ebc8f3b -r a1755ae00b9c 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