00001 /*! 00002 \file 00003 \brief Class definition and function declarations for CartanClassSet. 00004 */ 00005 00006 /* 00007 This is cartanset.h 00008 00009 Copyright (C) 2004,2005 Fokko du Cloux 00010 part of the Atlas of Reductive Lie Groups 00011 00012 See file main.cpp for full copyright notice 00013 */ 00014 00015 #ifndef CARTANSET_H /* guard against multiple inclusions */ 00016 #define CARTANSET_H 00017 00018 #include "cartanset_fwd.h" 00019 #include "rootdata_fwd.h" 00020 #include "complexredgp.h" 00021 00022 #include "bitmap.h" 00023 #include "cartanclass.h" 00024 #include "poset.h" 00025 #include "realform.h" 00026 #include "weyl.h" 00027 00028 /******** function declarations **********************************************/ 00029 00030 namespace atlas { 00031 00032 namespace cartanset { 00033 00034 unsigned long blockSize(realform::RealForm, realform::RealForm, 00035 const CartanClassSet&); 00036 00037 unsigned long kgbSize(realform::RealForm, const CartanClassSet&); 00038 00039 void cayley_and_cross_part(rootdata::RootList& cayley, 00040 weyl::WeylWord& cross, 00041 const weyl::TwistedInvolution& tw, 00042 const rootdata::RootDatum& rd, 00043 const weyl::WeylGroup& W); 00044 } 00045 00046 /******** type definitions ***************************************************/ 00047 00048 namespace cartanset { 00049 00050 using weyl::TwistedInvolution; 00051 using weyl::TwistedInvolutionList; 00052 00053 /*! 00054 \brief Stores the set of stable conjugacy classes of Cartan subgroups of G. 00055 00056 Each stable conjugacy classes of Cartan subgroups corresponds to a W-conjugacy 00057 class of involutions in the Gamma-enlarged Weyl group (W semidirect <Gamma>, 00058 where <Gamma>=Z/2Z acts on W), contained in the complement of its subgroup W. 00059 Since such involutions are of the form (w,Gamma), they can be represented by 00060 their element w, which is called a twisted involution. The condition for being 00061 a twisted involution $t$ is $t\Gamma(t)=e$ and "twisted conjugacy" of $t$ by 00062 \f$w\in W\f$ is given by \f$w\cdot t=wt\Gamma(w^{-1})\f$. The stable conjugacy classes 00063 of Cartan subgroups will each be represented by a canonical representative of 00064 the corresponding twisted conjugacy class of twisted involutions. 00065 00066 In addition to describing the set of Cartan classes, this class provides 00067 access (via the |d_cartan| array) to data for each individual one of them, and 00068 (via |d_ordering|) to the partial order relation between them. For the latter, 00069 let |tau_i| be involutions acting on the complex torus |H| for various classes 00070 of Cartan subgroups; (H,tau_1) is considered "more compact" than (H,tau_2) 00071 if the identity component of the fixed point set H^tau_2 is W-conjugate to a 00072 subtorus of H^tau_1. 00073 00074 The problem for the dual group of G is identical, the bijection taking 00075 the negative transpose of a twisted involution. This bijection 00076 reverses the partial order on Cartans. The class provides also access 00077 to Cartans in the dual group. 00078 */ 00079 00080 class CartanClassSet { 00081 00082 /*! 00083 \brief The inner class to which we are associated (and accessed from) 00084 */ 00085 const complexredgp::ComplexReductiveGroup& d_parent; 00086 00087 /*! 00088 \brief List of stable conjugacy classes of Cartan subgroups. 00089 00090 The list includes only Cartans appearing in real forms considered so far. 00091 */ 00092 std::vector<cartanclass::CartanClass*> d_cartan; 00093 00094 /*! 00095 \brief (Representative) twisted involutions for each class of Cartan 00096 subgroup. Choice at |j| must match corresponding |cartan(j).involution()| 00097 00098 In this version the representative involutions are the canonical ones. 00099 They satisfy: 00100 00101 (1) the sum of the positive real roots is dominant (call it $SR$) 00102 (2) in the subsystem of roots orthogonal to $SR$, which contains all the 00103 imaginary roots, the sum of the imaginary roots is dominant for the 00104 subsystem (call it $SI$) 00105 (3) in the subsystem of roots orthogonal to both $SR$ and $SI$, the 00106 involution corresponding to twisted involution fixes (globally) the 00107 dominant chamber of the subsystem (it permutes its simple roots). 00108 */ 00109 TwistedInvolutionList d_twistedInvolution; 00110 00111 /*! 00112 \brief Partial order of Cartan subgroups. 00113 00114 This is the ordering by containment of H^theta up to conjugacy: (H,theta_1) 00115 precedes (H,theta_2) if (H^theta_2)_0 is W-conjugate to a subtorus of 00116 H^theta_1. Numbering of elements is as in d_twistedInvolution 00117 */ 00118 poset::Poset d_ordering; 00119 00120 /*! 00121 \brief Fiber class for the fundamental Cartan subgroup. 00122 00123 The involution is delta, which is stored here. It permutes the simple roots. 00124 */ 00125 cartanclass::Fiber d_fundamental; 00126 00127 /*! 00128 \brief Fiber class for the fundamental Cartan in the dual group. 00129 00130 The fiber group here is the group of characters (i.e., the dual group) 00131 of the component group of the quasisplit Cartan. 00132 */ 00133 cartanclass::Fiber d_dualFundamental; 00134 00135 /*! 00136 \brief Entry \#n lists the real forms in which Cartan \#n is defined. 00137 00138 More precisely, d_realFormLabels[n][i] is the inner number of the real form 00139 that corresponds to part i of the partition cartan(n).fiber().weakReal() 00140 00141 */ 00142 std::vector<realform::RealFormList> d_realFormLabels; 00143 00144 /*! 00145 \brief Entry \#n lists the dual real forms in which dual Cartan \#n 00146 is defined. 00147 00148 More precisely, d_dualRealFormLabels[n][i] is the inner number of the dual 00149 real form that corresponds to part i of the partition 00150 cartan(n).dualFiber().weakReal() 00151 */ 00152 std::vector<realform::RealFormList> d_dualRealFormLabels; 00153 00154 /*! 00155 \brief Entry \#rf flags the Cartans defined in real form \#rf. 00156 */ 00157 std::vector<bitmap::BitMap> d_support; 00158 00159 /*! 00160 \brief Entry \#rf flags the dual Cartans defined in dual real form \#rf. 00161 */ 00162 std::vector<bitmap::BitMap> d_dualSupport; 00163 00164 /*! 00165 \brief Flags the set of real forms for which the full set of Cartan 00166 classes is constructed. 00167 00168 Because of the way the construction proceeds, these are exactly the 00169 real forms for which the most split Cartan has been reached. 00170 */ 00171 bitmap::BitMap d_status; 00172 00173 /*! 00174 \brief Entry \#rf is the number of the most split Cartan for real form \#rf. 00175 */ 00176 std::vector<size_t> d_mostSplit; 00177 00178 /*! 00179 \brief Entry \#j is the sum of the positive real roots for 00180 d_twistedInvolution[j]. 00181 00182 [Not yet implemented ] 00183 */ 00184 // std::vector<latticetypes::LatticeElt> d_PosRealRootSum; 00185 00186 /*! 00187 \brief Entry \#j is intended to flag the imaginary roots for 00188 d_twistedInvolution[j]. 00189 00190 [Not yet implemented. DV 8/5/06.] 00191 */ 00192 // rootdata::RootSetList d_imaginary; 00193 00194 /*! 00195 \brief Entry \#j is intended to flag the simple imaginary roots for 00196 d_twistedInvolution[j]. 00197 00198 [Not yet implemented. DV 8/5/06.] 00199 */ 00200 // rootdata::RootSetList d_simple_imaginary; 00201 00202 public: 00203 00204 // constructors and destructors 00205 00206 // the main and only constructor 00207 CartanClassSet(const complexredgp::ComplexReductiveGroup& parent, 00208 const latticetypes::LatticeMatrix& distinguished); 00209 00210 ~CartanClassSet(); 00211 00212 // copy, assignment and swap 00213 00214 /* the copy constructor and assignment are forbidden, since a copy would point 00215 to the parent without reciprocal relation. If a need to copy or assign 00216 |ComplexReductiveGroup| objects should arise, this should be implemented 00217 using the pseudo copy-constructor declared below (but as yet undefined). 00218 For similar reasons, a swap operation should not be defined. 00219 */ 00220 00221 private: 00222 CartanClassSet(const CartanClassSet&); 00223 CartanClassSet& operator= (const CartanClassSet&); 00224 00225 public: 00226 // pseudo copy-constructor that provides a new parent for the copy 00227 CartanClassSet(const complexredgp::ComplexReductiveGroup& parent, 00228 const CartanClassSet&); 00229 00230 // accessors 00231 00232 /*! 00233 \brief Returns data for stable conjugacy class \#cn of Cartan subgroups. 00234 */ 00235 const cartanclass::CartanClass& cartan(size_t cn) const { 00236 return *d_cartan[cn]; 00237 } 00238 00239 /*! 00240 \brief Recover the matrix of the involution for the fundamental Cartan. 00241 00242 This is the one permuting the simple roots, the distinguished one among the 00243 involutions in this inner class of G. 00244 */ 00245 const latticetypes::LatticeMatrix& distinguished() const { 00246 return d_fundamental.involution(); 00247 } 00248 00249 /*! 00250 \brief Matrix of involution for the fundamental Cartan in the dual 00251 group. 00252 00253 This is -w_0 times the transpose of the fundamental involution. 00254 */ 00255 const latticetypes::LatticeMatrix& dualDistinguished() const { 00256 return d_dualFundamental.involution(); 00257 } 00258 00259 /*! 00260 \brief The size of the fiber orbits corresponding to strong real forms lying 00261 over weak real form \#rf, in cartan \#cn (all orbits have the same size) 00262 00263 Precondition: Real form \#rf is defined for cartan \#cn. 00264 */ 00265 unsigned long fiberSize(realform::RealForm rf, size_t cn) const; 00266 00267 /*! 00268 \brief Fiber class for the fundamental Cartan subgroup. 00269 00270 The involution is delta, which preserves the simple roots. 00271 */ 00272 const cartanclass::Fiber& fundamental() const { 00273 return d_fundamental; 00274 } 00275 00276 unsigned long dualFiberSize(realform::RealForm, size_t) const; 00277 00278 /*! 00279 \brief Fiber class for the fundamental Cartan in the dual group. 00280 00281 The fiber group here is the group of characters of the component 00282 group of the quasisplit Cartan. 00283 */ 00284 const cartanclass::Fiber& dualFundamental() const { 00285 return d_dualFundamental; 00286 } 00287 00288 /*! 00289 \brief Tells whether Cartan \#cn is defined in real form \#rf. 00290 */ 00291 bool isDefined(realform::RealForm rf, size_t cn) const { 00292 return d_support[rf].isMember(cn); 00293 } 00294 00295 /*! 00296 \brief Entry \#rf is the number of the most split Cartan for real form \#rf. 00297 */ 00298 size_t mostSplit(realform::RealForm rf) const { 00299 return d_mostSplit[rf]; 00300 } 00301 00302 /*! 00303 \brief Returns the set of noncompact imaginary roots for (the representative 00304 in the adjoint fiber of) the real form \#rf. 00305 */ 00306 rootdata::RootSet noncompactRoots(realform::RealForm rf) const 00307 { 00308 return 00309 d_fundamental.noncompactRoots(d_fundamental.weakReal().classRep(rf)); 00310 } 00311 00312 /*! 00313 \brief Returns the number of stable conjugacy classes of Cartans for G. 00314 */ 00315 size_t numCartan() const { 00316 return d_cartan.size(); 00317 } 00318 00319 /*! 00320 \brief Returns the number of weak real forms of the dual group of G. 00321 */ 00322 size_t numDualRealForms() const { 00323 return d_dualFundamental.numRealForms(); 00324 } 00325 00326 /*! 00327 \brief Returns the number of weak real forms of the dual group for 00328 which the dual of Cartan \#cn is defined. 00329 */ 00330 size_t numDualRealForms(size_t cn) const { 00331 return d_cartan[cn]->numDualRealForms(); 00332 } 00333 00334 size_t numInvolutions() const; 00335 size_t numInvolutions(const bitmap::BitMap& Cartan_classes) const; 00336 00337 /*! 00338 \brief Returns the number of weak real forms of G. 00339 */ 00340 size_t numRealForms() const { 00341 return d_fundamental.numRealForms(); 00342 } 00343 00344 /*! 00345 \brief Returns the number of weak real forms of G for which Cartan 00346 \#cn is defined. 00347 */ 00348 size_t numRealForms(size_t cn) const { 00349 return d_cartan[cn]->numRealForms(); 00350 } 00351 00352 /*! 00353 \brief Returns the partial ordering of the set of Cartans. 00354 */ 00355 const poset::Poset& ordering() const { 00356 return d_ordering; 00357 } 00358 00359 /*! 00360 \brief Returns the (inner) number of the quasisplit real form. 00361 */ 00362 realform::RealForm quasisplit() const { 00363 return realform::RealForm(0); 00364 } 00365 00366 /*! 00367 \brief Lists the real forms for which Cartan \#cn is defined. 00368 */ 00369 const realform::RealFormList& realFormLabels(size_t cn) const { 00370 return d_realFormLabels[cn]; 00371 } 00372 00373 /*! 00374 \brief Entry \#cn lists the dual real forms in which dual Cartan 00375 \#cn is defined. 00376 */ 00377 const realform::RealFormList& dualRealFormLabels(size_t cn) const { 00378 return d_dualRealFormLabels[cn]; 00379 } 00380 00381 /*! get part in the |weakReal| partition of the fiber in Cartan \#cn 00382 corresponding to real form |rf| 00383 */ 00384 cartanclass::adjoint_fiber_orbit 00385 real_form_part(realform::RealForm rf, size_t cn) const 00386 { 00387 return setutils::find_index(d_realFormLabels[cn],rf); 00388 } 00389 00390 /*! get part in the |weakReal| partition of the dual fiber in Cartan \#cn 00391 corresponding to dual real form |drf| 00392 */ 00393 cartanclass::adjoint_fiber_orbit 00394 dual_real_form_part(realform::RealForm drf, size_t cn) const 00395 { 00396 return setutils::find_index(d_dualRealFormLabels[cn],drf); 00397 } 00398 00399 /*! 00400 \brief An element of the orbit in the adjoint fiber corresponding to |rf| 00401 in the classification of weak real forms for cartan |\#cn|. 00402 00403 Precondition: cartan \#cn is defined for rf. 00404 */ 00405 unsigned long representative(realform::RealForm rf, size_t cn) const; 00406 00407 /*! 00408 \brief An element of the orbit in the adjoint dual fiber corresponding to 00409 |drf| in the classification of dual weak real forms for cartan |\#cn|. 00410 00411 Precondition: cartan \#cn is defined for rf. 00412 */ 00413 unsigned long dualRepresentative(realform::RealForm, size_t) const; 00414 00415 const rootdata::RootDatum& rootDatum() const { 00416 return d_parent.rootDatum(); 00417 } 00418 00419 /*! 00420 \brief Entry \#rf flags the Cartans defined in real form \#rf. 00421 */ 00422 const bitmap::BitMap& support(realform::RealForm rf) const { 00423 return d_support[rf]; 00424 } 00425 00426 /*! 00427 \brief Entry \#rf flags the dual Cartans defined in dual real form \#rf. 00428 */ 00429 const bitmap::BitMap& dualSupport(realform::RealForm rf) const { 00430 return d_dualSupport[rf]; 00431 } 00432 00433 const weyl::WeylGroup& weylGroup() const { 00434 return d_parent.weylGroup(); 00435 } 00436 00437 /*! 00438 \brief (Representative) twisted involutions for each class of Cartan 00439 subgroup. 00440 */ 00441 const TwistedInvolution& twistedInvolution(size_t cn) const { 00442 return d_twistedInvolution[cn]; 00443 } 00444 00445 /*! \brief Make |sigma| canonical and return Weyl group |w| element that 00446 twisted conjugates the canonical representative back to |sigma| 00447 */ 00448 const weyl::WeylElt canonicalize(TwistedInvolution&) const; 00449 00450 00451 /*! 00452 \brief matrix giving involution action of |tw| on weight lattice 00453 */ 00454 latticetypes::LatticeMatrix 00455 involutionMatrix(const TwistedInvolution& tw) const; 00456 00457 00458 /*! 00459 \brief apply involution action of |tw| on weight lattice to |v| 00460 */ 00461 void twistedAct 00462 (const weyl::TwistedInvolution& tw,latticetypes::LatticeElt& v) 00463 const; 00464 00465 unsigned long KGB_size(realform::RealForm rf, 00466 const bitmap::BitMap& Cartan_classes) const; 00467 unsigned long block_size(realform::RealForm, realform::RealForm, 00468 const bitmap::BitMap& Cartan_classes) const; 00469 00470 latticetypes::LatticeElt posRealRootSum(const TwistedInvolution&) const; 00471 00472 latticetypes::LatticeElt posImaginaryRootSum(const TwistedInvolution&) const; 00473 00474 00475 size_t cayley(size_t, size_t, weyl::WeylElt*) const; 00476 00477 size_t classNumber(TwistedInvolution) const; 00478 00479 // manipulators 00480 void extend(realform::RealForm); 00481 00482 00483 private: 00484 // auxiliary accessors 00485 weyl::TwistedInvolution 00486 reflection(rootdata::RootNbr rn,const TwistedInvolution& tw) const; 00487 00488 rootdata::RootSet noncompactPosRootSet(realform::RealForm, size_t) const; 00489 00490 std::vector<weyl::WeylEltList> expand() const; // obsolete 00491 00492 // auxiliary manipulators 00493 00494 /*! 00495 \brief Adds a new cartan, with Cartan involution given by |tw|. 00496 */ 00497 void addCartan(TwistedInvolution tw) 00498 { 00499 d_cartan.push_back(new cartanclass::CartanClass 00500 (rootDatum(),involutionMatrix(tw))); 00501 } 00502 00503 /*! 00504 \brief Adds a new cartan, obtained from cartan \#j by Cayley transform 00505 through root \#rn. This unused old version will be phased out. 00506 */ 00507 void addCartan(rootdata::RootNbr rn, size_t j); 00508 00509 void correlateForms(); 00510 00511 void correlateDualForms(const rootdata::RootDatum& rd, 00512 const weyl::WeylGroup& W); 00513 00514 void updateStatus(size_t prev_Cartan_size); 00515 00516 void updateSupports(size_t last_Cartan_class_added); 00517 00518 void updateTwistedInvolutions 00519 (std::vector<weyl::WeylEltList>& known, const TwistedInvolution& tw); 00520 00521 }; 00522 00523 } 00524 00525 } 00526 00527 #endif
1.3.9.1