iferr(Mat([1]) + matrix(0,1),E,E)
iferr(1/matrix(2,2,i,j,Mod(0, 2)),E,E)
test(n)=
{
  until(matrank(M)==n,M=matrix(n,n,i,j,random(Mod(1,2))));
  if(M^-1*M!=matid(n),error("F2m"));
}
test(200)
test(2)

matsize(matrix(0, 0) * matrix(0, 2))

default(realprecision,38);
h=mathilbert(40);
[Q,R] = matqr(h); vecmax(abs(h-Q*R)) < 1e-37
[q,R] = matqr(h,1); vecmax(abs(mathouseholder(q,h)-R)) < 1e-37
matqr([;])
matqr([;],1)
mathouseholder(1,1)
mathouseholder(q,1)
mathouseholder(q, vectorv(40,i,1))
Mat(List())
Mat(List([1]))
Mat([[1,2,3],[2,3,4]]~)
Mat(Qfb(1,2,5))
matdiagonal(matid(2))
iferr(matdiagonal([1,2;3,4]),E,E)
matpascal(4,1/2)
A=[1,2,3;4,5,6];B=[4,6;10,12]
matinverseimage(A,B)
matinverseimage(A*Mod(1,2),B)
matinverseimage(A*Mod(1,7),B)
matinverseimage(A*Mod(1,2^64+13),B)
matinverseimage(A*Mod(1,3037000507),B)
B=[4,10]~;
matinverseimage(A*Mod(1,2),B)
matinverseimage(A*Mod(1,7),B)
matinverseimage(A*Mod(1,2^64+13),B)
matinverseimage(A*Mod(1,3037000507),B)

test(f)=
{
  print(f,":");
  print(f(A*Mod(1,2)));
  print(f(A*Mod(1,7)));
  print(f(A*Mod(1,3037000507)));
  print(f(A*Mod(1,2^64+13)));
  print(f(A*(1+O(101^3))));
}
testall()=
{
  test(matdet);
  test(matrank);
  test(matadjoint);
  test(matimage);
  test(matimagecompl);
  test(matindexrank);
  test(matker);
  test(lindep);
  test(x->matsolve(x,vectorv(#x,i,i)));
  test(x->matsolve(x,matrix(#x,#x,i,j,i+j)));
  test(x->x^(-1));
  test(x->x^2);
  test(x->A*x);
}
A = [1,2,4;2,12,7;2,9,11];
testall();
A = [;]
testall();

A=[0,1,0;1,0,1;2,0,3];
matdet(A*Mod(1,3037000507))
matdet(A*Mod(1,2^64+13))
matsolve(A*Mod(1,2^64+13),[1,2,3]~)
matsolve([1,0;0,0]*Mod(1,2),[1,1]~)
matsolve([1,0;0,0]*Mod(1,3),[1,1]~)

matker([1.,I;I,-1.])
matkerint(Mat([1,1]))

trace(matid(3))
trace([;])
iferr(trace(Mat([1,2])),E,E)
matrixqz([1/3,1/4;1/2,1/3])
matrixqz(matrix(2,2),-1)

A=[1,2,3;4,5,6;7,8,9];
test(lindep)
test(matsupplement)

default(parisize,10^6); \\ need to exercise gerepile in matker+matimage
p=2^64+13;
A=matrix(70,70,i,j, i+j);
Ap=Mod(A,p);
#matker(Ap)
#matimage(Ap)
#matker(A)
vecsum([])
vecsum([2])
vecsum(primes(4))
vecsum(1)
1~

content([])
content([;])
content(matrix(0,2))

vectorsmall(3)
v=vectorsmall(3,i,3*i^2)
content(v)
content(vectorsmall(0))
v=vectorsmall(5,i,(3-i)*i)
content(v)
vectorsmall(3,i,i^100)

m=[1,0;0,0;0,1]; b=[1,2;0,0;3,4];
liftint(Mod(m,2)^(-1))
liftint(Mod(m,3)^(-1))
liftint(Mod(m,2^64+13)^(-1))
liftint(matsolve(Mod(m,2),b))
liftint(matsolve(Mod(m,3),b))
liftint(matsolve(Mod(m,2^64+13),b))
(m*ffgen(2^2)^0)^(-1)
(m*ffgen(3^2)^0)^(-1)
(m*ffgen((2^64+13)^2)^0)^(-1)

m=[1,2,3;4,5,6];
m[1,]=[1,2]
m[1,]=[1,2,3,4]
m[1,]=[1,2,3]~
m[2,]=[1,2,3]
m
m[1,]*=2
m

test(t) =
{
   N = [1, 2; -1, -2]*t^0;
   print(matinverseimage(N, N^0));
}
test(Mod(1, 3));
test(Mod(1, nextprime(2^64)));
test(ffgen(2^17));
test(ffgen(2017^3));
test(ffgen(nextprime(2^64)^3));
