Testing latest pari + WASM + node.js... and it works?! Wow.
License: GPL3
ubuntu2004
default(realprecision,38); default(parisize,"100M"); \\Tests related to hasse invariants in algebras do(name, test) = { setrand(1); print(name,": ", iferr(test(), E, E)); } gusuite(name, tests) = print("Suite: ", name); tests(); searchin(hf,pr,h) = { my(i,n); for(i=1,#hf[1], if(hf[1][i]==pr, return(hf[2][i]==h)) ); return(h==0); }; samehasse(hf1,hi1,hf2,hi2) = { my(i,n); if(hi1 != hi2, return(0)); n = #hf1[1]; for(i=1,n, if(!searchin(hf2,hf1[1][i],hf1[2][i]), return(0)); ); n = #hf2[1]; for(i=1,n, if(!searchin(hf1,hf2[1][i],hf2[2][i]), return(0)); ); return(1); }; hassetriv(hf,hi) = samehasse(hf,hi,[[],Vecsmall([])],Vecsmall(vector(#hi,i,0))); altriv(al) = hassetriv(alghassef(al),alghassei(al)); alsame(al,hf,hi) = samehasse(alghassef(al),alghassei(al),hf,hi); alcheckhasse(al) = { my(n,h); n = algdegree(al); h = Mod(0,n); for(i=1, #alghassef(al)[1], h += alghassef(al)[2][i]); for(i=1, #alghassei(al), h += (n/2)*alghassei(al)[i]); return(h == Mod(0,n)); }; al_cyclotomic(p,b,mo=1) = { my(Q,F,pc,r); Q = nfinit(y); pc = polcyclo(p,x); F = rnfinit(Q,pc); r = lift(znprimroot(p)); return(alginit(F, [Mod(Mod(1,y)*x^r,pc), b], 'x, mo)); }; hasse0() = gusuite("hasse sum to 0", ()->{ do("cyclo construction", ()->al_cyclotomic(3,-175624635)); do("cyclo ramified at infinity", ()->alcheckhasse(al_cyclotomic(3,-175624635))); do("cyclo unramified at infinity", ()->alcheckhasse(al_cyclotomic(3,2763764))); do("cyclo 5", ()->alcheckhasse(al_cyclotomic(5,7861623))); do("cyclo 5 bis", ()->alcheckhasse(al_cyclotomic(5,6569846846546548798*25))); do("cyclo 7 bis no mo", ()->alcheckhasse(al_cyclotomic(7,168656465154165487*7^3,0))); do("cyclo 11 no mo", ()->alcheckhasse(al_cyclotomic(11,87165765,0))); do("quat -1,-1 over Q", ()->alcheckhasse(alginit(nfinit(y),[-1,-1]))); do("quat -1,-1 over Q(sqrt(2))", ()->alcheckhasse(alginit(nfinit(y^2-2),[-1,-1],x))); do("quat -1,-1 over Q(sqrt(60))", ()->alcheckhasse(alginit(nfinit(y^2-60),[-1,-1],x))); }); alfromhasse() = gusuite("algebra from Hasse invariants", ()->{ my(nf, pr7, pr13, finvm, finv, finv1, finv2, iinvm, iinv, iinv1, iinv2, d1,\ d2, d, dm, mai, al); nf = nfinit(y^3+y^2-2*y-1); pr7 = idealprimedec(nf,7); pr13 = idealprimedec(nf,13); J = varhigher("J"); al = alginit(nf,3,J); do("matrix algebra invariants", ()->altriv(al)); d1 = 3; finv1 = [pr13,Vecsmall([1,1,1])]; iinv1 = Vecsmall([0,0,0]); al = alginit(nf,[d1,finv1,iinv1],J); do("algebra 1 invariants", ()->alsame(al,finv1,iinv1)); d2 = 2; finv2 = [pr7,Vecsmall([1])]; iinv2 = Vecsmall([1,0,0]); al = alginit(nf,[d2,finv2,iinv2],J); do("algebra 2 invariants", ()->alsame(al,finv2,iinv2)); nf = nfinit(y); p13 = idealprimedec(nf,13)[1]; finv1 = [[p13],[Mod(1,2)]]; iinv1 = Vecsmall([1]); do("test", ()->alginit(nf,[2,finv1,iinv1],J)); d = 6; p3 = idealprimedec(nf,3)[1]; p5 = idealprimedec(nf,5)[1]; p7 = idealprimedec(nf,7)[1]; p11 = idealprimedec(nf,11)[1]; finv = [[p3,p5,p7,p11], Vecsmall([3,2,2,2])]; iinv = Vecsmall([3]); al = alginit(nf,[d,finv,iinv],J,0); do("degree 6 algebra over Q", ()->alsame(al,finv,iinv)); nf = nfinit(y^2-5); finv1 = [[],[]]; iinv1 = Vecsmall([1,1]); do("trivial finite conditions", ()->my(al=alginit(nf,[2,finv1,iinv1])); [alghassei(al),alghassef(al)]); }); all() = gusuite("all", ()->{ hasse0(); alfromhasse(); }); all(); \\better accessors for hasse invariants print("better accessors"); setrand(1); x='x; nf = nfinit(y^3-y+1); rnf = rnfinit(nf, polcyclo(5,x)); al = alginit(rnf, [x^2,-2],, 0); alghasse(al,1) alghasse(al,2) alghasse(al,idealprimedec(nf,2)[1]) alghasse(al,idealprimedec(nf,3)[1]) alghasse(al,idealprimedec(nf,5)[1]) alghasse(al,idealprimedec(nf,5)[2]) algindex(al,1) algindex(al,2) algindex(al,idealprimedec(nf,2)[1]) algindex(al,idealprimedec(nf,3)[1]) algindex(al,idealprimedec(nf,5)[1]) algindex(al,idealprimedec(nf,5)[2]) algindex(al) algisdivision(al,1) algisdivision(al,2) algisdivision(al,idealprimedec(nf,2)[1]) algisdivision(al,idealprimedec(nf,3)[1]) algisdivision(al,idealprimedec(nf,5)[1]) algisdivision(al,idealprimedec(nf,5)[2]) algisdivision(al) algissplit(al,1) algissplit(al,2) algissplit(al,idealprimedec(nf,2)[1]) algissplit(al,idealprimedec(nf,3)[1]) algissplit(al,idealprimedec(nf,5)[1]) algissplit(al,idealprimedec(nf,5)[2]) algissplit(al) algisramified(al,1) algisramified(al,2) algisramified(al,idealprimedec(nf,2)[1]) algisramified(al,idealprimedec(nf,3)[1]) algisramified(al,idealprimedec(nf,5)[1]) algisramified(al,idealprimedec(nf,5)[2]) algisramified(al) algramifiedplaces(al) print(" "); al = 0; al = alginit(rnf, [x^2,-1],, 0); alghasse(al,1) alghasse(al,2) alghasse(al,idealprimedec(nf,2)[1]) alghasse(al,idealprimedec(nf,5)[1]) alghasse(al,idealprimedec(nf,5)[2]) algindex(al,1) algindex(al,2) algindex(al,idealprimedec(nf,2)[1]) algindex(al,idealprimedec(nf,5)[1]) algindex(al,idealprimedec(nf,5)[2]) algindex(al) algisdivision(al,1) algisdivision(al,2) algisdivision(al,idealprimedec(nf,2)[1]) algisdivision(al,idealprimedec(nf,5)[1]) algisdivision(al,idealprimedec(nf,5)[2]) algisdivision(al) algissplit(al,1) algissplit(al,2) algissplit(al,idealprimedec(nf,2)[1]) algissplit(al,idealprimedec(nf,5)[1]) algissplit(al,idealprimedec(nf,5)[2]) algissplit(al) algisramified(al,1) algisramified(al,2) algisramified(al,idealprimedec(nf,2)[1]) algisramified(al,idealprimedec(nf,5)[1]) algisramified(al,idealprimedec(nf,5)[2]) algisramified(al) algramifiedplaces(al) print(" "); al = 0; al = alginit(rnf, [x^2, 1],, 0); alghasse(al,1) alghasse(al,2) alghasse(al,idealprimedec(nf,2)[1]) alghasse(al,idealprimedec(nf,5)[2]) algindex(al,1) algindex(al,2) algindex(al,idealprimedec(nf,2)[1]) algindex(al,idealprimedec(nf,5)[2]) algindex(al) algisdivision(al,1) algisdivision(al,2) algisdivision(al,idealprimedec(nf,2)[1]) algisdivision(al,idealprimedec(nf,5)[2]) algisdivision(al) algissplit(al,1) algissplit(al,2) algissplit(al,idealprimedec(nf,2)[1]) algissplit(al,idealprimedec(nf,5)[2]) algissplit(al) algisramified(al,1) algisramified(al,2) algisramified(al,idealprimedec(nf,2)[1]) algisramified(al,idealprimedec(nf,5)[2]) algisramified(al) algramifiedplaces(al) print("Hasse inv 0 bug"); setrand(1); a='a; K=nfinit(a);PR=idealprimedec(K,2);A=alginit(K,[3,[PR,[0]],[0]],,0); algdegree(A) algdim(A) algindex(A) algisdivision(A) algadd(A,[1,0,0,0,0,0,0,0,0]~,[1,2,3]~) algsub(A,[1,0,0,0,0,0,0,0,0]~,[1,2,3]~) algmul(A,[0,0,0,0,0,0,0,0,0]~,[1,2,3]~) print("\ntests with splitting field that does not descend"); setrand(1); nf = nfinit(y^2-5); al = alginit(nf,[y,-1]); algramifiedplaces(al) al = alginit(nf,[-3+y,-1]); algramifiedplaces(al) al = alginit(nf,[-3+y,y]); algramifiedplaces(al) nf = nfinit(y^4 - 10*y^2 + 1); p3 = idealprimedec(nf,3)[1]; p5 = idealprimedec(nf,5)[1]; al = alginit(nf, [2, [[p3,p5],[1/2,1/2]], [1/2,0,0,1/2]]); algramifiedplaces(al) al = alginit(nf, [2, [[p3],[1/2]], [0,1/2,0,0]]); algramifiedplaces(al) nf = nfinit(y^8 - 40*y^6 + 352*y^4 - 960*y^2 + 576); p3 = idealprimedec(nf,3)[1]; al = alginit(nf, [2,[[p3],[1/2]], [1/2,0,0,1/2,1/2,0,0,0]]); algramifiedplaces(al) print("degree bug"); nf = nfinit(y); p2 = idealprimedec(nf,2)[1]; p3 = idealprimedec(nf,3)[1]; al = alginit(nf, [4,[[p2,p3],[1/2,1/2]],[0]]); algdegree(al) {for(i=1,10, al = alginit(nf, [2,[[p2,p3],[0,0]],[0]]); print1(algdegree(al)," "); )}; al = alginit(nf, [4,[[p2,p3],[0,0]],[0]]); algdegree(al) nf = nfinit(z^2+1); p31 = idealprimedec(nf,31)[1]; p2 = idealprimedec(nf,2)[1]; {for(i=1,10, al = alginit(nf, [2, [[p31,p2], [0, 0]], []]); print1(algdegree(al)," "); )};