User:Ben/KRhomology: Difference between revisions
(changed program to hopefully use less memory) |
|||
Line 124: | Line 124: | ||
KR = K -> ( |
KR = K -> ( |
||
if K#?KR then return K#KR else ( |
if K#?KR then return K#KR else ( |
||
if not K#?braid then error "no braid representation" else ( |
|||
Kb=K#braid; |
|||
P=K#nbcross=#Kb; |
|||
Ka=apply(Kb,abs); |
|||
Kt=apply(Kb,i->(i>0)); |
|||
Ks=sort Ka; |
|||
--error Ks; |
|||
bind=K#bindex=last(Ks)+1; |
|||
R=QQ[vars(1 .. 2*P+bind)]; |
|||
Kmod = chainComplex( gradedModule(R^1)); |
|||
Cvars=new MutableList from toList (0..bind); |
|||
--error Cvars#3; |
|||
for I from 0 to P-1 do ( |
|||
Kmod=Kmod**KhMods(Cvars#(Ka_I)-1,Cvars#(Ka_I+1)-1,bind+2*I,R,Kt_I); |
|||
Cvars#(Ka_I)=bind+2*I+1; |
|||
Cvars#(Ka_I+1)=bind+2*I+2; |
|||
); |
|||
Ml=toList (1..bind); |
Ml=toList (1..bind); |
||
M=matrix {apply(Ml, I-> R_(Cvars#I-1)-R_(I-1))}; |
|||
KKR=Torify(Kmod,M); |
|||
return KKR) |
|||
) |
|||
) |
) |
||
Line 151: | Line 151: | ||
KhMods = (H,I,J,S,W) -> ( |
KhMods = (H,I,J,S,W) -> ( |
||
Mp=S^1/ideal(S_H+S_I-S_J-S_(J+1),S_H*S_I-S_J*S_(J+1)); |
Mp=S^1/ideal(S_H+S_I-S_J-S_(J+1),S_H*S_I-S_J*S_(J+1)); |
||
Np=S^{-1}/ideal(S_H-S_J,S_I-S_(J+1)); |
|||
Mn=S^{1}/ideal(S_H+S_I-S_J-S_(J+1),S_H*S_I-S_J*S_(J+1)); |
|||
Nn=S^{1}/ideal(S_H-S_J,S_I-S_(J+1)); |
|||
if W then C=chainComplex(map(Mp,Np,(S_J-S_I))) else C=chainComplex(map(Nn,Mn))[1]; |
|||
C) |
|||
--these extend Macaulay2's ability to take tensor products and induced maps. |
--these extend Macaulay2's ability to take tensor products and induced maps. |
||
Line 169: | Line 169: | ||
inducedchainMap = (C,D,f) -> ( |
inducedchainMap = (C,D,f) -> ( |
||
map( |
map( |
||
C,D,i->inducedMap(C_i,D_i) |
|||
) |
|||
) |
) |
||
Line 179: | Line 179: | ||
L:=(0..J); |
L:=(0..J); |
||
Lt=apply(L,I->( |
Lt=apply(L,I->( |
||
F:=koszul(I,M); |
|||
G:=koszul(I+1,M); |
|||
FB=C**F; |
|||
GB=C**G; |
|||
CB=source FB; |
|||
H=inducedchainMap(ker FB,image GB,id_CB); |
|||
⚫ | |||
H=inducedchainMap(ker FB,image GB,id_CB); |
|||
⚫ | |||
--error H; |
|||
⚫ | |||
⚫ | |||
Lt) |
Lt) |
||
--input, a link. output, KR homology (as modules). this is less useful than you think, just because of the difficulty of reading the output. |
--input, a link. output, KR homology (as modules). this is less useful than you think, just because of the difficulty of reading the output. |
||
KRHom = K -> ( |
KRHom = K -> ( |
||
L:=KR(K); |
|||
M:=apply(L,homology); |
|||
N:=apply(M,prune); |
|||
N) |
|||
K#KRHom=N; |
|||
); |
|||
stack(apply(N,net))) |
|||
--This sends a chain complex to the list of degrees for which Macaulay2 remembers a module in it. |
--This sends a chain complex to the list of degrees for which Macaulay2 remembers a module in it. |
||
Line 211: | Line 206: | ||
KRpoly = K -> ( |
KRpoly = K -> ( |
||
if K#?KRpoly then return K#KRpoly; |
if K#?KRpoly then return K#KRpoly; |
||
L:=KRHom K; |
|||
L:=K#KRHom; |
|||
R:=ring L_0; |
R:=ring L_0; |
||
Rn:=#generators R; |
Rn:=#generators R; |
||
Line 223: | Line 217: | ||
spoM:=sort (spots M_0); |
spoM:=sort (spots M_0); |
||
P:=sum(apply(toList (0..#M-1), i-> ( |
P:=sum(apply(toList (0..#M-1), i-> ( |
||
q^i*sum(apply(spoM, j-> ( |
|||
s^j*sum(apply(flatten N_i j, k->t^k)) |
|||
) |
|||
) |
|||
)) |
|||
)) |
|||
) |
|||
)); |
|||
K#KRpoly=P |
K#KRpoly=P//(q*t+1) |
||
K#KRpoly) |
|||
KRdisp =K -> ( |
KRdisp =K -> ( |
||
Line 237: | Line 231: | ||
spoM=spots K#KRHom_0; |
spoM=spots K#KRHom_0; |
||
net P || " " || ( " " || stack apply(spoM, net)) | " " | horizontalJoin between(" ", apply( |
net P || " " || ( " " || stack apply(spoM, net)) | " " | horizontalJoin between(" ", apply( |
||
toList (0..#M-1),i-> net i || stack( |
|||
apply( |
|||
spoM,j->net(flatten(N_i j)) |
|||
) |
|||
) |
|||
) |
|||
) |
|||
) |
|||
) |
) |
||
</pre> |
</pre> |
Revision as of 11:04, 8 December 2005
Actual calculations
Note: these polynomials are missing fudge factors. These will be fixed when I get back to Berkeley on Wednesday.
Here is a table of known KR homologies. We let be the Hilbert series of KR homology. Note that a factor of the Hilbert series of the unknot appears in all of them. This will not be true of links, I believe.
Unfortunately, computation seems to bog down very fast. 6_1 has been giving me a lot of trouble, probably because it has braid index 4. If someone with a faster machine would run it, I would be very appreciative.
Warning the polynomial for 5_2 here is incorrect. The correct value appears on the main Knot Atlas page for 5_2. --Scott 12:48, 3 Dec 2005 (EST)
0_1 | |
3_1 | |
4_1 | |
5_1 | |
5_2 | |
6_2 | |
6_3 |
I've been running more calculations on panda and neuron, two of the fast computers in the math department. I've got panda working through all the braid index 3 knots, and it's started giving some results. 7_3 took about half an hour, and consumed about a gig of memory. --Scott 02:16, 30 Nov 2005 (EST)
7_3 | |
7_5 |
neuron is working on braid index 4 knots, starting with 6_1, and seems to be working fine. 6_1 took over an hour, and about 1.2 gigs of memory. --Scott 02:59, 30 Nov 2005 (EST)
6_1 |
Theoretical stuff
I have some ideas which I hope will be of interest to ya'll, but I'd like to mull them a bit longer. Maybe when I get back on Wednesday.
For those who are curious, the polynomials above should follow the skein relation after subsituting s=-1.
Macaulay2 program
Save this as a file (called KR.m2), open Macaulay2 (in command line or emacs), and type load "KR.m2"
.
KRpoly
is probabby the command you want (but it only works for knots at the moment). It outputs .
Using texMath
puts things in format for LaTeX.
Here's a sample session:
Macaulay 2, version 0.9 --Copyright 1993-2001, D. R. Grayson and M. E. Stillman --Singular-Factory 1.3b, copyright 1993-2001, G.-M. Greuel, et al. --Singular-Libfac 0.3.2, copyright 1996-2001, M. Messollen i1 : load "KR.m2" KR.m2:113:11: warning: local declaration of N shields variable with same name --loaded KR.m2 i2 : texMath KRpoly K01 o2 = 1 i3 : texMath KRpoly K31 o3 = s^{2} t^{2}+{q} t^{2}+1 i4 :
Here's the code for the program.
--KR.m2 --This file defines a new object for Macaulay2, called a "Link." --Like all objects in Macaulay2, a Link is just a hash table. --Defining a link lets you store information about it for later use. Link = new Type of MutableHashTable Link.synonym = "link" new Link := Link => (cl) -> ( C:=newClass(Link,new MutableHashTable); C) --braidClosure is currently the only useful way of defining a link. --I think it should be clear from the examples below how to use it. --(Remember to use {}, not () or []) braidClosure = L ->( K=new Link; K#braid=L; K) --This defines all links of 7 or fewer crossings by a braid closure. K01=braidClosure {1}; K31=braidClosure {1,1,1}; K41=braidClosure {1,-2,1,-2}; K51=braidClosure {1,1,1,1,1}; --Warning: early versions of this program included the wrong braid representation for 5_2 (missing the first -1). Scott. K52=braidClosure {-1,-1,-1,-2,1,-2}; K61=braidClosure {1,1,2,-1,-3,2,-3}; K62=braidClosure {-1,-1,-1,2,-1,2}; K63=braidClosure {-1,-1,2,-1,2,2}; K71=braidClosure {-1,-1,-1,-1,-1,-1,-1} K72=braidClosure {-1,-1,-1,-2,1,-2,-3,2,-3} K73=braidClosure {1,1,1,1,1,2,-1,2} K74=braidClosure {1,1,2,-1,2,2,3,-2,3} K75=braidClosure {-1,-1,-1,-1,-2,1,-2,-2} K76=braidClosure {-1,-1,2,-1,-3,2,-3} K77=braidClosure {1,-2,1,-2,3,-2,3} --This outputs a List of complexes, one in each Hochschild degree. --The homology of these complexes is actual KR homology. Mostly this function --just feeds into others. KR = K -> ( if K#?KR then return K#KR else ( if not K#?braid then error "no braid representation" else ( Kb=K#braid; P=K#nbcross=#Kb; Ka=apply(Kb,abs); Kt=apply(Kb,i->(i>0)); Ks=sort Ka; --error Ks; bind=K#bindex=last(Ks)+1; R=QQ[vars(1 .. 2*P+bind)]; Kmod = chainComplex( gradedModule(R^1)); Cvars=new MutableList from toList (0..bind); --error Cvars#3; for I from 0 to P-1 do ( Kmod=Kmod**KhMods(Cvars#(Ka_I)-1,Cvars#(Ka_I+1)-1,bind+2*I,R,Kt_I); Cvars#(Ka_I)=bind+2*I+1; Cvars#(Ka_I+1)=bind+2*I+2; ); Ml=toList (1..bind); M=matrix {apply(Ml, I-> R_(Cvars#I-1)-R_(I-1))}; KKR=Torify(Kmod,M); return KKR) ) ) --this function just makes the modules used in the complex above. KhMods = (H,I,J,S,W) -> ( Mp=S^1/ideal(S_H+S_I-S_J-S_(J+1),S_H*S_I-S_J*S_(J+1)); Np=S^{-1}/ideal(S_H-S_J,S_I-S_(J+1)); Mn=S^{1}/ideal(S_H+S_I-S_J-S_(J+1),S_H*S_I-S_J*S_(J+1)); Nn=S^{1}/ideal(S_H-S_J,S_I-S_(J+1)); if W then C=chainComplex(map(Mp,Np,(S_J-S_I))) else C=chainComplex(map(Nn,Mn))[1]; C) --these extend Macaulay2's ability to take tensor products and induced maps. ChainComplex ** Matrix := ChainComplexMap => (C,f) ->( map(C ** target f,C** source f,i -> id_(C_i)**f)) RingMap ** GradedModule := GradedModule => (f,C) -> ( D := new GradedModule; D#ring= target f; scan(spots C, i->D#i=f**C#i); D) inducedchainMap = (C,D,f) -> ( map( C,D,i->inducedMap(C_i,D_i) ) ) --This has input a chain complex C and output a list of the complexes --Tor^i(C,coker M), provided M is a regular sequence. Torify = (C,M) -> ( J:=rank source M; L:=(0..J); Lt=apply(L,I->( F:=koszul(I,M); G:=koszul(I+1,M); FB=C**F; GB=C**G; CB=source FB; H=inducedchainMap(ker FB,image GB,id_CB); E=coker H; E)); Lt) --input, a link. output, KR homology (as modules). this is less useful than you think, just because of the difficulty of reading the output. KRHom = K -> ( L:=KR(K); M:=apply(L,homology); N:=apply(M,prune); N) --This sends a chain complex to the list of degrees for which Macaulay2 remembers a module in it. spots = C -> select(keys C, i -> class i === ZZ) degrees(GradedModule) := Function => C -> ( i -> degrees C_i) --input, a knot K. output ((1-t)/(1+q*t))*(the graded Hilbert --polynomial of K). THIS CURRENTLY ONLY WORKS FOR KNOTS, NOT LINKS. KRpoly = K -> ( if K#?KRpoly then return K#KRpoly; L:=KRHom K; R:=ring L_0; Rn:=#generators R; S:=QQ[t]; f=map(S,R,apply(toList (1..Rn),i->t)); M:=apply(L, C -> f**C); N:=apply(M,degrees); K#KRdeg=N; Pring=QQ[q,s,t,Inverses=>true]; spoM:=sort (spots M_0); P:=sum(apply(toList (0..#M-1), i-> ( q^i*sum(apply(spoM, j-> ( s^j*sum(apply(flatten N_i j, k->t^k)) ) )) ) )); K#KRpoly=P//(q*t+1) K#KRpoly) KRdisp =K -> ( if not K#?KRdeg then KRpoly K; N=K#KRdeg; spoM=spots K#KRHom_0; net P || " " || ( " " || stack apply(spoM, net)) | " " | horizontalJoin between(" ", apply( toList (0..#M-1),i-> net i || stack( apply( spoM,j->net(flatten(N_i j)) ) ) ) ) )