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.

    $RandomUnimod3=maple("
        proc()
        	U:=LinearAlgebra[RandomMatrix](3,3,generator=rand(-4..4),shape=triangular[upper]):
        	for i from 1 to 3 do
        		U[i,i]:=1:
        	end do:
        	U
        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.

    Usage:

    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