# kroneckerNormalForm -- Kronecker normal form of a matrix of linear forms

## Synopsis

• Usage:
(B,P,Q) = kroneckerNormalForm A
(B,P) = kroneckerNormalForm(A,ChangeMatrix=>{true,false})
(B,Q) = kroneckerNormalForm(A,ChangeMatrix=>{false,true})
B = kroneckerNormalForm(A,ChangeMatrix=>{false,false})
(B,P,Q) = kroneckerNormalForm(A,x,y)
(B,P) = kroneckerNormalForm(A,x,y,ChangeMatrix=>{true,false})
(B,Q) = kroneckerNormalForm(A,x,y,ChangeMatrix=>{false,true})
B = kroneckerNormalForm(A,x,y,ChangeMatrix=>{false,false})
• Inputs:
• A, , a matrix of linear forms in two variables
• x,
• y,
• Optional inputs:
• ChangeMatrix => ..., default value {true, true}
• Outputs:
• B, , the Kronecker normal form of A
• P, , invertible (left) change of basis matrix
• Q, , invertible (right) change of basis matrix

## Description

This function produces a matrix of linear forms B, and invertible matrices P and Q such that B = P*A*Q and B is in Kronecker normal form. The optional parameters x and y, if given, should be complementary linear forms. They are used to fill in nonzero entries of all blocks in the Kronecker normal form for which there is a choice of which linear forms to use. If they are not given, they are assumed to be the first two variables of the ring.
 i1 : R = ZZ/101[x,y] o1 = R o1 : PolynomialRing i2 : A = matrix{{x,y,x,y},{y,x,y,x},{x,y,x,y},{y,y,y,y},{x,x,y,y}} o2 = | x y x y | | y x y x | | x y x y | | y y y y | | x x y y | 5 4 o2 : Matrix R <--- R i3 : (B,P,Q) = kroneckerNormalForm A o3 = (| 0 0 0 0 |, | -1 0 1 0 0 |, {1} | -1 1 1 1 |) | 0 x 0 0 | | 0 1 1 -1 0 | {1} | 1 0 0 -1 | | 0 y 0 0 | | 0 0 0 1 0 | {1} | 1 0 -1 0 | | 0 0 x-y 0 | | 0 -1 -1 1 1 | {1} | -1 0 0 0 | | 0 0 0 x-y | | 0 -1 0 1 0 | o3 : Sequence i4 : B - P*A*Q == 0 o4 = true i5 : kroneckerNormalForm(A, ChangeMatrix => {true,false}) o5 = (| 0 0 0 0 |, | -1 0 1 0 0 |) | 0 x 0 0 | | 0 1 1 -1 0 | | 0 y 0 0 | | 0 0 0 1 0 | | 0 0 x-y 0 | | 0 -1 -1 1 1 | | 0 0 0 x-y | | 0 -1 0 1 0 | o5 : Sequence i6 : kroneckerNormalForm(A, ChangeMatrix => {false,true}) o6 = (| 0 0 0 0 |, {1} | -1 1 1 1 |) | 0 x 0 0 | {1} | 1 0 0 -1 | | 0 y 0 0 | {1} | 1 0 -1 0 | | 0 0 x-y 0 | {1} | -1 0 0 0 | | 0 0 0 x-y | o6 : Sequence i7 : kroneckerNormalForm(A, ChangeMatrix => {false,false}) o7 = | 0 0 0 0 | | 0 x 0 0 | | 0 y 0 0 | | 0 0 x-y 0 | | 0 0 0 x-y | 5 4 o7 : Matrix R <--- R i8 : (B,P,Q) = kroneckerNormalForm(A,x+y,x-y) o8 = (| 0 0 0 0 |, | -1 0 1 0 0 |, {1} | -1 -2 1 1 |) | 0 x+y 0 0 | | 0 50 50 0 0 | {1} | 1 0 0 -1 | | 0 x-y 0 0 | | 0 50 50 1 0 | {1} | 1 0 -1 0 | | 0 0 x-y 0 | | 0 -1 -1 1 1 | {1} | -1 0 0 0 | | 0 0 0 x-y | | 0 -1 0 1 0 | o8 : Sequence i9 : B - P*A*Q == 0 o9 = true

## For the programmer

The object kroneckerNormalForm is .