Main Page | Namespace List | Class Hierarchy | Class List | File List | Namespace Members | Class Members | File Members

/home/r0/dav/atlas.dir/atlas3/sources/gkmod/kgb.h

Go to the documentation of this file.
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

Generated on Wed Mar 26 16:49:33 2008 for atlas by  doxygen 1.3.9.1