Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Download

n environment to decompose the i-th Hochschild cohomology on some homogeneous varieties X=G/P by Hoschild-Kostant-Rosenberg.

383 views
License: GPL3
ubuntu2204
1
2
3
# This file was *autogenerated* from the file base_space.sage
4
from sage.all_cmdline import * # import sage library
5
6
_sage_const_1 = Integer(1); _sage_const_2 = Integer(2); _sage_const_3 = Integer(3); _sage_const_6 = Integer(6); _sage_const_8 = Integer(8); _sage_const_4 = Integer(4); _sage_const_0 = Integer(0); _sage_const_7 = Integer(7)
7
from typing import Iterator
8
9
10
11
class irreducible_Cartan_group ( object ) :
12
13
14
ADMISSIBLE_CARTAN_FAMILIES = { 'A' : ( _sage_const_1 , +infinity ) ,
15
'B' : ( _sage_const_2 , +infinity ) ,
16
'C' : ( _sage_const_2 , +infinity ) ,
17
'D' : ( _sage_const_3 , +infinity ) ,
18
'E' : ( _sage_const_6 , _sage_const_8 ) ,
19
'F' : ( _sage_const_4 , _sage_const_4 ) ,
20
'G' : ( _sage_const_2 , _sage_const_2 )
21
}
22
23
24
def __eq__ ( self , other ) -> bool :
25
"""Tests if ``self`` coincides with ``other``."""
26
assert isinstance( other , irreducible_Cartan_group ) , 'The input for ``other`` needs to be an irreducible Cartan group.'
27
return self.__repr__() == other.__repr__()
28
29
30
31
def __init__ ( self , Cartan_family:str , Cartan_degree:sage.rings.integer.Integer ) -> None :
32
"""Initialise ``self``."""
33
assert Cartan_family in self.ADMISSIBLE_CARTAN_FAMILIES.keys() , ValueError('The input for ``Cartan_family`` needs to be a letter from the alphabet '+str(self.ADMISSIBLE_CARTAN_FAMILIES.keys())+'.')
34
self._Cartan_family = Cartan_family
35
36
assert Cartan_degree in ZZ , ValueError('The input for ``Cartan_degree`` needs to be an integer.')
37
lower_bound , upper_bound = self.ADMISSIBLE_CARTAN_FAMILIES[Cartan_family]
38
assert lower_bound <= Cartan_degree and Cartan_degree <= upper_bound , ValueError('If the Cartan family is '+str(Cartan_family)+', then the input for ``Cartan_degree`` needs to between '+str(lower_bound)+' and '+str(upper_bound)+'.')
39
self._Cartan_degree = Cartan_degree
40
41
42
def __neq__ ( self , other ) -> bool :
43
"""Tests if ``self`` does NOT coincides with ``other``."""
44
return not self == other
45
46
47
def __repr__ ( self ) -> tuple[ str , sage.rings.integer.Integer ] :
48
"""Returns a developers adjusted description."""
49
return self._Cartan_family , self._Cartan_degree
50
51
52
def __str__ ( self ) -> str :
53
"""Returns a human-readable description."""
54
return self._Cartan_family+'_'+str(self._Cartan_degree)
55
56
57
def __truediv__ ( self , other:'maximal_parabolic_subgroup' ) -> 'minimal_irreducible_homogeneous_variety' :
58
"""Returns the minimal irreducible homogeneous variety X=G/P."""
59
assert isinstance( other , maximal_parabolic_subgroup ) , 'The input for ``other`` needs to be a minimal parabolic subgroup.'
60
61
assert self == other._parent_group , 'The parent group of ``other`` needs to be self.'
62
63
return minimal_irreducible_homogeneous_variety( parabolic_subgroup=other )
64
65
66
def Cartan_string ( self ) -> str :
67
"""Returns the Cartan string ``_Cartan_family``+``_Cartan_degree``."""
68
return self._Cartan_family+str(self._Cartan_degree)
69
70
71
def Cartan_type ( self ) -> 'sage.combinat.root_system.type_A.CartanType' or 'sage.combinat.root_system.type_B.CartanType' or 'sage.combinat.root_system.type_D.CartanType' or 'sage.combinat.root_system.type_E.CartanType' or 'sage.combinat.root_system.type_E.CartanType' or 'sage.combinat.root_system.type_F.CartanType' or 'sage.combinat.root_system.type_G.CartanType' :
72
"""Returns the associated Cartan type."""
73
return CartanType( self.Cartan_string() )
74
75
76
def dimension ( self ) -> sage.rings.integer.Integer :
77
"""
78
Return the dimension of ``self`.
79
80
INPUT:
81
- ``self`` -- minimal_irreducible_homogeneous_variety; base space X=G/P.
82
83
OUTPUT:
84
- ``Output`` -- Integer; the dimension of X=G/P
85
86
ALGORITHM:
87
Thanks to the post by Pieter Belmans concerning the dimension of partial flag varieties
88
from Jun 14th, 2017 on his blog (cf. to [Blog_PieterBelmans]_). The link is
89
https://pbelmans.ncag.info/blog/2017/06/14/dimensions-of-partial-flag-varieties/
90
(Date: Apr 21st, 2021).
91
92
For the Borel group B ⊂ G: dim B = # of positive roots + rank (which accounts for the center)
93
For G: dim G = # of roots in the root system + rank (which accounts for the center)
94
i.e. # of roots in the root system = # of positive roots + # negative roots
95
and # of positive roots = # negative roots
96
so # of roots in the root system = 2 * # of positive roots
97
98
REFERENCE:
99
[Blog_PieterBelmans] https://pbelmans.ncag.info/blog/
100
"""
101
rank = self.Cartan_type().dynkin_diagram().rank()
102
number_of_positive_roots = len( list( self.Cartan_type().root_system().root_lattice().positive_roots() ) )
103
return rank + _sage_const_2 *number_of_positive_roots
104
105
106
def parabolic_subgroup ( self , excluded_node:sage.rings.integer.Integer ) -> 'maximal_parabolic_subgroup' :
107
"""Returns a maximal parabolic subgroup associated to a given excluded node."""
108
return maximal_parabolic_subgroup( parent_group=self , excluded_node=excluded_node )
109
110
111
def Weyl_character_ring( self ) -> 'sage.combinat.root_system.weyl_characters.WeylCharacterRing_with_category' :
112
"""Returns the associated Weyl character ring."""
113
return WeylCharacterRing( self.Cartan_type() , style='coroots' )
114
115
116
def Weyl_group( self ) -> 'sage.combinat.root_system.weyl_group.WeylGroup_gens_with_category' :
117
"""Returns the associated Weyl group."""
118
return WeylGroup( self.Cartan_type() )
119
120
121
122
class maximal_parabolic_subgroup ( object ) :
123
124
125
def __eq__ ( self , other ) -> bool :
126
"""Tests if ``self`` coincides with ``other``."""
127
assert isinstance( other , maximal_parabolic_subgroup ) , 'The input for ``other`` needs to be an irreducible Cartan group.'
128
return self.__repr__() == other.__repr__()
129
130
131
def __init__ ( self , parent_group:irreducible_Cartan_group , excluded_node:sage.rings.integer.Integer ) :
132
"""Initialise ``self``."""
133
assert isinstance( parent_group , irreducible_Cartan_group ) , ValueError('The input for ``parent_group`` needs to be an irreducible Cartan group.')
134
self._parent_group = parent_group
135
136
assert excluded_node in ZZ , ValueError('The input for ``excluded_node`` needs to be an integer.')
137
assert excluded_node in (ellipsis_range( _sage_const_1 ,Ellipsis, self._parent_group._Cartan_degree )) , ValueError('The input for ``excluded_node`` needs to be in the range from 1 to '+str(self._Cartan_degree)+'.')
138
self._excluded_node = excluded_node
139
140
141
def __neq__ ( self , other ) -> bool :
142
"""Tests if ``self`` does NOT coincides with ``other``."""
143
return not self == other
144
145
146
def __repr__ ( self ) -> tuple[ irreducible_Cartan_group , sage.rings.integer.Integer ] :
147
"""Returns a developers adjusted description."""
148
return self._parent_group , self._excluded_node
149
150
151
def __str__ ( self ) -> str :
152
"""Returns a human-readable description."""
153
return 'P_'+str(self._excluded_node)
154
155
156
def dimension ( self ) -> sage.rings.integer.Integer :
157
"""
158
Return the dimension of ``self`.
159
160
INPUT:
161
- ``self`` -- minimal_irreducible_homogeneous_variety; base space X=G/P.
162
163
OUTPUT:
164
- ``Output`` -- Integer; the dimension of X=G/P
165
166
ALGORITHM:
167
Thanks to the post by Pieter Belmans concerning the dimension of partial flag varieties
168
from Jun 14th, 2017 on his blog (cf. to [Blog_PieterBelmans]_). The link is
169
https://pbelmans.ncag.info/blog/2017/06/14/dimensions-of-partial-flag-varieties/
170
(Date: Apr 21st, 2021).
171
172
For the Borel group B ⊂ G: dim B = # of positive roots + rank (which accounts for the center)
173
For P: dim P = dim B + # of negative roots which are added to construct P
174
175
REFERENCE:
176
[Blog_PieterBelmans] https://pbelmans.ncag.info/blog/
177
"""
178
rank = self._parent_group.Cartan_type().dynkin_diagram().rank()
179
number_of_positive_roots = len( list( self._parent_group.Cartan_type().root_system().root_lattice().positive_roots() ) )
180
negative_roots = [ negative_root for negative_root in list( self._parent_group.Cartan_type().root_system().root_lattice().negative_roots() )
181
if not False in [ node != self._excluded_node for node , coefficient in negative_root ]
182
]
183
number_of_available_negative_roots = len( negative_roots )
184
return rank + number_of_positive_roots + number_of_available_negative_roots
185
186
187
def included_nodes ( self ) -> list[ sage.rings.integer.Integer ] :
188
"""Returns list of included nodes."""
189
return [ node for node in (ellipsis_range( _sage_const_1 ,Ellipsis, self._parent_group._Cartan_degree )) if node != self._excluded_node ]
190
191
192
193
class minimal_irreducible_homogeneous_variety ( object ) :
194
195
def __eq__ ( self , other ) -> bool :
196
"""Tests if ``self`` coincides with ``other``."""
197
assert isinstance( other , minimal_irreducible_homogeneous_variety ) , 'The input for ``other`` needs to be an irreducible Cartan group.'
198
return self.__repr__() == other.__repr__()
199
200
201
def __init__ ( self , parabolic_subgroup:maximal_parabolic_subgroup ) -> None :
202
"""Initialise ``self``."""
203
assert isinstance( parabolic_subgroup , maximal_parabolic_subgroup ) , ValueError('The input for ``parabolic_subgroup`` needs to be a maximal parabolic subgroup.')
204
self._parabolic_subgroup = parabolic_subgroup
205
206
207
def __neq__ ( self , other ) -> bool :
208
"""Tests if ``self`` does NOT coincides with ``other``."""
209
return not self == other
210
211
212
def __repr__ ( self ) -> maximal_parabolic_subgroup :
213
"""Returns a developers adjusted description."""
214
return self._parabolic_subgroup
215
216
217
def __str__ ( self ) -> str :
218
"""Returns a human-readable description."""
219
return str(self._parabolic_subgroup._parent_group)+'/'+str(self._parabolic_subgroup)
220
221
222
def dimension ( self ) -> sage.rings.integer.Integer :
223
"""
224
Return the dimension of ``self`.
225
226
INPUT:
227
- ``self`` -- minimal_irreducible_homogeneous_variety; base space X=G/P.
228
229
OUTPUT:
230
- ``Output`` -- Integer; the dimension of X=G/P
231
232
ALGORITHM:
233
For X=G/P, dim X = dim G - dim P
234
"""
235
return self._parabolic_subgroup._parent_group.dimension() - self._parabolic_subgroup.dimension()
236
237
238
def Fano_index ( self ) -> sage.rings.integer.Integer :
239
"""
240
Returns the Fano index of ``self``.
241
242
INPUT:
243
- ``self`` -- minimal_irreducible_homogeneous_variety; base space X=G/P.
244
245
OUTPUT:
246
- ``Fano_index`` -- integer; index associated to X = G/P.
247
248
ALGORITHM:
249
Thanks to the post by Pieter Belmans concerning the index of partial flag varieties
250
from Aug 23rd, 2018 on his blog (cf. to [Blog_PieterBelmans]_). The link is
251
https://pbelmans.ncag.info/blog/2018/08/23/index-partial-flag-varieties/
252
(Date: Apr 26th, 2021).
253
254
The index, i.e. for X=G/P (P maximal), we have Pic(X) ≅ ZZ⋅O_X(1) and therefore define the index as the integer i
255
such that ω∨_X ≅ O_X(1) ⊗ i.
256
257
To compute it, we use lemma 2.19 and remark 2.20 of [KP2016]. Combined they say the following:
258
Let β be the simple root corresponding to the chosen maximal parabolic subgroup P, and ξ the associated
259
fundamental weight. Let ¯β be the maximal root of the same length as β such that the coefficient of β
260
in the expression of ¯β is 1.
261
Then the index of G/P equals i_G/P = (ρ,β+¯β)/(ξ,β).
262
263
REFERENCE:
264
[Blog_PieterBelmans] https://pbelmans.ncag.info/blog/
265
[KP2016] Kuznetsov, Alexander; Polishchuk, Alexander Exceptional collections on isotropic Grassmannians.
266
J. Eur. Math. Soc. (JEMS) 18 (2016), no. 3, 507–574.
267
"""
268
root_lattice = self._parabolic_subgroup._parent_group.Cartan_type().root_system().root_lattice()
269
ambient_space = self._parabolic_subgroup._parent_group.Cartan_type().root_system().ambient_space()
270
beta = root_lattice.simple_root(self._parabolic_subgroup._excluded_node).to_ambient() # The simple root associated to ``excluded_node``
271
xi = ambient_space.fundamental_weight(self._parabolic_subgroup._excluded_node) # The fundamental weight associated to ``excluded_node``
272
rho = ambient_space.rho() # Sum of fundamental weights
273
length = beta.dot_product(beta)
274
beta_bar = [ alpha for alpha in root_lattice.roots()
275
if alpha.coefficient(self._parabolic_subgroup._excluded_node) == _sage_const_1 and alpha.to_ambient().dot_product(alpha.to_ambient()) == length
276
][-_sage_const_1 ].to_ambient()
277
# The maximal root of the same length as ``beta`` such that the coefficient of ``beta`` in the expression of ``beta_bar`` is 1.
278
Fano_index = rho.dot_product(beta + beta_bar) / xi.dot_product(beta)
279
return Fano_index
280
281
282
def Kostant_space ( self , i:sage.rings.integer.Integer , j:sage.rings.integer.Integer , restriction:str or None =None ) -> Iterator[ 'sage.combinat.root_system.weight_space.WeightSpace_with_category.element_class' ] :
283
"""
284
Returns the K(G,P,i,j) as introduced in [BS2023].
285
286
INPUT:
287
- ``self`` -- minimal_irreducible_homogeneous_variety, base space X=G/P.
288
- ``i`` -- integer.
289
- ``j`` -- integer.
290
- ``restriction`` -- string.
291
292
OUTPUT:
293
- ``Weight`` -- sage.combinat.root_system.weight_space.WeightSpace_with_category.element_class; highest weight corresponding to irreducible summand in K(G,P,i,j).
294
295
296
REFERENCE:
297
[BS2023] Belmans, Pieter; Smirnov, Maxim. Hochschild cohomology of generalised Grassmannians.
298
"""
299
# basis
300
fw = dict( self._parabolic_subgroup._parent_group.Cartan_type().root_system().weight_space().fundamental_weights() )
301
rho = sum(list(fw.values())) # sum of fundamental weights
302
ambt = { node : vector( QQ , (node-_sage_const_1 )*[ _sage_const_0 ] + [ _sage_const_1 ] + (self._parabolic_subgroup._parent_group._Cartan_degree-node)*[ _sage_const_0 ] )
303
for node in (ellipsis_range( _sage_const_1 ,Ellipsis, self._parabolic_subgroup._parent_group._Cartan_degree ))
304
}
305
base_change = matrix( QQ , [ sum([ omega.to_ambient()[node-_sage_const_1 ]*e for node , e in ambt.items() ])
306
for omega in fw.values()
307
]
308
).transpose().inverse() # Cartan matrix describing base change from ambt to fw
309
# Weyl group
310
WG = self._parabolic_subgroup._parent_group.Weyl_group()
311
sr = WG.simple_reflections()
312
# Weyl character ring
313
WCR = self._parabolic_subgroup._parent_group.Weyl_character_ring()
314
315
# integer invariants
316
dimension = self.dimension() # dimension
317
Fano_index = self.Fano_index() # Fano index
318
319
for Weyl_element , reduced_description in self.Weyl_group_coset_representatives_of_minimal_length() :
320
if len(reduced_description) == dimension-i :
321
# See (1.7): Weight = WeylElement \cdot 0 + ( FanoIndex + j ) * fw[k]
322
result = Weyl_element.action(rho.to_ambient()) - rho.to_ambient() + (Fano_index+j)*fw[self._parabolic_subgroup._excluded_node].to_ambient()
323
vector_with_respect_to_ambt_basis = vector( QQ , [ result.coefficient(node) for node in range(self._parabolic_subgroup._parent_group._Cartan_degree) ] )
324
vector_with_respect_to_fw_basis = base_change*vector_with_respect_to_ambt_basis
325
weight = sum([ coefficient*fw[node] for node , coefficient in enumerate( vector_with_respect_to_fw_basis , start=_sage_const_1 ) ])
326
327
if restriction in [ None , 'None' , 'none' , '' ] :
328
yield weight
329
elif restriction in [ 'Regular' , 'regular' , 'Reg' , 'reg' , 'Non-Singular' , 'non-singular' , 'Non-Sing' , 'non-sing' ] :
330
if self.is_regular( weight+rho ) : yield weight
331
else :
332
raise ValueError('The input for ``restriction`` is anppropriate.')
333
334
335
def is_adjoint ( self ) -> bool :
336
"""Tests if ``self`` is adjoint (cf. grassmannian.info)"""
337
if self._parabolic_subgroup._parent_group._Cartan_family == 'B' : return self._parabolic_subgroup._excluded_node == _sage_const_2
338
elif self._parabolic_subgroup._parent_group._Cartan_family == 'C' : return self._parabolic_subgroup._excluded_node == _sage_const_1
339
elif self._parabolic_subgroup._parent_group._Cartan_family == 'D' : return self._parabolic_subgroup._excluded_node == _sage_const_2 and _sage_const_4 <= self._parabolic_subgroup._parent_group._Cartan_degree
340
elif self._parabolic_subgroup._parent_group._Cartan_family == 'E' : return ( self._parabolic_subgroup._excluded_node == _sage_const_2 and self._parabolic_subgroup._parent_group._Cartan_degree == _sage_const_6 ) or ( self._parabolic_subgroup._excluded_node == _sage_const_1 and self._parabolic_subgroup._parent_group._Cartan_degree == _sage_const_7 ) or ( self._parabolic_subgroup._excluded_node == _sage_const_8 and self._parabolic_subgroup._parent_group._Cartan_degree == _sage_const_8 )
341
elif self._parabolic_subgroup._parent_group._Cartan_family == 'F' : return self._parabolic_subgroup._excluded_node == _sage_const_1 and self._parabolic_subgroup._parent_group._Cartan_degree == _sage_const_4
342
elif self._parabolic_subgroup._parent_group._Cartan_family == 'G' : return self._parabolic_subgroup._excluded_node == _sage_const_2 and self._parabolic_subgroup._parent_group._Cartan_degree == _sage_const_2
343
else : return False
344
345
346
def is_exceptional ( self ) -> bool :
347
"""Test if the Cartan family of ``self`` is out of [ E , F , G ]."""
348
return self._parabolic_subgroup._parent_group.ADMISSIBLE_CARTAN_FAMILIES[self._parabolic_subgroup._parent_group._Cartan_family][_sage_const_1 ] < +infinity
349
350
351
def is_ordinary ( self ) -> bool :
352
"""Test if the Cartan family of ``self`` is out of [ A , B , C , D ]."""
353
return not self.is_exceptional()
354
355
356
def is_regular ( self , weight:'sage.combinat.root_system.weight_space.WeightSpace_with_category.element_class' ) -> bool :
357
"""Tests if a given weight on ``self`` is G-regular (i.e. does not ly on a wall of a Weyl chamber)."""
358
return not self.is_singular( weight )
359
360
361
def is_singular ( self , weight:'sage.combinat.root_system.weight_space.WeightSpace_with_category.element_class' ) -> bool :
362
"""Tests if a given weight on ``self`` is G-singular (i.e. lies on a wall of a Weyl chamber)."""
363
assert weight in self._parabolic_subgroup._parent_group.Cartan_type().root_system().weight_space() , ValueError('The weight must be an element of the weight space: '+str(self._parabolic_subgroup._parent_group.Cartan_type().root_system().weight_space()))
364
# Move ``Weight`` to dominant chamber
365
weight_in_dominant_chamber = weight.to_dominant_chamber()
366
# Consider list of reflections of ``weight`` and check whether ``weight`` is invariant under some reflection
367
reflections = [ weight_in_dominant_chamber.simple_reflection( index ) for index in self._parabolic_subgroup._parent_group.Cartan_type().index_set() ]
368
return weight_in_dominant_chamber in reflections
369
370
371
def Weyl_group_coset_representatives_of_minimal_length ( self ) -> Iterator[ tuple[ 'sage.combinat.root_system.weyl_group.WeylGroup_gens_with_category.element_class' , list ] ] :
372
"""Returns the Weyl group coset representatives of minimal length"""
373
WG = self._parabolic_subgroup._parent_group.Weyl_group()
374
sr = WG.simple_reflections()
375
identity = sr[_sage_const_1 ]*(sr[_sage_const_1 ].inverse())
376
377
stock = [ [ i+_sage_const_1 for i in w._reduced_word ] for w in WeylGroup( self._parabolic_subgroup._parent_group.Cartan_type() , implementation='permutation' ).iteration('breadth',True) ]
378
stock = [ ( prod([ identity ] + [ sr[node] for node in reduced_description ]) , reduced_description ) for reduced_description in stock ]
379
380
for Weyl_element_0 , reduced_description_0 in stock :
381
length_0 = len(reduced_description_0)
382
383
Weyl_element_0_is_coset_representaion_of_minimal_length = True
384
for node in self._parabolic_subgroup.included_nodes() :
385
Weyl_element_1 = sr[node]*Weyl_element_0
386
387
for Weyl_element , reduced_description in stock :
388
if Weyl_element_1 == Weyl_element :
389
reduced_description_1 = reduced_description
390
length_1 = len(reduced_description_1)
391
break
392
393
if length_1 != length_0+_sage_const_1 :
394
Weyl_element_0_is_coset_representaion_of_minimal_length = False
395
break
396
397
if Weyl_element_0_is_coset_representaion_of_minimal_length :
398
yield Weyl_element_0 , reduced_description_0
399
400
401