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

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

Go to the documentation of this file.
00001 /*!
00002 \file
00003 \brief Class definition and function declarations for class Block.
00004 */
00005 /*
00006   This is blocks.h
00007 
00008   Copyright (C) 2004,2005 Fokko du Cloux
00009   part of the Atlas of Reductive Lie Groups
00010 
00011   See file main.cpp for full copyright notice
00012 */
00013 
00014 #ifndef BLOCKS_H  /* guard against multiple inclusions */
00015 #define BLOCKS_H
00016 
00017 #include "blocks_fwd.h"
00018 #include <cassert>
00019 
00020 #include "bruhat_fwd.h"
00021 #include "descents.h"
00022 #include "kgb_fwd.h"
00023 #include "complexredgp_fwd.h"
00024 #include "realredgp_fwd.h"
00025 #include "weyl_fwd.h"
00026 
00027 #include "bitset.h"
00028 #include "bitmap.h"
00029 #include "realform.h"
00030 #include "weyl.h"
00031 
00032 namespace atlas {
00033 
00034 /******** type declarations *************************************************/
00035 
00036 /******** constant declarations *********************************************/
00037 
00038 namespace blocks {
00039 
00040 // reserve the last possible unsigned value; it is supposed unused
00041 const BlockElt UndefBlock = ~ BlockElt(0);
00042 
00043 }
00044 
00045 /******** function declarations *********************************************/
00046 
00047 namespace blocks {
00048 
00049   std::vector<BlockElt> dual_map(const Block& b, const Block& dual_b);
00050   bitmap::BitMap common_Cartans(realredgp::RealReductiveGroup& GR,
00051                                 realredgp::RealReductiveGroup& dGR);
00052 
00053 }
00054 
00055 /******** type definitions **************************************************/
00056 
00057 namespace blocks {
00058 
00059   /*!
00060 \brief Represents a block of representations of an inner form of G.
00061 
00062 For our fixed inner form, orbits of $K$ on $G/B$ are parametrized by classes
00063 of elements $x$ in $N_G(H).\delta$ (which is the normalizer in the second half
00064 $G.\delta$ of the extended group $G^Gamma=G disju G.\delta$, where $\delta$ is
00065 (i.e., acts on $G$ as) an involution that itself normalises $H$) modulo the
00066 \emph{conjugation} action of $H$. (Dangerous bend: this $H$ conjugacy class of
00067 $x$ is a subset, usually proper, of the coset $xH$. The collection of all $x$
00068 is therefore NOT a subset of the extended Weyl group $N(H)/H$, but something
00069 more subtle.) The requirement on $x$ is that it belong to to the $G$-conjugacy
00070 class of strong involutions defining the inner form.
00071 
00072 Each $x$ therefore defines an involution $theta_x$ of $H$.  Describing the
00073 set of $x$ with a fixed involution is accomplished by the Fiber class.
00074 
00075 A block is characterized by specifying also an inner form of the dual
00076 group $G^vee$.  For this inner form, $K^vee$ orbits on $G^vee/B^vee$ are
00077 parametrized by elements $y$.  The basic theorem is that the block of
00078 representations is parametrized by pairs $(x,y)$ as above, subject to
00079 the requirement that $theta_y$ is the negative transpose of $theta_x$.
00080   */
00081 class Block {
00082 
00083   enum State { BruhatConstructed, NumStates };
00084 
00085   /*!
00086 \brief Number (in the list maintained by the complex reductive group)
00087 of the real form of G where the block lives.
00088   */
00089   realform::RealForm d_realForm;
00090 
00091   /*!
00092 \brief Number of the real form of G^vee defining the block.
00093   */
00094   realform::RealForm d_dualForm;
00095 
00096   /*! \brief Semisimple rank of G. */
00097   size_t d_rank;
00098 
00099   const weyl::WeylGroup& d_weylGroup;
00100 
00101   /*!
00102 \brief Number of K orbits on G/B.
00103   */
00104   size_t d_xrange;
00105 
00106   /*!
00107 \brief Number of K^vee orbits on G^vee/B^vee.
00108   */
00109   size_t d_yrange;
00110 
00111   /*!
00112 \brief Element d_x[z] identifies the K orbit x on G/B for z.
00113   */
00114   kgb::KGBEltList d_x;  // of size |size()|
00115 
00116   /*!
00117 \brief Element d_y[z] identifies the K^vee orbit y on G^vee/B^vee for z.
00118   */
00119   kgb::KGBEltList d_y; // of size |size()|
00120 
00121 /*!\brief maps KGB element |x| to the first block element |z| with |d_x[z]>=x|.
00122 */
00123   std::vector<BlockElt> d_first_z_of_x; // of size |d_xrange|
00124 
00125   /*!
00126 \brief d_cross[s][z] is $s * z$ (for s a simple root, z a BlockElt).
00127   */
00128   std::vector<BlockEltList> d_cross; // of size |d_rank| * |size()|
00129 
00130   /*! \brief For $s$ a simple root and $z$ a |BlockElt|, |d_cayley[s][z]| is
00131 the Cayley transform $c_s(z)$ (noncompact imaginary case) or the inverse
00132 Cayley transform $c^s(z)$ (real type 1 or 2) or undefined (otherwise).
00133   */
00134   std::vector<BlockEltPairList> d_cayley; // of size |d_rank| * |size()|
00135 
00136 
00137   /*!
00138 \brief Entry z flags the descent status of the simple roots for block
00139 element z.
00140   */
00141   descents::DescentStatusList d_descent; // of size |size()|
00142 
00143   /*!
00144 \brief Entry z is the length of block element z.
00145   */
00146   std::vector<size_t> d_length; // of size |size()|
00147 
00148   /*!
00149 \brief Entry z is the Cartan class of block element z.
00150   */
00151   std::vector<size_t> d_Cartan; // of size |size()|
00152 
00153 
00154   /*!
00155 \brief Entry z (multiplied by the fixed outer automorphism \delta) is
00156 the involution \f$\tau_z\f$ of H attached to z
00157 (in other words, d_involution[z] is the twisted involution attached to z; MvL)
00158   */
00159   weyl::TwistedInvolutionList d_involution; // of size |size()|
00160 
00161   /*!
00162 \brief Entry z flags the simple roots occurring in \f$\theta_z\f$.
00163   */
00164   std::vector<bitset::RankFlags> d_involutionSupport; // of size |size()|
00165 
00166   /*!
00167 \brief Records state bits (in fact one: whether the Bruhat order is computed).
00168   */
00169   bitset::BitSet<NumStates> d_state;
00170 
00171   /*!
00172 \brief Bruhat order on the block.
00173 
00174 Definition now corrected mathematically from the bad definition of
00175 Vogan's Park City notes to one equivalent to the transitive closure of
00176 non-vanishing KL polynomial.
00177   */
00178   bruhat::BruhatOrder* d_bruhat;
00179 
00180  public:
00181 
00182 // constructors and destructors
00183   Block(complexredgp::ComplexReductiveGroup&, realform::RealForm rf,
00184         realform::RealForm drf, bool select_Cartans=false);
00185 
00186   ~Block();
00187 
00188 // copy, assignment and swap
00189 
00190 // accessors
00191   /*! \brief vector of descent statuses of all simple roots */
00192   const descents::DescentStatus& descent(BlockElt z) const {
00193     assert(z<size());
00194     return d_descent[z];
00195   }
00196 
00197   /*! \brief descent type of s at z */
00198   descents::DescentStatus::Value descentValue(size_t s, BlockElt z) const {
00199     assert(z<size());
00200     assert(s<d_rank);
00201     return d_descent[z][s];
00202   }
00203 
00204   //!\brief whether |s| is a weak descent for |z|
00205   bool isWeakDescent(size_t s, BlockElt z) const
00206     { return descents::DescentStatus::isDescent(descentValue(s,z)); }
00207 
00208   realform::RealForm dualForm() const {
00209     return d_dualForm;
00210   }
00211 
00212   size_t firstStrictDescent(BlockElt z) const;
00213   size_t firstStrictGoodDescent(BlockElt z) const;
00214 
00215   /*! \brief cross action */
00216   BlockElt cross(size_t s, BlockElt z) const {
00217     assert(z<size());
00218     assert(s<d_rank);
00219     return d_cross[s][z];
00220   }
00221 
00222   /*! \brief Cayley transform */
00223   BlockEltPair cayley(size_t s, BlockElt z) const {
00224     assert(z<size());
00225     assert(s<d_rank);
00226     if (not isWeakDescent(s,z))
00227       return d_cayley[s][z];
00228     else return BlockEltPair(UndefBlock,UndefBlock);
00229   }
00230 
00231   /*! \brief inverse Cayley transform */
00232   BlockEltPair inverseCayley(size_t s, BlockElt z) const {
00233     assert(z<size());
00234     assert(s<d_rank);
00235     if (isWeakDescent(s,z))
00236       return d_cayley[s][z];
00237     else return BlockEltPair(UndefBlock,UndefBlock);
00238   }
00239 
00240   /*! \brief the simple roots occurring in \f$\theta_z\f$. */
00241   const bitset::RankFlags& involutionSupport(size_t z) const {
00242     assert(z<size());
00243     return d_involutionSupport[z];
00244   }
00245 
00246   bool isStrictAscent(size_t, BlockElt) const;
00247 
00248   bool isStrictDescent(size_t, BlockElt) const;
00249 
00250   /*! \brief length of block element */
00251   size_t length(BlockElt z) const {
00252     return d_length[z];
00253   }
00254 
00255   /*! \brief Cartan class of block element */
00256   size_t Cartan_class(BlockElt z) const {
00257     assert(z<size());
00258     return d_Cartan[z];
00259   }
00260 
00261   /*! \brief the functor \f$T_{\alpha,\beta}\f$ */
00262   BlockEltPair link(size_t alpha,size_t beta,BlockElt y) const;
00263 
00264   /*! \brief semisimple rank of the group this block is constructed for */
00265   size_t rank() const {
00266     return d_rank;
00267   }
00268 
00269   realform::RealForm realForm() const {
00270     return d_realForm;
00271   }
00272 
00273   /*! \brief size of the block */
00274   size_t size() const {
00275     return d_involution.size(); // d_involution is one of many possible vectors
00276   }
00277 
00278 /*!
00279   \brief Returns the twisted involution corresponding to z.
00280 
00281 This is the corresponding Weyl group element w, such that w.delta is the
00282 root datum involution tau corresponding to z
00283 */
00284   const weyl::TwistedInvolution& involution(BlockElt z) const{
00285     assert(z<size());
00286     return d_involution[z];
00287 }
00288 
00289 
00290   const weyl::WeylGroup& weylGroup() const {
00291     return d_weylGroup;
00292   }
00293 
00294   kgb::KGBElt x(BlockElt z) const {
00295     assert(z<size());
00296     return d_x[z];
00297   }
00298 
00299   kgb::KGBElt y(BlockElt z) const {
00300     assert(z<size());
00301     return d_y[z];
00302   }
00303 
00304   //!\brief Look up element by |x|, |y| coordinates
00305   BlockElt element(kgb::KGBElt x,kgb::KGBElt y) const;
00306 
00307   std::pair<BlockElt,BlockElt> R_packet(BlockElt z) const
00308   {
00309     assert(z<size());
00310     BlockElt x=d_x[z];
00311     return std::make_pair(d_first_z_of_x[x],d_first_z_of_x[x+1]);
00312   }
00313 
00314   size_t xsize() const {
00315     return d_xrange;
00316   }
00317   size_t ysize() const {
00318     return d_yrange;
00319   }
00320 
00321   // manipulators
00322   bruhat::BruhatOrder& bruhatOrder()
00323   {
00324     fillBruhat(); return *d_bruhat;
00325   }
00326 
00327   // private accessor and manipulators
00328 private:
00329   weyl::TwistedInvolution dualInvolution
00330     (const weyl::TwistedInvolution& tw,weyl::WeylInterface to_dual) const;
00331 
00332   void generate(realredgp::RealReductiveGroup& G,
00333                 realredgp::RealReductiveGroup& dG,
00334                 bool select_Cartans);
00335 
00336   void fillBruhat();
00337 }; // class Block
00338 
00339 } // namespace blocks
00340 
00341 } // namespace atlas
00342 #endif

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