Real-time collaboration for Jupyter Notebooks, Linux Terminals, LaTeX, VS Code, R IDE, and more,
all in one place.
Real-time collaboration for Jupyter Notebooks, Linux Terminals, LaTeX, VS Code, R IDE, and more,
all in one place.
| Download
GAP 4.8.9 installation with standard packages -- copy to your CoCalc project to get it
Project: cocalc-sagemath-dev-slelievre
Views: 418346####################################################################### #0 #F IsIntList ## Input: A list L ## ## Output: True if L is a list of integers ## False otherwise ## InstallGlobalFunction(IsIntList, function(list) local i; for i in list do if not IsInt(i) then return false; fi; od; return true; end); ####################################################################### ####################################################################### #0 #F VectorToCrystMatrix ## Input: A n-dimensional vector v ## ## Output: A pure translation crystallographic matrix ## ## InstallGlobalFunction(VectorToCrystMatrix, function(v) local M,n; v:=Flat(v); n:=Length(v); M:=IdentityMat(n+1); Add(v,1); Remove(M); Add(M,v); return M; end); ################### end of VectorToCrystMatrix ####################### ###################################################################### #0 #F CrystTranslationMatrixToVector ## Input: A pure translation crystallographic matrix g ## ## Output: An n-dimensional vector v ## ## InstallGlobalFunction(CrystTranslationMatrixToVector, function(g) local n,v; n:=Length(g); v:=g[n]; v:=Flat(v); Remove(v); return v; end); ################### end of CrystTranslationMatrixToVector ############ ###################################################################### #0 #F TranslationSubGroup ## Input: A crystallographic group G ## ## Output: Translation subgroup of G ## ## InstallGlobalFunction(TranslationSubGroup, function(G) local B,SbGrp,trsltbasis; B:=TranslationBasis(G); if not IsBound(G!.TranslationBasis) then return false;fi; B:=G!.TranslationBasis; trsltbasis:=List(B,w->VectorToCrystMatrix(Flat(w))); SbGrp:=Group(trsltbasis); SbGrp!.TranslationBasis:=B; SetIsCrystTranslationSubGroup(SbGrp,true); return SbGrp; end); ################### end of TranslationSubGroup ####################### ###################################################################### #0 #F Method in ## Input: A matrix g and a translation subgroup G of ## a crystallographic group ## a positive integer p ## Output: True if g in G ## False if g not in G ## InstallOtherMethod(\in, "for TranslationSubGroup of a CrystGroup", [IsMatrix,IsCrystTranslationSubGroup], function(g,G) local B,v,n; n:=DimensionSquareMat(g)-1; if not LinearPartOfAffineMatOnRight(g)=IdentityMat(n) then return false; fi; B:=G!.TranslationBasis; v:=CrystTranslationMatrixToVector(g); return IsIntList(v*TransposedMat(B)^-1); end); ################### end of Method g in G ########################### #################################################################### #0 #F IsCrystSameOrbit ## Input: Two points u, v in R^n and a group G. ## ## Output: return True if u, v in the same orbit. ## Otherwise returns False. ## ## InstallGlobalFunction(IsCrystSameOrbit, function(arg) local G,T,H,u,v,B,x,w; G:=arg[1]; if Length(arg)=3 then H:=TranslationSubGroup(G); T:=RightTransversal(G,H); B:=H!.TranslationBasis; u:=arg[2]; v:=arg[3]; else B:=arg[2]; T:=arg[3]; u:=arg[4]; v:=arg[5]; fi; u:=Flat(u); v:=Flat(v); Add(u,1); Add(v,1); for x in T do w:=u*x-v; w:=Flat(w); Remove(w); if IsIntList(w*TransposedMat(B)^-1) then return x*VectorToCrystMatrix(w)^-1; fi; od; return false; end); ################### end of IsCrystSameOrbit ############################## ########################################################################## #0 #F CombinationDisjointSets ## Input: A list of k positive integers $(a_i)$. ## ## Output: A 2-dimensional array L such that 0 <= L[i][j] < a_j. ## ## InstallGlobalFunction(CombinationDisjointSets, function(arg) local b,list,n1,i,g,h; g:=arg[1]; if g=[] then return [[]];fi; n1:=g[1]; h:=g{[2..Length(g)]}; list:=[]; b:=CombinationDisjointSets(h); for i in [0..(n1-1)] do Append(list,List(b,w->AddFirst(w,i))); od; return list; end); ################### end of CombinationDisjointSets ####################### ########################################################################## #0 #F AddFirst ## Input: A list w and an element g. ## ## Output: List with g in the first position ## ## InstallGlobalFunction(AddFirst, function(list,g) # add g in the first position in list local w; w:=[g]; Append(w,list); return w; end); ## ################### end of AddFirst ###################################### ########################################################################## #0 #F IsCrystSufficientLattice ## Input: A lattice's basis B and a transversal S of the translation ## subgroup in crystallographic group G. ## ## Output: True if G acts on the lattice, otherwise return False. ## ## InstallGlobalFunction(IsCrystSufficientLattice, function(B,SS,T) local v,x,w,B1,c,i,A,Origin,S1,S2,S; S:=StructuralCopy(List(SS)); Append(S,GeneratorsOfGroup(T)); Origin:=0*B[1]; Origin:=Flat(Origin); Add(Origin,1); A:=StructuralCopy(B); v:=Sum(A)/2; v:=Flat(v); Add(v,1); for x in S do w:=Flat(v*x-v); if not IsIntList(w*A^-1) then return false; fi; od; for i in [1..Length(A)] do A[i]:=Flat(A[i]); Add(A[i],1); od; for x in S do B1:=List(A,w->w*x); c:=Flat(Origin*x-Origin); B1:=List(B1,w->w-c); for x in B1 do Remove(x); od; S2:=Set(B1); for x in B do if not ((x in S2) or (-x in S2)) then return false; fi; od; od; return true; end); ################### end of IsCrystSufficientLattice ###################### ########################################################################## #0 #F CrystFinitePartOfMatrix ## Input: A crystallographic matrix g ## ## Output: Finite part of g. ## ## InstallGlobalFunction(CrystFinitePartOfMatrix, function(g) local x,w,i; w:=[]; for i in [1..(Length(g)-1)] do x:=Flat(g[i]); Remove(x); Add(w,x); od; return w; end); ################### end of CrystFinitePartOfMatrix ####################### ########################################################################## #0 #F ResolutionBoundaryOfWordOnRight ## Input: A free resolution R, degree n, a list of word w ## ## Output: The boundary of w respects to the right action. ## ## InstallGlobalFunction(ResolutionBoundaryOfWordOnRight, function(R,n,W) local x, DW, Boundary, Dimension,Elts,pos, ans,H; Dimension:=R!.dimension; Boundary:=R!.boundary; Elts:=R!.elts; DW:=[]; for x in W do ans:=Boundary(n,x[1]); ans:=List(ans, a->[a[1],Elts[a[2]]]); ans:=List(ans, a->[a[1],a[2]*Elts[x[2]]]); Append(DW,ans); od; DW:= AlgebraicReduction(DW); for x in DW do if not x[2] in Elts then Add(Elts,x[2]); fi; od; DW:=List(DW,x->[x[1],Position(Elts,x[2])]); DW:=List(DW,x->[R!.Sign(n-1,x[1],x[2])*x[1],x[2]]); for x in DW do H:=R!.stabilizer(n-1,AbsInt(x[1])); pos:=Position(R!.elts,CanonicalRightCountableCosetElement( H,R!.elts[x[2]])); if pos=fail then Add(R!.elts,CanonicalRightCountableCosetElement( H,R!.elts[x[2]])); x[2]:=Length(R!.elts); else x[2]:=pos; fi; od; DW:=List(DW,x->[R!.Sign(n-1,x[1],x[2])*x[1],x[2]]); DW:= AlgebraicReduction(DW); return DW; end); ################### end of ResolutionBoundaryOfWordOnRight ############### ########################################################################## #0 #F CrystCubicalTiling ## Input: Dimension n ## ## Output: A list of some cubical tiling in n-dimensional space ## InstallGlobalFunction(CrystCubicalTiling, function(n) local combin,x,w,Til,i; combin:=Combinations([1..n],2); Til:=[]; Add(Til,IdentityMat(n)); for i in [1..Length(combin)] do w:=combin[i]; x:=IdentityMat(n); x[w[1]][w[1]]:=-1/2; x[w[1]][w[2]]:=-1/2; x[w[2]][w[1]]:=1; x[w[2]][w[2]]:=-1; Add(Til,x); od; return Til; end); ################### end of CrystCubicalTiling ############################ ########################################################################## #0 #F AverageInnerProduct ## Input: An affine group G and 2 vector u,v ## ## Output: the avarage inner product of u and v. ## InstallGlobalFunction(AverageInnerProduct, function(G,u,v) local i,sum,n,Elts; n:=Order(G); Elts:=Elements(G); sum:=0; for i in [1..n] do sum:=sum+(u*Elts[i])*(v*Elts[i]); od; sum:=sum/n; return sum; end); ################### end of AverageInnerProduct ########################## ######################################################################### #0 #F OrthogonalizeBasisByAverageInnerProduct ## Input: A basis B and group G ## ## Output: An orthogonal basis B' and a a matrix change of basis ## ## InstallGlobalFunction(OrthogonalizeBasisByAverageInnerProduct, function(B,G) local Project,i,j,A,n; A:=StructuralCopy(B); n:=Length(B); if not RankMat(B)=Length(B) then Print("Input is not a basis"); return fail; fi; Project:=function(u,v) #This operator projects the vector v orthogonally #onto the line spanned by vector u return (AverageInnerProduct(G,u,v)/AverageInnerProduct(G,u,u))*u; end; for i in [2..n] do for j in [1..(i-1)] do B[i]:=B[i]-Project(B[j],A[i]); od; od; for i in [1..n] do B[i]:=(1/Sqrt(AverageInnerProduct(G,B[i],B[i])))*B[i]; od; return B; end); ########## end of OrthogonalizeBasisByAverageInnerProduct ################ ########################################################################## #0 #F CrystMatrix ## Input: nxn matrix M ## ## Output: the crystallographic form of M. ## ## InstallGlobalFunction(CrystMatrix, function(M) local i,n,x,N; N:=StructuralCopy(M); if IsMatrix(N) then n:=Length(N); x:=0*N[1]; Add(x,1); for i in [1..n] do Add(N[i],0); od; Add(N,x); else N:=VectorToCrystMatrix(N); fi; return N; end); ################### end of CrystMatrix ################################### ########################################################################## #0 #F IsRigid ## Input: A HAP G-complex ## ## Output: Either ``true'' or ``false''. ## ## InstallGlobalFunction(IsRigid, function(C) local i,j,bdr, w,s; for i in [1..5000] do #SLOPPY!! for j in [1..C!.dimension(i)] do bdr:=C!.boundary(i,j); for w in bdr do s:=ConjugateGroup(C!.stabilizer(i-1,AbsInt(w[1])), C!.elts[w[2]]^-1); if not IsSubgroup(s,C!.stabilizer(i,j)) then Print([i,j],"\n"); return false; fi; od; od; i:=i+1; od; return true; end); #######################End of IsRigid ################################### ########################################################################## #0 #F IsRigidOnRight ## Input: A HAP G-complex ## ## Output: Either ``true'' or ``false''. ## ## InstallGlobalFunction(IsRigidOnRight, function(C) local i,j,L,bdr,intst; i:=1; while C!.dimension(i)>0 do for j in [1..C!.dimension(i)] do bdr:=C!.boundary(i,j); L:=List(bdr,w->Elements(ConjugateGroup(C!.stabilizer(i-1,AbsInt(w[1])),C!.elts[w[2]]))); intst:=Intersection(L); if not Elements(C!.stabilizer(i,j))=Elements(intst) then Print([i,j]); return false; fi; od; i:=i+1; od; return true; end); #######################End of IsRigidOnRight ###################################