Ticket #12923: trac_12923-free_mod_cmp_fix-fh.patch

File trac_12923-free_mod_cmp_fix-fh.patch, 7.7 KB (added by hivert, 10 years ago)
  • sage/modules/free_module_element.pyx

    # HG changeset patch
    # User Florent Hivert <Florent.Hivert@univ-rouen.fr>
    # Date 1336493777 -7200
    # Node ID ac1954fbee6158b2ab860197587d7315b474092f
    # Parent  89016c4f363a2e1830954853be2fd48a16d8d1f2
    Comparison of vectors is O(n) even in the simple cases
    
    diff --git a/sage/modules/free_module_element.pyx b/sage/modules/free_module_element.pyx
    a b cdef class FreeModuleElement(element_Vec 
    14331433        """
    14341434        EXAMPLES::
    14351435       
    1436             sage: v = vector(QQ, [0,0,0,0])
     1436            sage: v = vector(SR, [0,0,0,0])
    14371437            sage: v == 0
    14381438            True
    14391439            sage: v == 1
    14401440            False
    14411441            sage: v == v
    14421442            True
    1443             sage: w = vector(QQ, [-1,0,0,0])
     1443            sage: w = vector(SR, [-1,x,pi,0])
    14441444            sage: w < v
    14451445            True
    14461446            sage: w > v
    cdef class FreeModuleElement(element_Vec 
    14521452            c = cmp(left[i], right[i])
    14531453            if c: return c
    14541454        return 0
    1455        
     1455
     1456    # see sage/structure/element.pyx
     1457    def __richcmp__(left, right, int op):
     1458        """
     1459        TESTS::
     1460
     1461            sage: F.<y> = PolynomialRing(QQ, 'y')
     1462            sage: type(vector(F, [0]*4, sparse=True))
     1463            <type 'sage.modules.free_module_element.FreeModuleElement_generic_sparse'>
     1464            sage: vector(F, [0,0,0,y]) == vector(F, [0,0,0,y])
     1465            True
     1466            sage: vector(F, [0,0,0,0]) == vector(F, [0,2,0,y])
     1467            False
     1468        """
     1469        return (<Element>left)._richcmp(right, op)
     1470
    14561471    def __getitem__(self, i):
    14571472        """
    14581473        Return `i`-th entry or slice of self.
    cdef class FreeModuleElement_generic_den 
    36333648        else:
    36343649            return self._entries
    36353650
    3636     cdef int _cmp_c_impl(left, Element right) except -2:
    3637         """
    3638         Compare two free module elements with identical parents.
    3639        
    3640         Free module elements are compared in lexicographic order on
    3641         the underlying list of coefficients. Two free module elements
    3642         are equal if their coefficients are the same. (This is true
    3643         even if one is sparse and one is dense.)
    3644         """
    3645         return cmp(left._entries, (<FreeModuleElement_generic_dense>right)._entries)
    3646 
    36473651    def __call__(self, *args, **kwargs):
    36483652        """
    36493653        Calling a free module element returns the result of calling each
    cdef class FreeModuleElement_generic_spa 
    40104014    cdef int _cmp_c_impl(left, Element right) except -2:
    40114015        """
    40124016        Compare two sparse free module elements.
    4013        
     4017
    40144018        Free module elements are compared in lexicographic order on
    40154019        the underlying list of coefficients. Two free module elements
    40164020        are equal if their coefficients are the same. (This is true
    40174021        even if one is sparse and one is dense.)
     4022
     4023        TESTS::
     4024
     4025            sage: v = vector([1,2/3,pi], sparse=True)
     4026            sage: w = vector([1,2/3,pi], sparse=True)
     4027            sage: w == v
     4028            True
    40184029        """
    40194030        a = left._entries.items()
    40204031        a.sort()
    cdef class FreeModuleElement_generic_spa 
    40224033        b.sort()
    40234034        return cmp(a,b)
    40244035
     4036    # see sage/structure/element.pyx
     4037    def __richcmp__(left, right, int op):
     4038        """
     4039        TESTS::
     4040
     4041            sage: v = vector([1,2/3,pi], sparse=True)
     4042            sage: v == v
     4043            True
     4044        """
     4045        return (<Element>left)._richcmp(right, op)
     4046
     4047    # __hash__ is not properly inherited if comparison is changed
     4048    def __hash__(self):
     4049        """
     4050        TESTS::
     4051
     4052            sage: v = vector([1,2/3,pi], sparse=True)
     4053            sage: v.set_immutable()
     4054            sage: isinstance(hash(v), int)
     4055            True
     4056        """
     4057        return FreeModuleElement.__hash__(self)
     4058
    40254059    def iteritems(self):
    40264060        """
    40274061        Return iterator over the entries of self.
  • sage/modules/vector_integer_dense.pyx

    diff --git a/sage/modules/vector_integer_dense.pyx b/sage/modules/vector_integer_dense.pyx
    a b cdef class Vector_integer_dense(free_mod 
    145145                return 1
    146146        return 0
    147147
     148    # see sage/structure/element.pyx
     149    def __richcmp__(left, right, int op):
     150        """
     151        TEST::
     152
     153            sage: w = vector(ZZ, [-1,0,0,0])
     154            sage: w == w
     155            True
     156        """
     157        return (<Element>left)._richcmp(right, op)
     158
     159    # __hash__ is not properly inherited if comparison is changed
     160    def __hash__(self):
     161        """
     162        TEST::
     163
     164            sage: w = vector(ZZ, [-1,0,0,0])
     165            sage: w.set_immutable()
     166            sage: isinstance(hash(w), int)
     167            True
     168        """
     169        return free_module_element.FreeModuleElement.__hash__(self)
     170
    148171    def __len__(self):
    149172        return self._degree
    150173
  • sage/modules/vector_mod2_dense.pyx

    diff --git a/sage/modules/vector_mod2_dense.pyx b/sage/modules/vector_mod2_dense.pyx
    a b cdef class Vector_mod2_dense(free_module 
    205205            return 0
    206206        return mzd_cmp(left._entries, (<Vector_mod2_dense>right)._entries)
    207207
     208    # see sage/structure/element.pyx
     209    def __richcmp__(left, right, int op):
     210        """
     211        TEST::
     212
     213            sage: w = vector(GF(2), [-1,0,0,0])
     214            sage: w == w
     215            True
     216        """
     217        return (<Element>left)._richcmp(right, op)
     218
     219    # __hash__ is not properly inherited if comparison is changed
     220    def __hash__(self):
     221        """
     222        TEST::
     223
     224            sage: w = vector(GF(2), [-1,0,0,0])
     225            sage: w.set_immutable()
     226            sage: isinstance(hash(w), int)
     227            True
     228        """
     229        return free_module_element.FreeModuleElement.__hash__(self)
     230
    208231    def __len__(self):
    209232        """
    210233        EXAMPLES::
  • sage/modules/vector_modn_dense.pyx

    diff --git a/sage/modules/vector_modn_dense.pyx b/sage/modules/vector_modn_dense.pyx
    a b cdef class Vector_modn_dense(free_module 
    178178            elif l > r:
    179179                return 1
    180180        return 0
     181    # see sage/structure/element.pyx
     182    def __richcmp__(left, right, int op):
     183        """
     184        TEST::
     185
     186            sage: w = vector(GF(11), [-1,0,0,0])
     187            sage: w == w
     188            True
     189        """
     190        return (<Element>left)._richcmp(right, op)
     191
     192    # __hash__ is not properly inherited if comparison is changed
     193    def __hash__(self):
     194        """
     195        TEST::
     196
     197            sage: w = vector(GF(11), [-1,0,0,0])
     198            sage: w.set_immutable()
     199            sage: isinstance(hash(w), int)
     200            True
     201        """       
     202        return free_module_element.FreeModuleElement.__hash__(self)
    181203
    182204    def __len__(self):
    183205        return self._degree
  • sage/modules/vector_rational_dense.pyx

    diff --git a/sage/modules/vector_rational_dense.pyx b/sage/modules/vector_rational_dense.pyx
    a b cdef class Vector_rational_dense(free_mo 
    150150                return 1
    151151        return 0
    152152
     153    # see sage/structure/element.pyx
     154    def __richcmp__(left, right, int op):
     155        """
     156        TEST::
     157
     158            sage: w = vector(QQ, [-1,0,0,0])
     159            sage: w == w
     160            True
     161        """
     162        return (<Element>left)._richcmp(right, op)
     163
     164    # __hash__ is not properly inherited if comparison is changed
     165    def __hash__(self):
     166        """
     167        TEST::
     168
     169            sage: w = vector(QQ, [-1,0,0,0])
     170            sage: w.set_immutable()
     171            sage: isinstance(hash(w), int)
     172            True
     173        """
     174        return free_module_element.FreeModuleElement.__hash__(self)
     175
    153176    def __len__(self):
    154177        return self._degree
    155178