Skip to content

Commit a56e004

Browse files
Merge pull request #352 from oscarbenjamin/pr_lll_empty
fix(fmpz_mat): don't segfault on empty matrices
2 parents 979e7d9 + 3335597 commit a56e004

File tree

2 files changed

+24
-1
lines changed

2 files changed

+24
-1
lines changed

src/flint/test/test_all.py

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -642,13 +642,27 @@ def set_bad(i,j):
642642
M3n = M([[3,0,0],[-6,0,0],[3,0,0]])
643643
assert M3.nullspace() == (M3n, 1)
644644
assert M3 * M3.nullspace()[0] == M(3,3,[0]*9)
645-
# XXX: lll core dumps on a singular matrix
646645
M4 = M([[1,2,3],[4,5,6],[7,8,10]])
647646
L4 = M([[0,0,1],[-1,1,0],[2,1,0]])
648647
T4 = M([[1,-2,1],[0,5,-3],[-2,1,0]])
649648
assert L4 == T4 * M4
650649
assert M4.lll() == L4
651650
assert M4.lll(transform=True) == (L4, T4)
651+
M5 = M([[1,2,3],[4,5,6],[7,8,9]])
652+
L5 = M([[0,0,0],[2,1,0],[-1,1,3]])
653+
T5 = M([[1,-2,1],[-2,1,0],[3,-1,0]])
654+
assert L5 == T5 * M5
655+
assert M5.lll() == L5
656+
assert M5.lll(transform=True) == (L5, T5)
657+
Mz = M(0, 3, [])
658+
assert Mz.lll() == M(0, 3, [])
659+
assert Mz.lll(transform=True) == (M(0, 3, []), M(0, 0, []))
660+
Mr = M(3, 0, [])
661+
assert Mr.lll() == M(3, 0, [])
662+
assert Mr.lll(transform=True) == (M(3, 0, []), M([[1,0,0],[0,1,0],[0,0,1]]))
663+
Mzz = M(0, 0, [])
664+
assert Mzz.lll() == M(0, 0, [])
665+
assert Mzz.lll(transform=True) == (M(0, 0, []), M(0, 0, []))
652666
# XXX: rep="gram" consumes all memory in the system and core dumps
653667
#for rep in "zbasis", "gram":
654668
rep = "zbasis"

src/flint/types/fmpz_mat.pyx

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -842,6 +842,15 @@ cdef class fmpz_mat(flint_mat):
842842
raise ValueError("gram must be 'approx' or 'exact'")
843843
fmpz_lll_context_init(ctx, delta, eta, rt, gt)
844844
u = fmpz_mat(self)
845+
846+
# FLINT would segfault given a matrix with zero rows
847+
if u.nrows() == 0:
848+
if transform:
849+
v = fmpz_mat(0, 0, [])
850+
return u, v
851+
else:
852+
return u
853+
845854
if transform:
846855
v = fmpz_mat(self.nrows(), self.nrows())
847856
for 0 <= i < self.nrows():

0 commit comments

Comments
 (0)