
ClearVerbose();

"Modular Determinant";

X := MatrixRing(IntegerRing(), 24) ! \[
2,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,2,0,0,0,1,0,0,0,0,0,0,0,1\
,0,0,0,0,0,0,0,1,0,0,0,0,2,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,2,\
0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,-5,0,0,0,2,0,0,0,-6,0,0,0,0,0,0,0,11,\
0,0,0,0,0,0,0,0,-5,0,0,0,2,0,0,0,-6,0,0,0,0,0,0,0,11,0,0,0,0,0,0,0,0,-5,0,0,0\
,2,0,0,0,-6,0,0,0,0,0,0,0,11,0,0,0,0,0,0,0,0,-5,0,0,0,2,0,0,0,-6,0,0,0,0,0,0,\
0,11,0,0,0,0,0,0,0,0,-5,0,0,0,2,0,0,0,-6,0,0,0,0,0,0,0,11,0,0,0,0,0,0,0,0,-5,\
0,0,0,2,0,0,0,-6,0,0,0,0,0,0,0,11,0,0,0,0,0,0,0,0,-5,0,0,0,2,0,0,0,-6,0,0,0,0\
,0,0,0,11,0,0,0,0,0,0,0,0,-5,0,0,0,2,0,0,0,-6,0,0,0,0,0,0,0,11,-4,0,0,0,0,0,0\
,0,-14,0,0,0,2,0,0,0,2,0,0,0,0,0,0,0,0,-4,0,0,0,0,0,0,0,-14,0,0,0,2,0,0,0,2,0\
,0,0,0,0,0,0,0,-4,0,0,0,0,0,0,0,-14,0,0,0,2,0,0,0,2,0,0,0,0,0,0,0,0,-4,0,0,0,\
0,0,0,0,-14,0,0,0,2,0,0,0,2,0,0,0,0,0,0,0,0,-3,0,0,0,0,0,0,0,-5,0,0,0,2,0,0,0\
,7,0,0,0,0,0,0,0,0,-3,0,0,0,0,0,0,0,-5,0,0,0,2,0,0,0,7,0,0,0,0,0,0,0,0,-3,0,0\
,0,0,0,0,0,-5,0,0,0,2,0,0,0,7,0,0,0,0,0,0,0,0,-3,0,0,0,0,0,0,0,-5,0,0,0,2,0,0\
,0,7,1,0,0,0,0,0,0,0,-4,0,0,0,0,0,0,0,-7,0,0,0,2,0,0,0,0,1,0,0,0,0,0,0,0,-4,0\
,0,0,0,0,0,0,-7,0,0,0,2,0,0,0,0,1,0,0,0,0,0,0,0,-4,0,0,0,0,0,0,0,-7,0,0,0,2,0\
,0,0,0,1,0,0,0,0,0,0,0,-4,0,0,0,0,0,0,0,-7,0,0,0,2
];

assert Determinant(X) eq 61816789382270976;
assert Determinant(-X) eq 61816789382270976;

B := 81;

L := [ 0, 0, 0, 5314410, 177501294, 24584992101, 3696168966354,
667123150160223, 61816789382270976, 61816789382270976 ];

for i := 1 to 10 do
    N := B^i;
    Y := Matrix(Integers(N), X);
    d := Determinant(X) mod N;
    d;
    assert d eq L[i];
    assert Determinant(Y) eq d;
end for;

n := 100;
density := 0.1;
range := 5;
Z := IntegerRing();

for i := 1 to 10 do
    X := RandomSparseMatrix(Z, n, n, density, range);
    D := Determinant(X);
    for m in [2, 3, 5] do
        for k := 1 to 10 do
            M := m^k;
            R := IntegerRing(M);
            assert Determinant(Matrix(R, X)) eq R!D;
        end for;
    end for;
end for;
