Generating unimodular matrices (determinant = 1 or -1)

  • Maple TA Interns 2016

    Maple has a deprecated function linalg[randmatrix] which has an option to make the matrix unimodular. The function generates an upper triangular matrix with all the diagonal elements equal to 1 (so the determinant is always equal to 1), and other non-zero elements randomized.

    To create an equivalent matrix without using the deprecated function, you can generate a random upper triangular matrix using LinearAlgebra[RandomMatrix] and then manually set all diagonal elements to 1. Below is an example of a function that produces a 3x3 unimodular matrix.

        	for i from 1 to 3 do
        	end do:
        end proc:

  • administrators

    This can be generalized so the procedure takes the size, random generator and whether to produce an upper or lower triangular matrix as arguments.

    genUniModular := proc(size, {gen := rand(10), type := upper})
        local i, U:=LinearAlgebra[RandomMatrix](size,size,generator=gen,shape=triangular[type]):
        for i from 1 to size do U[i,i]:=1:end do:
        return U:
    end proc:

    The only required argument is the size of the matrix, the others are optional.


    genUniModular(4, gen = rand(-10..10), type = lower)

    to generate a 4x4 lower triangular unimodular matrix with non-diagonal elements between -10 and 10

Log in to reply