Testing latest pari + WASM + node.js... and it works?! Wow.
License: GPL3
ubuntu2004
randdistinct(n) = { my(i=0,j=0); while(i==j, i = random([1,n]); j = random([1,n]); ); [i,j]; } randSLn(n,nb,B,A = matid(n)) = { my(i,j,a,tmp); for(count=1,nb, [i,j] = randdistinct(n); a = random([-B,B]); A[,i] = A[,i] + a*A[,j]; [i,j] = randdistinct(n); ); A; } rmzerocol(A) = { my(L=[]); for(i=1,#A, if(A[,i]!=0, L = concat(L,[A[,i]])) ); matconcat(L); } print("bb hermite Z/NZ"); N=1800; nb = 500; setrand(1); print("imagemod"); {for(m=1,4, for(n=1,4, for(count=1,nb, A = matrix(m,n,i,j,random([0,N-1])); h1 = mathnfmodid(A,N); h2 = matimagemod(A,N,&U); if(rmzerocol(h1%N)!=h2, print("fail: ", A)); if(A*(U*Mod(1,N))!=h2, print("fail2: ", A, "\n", h2, "\n", U)); ); ); );} {M = matdiagonal([900,4,9,25,10]);M[1,]=[900,2*65,9*13,25*11,5*17];} H = matimagemod(M,N) nb = 250; {for(count=1,nb, A = randSLn(5,50,N,M); if(H != matimagemod(A,N), print("fail3: ", A); ); );} {M = [11,28,-1; 2,1,89; 5,78,15; 0,8,3; 0,0,3 ];} H = matimagemod(M,N) {for(count=1,300, A = randSLn(3,30,N,M); if(H != matimagemod(A,N), print("fail4: ", A); ); );} print("kermod"); d=1800; nb=250; setrand(1); {for(m=1,5, for(n=1,5, for(count=1,nb, M = matrix(m,n,i,j,random([0,d-1])); K = matkermod(M,d,&im); if((M*K)%d!=0, print("fail:", M)); K2 = matsolvemod(M,d,0,1)[2]; K3 = matimagemod(K2,d); if(K!=K3, print("fail2:", M, K, K3)); im2 = matimagemod(M,d); if(im!=im2, print("fail3:", M, im, im2)); ); ); );} d = 6; matkermod(Mat([0]),d) matkermod(Mat([1]),d) matkermod(Mat([2]),d) matkermod([1;0],d) matkermod([2;0],d) matkermod([0;0],d) matkermod([3;0],d) matkermod([0;1],d) matkermod([0;2],d) matkermod([1;3],d) matkermod([2;3],d) matkermod([2;4],d) matkermod(Mat([1,0]),d) matkermod(Mat([0,1]),d) matkermod(Mat([2,0]),d) matkermod(Mat([1,3]),d) matkermod(Mat([0,3]),d) matkermod(Mat([2,3]),d) matkermod([1,0;0,0],d) matkermod([2,0;0,3],d) matkermod([1,1;0,1],d) matkermod([2,1;0,3],d) matkermod([4,2;4,2],d) matkermod([2,2;3,0],d) print("invmod"); d=1800; nb=100; setrand(1); {for(m=1,5, for(n=1,5, for(count=1,nb, M = matrix(m,n,i,j,random([0,d-1])); U = 0; iferr(U = matinvmod(M,d),E, if(errname(E)!="e_INV", print(E)) ); if(U!=0 && (U*M)%d != 1, printsep(" ", "fail 1800:", M, U, (U*M)%d)); ); ); );} d=31; nb=100; setrand(1); {for(m=1,5, for(n=1,5, for(count=1,nb, M = matrix(m,n,i,j,random([0,d-1])); U = 0; iferr(U = matinvmod(M,d),E, if(errname(E)!="e_INV", print(E)) ); if(U!=0 && (U*M)%d != 1, printsep(" ", "fail 31:", M, U, (U*M)%d)); ); ); );} \\matsolvemod aff2lin(X) = mathnf(matconcat([X[2],X[1];0,1])); M = [1,2;3,4]; aff2lin(matsolvemod(M, [3,4]~, [1,2]~, 1)) aff2lin(matsolvemod(M, 3, [1,1]~, 1)) aff2lin(matsolvemod([1,1;1,1], [15,6]~, [2,2]~, 1)) aff2lin(matsolvemod(Mat([2,4,6]), 8, [2]~, 1)) aff2lin(matsolvemod([3;5;7], [2,3,5]~, [-1,-2,-3]~, 1)) aff2lin(matsolvemod([7,8,6;1,11,16],512,[-1,-1]~,1)) matsolvemod([1,1;1,1], 32, [17,1]~) matsolvemod(Mat(1),2,[1]~) matsolvemod([;],2,1) matsolvemod([;],2,0) matsolvemod([;],[2,2]~,1) matsolvemod([;],[2,2]~,0) matsolvemod([;],[2,2]~,[0,0]~) matsolvemod([;],[2,2]~,[1,2]~) matsolvemod([;],2,[1,2]~) matsolvemod(Mat(1),2,1) matsolvemod([1,2;3,4],0,1) \\zero ring matimagemod([1,2;3,4],1) matdetmod(Mat(3),1) matdetmod([;],1) matkermod([1,2;3,4],1) matinvmod([1,2;3,4],1) matinvmod([1,2;3,4;5,6],1) matsolvemod(Mat(1),1,[1]~,1) \\examples from docu A = [2,1;0,2]; matimagemod(A,6,&U) U (A*U)%6 A = [1,2,3;5,1,4] K = matkermod(A,6) (A*K)%6 A = [3,1,2;1,2,1;3,1,1]; U = matinvmod(A,6) (U*A)%6 A = [4,2,3; 4,5,6; 7,8,9]; matdetmod(A,27) \\end examples matdetmod([0,1;1,0],9) matdetmod([7,1;1,0],9) matdetmod([6,0;0,1],9) matimagemod([1;2],4) matimagemod([4,1;0,4],8,&U) U matsolvemod(matrix(1,0),0,[0]~) matsolvemod(matrix(1,0),0,0) matsolvemod(matrix(1,0),[0]~,[0]~) matsolvemod(matrix(1,0),[0]~,[0]~,1) matsolvemod(Mat([1]),[0]~,[0]~) matsolvemod(Mat([1]),[0]~,0) matsolvemod(Mat([1]),0,0,1) matsolvemod(Mat([2]),0,1,1) matsolvemod(Mat([21,110]),0,1,1) \\matdetmod fixes M = [21,7,7;23,2,7;20,21,31]; n=36; matdetmod(M,n) == matdet(M)%n M = matrix(11,11,i,j,if(j<i,1,i==j,prime(i+2)%n,0)); matdetmod(M,n) == matdet(M)%n \\bad inputs matimagemod([],1); matimagemod([;],'x); matimagemod([0,'x;1,0],1); matkermod([],1); matkermod([;],'x); matkermod([0,'x;1,0],1); matinvmod([],1); matinvmod([;],'x); matinvmod([0,'x;1,0],1); matdetmod([],1); matdetmod(Mat([1,2]),1); matdetmod(Mat(1/2),3); matimagemod(Mat(1),-1); matdetmod(Mat(1),0); matkermod(Mat(1),0); matinvmod(Mat(1),0); matinvmod([1,2,3;4,5,6],1); matsolvemod([;],[2,2]~,[1,2,3]~) matsolvemod(Mat(1),[1,2]~,1) matsolvemod(Mat(1),2,[1,2]~) matsolvemod(Mat(1),[2],1) matsolvemod(Mat(1),2,[1]) matsolvemod("a",2,1) matsolvemod(Mat(1),-2,1) matsolvemod([1,2;3,4],[2,-3]~,1) matsolvemod(Mat(1/2),1,1) matsolvemod(Mat(1),1/2,1) matsolvemod(Mat(1),1,1/2) matsolvemod(Mat(1),[1/2]~,1) matsolvemod(Mat(1),1,[1/2]~)