Changeset 1955:64d44aa1f88d
- Timestamp:
- 11/25/06 11:00:18 (6 years ago)
- Branch:
- default
- Location:
- sage/rings
- Files:
-
- 2 edited
-
finite_field.py (modified) (3 diffs)
-
finite_field_givaro.pyx (modified) (23 diffs)
Legend:
- Unmodified
- Added
- Removed
-
sage/rings/finite_field.py
r1709 r1955 63 63 64 64 #_objsFiniteField = {} 65 def FiniteField(order, name='a', modulus=None ):65 def FiniteField(order, name='a', modulus=None, cache=False): 66 66 """ 67 67 Return a finite field of given order with generator labeled by the given name. … … 72 72 modulus -- defining polynomial for field, i.e., generator of the field will 73 73 be a root of this polynomial. 74 cache -- cache all elements to avoid creation time (default:False) 74 75 75 76 EXAMPLES: … … 94 95 else: 95 96 if order < 2**16: 96 R = FiniteField_givaro(order, name, modulus )97 R = FiniteField_givaro(order, name, modulus, cache=cache) 97 98 else: 98 99 R = FiniteField_ext_pari(order, name, modulus) -
sage/rings/finite_field_givaro.pyx
r1954 r1955 48 48 from sage.libs.pari.gen import gen 49 49 50 cdef extern from "stdlib.h": 51 ctypedef int size_t 52 void free(void *ptr) 53 void *malloc(size_t size) 54 void *realloc(void *ptr, size_t size) 55 size_t strlen(char *s) 56 char *strcpy(char *dest, char *src) 57 50 58 ## cdef extern from 'interrupt.h': 51 59 ## int _sig_on, _sig_off, _sig_check … … 56 64 57 65 cdef class FiniteField_givaro(FiniteField) #forward declaration 66 67 58 68 59 69 cdef extern from "Python.h": … … 135 145 cdef int repr 136 146 137 def __init__(FiniteField_givaro self, q, name="a", modulus=None, repr="poly" ):147 def __init__(FiniteField_givaro self, q, name="a", modulus=None, repr="poly", cache=False): 138 148 """ 139 149 Finite Field. These are implemented using Zech logs and the … … 154 164 'int': repr is element.int_repr() 155 165 'poly': repr is element.poly_repr() 166 cache -- if True a cache of all elements of this field is 167 created. Thus, arithmetic does not create new 168 elements which speeds calculations up. Also, if 169 many elements are needed during a calculation 170 this cache reduces the memory requirement as at 171 most self.order() elements are created. (default: False) 156 172 157 173 OUTPUT: … … 236 252 self.objectptr = gfq_factorypk(p,k) 237 253 _sig_off 238 self._array = self.gen_array() 254 if cache: 255 self._array = self.gen_array() 239 256 return 240 257 … … 250 267 self.objectptr = gfq_factorypkp(p, k,cPoly) 251 268 _sig_off 252 self._array = self.gen_array() 269 if cache: 270 self._array = self.gen_array() 253 271 return 254 272 … … 256 274 257 275 cdef gen_array(FiniteField_givaro self): 276 """ 277 Generates an array/list/tuple containing all elements of self indexed by their 278 power with respect to the internal generator. 279 """ 258 280 cdef int i 281 259 282 array = list() 260 for i from 0 <= i < self.order(): 283 284 for i from 0 <= i < self.order_c(): 261 285 array.append( make_FiniteField_givaroElement(self,i) ) 262 286 return tuple(array) … … 265 289 """ 266 290 """ 267 268 291 delete(self.objectptr) 269 292 … … 288 311 return self.cardinality() 289 312 313 cdef int order_c(FiniteField_givaro self): 314 """ 315 C equivalent of self.order() 316 """ 317 return self.objectptr.cardinality() 318 290 319 def __len__(self): 291 320 """ … … 569 598 570 599 if self.degree() == 1: 571 return self(primitive_root(self.order ()))600 return self(primitive_root(self.order_c())) 572 601 else: 573 602 return make_FiniteField_givaroElement(self,self.objectptr.sage_generator()) … … 625 654 if p<0: 626 655 raise ArithmeticError, "Cannot serve negative exponent %d"%p 627 elif p>=self.order ():656 elif p>=self.order_c(): 628 657 raise IndexError, "p=%d must be < self.order()"%p 629 658 _sig_on … … 711 740 from sage.rings.finite_field import FiniteField_ext_pari 712 741 from sage.rings.finite_field import FiniteField_prime_modn 713 return FiniteField_ext_pari(self. cardinality(),self.variable_name(),self.polynomial())742 return FiniteField_ext_pari(self.order_c(),self.variable_name(),self.polynomial()) 714 743 715 744 def vector_space(FiniteField_givaroElement self): … … 894 923 return make_FiniteField_givaroElement(self,r) 895 924 896 def _add(FiniteField_givaro self, int r, int l):897 """898 This is the fastest way to add two Givaro finite field899 elements using SAGE. Given r and l this method calculates s900 such that self.gen()^s = self.gen()^r + self.gen()^l.901 902 INPUT:903 r -- int representing an exponent of self.gen()904 l -- int representing an exponent of self.gen()905 906 EXAMPLE:907 sage: k.<a> = GF(2**8)908 sage: k._add(int(10),int(20))909 31910 sage: (a^10+a^20).log_repr()911 '31'912 """913 cdef int res914 return self.objectptr.add(res, r , l )915 916 def _mul(FiniteField_givaro self, int r, int l):917 """918 This is the fastest way to multiply two Givaro finite field919 elements using SAGE. Given r and l this method calculates s920 such that self.gen()^s = self.gen()^r * self.gen()^l.921 922 INPUT:923 r -- int representing an exponent of self.gen()924 l -- int representing an exponent of self.gen()925 926 EXAMPLE:927 sage: k.<a> = GF(2**8)928 sage: k._mul(int(10),int(20))929 30930 sage: (a^10*a^20).log_repr()931 '30'932 933 """934 cdef int res935 return self.objectptr.mul(res, r , l )936 937 def _div(FiniteField_givaro self, int r, int l):938 """939 This is the fastest way to divide two Givaro finite field940 elements using SAGE. Given r and l this method calculates s941 such that self.gen()^s = self.gen()^r / self.gen()^l.942 943 INPUT:944 r -- int representing an exponent of self.gen()945 l -- int representing an exponent of self.gen()946 947 EXAMPLE:948 sage: k.<a> = GF(2**8)949 sage: k._div(int(10),int(20))950 245951 sage: (a^10/a^20).log_repr()952 '245'953 954 """955 cdef int res956 return self.objectptr.div(res, r , l )957 958 def _sub(FiniteField_givaro self, int r, int l):959 """960 This is the fastest way to subtract two Givaro finite field961 elements using SAGE. Given r and l this method calculates s962 such that self.gen()^s = self.gen()^r + self.gen()^l.963 964 INPUT:965 r -- int representing an exponent of self.gen()966 l -- int representing an exponent of self.gen()967 968 EXAMPLE:969 sage: k.<a> = GF(2**8)970 sage: k._sub(int(10),int(20))971 31972 sage: (a^10-a^20).log_repr()973 '31'974 """975 cdef int res976 return self.objectptr.sub(res, r , l )925 ## def _add(FiniteField_givaro self, int r, int l): 926 ## """ 927 ## This is the fastest way to add two Givaro finite field 928 ## elements using SAGE. Given r and l this method calculates s 929 ## such that self.gen()^s = self.gen()^r + self.gen()^l. 930 931 ## INPUT: 932 ## r -- int representing an exponent of self.gen() 933 ## l -- int representing an exponent of self.gen() 934 935 ## EXAMPLE: 936 ## sage: k.<a> = GF(2**8) 937 ## sage: k._add(int(10),int(20)) 938 ## 31 939 ## sage: (a^10+a^20).log_repr() 940 ## '31' 941 ## """ 942 ## cdef int res 943 ## return self.objectptr.add(res, r , l ) 944 945 ## def _mul(FiniteField_givaro self, int r, int l): 946 ## """ 947 ## This is the fastest way to multiply two Givaro finite field 948 ## elements using SAGE. Given r and l this method calculates s 949 ## such that self.gen()^s = self.gen()^r * self.gen()^l. 950 951 ## INPUT: 952 ## r -- int representing an exponent of self.gen() 953 ## l -- int representing an exponent of self.gen() 954 955 ## EXAMPLE: 956 ## sage: k.<a> = GF(2**8) 957 ## sage: k._mul(int(10),int(20)) 958 ## 30 959 ## sage: (a^10*a^20).log_repr() 960 ## '30' 961 962 ## """ 963 ## cdef int res 964 ## return self.objectptr.mul(res, r , l ) 965 966 ## def _div(FiniteField_givaro self, int r, int l): 967 ## """ 968 ## This is the fastest way to divide two Givaro finite field 969 ## elements using SAGE. Given r and l this method calculates s 970 ## such that self.gen()^s = self.gen()^r / self.gen()^l. 971 972 ## INPUT: 973 ## r -- int representing an exponent of self.gen() 974 ## l -- int representing an exponent of self.gen() 975 976 ## EXAMPLE: 977 ## sage: k.<a> = GF(2**8) 978 ## sage: k._div(int(10),int(20)) 979 ## 245 980 ## sage: (a^10/a^20).log_repr() 981 ## '245' 982 983 ## """ 984 ## cdef int res 985 ## return self.objectptr.div(res, r , l ) 986 987 ## def _sub(FiniteField_givaro self, int r, int l): 988 ## """ 989 ## This is the fastest way to subtract two Givaro finite field 990 ## elements using SAGE. Given r and l this method calculates s 991 ## such that self.gen()^s = self.gen()^r + self.gen()^l. 992 993 ## INPUT: 994 ## r -- int representing an exponent of self.gen() 995 ## l -- int representing an exponent of self.gen() 996 997 ## EXAMPLE: 998 ## sage: k.<a> = GF(2**8) 999 ## sage: k._sub(int(10),int(20)) 1000 ## 31 1001 ## sage: (a^10-a^20).log_repr() 1002 ## '31' 1003 ## """ 1004 ## cdef int res 1005 ## return self.objectptr.sub(res, r , l ) 977 1006 978 1007 def __reduce__(FiniteField_givaro self): … … 987 1016 988 1017 """ 1018 if self._array is None: 1019 cache = 0 1020 else: 1021 cache = 1 1022 989 1023 return sage.rings.finite_field_givaro.unpickle_FiniteField_givaro, \ 990 (self.order (),self.variable_name(),map(int,list(self.modulus())),int(self.repr))991 992 def unpickle_FiniteField_givaro(order,variable_name,modulus,rep ):1024 (self.order_c(),self.variable_name(),map(int,list(self.modulus())),int(self.repr),cache) 1025 1026 def unpickle_FiniteField_givaro(order,variable_name,modulus,rep,cache): 993 1027 from sage.rings.arith import is_prime 994 1028 … … 1001 1035 1002 1036 if not is_prime(order): 1003 return FiniteField_givaro(order,variable_name,modulus,rep )1037 return FiniteField_givaro(order,variable_name,modulus,rep,cache=cache) 1004 1038 else: 1005 return FiniteField_givaro(order )1039 return FiniteField_givaro(order,cache=cache) 1006 1040 1007 1041 cdef class FiniteField_givaro_iterator: … … 1101 1135 """ 1102 1136 #copied from finite_field_element.py 1137 cdef FiniteField_givaro K 1103 1138 K = (<FiniteField_givaro>self._parent) 1104 1139 if K.characteristic() == 2: 1105 1140 return True 1106 n = K.order () - 11141 n = K.order_c() - 1 1107 1142 a = self**(n / 2) 1108 1143 return bool(a == 1) … … 1230 1265 field = (<FiniteField_givaro>self._parent).objectptr 1231 1266 1232 exp = exp % ((<FiniteField_givaro>self._parent).order()-1)1267 exp = exp % int(field.cardinality()-1) 1233 1268 1234 1269 if field.isOne(self.object): … … 1248 1283 1249 1284 return make_FiniteField_givaroElement((<FiniteField_givaro>self._parent),power) 1250 1251 ## def add(FiniteField_givaroElement self,FiniteField_givaroElement other):1252 ## """1253 ## """1254 ## cdef int r1255 ## r = (<FiniteField_givaro>self._parent).objectptr.add(r, self.object , other.object )1256 ## return make_FiniteField_givaroElement((<FiniteField_givaro>self._parent),r)1257 1258 ## def mul(FiniteField_givaroElement self,FiniteField_givaroElement other):1259 ## """1260 ## """1261 ## cdef int r1262 ## r = (<FiniteField_givaro>self._parent).objectptr.mul(r, self.object , other.object )1263 ## return make_FiniteField_givaroElement((<FiniteField_givaro>self._parent),r)1264 1265 1266 ## def div(FiniteField_givaroElement self,FiniteField_givaroElement other):1267 ## cdef int r1268 ## r = (<FiniteField_givaro>self._parent).objectptr.div(r, self.object , other.object )1269 ## return make_FiniteField_givaroElement((<FiniteField_givaro>self._parent),r)1270 1271 ## def sub(FiniteField_givaroElement self,FiniteField_givaroElement other):1272 ## cdef int r1273 ## r = (<FiniteField_givaro>self._parent).objectptr.sub(r, self.object , other.object )1274 ## return make_FiniteField_givaroElement((<FiniteField_givaro>self._parent),r)1275 1285 1276 1286 def __cmp__(self, other): … … 1347 1357 def log(FiniteField_givaroElement self, a): 1348 1358 #copied from finite_field_element.py 1349 q = (self.parent()).order () - 11359 q = (self.parent()).order_c() - 1 1350 1360 return sage.rings.arith.discrete_log_generic(self, a, q) 1351 1361 … … 1441 1451 if self.is_zero(): 1442 1452 return ArithmeticError, "Multiplicative order of 0 not defined." 1443 n = (parent_object(self)).order () - 11453 n = (parent_object(self)).order_c() - 1 1444 1454 order = 1 1445 1455 for p, e in sage.rings.arith.factor(n): … … 1465 1475 """ 1466 1476 #copied from finite_field_element.py 1477 cdef FiniteField_givaro F 1467 1478 F = parent_object(self) 1468 if F.order () > 65536:1469 raise TypeError, "order (=%s) must be at most 65536."%F.order ()1479 if F.order_c() > 65536: 1480 raise TypeError, "order (=%s) must be at most 65536."%F.order_c() 1470 1481 if self == 0: 1471 return '0*Z(%s)'%F.order ()1482 return '0*Z(%s)'%F.order_c() 1472 1483 assert F.degree() > 1 1473 1484 g = F.multiplicative_generator() 1474 1485 n = g.log(self) 1475 return 'Z(%s)^%s'%(F.order (), n)1486 return 'Z(%s)^%s'%(F.order_c(), n) 1476 1487 1477 1488 def charpoly(FiniteField_givaroElement self): … … 1562 1573 return parent._array[x] 1563 1574 1564 cdef gap_to_givaro(x, F ):1575 cdef gap_to_givaro(x, FiniteField_givaro F): 1565 1576 """ 1566 1577 INPUT: … … 1599 1610 i2 = s.index(")") 1600 1611 q = eval(s[i1+1:i2].replace('^','**')) 1601 if q == F.order ():1612 if q == F.order_c(): 1602 1613 K = F 1603 1614 else:
Note: See TracChangeset
for help on using the changeset viewer.
