Skip to content

Commit 2a9de23

Browse files
author
Release Manager
committed
Trac #28042: broken arithmetic over GF(p)
The dot product for finite fields using `IntegerMod_int64` is broken. An example is provided by {{{ sage: p=193379 sage: K=GF(p) sage: a=K(1) sage: b=K(191495) sage: c=K(109320) sage: d=K(167667) sage: e=103937 sage: a*c+b*d-e 102041 sage: vector([a,b])*vector([c,d])-e -91339 sage: -91339+e 12598 sage: vector([a,b])*vector([c,d]) 12599 }}} as reported [https://groups.google.com/d/msg/sage-devel/gRlCTs- z_OQ/7W787JYUDQAJ here] URL: https://trac.sagemath.org/28042 Reported by: dimpase Ticket author(s): Vincent Delecroix Reviewer(s): Dima Pasechnik, Clément Pernet
2 parents 4d1cf50 + ff3f441 commit 2a9de23

File tree

1 file changed

+34
-8
lines changed

1 file changed

+34
-8
lines changed

src/sage/modules/vector_modn_dense.pyx

Lines changed: 34 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,24 @@ TESTS::
7979
sage: isinstance(hash(w), int)
8080
True
8181
82+
Test that :trac:`28042` is fixed::
83+
84+
sage: p = 193379
85+
sage: K = GF(p)
86+
sage: a = K(1)
87+
sage: b = K(191495)
88+
sage: c = K(109320)
89+
sage: d = K(167667)
90+
sage: e = 103937
91+
sage: a*c+b*d-e
92+
102041
93+
sage: vector([a,b]) * vector([c,d]) - e
94+
102041
95+
sage: type(vector([a,b]) * vector([c,d])) # py3
96+
<class 'sage.rings.finite_rings.integer_mod.IntegerMod_int64'>
97+
sage: type(vector([a,b]) * vector([c,d])) # py2
98+
<type 'sage.rings.finite_rings.integer_mod.IntegerMod_int64'>
99+
82100
AUTHOR:
83101
84102
- William Stein (2007)
@@ -279,17 +297,25 @@ cdef class Vector_modn_dense(free_module_element.FreeModuleElement):
279297
return z
280298

281299
cpdef _dot_product_(self, Vector right):
282-
cdef Py_ssize_t i
300+
cdef size_t i
283301
cdef IntegerMod_int n
302+
cdef IntegerMod_int64 m
284303
cdef Vector_modn_dense r = right
285-
n = IntegerMod_int.__new__(IntegerMod_int)
286-
IntegerMod_abstract.__init__(n, self.base_ring())
287-
n.ivalue = 0
288304

289-
for i from 0 <= i < self._degree:
290-
n.ivalue = (n.ivalue + self._entries[i] * r._entries[i]) % self._p
291-
292-
return n
305+
if use_32bit_type(self._p):
306+
n = IntegerMod_int.__new__(IntegerMod_int)
307+
IntegerMod_abstract.__init__(n, self.base_ring())
308+
n.ivalue = 0
309+
for i in range(self._degree):
310+
n.ivalue = (n.ivalue + self._entries[i] * r._entries[i]) % self._p
311+
return n
312+
else:
313+
m = IntegerMod_int64.__new__(IntegerMod_int64)
314+
IntegerMod_abstract.__init__(m, self.base_ring())
315+
m.ivalue = 0
316+
for i in range(self._degree):
317+
m.ivalue = (m.ivalue + self._entries[i] * r._entries[i]) % self._p
318+
return m
293319

294320
cpdef _pairwise_product_(self, Vector right):
295321
"""

0 commit comments

Comments
 (0)