tensor(A,B) = { local(C,s1,s2); A = Mat(A); B = Mat(B); s1 = matsize(A); s2 = matsize(B); C = matrix(s1[1]*s2[1], s1[2]*s2[2]); for(i = 1, s1[1], for(j = 1, s1[2], for(k = 1, s2[1], for(l = 1, s2[2], C[i + (k-1)*s1[1],j + (l-1)*s1[2]] = A[i,j] * B[k,l] ) ) ) ); C; } matcomplex(A) = { local(C, s); s = matsize(A); C = matrix(s[1]*2, s[2]*2); for(i = 1, s[1], for(j = 1, s[2], C[i*2-1,j*2-1] = real(A[i,j]); C[i*2,j*2] = real(A[i,j]); C[i*2-1,j*2] = -imag(A[i,j]); C[i*2,j*2-1] = imag(A[i,j]); ) ); C; } matleftinverse(A) = vecextract((matsupplement(A)^-1)~, 2^(matsize(A)[2])-1)~; latticeintersect(M,N) = mathnf(M * matrixqz(matleftinverse(M) * N, -1));