00001 /*! 00002 \file 00003 \brief Class definition and function declarations for the class KGB 00004 representing orbits of K on G/B. 00005 */ 00006 /* 00007 This is kgb.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 KGB_H /* guard against multiple inclusions */ 00016 #define KGB_H 00017 00018 #include "kgb_fwd.h" 00019 00020 #include "bitmap_fwd.h" 00021 #include "realredgp_fwd.h" 00022 00023 #include "weyl.h" 00024 #include "bruhat.h" // class definition needed for inlined KGB destructor 00025 #include "gradings.h" 00026 #include "hashtable.h" 00027 00028 namespace atlas { 00029 00030 /******** function declarations *********************************************/ 00031 00032 /******** constant declarations *********************************************/ 00033 00034 namespace kgb { 00035 00036 const KGBElt UndefKGB = ~0ul; 00037 00038 } 00039 00040 /******** type definitions **************************************************/ 00041 00042 namespace kgb { 00043 00044 struct KGBInfo // per KGB element information 00045 { 00046 gradings::Status status; ///< status of each simple root for this element 00047 unsigned int length; ///< dimension of the K orbit on G/B, minus minimal one 00048 unsigned int cartan; ///< records to which Cartan class this element belongs 00049 Descent desc; ///< flags which simple reflections give a descent 00050 00051 KGBInfo(unsigned int l, unsigned int c) : status(),length(l),cartan(c),desc() 00052 {} // set length explicitly, both other fields set to their default value 00053 }; 00054 00055 /*! 00056 \brief Represents the orbits of K on G/B for a particular real form. 00057 00058 Each orbit x defines an involution theta_x of H, coming from the 00059 extended Weyl group. The collection of orbits defining the same 00060 involution is parametrized using the Fiber class: in the end it is a 00061 particular orbit of the imaginary Weyl group on the fiber group. 00062 00063 These orbits are needed first of all for the parametrization of 00064 irreducible representations of the real form (see the class Block). 00065 00066 In this class, an orbit is represented by KGBElt, which is a number specifying 00067 the position of the orbit on a list. For each number, the involution theta_x 00068 is retained (as d_involution[KGBElt]), but not the fiber information 00069 distinguishing different orbits with the same involution. Instead, the class 00070 retains the cross action of (each simple reflection in) W on orbits, and the 00071 Cayley transform. Each of these is stored as a vector (indexed by orbit 00072 numbers) of lists of KGBElt's, one for each simple reflection (often the 00073 KGBElt UndefKGB = ~0 in the case of the Cayley transform) 00074 00075 The actual construction of the orbit is carried out by the (no longer 00076 derived!) class KGBHelper. It is that class that works with actual elements of 00077 the Tits group (which encode both a twisted involution and an element of the 00078 associlated fiber group). After the construction, some of that detailed 00079 information is discarded. What is retained by the class KGB is mainly the 00080 Cayley transforms (always going from more compact to less compact involutions) 00081 and cross actions; the associated twisted involution and |KGBInfo| record is 00082 stored as well. The inverse Cayley transforms are deduced from the forward 00083 ones and are also stored. This information is all that is used by the 00084 Kazhdan-Lusztig algorithm. 00085 */ 00086 00087 class KGB { 00088 00089 enum State { BruhatConstructed, NumStates }; 00090 00091 /*! 00092 \brief Semisimple rank of the underlying group. 00093 */ 00094 size_t d_rank; 00095 00096 /*! 00097 \brief The list d_cross[j] lists the images of the cross action 00098 of simple root \#j on the KGB elements. 00099 */ 00100 std::vector<KGBEltList> d_cross; 00101 00102 /*! 00103 \brief The list |d_cayley[j]| lists the images of the Cayley transform 00104 action of the simple root |\#j| on KGB elements, or |UndefKGB| if not defined 00105 */ 00106 std::vector<KGBEltList> d_cayley; 00107 00108 /*! \brief The list d_inverseCayley[j] lists the images of the inverse Cayley 00109 transform of simple root \#j on KGB elements. 00110 00111 For fixed |j| each KGB element can have up to two inverse Cayley images. For 00112 those for which simple root \#j is not real, both components will be 00113 |UndefKGB|, and otherwise the second component might still be |UndefKGB|. 00114 */ 00115 std::vector<KGBEltPairList> d_inverseCayley; 00116 00117 /*! 00118 \brief Information about individual KGB elements 00119 */ 00120 std::vector<KGBInfo> d_info; 00121 00122 /*! 00123 \brief Twisted Weyl group element defining Cartan involution for KGB 00124 element \#j. 00125 */ 00126 weyl::TwistedInvolutionList d_involution; // of size size() 00127 00128 //!\brief to help find range of elements with fixed twisted involution 00129 std::vector<KGBElt> first_of_tau; // size: #distinct twisted involutions +1 00130 00131 //!\brief tables to map twisted involutions to their sequence number 00132 weyl::TI_Entry::Pooltype d_pool; 00133 hashtable::HashTable<weyl::TI_Entry,unsigned int> d_tau; 00134 00135 /*! 00136 \brief Bit 0 flags whether or not the Bruhat order on KGB has already 00137 been constructed. 00138 */ 00139 bitset::BitSet<NumStates> d_state; 00140 00141 /*! 00142 \brief Owned pointer to the Bruhat order on KGB (or NULL). 00143 00144 The class BruhatOrder contains a Poset describing the full partial order, 00145 and in addition the Hasse diagram (set of all covering relations). 00146 */ 00147 bruhat::BruhatOrder* d_bruhat; 00148 00149 /*! 00150 \brief Pointer (non owned) to the (twisted) Weyl group. 00151 */ 00152 const weyl::WeylGroup* d_weylGroup; 00153 00154 public: 00155 00156 // constructors and destructors 00157 explicit KGB(realredgp::RealReductiveGroup& GR, 00158 const bitmap::BitMap& Cartan_classes = bitmap::BitMap(0)); 00159 00160 ~KGB() { delete d_bruhat; } // only |d_bruhat| is owned (if non NULL) 00161 00162 // copy, assignment and swap 00163 // these are currently reserved; if defined, they shoud take care of |d_bruhat| 00164 private: 00165 KGB(const KGB&); 00166 KGB& operator=(const KGB&); 00167 public: 00168 00169 00170 // accessors 00171 00172 /*! \brief Takes the Cayley transform of KGB element \#x in the direction of 00173 simple root \#s; returns |UndefKGB| unless that root was noncompact imaginary. 00174 */ 00175 KGBElt cayley(size_t s, KGBElt x) const { 00176 return d_cayley[s][x]; 00177 } 00178 00179 /*! 00180 \brief Method that used to return whether involution(x) < involution(y). 00181 00182 Explanation: the ordering is involution-length first, then weyl-length, then 00183 order by representative Weyl elements (weyl::TwistedInvolution::operator<). 00184 This is only a partial ordering, that does not distinguish elements of a 00185 fiber over one same twisted involution. 00186 00187 A similar function is used to sort the elements of |KGB| upon construction, 00188 so this method should hold whenever |x<y| and |involution(x)!=involution(y)| 00189 and it turns out the method is never used, so I have commented it out. MvL. 00190 00191 bool compare(KGBElt x, KGBElt y) const { 00192 if (length(x) != length(y)) 00193 return length(x) < length(y); 00194 else if (weylLength(x) != weylLength(y)) 00195 return weylLength(x) < weylLength(y); 00196 else 00197 return involution(x) < involution(y); 00198 } 00199 */ 00200 00201 /*! 00202 \brief Applies the cross action of simple root \#s to KGB element \#x. 00203 */ 00204 KGBElt cross(size_t s, KGBElt x) const { 00205 return d_cross[s][x]; 00206 } 00207 00208 /*! 00209 \brief Applies the inverse Cayley transform in simple root \#s to 00210 KGB element \#x. 00211 00212 If simple root \#s is not real, returns a pair of UndefKGB. 00213 */ 00214 KGBEltPair inverseCayley(size_t s, KGBElt x) const { 00215 return d_inverseCayley[s][x]; 00216 } 00217 00218 /*! 00219 \brief Semisimple rank of the underlying group. 00220 */ 00221 size_t rank() const { 00222 return d_rank; 00223 } 00224 00225 00226 /*! 00227 \brief Number of K orbits on G/B. 00228 */ 00229 size_t size() const { 00230 return d_info.size(); 00231 } 00232 00233 00234 /*! \brief Returns a Bitset flagging the simple roots which are descents for 00235 KGB element \#x. 00236 */ 00237 const Descent& descent(KGBElt x) const { 00238 return d_info[x].desc; 00239 } 00240 /*! 00241 \brief Length (dimension of the K orbit on G/B, minus minimal orbit dimension) 00242 for KGB element \#x. 00243 */ 00244 size_t length(KGBElt x) const { 00245 return d_info[x].length; 00246 } 00247 00248 /*! 00249 \brief Cartan class associated to KGB element \#x. 00250 */ 00251 size_t Cartan_class(KGBElt x) const { 00252 return d_info[x].cartan; 00253 } 00254 00255 00256 00257 /*! 00258 \brief Flag telling whether each simple root is real, complex, imaginary 00259 compact, or imaginary noncompact for KGB element \#x. 00260 */ 00261 const gradings::Status& status(KGBElt x) const { 00262 return d_info[x].status; 00263 } 00264 00265 00266 /*! 00267 \brief Tells whether simple root \#s is real, complex, imaginary compact, 00268 or imaginary noncompact for KGB element \#x. 00269 */ 00270 gradings::Status::Value status(size_t s, KGBElt x) const { 00271 return status(x)[s]; 00272 } 00273 00274 /*! 00275 \brief Tells whether simple root \# s is a descent generator for KGB 00276 element \#x. 00277 00278 This only depends on the twisted involution \f$\tau\f$ associated to |x|: it 00279 holds whenever the simple reflection for |s| either makes \f$\tau\f$ shorter 00280 by twisted conjugation (|s| is a complex descent for |tau|), or if it 00281 twisted commutes by left multiplication (|s| is real for |tau|). 00282 */ 00283 bool isDescent(size_t s, KGBElt x) const 00284 { 00285 return d_info[x].desc.test(s); 00286 } 00287 00288 /*! 00289 \brief Tells whether simple root \#s is an ascent generator for KGB 00290 element \#x. 00291 00292 This does not depend only on the twisted involution: it holds for all 00293 complex roots that are not descents, but for imaginary roots only if they 00294 noncompact. 00295 */ 00296 bool isAscent(size_t s, KGBElt x) const 00297 { 00298 return not isDescent(s,x) 00299 and not (status(s,x) == gradings::Status::ImaginaryCompact); 00300 } 00301 00302 /*! 00303 \brief Returns the root datum involution corresponding to z. 00304 00305 In fact, returns the twisted involution $w$ with \f$w.\delta = \tau\f$. 00306 */ 00307 const weyl::TwistedInvolution& involution(KGBElt x) const { 00308 return d_involution[x]; 00309 } 00310 00311 KGBEltPair tauPacket(const weyl::TwistedInvolution&) const; 00312 00313 /*! 00314 \brief The (twisted) Weyl group. 00315 */ 00316 const weyl::WeylGroup& weylGroup() const { 00317 return *d_weylGroup; 00318 } 00319 00320 size_t weylLength(KGBElt z) const { 00321 return weylGroup().length(d_involution[z].w()); 00322 } 00323 00324 // manipulators 00325 00326 // Creates Hasse diagram for Bruhat order on KGB and returns reference to it 00327 bruhat::BruhatOrder& bruhatOrder() 00328 { fillBruhat(); return *d_bruhat; } 00329 00330 const poset::Poset& bruhatPoset() // this creates full poset on demand 00331 { return bruhatOrder().poset(); } 00332 00333 // private methods 00334 private: 00335 void fillBruhat(); 00336 00337 }; // class KGB 00338 00339 } // namespace kgb 00340 00341 } // namespace atlas 00342 00343 #endif
1.3.9.1