install("KzMs_simplify","G");

install("zMs_to_ZM","GL");
check_complex(C) =
{
  my(dims,diffs);
  [dims,diffs] = C;
  print("checking complex:");
  print(dims);
  for(i=1,#diffs,
    diffs[i] = zMs_to_ZM(diffs[i],dims[i]);
    printp(diffs[i]);
    if(i>1,
      if(diffs[i-1]*diffs[i], printp(diffs[i-1]*diffs[i]); error("D^2!=0, i=",i));
    );
  );
};


dims = Vecsmall([2,2]);
{diffs = [
  [
    [Vecsmall([1,2]),Vecsmall([1,1])]~,
    [Vecsmall([2]),Vecsmall([1])]~
  ]
]};
C = [dims,diffs];
check_complex(C);
C = KzMs_simplify(C)
check_complex(C);
C = KzMs_simplify(C)
check_complex(C);


print("\n");
dims = Vecsmall([1,3,3,1]);
{diffs = [
  [
    [Vecsmall([1]),Vecsmall([-1])]~,
    [Vecsmall([1]),Vecsmall([1])]~,
    [Vecsmall([1]),Vecsmall([1])]~
  ],
  [
    [Vecsmall([1,2]),Vecsmall([1,1])]~,
    [Vecsmall([2,3]),Vecsmall([1,-1])]~,
    [Vecsmall([1,2]),Vecsmall([1,1])]~
  ],
  [
    [Vecsmall([1,3]),Vecsmall([1,-1])]~
  ]
]};
C = [dims,diffs];
check_complex(C);
C = KzMs_simplify(C)
check_complex(C);


print("\nLampret Remarks 1.4 (i)");
dims = Vecsmall([2,3]);
{diffs = [[
  [Vecsmall([1,2]),Vecsmall([1,1])]~,
  [Vecsmall([1,2]),Vecsmall([1,-1])]~,
  [Vecsmall([]),Vecsmall([])]~
]]};
C = [dims,diffs];
check_complex(C);
C = KzMs_simplify(C)
check_complex(C);


print("\nLampret Remarks 2.6 (a)");
dims = Vecsmall([2,2]);
{diffs = [[
  [Vecsmall([1,2]),Vecsmall([3,2])]~,
  [Vecsmall([1,2]),Vecsmall([4,3])]~
]]};
C = [dims,diffs];
check_complex(C);
C = KzMs_simplify(C)
check_complex(C);


print("\nLampret Remarks 2.6 (b)");
dims = Vecsmall([6,6]);
{diffs = [[
  [Vecsmall([5,6]),Vecsmall([1,1])]~,
  [Vecsmall([4,5]),Vecsmall([1,1])]~,
  [Vecsmall([3,4]),Vecsmall([1,1])]~,
  [Vecsmall([2,3]),Vecsmall([1,1])]~,
  [Vecsmall([1,2]),Vecsmall([1,1])]~,
  [Vecsmall([1]),Vecsmall([1])]~
]]};
C = [dims,diffs];
check_complex(C);
C = KzMs_simplify(C)
check_complex(C);


print("\nLampret Remarks 2.6 (b) reversed");
diffs = [vector(6,i,diffs[1][7-i])];
C = [dims,diffs];
check_complex(C);
C = KzMs_simplify(C)
check_complex(C);


print("\nLampret Remarks 2.6 (c)");
dims = Vecsmall([2,2]);
{diffs = [[
  [Vecsmall([2]),Vecsmall([1])]~,
  [Vecsmall([1,2]),Vecsmall([1,1])]~
]]};
C = [dims,diffs];
check_complex(C);
C = KzMs_simplify(C)
check_complex(C);


print("\nLampret Remarks 2.6 (c) reversed");
dims = Vecsmall([2,2]);
{diffs = [[
  [Vecsmall([1]),Vecsmall([1])]~,
  [Vecsmall([1,2]),Vecsmall([1,1])]~
]]};
C = [dims,diffs];
check_complex(C);
C = KzMs_simplify(C)
check_complex(C);


