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

/home/r0/dav/atlas.dir/atlas3/sources/structure/cartanset.h

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

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