Projekt:Computeralgebra-Berechnungen/Symmetrische Hilbert-Kunz Theorie/KSC
Syntax: KSC(L, q, R, maxM)
L ist eine Liste von Polynomen, q natürliche Zahl, R ein Ring (typischerweise der Polynomring ), maxM natürliche Zahl.
Zur Berechnung der mehrfach korrigierten symmetrischen Codimension eines Ideals im Polynomring als
Genauer sei
eine freie Auflösung des Ideals mit
Dann liefert
die q-te mehrfach korrigierte symmetrische Codimension von .
Manchmal auch interessant, aber unten auskommentiert: Ausgabe der einzelnen Summanden.
SymIndexRecursive=(k,n)-> (if (k==1) then {{n}} else ( IndexSet:={}; FirstIndex:={n}; for i from 2 to k do FirstIndex=append(FirstIndex,0); IndexSet=append(IndexSet, FirstIndex); for i from 1 to n do ( CurrentIndex:={}; RecList:=SymIndexRecursive(k-1, i); for Indx in RecList do ( Indx={n-i}|Indx; CurrentIndex=append(CurrentIndex, Indx)); IndexSet=IndexSet|CurrentIndex); IndexSet)) decreaseJthEntry=(L,j)-> ( TheList:=new MutableList from L; TheList#(j-1)=TheList#(j-1) -1; TheList) SymSyzHashT=(L,n)-> ( k:=#L; IndexSetDomain:=SymIndexRecursive(k,n); IndexSetRange:=SymIndexRecursive(k,n-1); hashlist:={}; for row in IndexSetRange do ( rowvalue:={}; for column in IndexSetDomain do rowvalue=append(rowvalue, column=>0); rowvalue=new MutableHashTable from hashTable(rowvalue); hashlist=append(hashlist, row=>rowvalue)); hashTM:=new MutableHashTable from hashTable(hashlist); for IndxD in IndexSetDomain do for j from 1 to k do ( IndxRM:=new MutableList from IndxD; IndxRM#(j-1)=IndxRM#(j-1)-1; IndxR:=new List from IndxRM; if (hashTM#?IndxR) then (hashTM#IndxR)#IndxD=L#(j-1)); for IndxR in IndexSetRange do hashTM#IndxR=new HashTable from hashTM#IndxR; hashT:=new HashTable from hashTM; hashT) HashTableToMatrix=hashT->( m:=#hashT; IndexSetRange:=rsort keys(hashT); row0hashT:=hashT#(IndexSetRange#0); n:=#row0hashT; IndexSetDomain:=rsort keys(row0hashT); rlist:={}; for j from 0 to m-1 do ( keyj:=IndexSetRange#j; rowj:={}; for i from 0 to n-1 do ( keyi:=IndexSetDomain#i; ijentry:=(hashT#keyj)#keyi; rowj=append(rowj, ijentry)); rlist=append(rlist, rowj)); matrix(rlist)) SymSyzMatrix=(L,n)-> ( SHT:=SymSyzHashT(L,n); HashTableToMatrix(SHT)) SymTwists=(ListOfTwists, n)->( r=length(ListOfTwists); TheSymTwists=new MutableList from {}; IndexSet=SymIndexRecursive(r,n); for Indx in IndexSet do ( thesum=0; for i in 0..r-1 do thesum=thesum+Indx#i*ListOfTwists#i; TheSymTwists=append(TheSymTwists, thesum)); L=new List from TheSymTwists; L) SymSyzModule=(L,n, R)-> ( LTwists=new MutableList from {}; for f in L do LTwists=append(LTwists, -(first degree(f))); LTwists=new List from LTwists; DomTwists=SymTwists(LTwists, n); RangeTwists=SymTwists(LTwists, n-1); symMap=map(R^RangeTwists, R^DomTwists, SymSyzMatrix(L,n)); kernel(symMap)) SymSyzSheaf=(L,n,R)->sheaf(SymSyzModule(L,n,R)) SC=(L,n, R)->( SnSyz=SymSyzSheaf(L,n,R); h=rank HH^1(SnSyz); hsum=h; m=0; while (h!=0) do ( m=m+1; h=rank HH^1(SnSyz(m)); hsum=hsum+h); hsum) KSC=(L, n, aRing, maxM)->( R=aRing; C=resolution(ideal(L)); AbbMat=C.dd_2; F2Twists=new MutableList from {}; degs=degrees(C_2); for degL in degs do F2Twists=append(F2Twists,-degL#0); F2Twists=new List from F2Twists; -- print F2Twists; Syz2Module=kernel(AbbMat); Syz2Sheaf=sheaf(Syz2Module); rankSyz2=rank(Syz2Sheaf); -- print rankSyz2; SnSyz1=SymSyzSheaf(L,n, R); sumH1SnSyz1=0; for m from 0 to maxM do sumH1SnSyz1=sumH1SnSyz1+rank HH^1(SnSyz1(m)); -- print sumH1SnSyz1; sumH0SnSyz1=0; for m from 0 to maxM do sumH0SnSyz1=sumH0SnSyz1-rank HH^0(SnSyz1(m)); -- print sumH0SnSyz1; WSumme=0; WSumme=sumH1SnSyz1+sumH0SnSyz1; for k from 0 to rankSyz2 do ( WedgeSyz=exteriorPower(k,Syz2Sheaf); theTwists=SymTwists(F2Twists, n-k); currentSheaf=WedgeSyz**(OO_(Proj R)^theTwists); hsum=0; for m from 0 to maxM do ( h=rank HH^0(currentSheaf(m)); hsum=hsum+h); kthsummand=(-1)^k*hsum; -- print kthsummand; WSumme=WSumme+kthsummand); WSumme)