print("\nLampret Example 3.1 (a)");
dims = Vecsmall([4,3]);
{diffs = [[
  [Vecsmall([1,2,3,4]),Vecsmall([1,1,1,1])]~,
  [Vecsmall([4]),Vecsmall([1])]~,
  [Vecsmall([4]),Vecsmall([1])]~
]]};
C = [dims,diffs];
check_complex(C);
C = KzMs_simplify(C)
check_complex(C);


print("\nLampret Example 3.1 (b)");
dims = Vecsmall([4,3]);
{diffs = [[
  [Vecsmall([1,2,3,4]),Vecsmall([1,1,1,1])]~,
  [Vecsmall([1]),Vecsmall([1])]~,
  [Vecsmall([1]),Vecsmall([1])]~
]]};
C = [dims,diffs];
check_complex(C);
C = KzMs_simplify(C)
check_complex(C);


print("\nLampret Example 3.1 (c)");
dims = Vecsmall([4,3]);
{diffs = [[
  [Vecsmall([1]),Vecsmall([1])]~,
  [Vecsmall([1]),Vecsmall([1])]~,
  [Vecsmall([1,2,3,4]),Vecsmall([1,1,1,1])]~
]]};
C = [dims,diffs];
check_complex(C);
C = KzMs_simplify(C)
check_complex(C);


print("\nLampret Example 1.3 (trefoil knot)");
dims = Vecsmall([4,6,12,8]);
{diffs = [
  [
    [Vecsmall([2,3]),Vecsmall([1,1])]~,
    [Vecsmall([4]),Vecsmall([1])]~,
    [Vecsmall([2,3]),Vecsmall([-1,-1])]~,
    [Vecsmall([4]),Vecsmall([-1])]~,
    [Vecsmall([2,3]),Vecsmall([1,1])]~,
    [Vecsmall([4]),Vecsmall([1])]~
  ],
  [
    [Vecsmall([1,3]),Vecsmall([-1,-1])]~,
    [Vecsmall([2,4]),Vecsmall([-1,-1])]~,
    [Vecsmall([2,4]),Vecsmall([-1,-1])]~,
    [Vecsmall([]),Vecsmall([])]~,
    [Vecsmall([1,5]),Vecsmall([1,-1])]~,
    [Vecsmall([2,6]),Vecsmall([1,-1])]~,
    [Vecsmall([2,6]),Vecsmall([1,-1])]~,
    [Vecsmall([]),Vecsmall([])]~,
    [Vecsmall([3,5]),Vecsmall([1,1])]~,
    [Vecsmall([4,6]),Vecsmall([1,1])]~,
    [Vecsmall([4,6]),Vecsmall([1,1])]~,
    [Vecsmall([]),Vecsmall([])]~
  ],
  [
    [Vecsmall([1,5,9]),Vecsmall([1,1,1])]~,
    [Vecsmall([3,6,10]),Vecsmall([1,1,1])]~,
    [Vecsmall([2,7,10]),Vecsmall([1,1,1])]~,
    [Vecsmall([4,8]),Vecsmall([1,1])]~,
    [Vecsmall([3,7,11]),Vecsmall([1,1,1])]~,
    [Vecsmall([8,12]),Vecsmall([1,1])]~,
    [Vecsmall([4,12]),Vecsmall([1,1])]~,
    [Vecsmall([]),Vecsmall([])]~
  ]
]};
C = [dims,diffs];
check_complex(C);
C = KzMs_simplify(C)
check_complex(C);


