Changeset 7421:d1d1db9cb07b


Ignore:
Timestamp:
11/21/07 07:15:44 (6 years ago)
Author:
Martin Albrecht <malb@…>
Branch:
default
Message:

fix #1224 (endianess issue in FiniteField?_nt_gf2e)
untested on big endian machines

File:
1 edited

Legend:

Unmodified
Added
Removed
  • sage/rings/finite_field_ntl_gf2e.pyx

    r7366 r7421  
    118118    GF = sage.rings.finite_field.GF 
    119119 
     120cdef extern from "arpa/inet.h": 
     121    unsigned int htonl(unsigned int) 
     122 
     123cdef little_endian(): 
     124    return htonl(1) != 1 
     125 
     126cdef unsigned int switch_endianess(unsigned int i): 
     127    cdef int j 
     128    cdef unsigned int ret = 0 
     129    for j from 0 <= j < sizeof(int): 
     130        (<unsigned char*>&ret)[j] = (<unsigned char*>&i)[sizeof(int)-j-1] 
     131    return ret 
     132 
    120133cdef class FiniteField_ntl_gf2e(FiniteField): 
    121134    """ 
     
    980993            sage: int(a^2 + 1) 
    981994            5 
    982         """ 
    983         cdef unsigned long i = 0 
     995            sage: k.<a> = GF(2^70) 
     996            sage: int(a^65 + a^64 + 1) 
     997            55340232221128654849L 
     998        """ 
     999        cdef unsigned int i = 0 
    9841000        ret = int(0) 
    9851001        cdef unsigned long shift = 0 
     
    9891005            return 0 
    9901006 
    991         while GF2X_deg(r) >= sizeof(long)*8: 
    992             BytesFromGF2X(<unsigned char *>&i, r, sizeof(long)) 
     1007        if little_endian(): 
     1008            while GF2X_deg(r) >= sizeof(int)*8: 
     1009                BytesFromGF2X(<unsigned char *>&i, r, sizeof(int)) 
     1010                ret += int(i) << shift 
     1011                shift += sizeof(int)*8 
     1012                GF2X_RightShift(r,r,(sizeof(int)*8)) 
     1013            BytesFromGF2X(<unsigned char *>&i, r, sizeof(int)) 
    9931014            ret += int(i) << shift 
    994             shift += sizeof(long)*8 
    995             GF2X_RightShift(r,r,(sizeof(long)*8)) 
    996  
    997         BytesFromGF2X(<unsigned char *>&i, r, sizeof(long)) 
    998         ret += int(i) << shift 
     1015        else: 
     1016            while GF2X_deg(r) >= sizeof(int)*8: 
     1017                BytesFromGF2X(<unsigned char *>&i, r, sizeof(int)) 
     1018                ret += int(switch_endianess(i)) << shift 
     1019                shift += sizeof(int)*8 
     1020                GF2X_RightShift(r,r,(sizeof(int)*8)) 
     1021            BytesFromGF2X(<unsigned char *>&i, r, sizeof(int)) 
     1022            ret += int(switch_endianess(i)) << shift 
    9991023         
    10001024        return int(ret) 
Note: See TracChangeset for help on using the changeset viewer.