Hi!
I am afraid I don't know a definitive answer to your question.
But at least I find the following a bit strange:
sage: d = M.det()
sage: d == -1
True
sage: d == 0
False
So, the inversion of M should work, I think. Let us do compute
the inverse "manually" (i.e., by applying Gaussian elimination
to the augmented matrix) to see where it fails:
sage: N = M.augment(M.parent()(1))
sage: N.swap_rows(0,3)
sage: N.add_multiple_of_row(1,0,-N[1,0])
sage: N.add_multiple_of_row(2,0,-N[2,0])
sage: N.add_multiple_of_row(2,1,-N[2,1])
sage: N.rescale_row(2,~N[2,2])
sage: N.add_multiple_of_row(3,2,-N[3,2])
sage: N.add_multiple_of_row(1,2,-N[1,2])
sage: N.add_multiple_of_row(0,2,-N[0,2])
sage: N.rescale_row(3,~N[3,3])
sage: N.add_multiple_of_row(2,3,-N[2,3])
sage: N.add_multiple_of_row(0,3,-N[0,3])
sage: N[:,:4] == 1
True
Therefore, N[:,4:] should be inverse to M. But it isn't:
sage: N[:,4:]*M == 1
False
sage: M*N[:,4:] == 1
False
I suppose that there is some p-adic rounding going on. Which would also
explain why there is a division-by-zero error (a number which is
p-adically close to zero may have been rounded to zero).
Best regards,
Simon