print("\nLampret Examples 2.5 RP1 first ordering");
dims = Vecsmall([6,15,10]);
{diffs = [
  [
    [Vecsmall([1,2]),Vecsmall([-1,1])]~,
    [Vecsmall([1,3]),Vecsmall([-1,1])]~,
    [Vecsmall([1,4]),Vecsmall([-1,1])]~,
    [Vecsmall([1,5]),Vecsmall([-1,1])]~,
    [Vecsmall([1,6]),Vecsmall([-1,1])]~,
    [Vecsmall([2,3]),Vecsmall([-1,1])]~,
    [Vecsmall([2,4]),Vecsmall([-1,1])]~,
    [Vecsmall([2,5]),Vecsmall([-1,1])]~,
    [Vecsmall([2,6]),Vecsmall([-1,1])]~,
    [Vecsmall([3,4]),Vecsmall([-1,1])]~,
    [Vecsmall([3,5]),Vecsmall([-1,1])]~,
    [Vecsmall([3,6]),Vecsmall([-1,1])]~,
    [Vecsmall([4,5]),Vecsmall([-1,1])]~,
    [Vecsmall([4,6]),Vecsmall([-1,1])]~,
    [Vecsmall([5,6]),Vecsmall([-1,1])]~
  ],
  [
    [Vecsmall([1,3,7]),Vecsmall([1,-1,1])]~,
    [Vecsmall([1,4,8]),Vecsmall([1,-1,1])]~,
    [Vecsmall([2,3,10]),Vecsmall([1,-1,1])]~,
    [Vecsmall([2,5,12]),Vecsmall([1,-1,1])]~,
    [Vecsmall([4,5,15]),Vecsmall([1,-1,1])]~,
    [Vecsmall([6,8,11]),Vecsmall([1,-1,1])]~,
    [Vecsmall([6,9,12]),Vecsmall([1,-1,1])]~,
    [Vecsmall([7,9,14]),Vecsmall([1,-1,1])]~,
    [Vecsmall([10,11,13]),Vecsmall([1,-1,1])]~,
    [Vecsmall([13,14,15]),Vecsmall([1,-1,1])]~
  ]
]};
C = [dims,diffs];
check_complex(C);
C = KzMs_simplify(C)
check_complex(C);
C = KzMs_simplify(C)
check_complex(C);


print("\nLampret Examples 2.5 RP1 second ordering");
dims = Vecsmall([6,15,10]);
{diffs = [
  [
    [Vecsmall([1,2]),Vecsmall([-1,1])]~,
    [Vecsmall([1,3]),Vecsmall([-1,1])]~,
    [Vecsmall([2,3]),Vecsmall([-1,1])]~,
    [Vecsmall([1,4]),Vecsmall([-1,1])]~,
    [Vecsmall([3,4]),Vecsmall([1,-1])]~,
    [Vecsmall([1,5]),Vecsmall([-1,1])]~,
    [Vecsmall([2,5]),Vecsmall([-1,1])]~,
    [Vecsmall([2,4]),Vecsmall([-1,1])]~,
    [Vecsmall([4,5]),Vecsmall([-1,1])]~,
    [Vecsmall([3,5]),Vecsmall([-1,1])]~,
    [Vecsmall([1,6]),Vecsmall([-1,1])]~,
    [Vecsmall([4,6]),Vecsmall([-1,1])]~,
    [Vecsmall([2,6]),Vecsmall([-1,1])]~,
    [Vecsmall([3,6]),Vecsmall([-1,1])]~,
    [Vecsmall([5,6]),Vecsmall([-1,1])]~
  ],
  [
    [Vecsmall([1,2,3]),Vecsmall([1,-1,1])]~,
    [Vecsmall([2,4,5]),Vecsmall([-1,1,1])]~,
    [Vecsmall([1,6,7]),Vecsmall([1,-1,1])]~,
    [Vecsmall([7,8,9]),Vecsmall([-1,1,1])]~,
    [Vecsmall([5,9,10]),Vecsmall([1,-1,1])]~,
    [Vecsmall([4,11,12]),Vecsmall([1,-1,1])]~,
    [Vecsmall([8,12,13]),Vecsmall([1,1,-1])]~,
    [Vecsmall([3,13,14]),Vecsmall([1,-1,1])]~,
    [Vecsmall([6,11,15]),Vecsmall([1,-1,1])]~,
    [Vecsmall([10,14,15]),Vecsmall([1,-1,1])]~
  ]
]};
C = [dims,diffs];
check_complex(C);
C = KzMs_simplify(C)
check_complex(C);

\\*/
