forked from galettof/BEMultipliers
-
Notifications
You must be signed in to change notification settings - Fork 0
/
BEMultipliers.m2
326 lines (287 loc) · 9.74 KB
/
BEMultipliers.m2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
newPackage(
"BEMultipliers",
Version => "0.2",
Date => "August 24, 2019",
AuxiliaryFiles => false,
Authors => {{Name => "Federico Galetto",
Email => "[email protected]",
HomePage => "https://math.galetto.org"}},
HomePage => "https://github.com/galettof/BEMultipliers",
Headline => "Buchsbaum-Eisenbud multipliers of free resolutions",
PackageImports => {"SimpleDoc"}
)
export {
"buchsbaumEisenbudMultipliers",--method
"bem",--shortcut
"BEmults",--CacheTable key
--"exteriorDuality",--method
"dualMultiplier"--method
}
-------------------------------------------------------------------
-------------------------------------------------------------------
-- Exported methods
-------------------------------------------------------------------
-------------------------------------------------------------------
-- the following method computes Buchsbaum-Eisenbud
-- multipliers of a free resolution based on B-E's paper
-- "Some structure theorems for finite free resolutions"
-- The only difference is that in order to make each multiplier
-- homogeneous we give its domain the appropriate degree
bem = buchsbaumEisenbudMultipliers = method()
-- WARNING: currently no safety checks are implemented!
-- this computes up to the k-th multiplier and returns it
buchsbaumEisenbudMultipliers(ZZ,ChainComplex) := Matrix => (k,F) -> (
-- get the index of the last nonzero module of the resolution
n := max F;
while F_n == 0 do n = n-1;
if (k > n or k <= min F) then
error ("the first argument should be the homological
degree of the domain of a nonzero differential");
-- check if stored and return
if F.cache#?BEmults then (
if F.cache#BEmults#?k then return F.cache#BEmults#k;
)
-- otherwise create the hash tables to store results in cache
else (
F.cache#BEmults = new MutableHashTable;
);
-- now we start the actual computation
-- the a will house the next multiplier
-- the last multiplier is simply an exterior power
a := exteriorPower(rank F.dd_n,F.dd_n);
F.cache#BEmults#n = a;
-- i is a running index
i := n-1;
while (i >= k) do (
-- the G's are rank one modules generated in the
-- appropriate degree to make everything homogeneous.
-- in fact this G is the domain of the next multiplier a
G := exteriorPower(rank F_i,F_i);
-- this code doesn't use the diagram of B-E's paper
-- instead it uses its dual and accounts for degrees.
-- e's are the exterior powers of the differentials
e := (dual exteriorPower(rank F.dd_i,F.dd_i))**G;
-- next: change of basis using exterior duality
w := exteriorDuality(i,F);
c := (dual w)**G;
-- get next multiplier by factoring as in dual diagram
b := e // (c*a);
-- now dualize back and fix the degrees
a = dual (b ** (dual G));
F.cache#BEmults#i = a;
i = i-1;
);
return F.cache#BEmults#k;
)
-- this returns all multipliers in a list
buchsbaumEisenbudMultipliers(ChainComplex) := List => F -> (
-- get the index of the last nonzero module of the resolution
n := max F;
while F_n == 0 do n = n-1;
toList apply(min(F)+1..n,k->bem(k,F))
)
dualMultiplier = method(TypicalValue => Matrix)
-- returns the dual of a BE multiplier with the appropriate
-- degrees of domain and codomain (via twist by a rank one module)
dualMultiplier(ZZ,ChainComplex) := (k,F) -> (
G := exteriorPower(rank F_(k-1),F_(k-1));
((dual bem(k,F)) ** G) * exteriorDuality(k-1,F)
)
-------------------------------------------------------------------
-------------------------------------------------------------------
-- Unexported functions
-------------------------------------------------------------------
-------------------------------------------------------------------
-- u and v are complementary sublists of 0..n-1
-- this function counts the number of inversion to unshuffle u|v
numberOfInversions = (u,v) -> (
c := 0;
for j in v do (
for i in u do (
if j-i<0 then c=c+1;
);
);
return c;
)
-- we need the iso of free modules Wedge^i F->Wedge^j F^*
-- from the pairing Wedge^i F ** Wedge^j F->Wedge^(i+j) F
-- where F is free has rank i+j.
-- Because of the way M2 lists subsets, this matrix
-- has +/-1 on the antidiagonal, 0's elsewhere
-- where the sign depends on the number of inversions
-- of the sets indexing row and column
exteriorDuality = method(TypicalValue => Matrix)
-- this computes the duality as a matrix of free abelian groups
exteriorDuality(ZZ,ZZ) := (r,n) -> (
U := subsets(toList(0..n-1),r);
V := subsets(toList(0..n-1),n-r);
b := binomial(n,r);
M := mutableMatrix map(ZZ^b,ZZ^b,0);
for i to b-1 do (
M_(b-i-1,i) = (-1)^(numberOfInversions(U_i,V_(b-i-1)));
);
return matrix M;
)
-- this gives the duality for the k-th module in a free resolution
exteriorDuality(ZZ,ChainComplex) := (k,F) -> (
r := rank F.dd_k;
n := rank F_k;
-- need a rank one free module to approriately twist degrees
G := exteriorPower(n,F_k);
domain := exteriorPower(r,F_k);
codomain := exteriorPower(n-r,dual F_k) ** G;
M := promote(exteriorDuality(r,n),ring F);
map(codomain,domain,M)
)
-------------------------------------------------------------------
-------------------------------------------------------------------
-- Documentation
-------------------------------------------------------------------
-------------------------------------------------------------------
beginDocumentation()
doc ///
Key
BEMultipliers
Headline
Buchsbaum-Eisenbud multipliers of free resolutions
Description
Text
@EM "BEMultipliers"@ is a Macaulay2 package that
can be used to compute Buchsbaum-Eisenbud multipliers
of minimal free resolutions of modules over polynomial
rings as introduced in
@HREF("https://doi.org/10.1016/S0001-8708(74)80019-8",
"Buchsbaum, Eisenbud - Some structure theorems for
finite free resolutions")@.
///
doc ///
Key
BEmults
Headline
cache key for Buchsbaum-Eisenbud multipliers
Description
Text
When @TO "buchsbaumEisenbudMultipliers"@ is called to
compute Buchsbaum-Eisenbud multipliers of a resolution,
it stores the results of the computation in a
@TO "HashTable"@ in the cache of the resolution.
The key to access this information is @TT "BEmults"@.
///
doc ///
Key
buchsbaumEisenbudMultipliers
Headline
compute Buchsbaum-Eisenbud multipliers of a resolution
Description
Text
Use this method to compute Buchsbaum-Eisenbud
multipliers of a free resolution over a polynomial
ring.
///
doc ///
Key
"bem"
Headline
compute Buchsbaum-Eisenbud multipliers of a resolution
Description
Text
Use @TT "bem"@ as a synonym for @TO "buchsbaumEisenbudMultipliers"@.
///
doc ///
Key
(buchsbaumEisenbudMultipliers,ChainComplex)
Headline
compute Buchsbaum-Eisenbud multipliers of a resolution
Usage
buchsbaumEisenbudMultipliers(F)
Inputs
F:ChainComplex
Outputs
:List
Description
Text
Use this method to compute all Buchsbaum-Eisenbud
multipliers of a free resolution @TT "F"@ over a
polynomial ring. By default, Macaulay2 does not
check that @TT "F"@ is actually a resolution.
The output is a list containing all the
multipliers in increasing order.
The results of the computation are stored in the
cache of @TT "F"@ with the key @TO "BEmults"@.
Example
R=QQ[x,y,z]
K=koszul vars R
buchsbaumEisenbudMultipliers(K)
peek K.cache#BEmults
SeeAlso
BEmults
///
doc ///
Key
(buchsbaumEisenbudMultipliers,ZZ,ChainComplex)
Headline
return the k-th Buchsbaum-Eisenbud multiplier of a free resolution
Usage
buchsbaumEisenbudMultipliers(k,F)
Inputs
k:ZZ
F:ChainComplex
Outputs
:Matrix
Description
Text
Use this method to return a single Buchsbaum-Eisenbud
multiplier of a free resolution @TT "F"@ over a
polynomial ring. By default, Macaulay2 does not
check that @TT "F"@ is actually a resolution.
Note that the definition of the multipliers is
recursive, so all the previous ones are computed as
well (and stored).
The output is the matrix of the k-th multiplier.
Example
R=QQ[x,y,z]
K=koszul vars R
buchsbaumEisenbudMultipliers(2,K)
peek K.cache#BEmults
SeeAlso
BEmults
///
doc ///
Key
dualMultiplier
(dualMultiplier,ZZ,ChainComplex)
Headline
compute the dual of a Buchsbaum-Eisenbud multiplier
Usage
dualMultiplier(k,F)
Inputs
k:ZZ
F:ChainComplex
Outputs
:Matrix
Description
Text
Use this method to compute the dual of a
Buchsbaum-Eisenbud multipliers of a free
resolution over a polynomial ring. The dual of a
multiplier is the dual as a module homomorphism but
shifted in the appropriate degree. This is necessary
in order to make the commutative diagram of the
First Structure Theorem of Buchsbaum and Eisenbud
a diagram of graded modules.
Example
R=QQ[x,y,z]
K=koszul vars R
dualMultiplier(3,K)
Text
We can use the dual of a multiplier to check the
First Structure Theorem holds.
Example
exteriorPower(rank K.dd_2,K.dd_2) == bem(2,K) * dualMultiplier(3,K)
exteriorPower(rank K.dd_1,K.dd_1) == bem(1,K) * dualMultiplier(2,K)
///
end
uninstallPackage "BEMultipliers"
restart
installPackage "BEMultipliers"
viewHelp