Parcourir la source

Add ranked phi automorphism

Jean Fromentin il y a 8 ans
Parent
commit
181359a24c

+ 44 - 5
ext/garside/braids.cpp

@@ -25,7 +25,7 @@
 //******************
 
 MonoidFamily ArtinA_mf("Artin A-type",ArtinA_disp,ArtinA_gnum);
-MonoidFamily dualA_mf("Dual A-type",DualA_disp,DualA_gnum);
+MonoidFamily DualA_mf("Dual A-type",DualA_disp,DualA_gnum);
 
 //***********************
 //* Auxiliary functions *
@@ -36,12 +36,16 @@ MonoidFamily dualA_mf("Dual A-type",DualA_disp,DualA_gnum);
 //---------------
 
 void braids_init(){
+  ArtinA_mf.data=(void*)type_ArtinWordA;
   ArtinA_mf.set_left_complement(&ArtinA_left_sc);
   ArtinA_mf.set_right_complement(&ArtinA_right_sc);
-  ArtinA_mf.data=(void*)type_ArtinWordA;
-  dualA_mf.set_left_complement(&DualA_left_sc);
-  dualA_mf.set_right_complement(&DualA_right_sc);
-  dualA_mf.data=(void*)type_DualWordA;
+  ArtinA_mf.set_ranked_phi_germ(&ArtinA_rpg);
+
+  DualA_mf.data=(void*)type_DualWordA;
+  DualA_mf.set_left_complement(&DualA_left_sc);
+  DualA_mf.set_right_complement(&DualA_right_sc);
+  DualA_mf.data=(void*)type_DualWordA;
+  DualA_mf.set_ranked_phi_germ(&DualA_rpg);
 }
 
 //------------------------------------------------
@@ -80,6 +84,17 @@ int ArtinA_right_sc(const Generator& x,const Generator& y,Generator* comp){
   }
 }
 
+//--------------------------------------------
+// Generator ArtinA_rpg(size_t,Generator,int)
+//--------------------------------------------
+
+Generator ArtinA_rpg(size_t r,const Generator& x,int p){
+  int power=abs(p)%2;
+  if(power==0) return x;
+  if(x>0) return r-x;
+  return -(r+x);
+}
+
 //--------------------
 // DualA_gnum(size_t)
 //--------------------
@@ -188,3 +203,27 @@ int DualA_right_sc(const Generator& x,const Generator& y,Generator* comp){
   comp[0]=y;
   return 1;
 }
+
+//-------------------------------------------
+// Generator DualA_rpg(size_t,Generator,int)
+//-------------------------------------------
+
+Generator DualA_rpg(size_t r,const Generator& x,int p){
+  int n=r+1;
+  int power=p%n;
+  if(power<0) power+=n;
+  int sign,absx;
+  if(x>0){
+    sign=1;
+    absx=x;
+  }
+  else{
+    sign=-1;
+    absx=-x;
+  }
+  int i=(get_i(absx)-1+power)%n+1;
+  int j=(get_j(absx)-1+power)%n+1;
+  if(i>j) swap(i,j);
+  return sign*generator(i,j);
+}
+

+ 12 - 1
ext/garside/braids.hpp

@@ -26,7 +26,7 @@
 //******************
 
 extern MonoidFamily ArtinA_mf;
-extern MonoidFamily dualA_mf;
+extern MonoidFamily DualA_mf;
 
 //***********************************
 //* Auxiliary functions declaration *
@@ -54,6 +54,12 @@ int ArtinA_left_sc(const Generator& x,const Generator &y,Generator* comp);
 //! Set right complement for Artin monoid of type A
 int ArtinA_right_sc(const Generator& x,const Generator &y,Generator* comp);
 
+//! Ranked phi germ for Artin monoid of type A
+// \param r the rank
+// \param x the generator to map
+// \param p power to apply
+Generator ArtinA_rpg(size_t r,const Generator& x,int p);
+
 //-----------------
 // Dual of type A
 //-----------------
@@ -70,6 +76,11 @@ int DualA_left_sc(const Generator& x,const Generator &y,Generator* comp);
 //! Set right complement for dual monoid of type A
 int DualA_right_sc(const Generator& x,const Generator &y,Generator* comp);
 
+//! Ranked phi germ for Artin monoid of type A
+// \param r the rank
+// \param x the generator to map
+// \param p power to apply
+Generator DualA_rpg(size_t r,const Generator& x,int p);
 
 //**********************
 //* Inline definitions *

+ 19 - 1
ext/garside/check

@@ -133,4 +133,22 @@ DualA.is_right_divisible_x(a12*a23,a12)==(true,a13)
 DualA.is_right_divisible_x(a12*a23,a23)==(true,a12)
 DualA.is_right_divisible_x(a12*a23,a13)==(true,a23)
 DualA.is_right_divisible_x(a12*a23,a14)==(false,a00)
-DualA.is_right_divisible_x(a12*a23,a12*a12)==(false,a00)
+DualA.is_right_divisible_x(a12*a23,a12*a12)==(false,a00)
+
+# Garise automorphism
+DualA.phi(2,a12)==a23
+DualA.phi(2,a23)==a13
+DualA.phi(2,a13)==a12
+DualA.phi(2,a12,2)==a13
+DualA.phi(2,a23,2)==a12
+DualA.phi(2,a13,2)==a23
+DualA.phi(2,a12,-1)==a13
+DualA.phi(2,a23,-1)==a12
+DualA.phi(2,a13,-1)==a23
+DualA.phi(2,a12,-4)==a13
+DualA.phi(2,a23,-4)==a12
+DualA.phi(2,a13,-4)==a23
+DualA.phi(2,A12)==A23
+DualA.phi(2,A23)==A13
+DualA.phi(2,A13)==A12
+DualA.phi(2,a12*A13)==a23*A12

+ 35 - 9
ext/garside/init.cpp

@@ -93,6 +93,8 @@ extern "C"{
     {"ArtinWordA","left_numerator",{"ArtinMonoidFamilyA"},(void*)mt_left_numerator},
     {"ArtinWordA","left_reverse",{"ArtinMonoidFamilyA","ArtinWordA"},(void*)mt_left_reverse},
     {"ArtinWordA","left_reverse",{"ArtinMonoidFamilyA","ArtinWordA","ArtinWordA"},(void*)mt_left_reverse2},
+    {"ArtinWordA","phi",{"ArtinMonoidFamilyA","Integer","ArtinWordA"},(void*)mt_phi},
+    {"ArtinWordA","phi",{"ArtinMonoidFamilyA","Integer","ArtinWordA","Integer"},(void*)mt_phi_power},
     {"ArtinWordA","right_complement",{"ArtinMonoidFamilyA","ArtinWordA","ArtinWordA"},(void*)mt_right_complement},
     {"ArtinWordA","right_denominator",{"ArtinMonoidFamilyA"},(void*)mt_right_denominator},
     {"ArtinWordA","right_lcm",{"ArtinMonoidFamilyA","ArtinWordA","ArtinWordA"},(void*)mt_right_lcm},
@@ -121,6 +123,8 @@ extern "C"{
     {"DualWordA","left_numerator",{"DualMonoidFamilyA"},(void*)mt_left_numerator},
     {"DualWordA","left_reverse",{"DualMonoidFamilyA","DualWordA"},(void*)mt_left_reverse},
     {"DualWordA","left_reverse",{"DualMonoidFamilyA","DualWordA","DualWordA"},(void*)mt_left_reverse2},
+    {"DualWordA","phi",{"DualMonoidFamilyA","Integer","DualWordA"},(void*)mt_phi},
+    {"DualWordA","phi",{"DualMonoidFamilyA","Integer","DualWordA","Integer"},(void*)mt_phi_power},
     {"DualWordA","right_complement",{"DualMonoidFamilyA","DualWordA","DualWordA"},(void*)mt_right_complement},
     {"DualWordA","right_denominator",{"DualMonoidFamilyA"},(void*)mt_right_denominator},
     {"DualWordA","right_lcm",{"DualMonoidFamilyA","DualWordA","DualWordA"},(void*)mt_right_lcm},
@@ -168,7 +172,7 @@ extern "C"{
     {"A24","DualWordA",(void*)&X24},
     {"A34","DualWordA",(void*)&X34},
     {"ArtinA","ArtinMonoidFamilyA",(void*)&ArtinA_mf},
-    {"DualA","DualMonoidFamilyA",(void*)&dualA_mf},
+    {"DualA","DualMonoidFamilyA",(void*)&DualA_mf},
     SYMB_SENTINEL
   };
 };
@@ -239,7 +243,7 @@ void* mt_left_complement(void* m,void* a,void* b){
 
 void* mt_left_denominator(void* m){
   MonoidTrait* monoid=(MonoidTrait*)m;
-    if(not monoid->is_left_complemented())
+    if(not monoid->has_left_complement())
     RuntimeError("Monoid is not left complemented");
   return new Word(monoid->left_denominator());
 }
@@ -291,7 +295,7 @@ void* mt_left_lcm_complement(void* m,void* a,void *b){
 
 void* mt_left_numerator(void* m){
   MonoidTrait* monoid=(MonoidTrait*)m;
-  if(not monoid->is_left_complemented())
+  if(not monoid->has_left_complement())
     RuntimeError("Monoid is not left complemented");
   return new Word(monoid->left_numerator());
 }
@@ -302,7 +306,7 @@ void* mt_left_numerator(void* m){
 
 void* mt_left_reverse(void* m,void* w){
   MonoidTrait* monoid=(MonoidTrait*)m;
-  if(not monoid->is_left_complemented())
+  if(not monoid->has_left_complement())
     RuntimeError("Monoid is not left complemented");
   return (void*)new Word(monoid->left_reverse(*(Word*)w));
 }
@@ -313,11 +317,33 @@ void* mt_left_reverse(void* m,void* w){
 
 void* mt_left_reverse2(void* m,void* num,void* den){
   MonoidTrait* monoid=(MonoidTrait*)m;
-  if(not monoid->is_left_complemented())
+  if(not monoid->has_left_complement())
     RuntimeError("Monoid is not left complemented");
   return (void*)new Word(monoid->left_reverse(*(Word*)num,*(Word*)den));
 }
 
+
+//------------------------------------
+// Word phi(MonoidTrait,Integer,Word)
+//------------------------------------
+
+void* mt_phi(void* m,void* r,void* w){
+  MonoidTrait* monoid=(MonoidTrait*)m;
+  size_t rank=Gomu::get_slong(r);
+  return new Word(monoid->map_phi(rank,*(Word*)w));
+}
+
+//--------------------------------------------
+// Word phi(MonoidTrait,Integer,Word,Integer)
+//--------------------------------------------
+
+void* mt_phi_power(void* m,void* r,void* w,void* p){
+  MonoidTrait* monoid=(MonoidTrait*)m;
+  size_t rank=Gomu::get_slong(r);
+  int power=Gomu::get_slong(p);
+  return new Word(monoid->map_phi(rank,*(Word*)w,power));
+}
+
 //----------------------------------------------
 // Word right_complement(MonoidTrait,Word,Word)
 //----------------------------------------------
@@ -336,7 +362,7 @@ void* mt_right_complement(void* m,void* a,void* b){
 
 void* mt_right_denominator(void* m){
   MonoidTrait* monoid=(MonoidTrait*)m;
-  if(not monoid->is_right_complemented())
+  if(not monoid->has_right_complement())
     RuntimeError("Monoid is not right complemented");
   return new Word(monoid->right_denominator());
 }
@@ -388,7 +414,7 @@ void* mt_right_lcm_complement(void* m,void* a,void *b){
 
 void* mt_right_numerator(void* m){
   MonoidTrait* monoid=(MonoidTrait*)m;
-  if(not monoid->is_right_complemented())
+  if(not monoid->has_right_complement())
     RuntimeError("Monoid is not right complemented");
   return new Word(monoid->right_numerator());
 }
@@ -399,7 +425,7 @@ void* mt_right_numerator(void* m){
 
 void* mt_right_reverse(void* m,void* w){
   MonoidTrait* monoid=(MonoidTrait*)m;
-  if(not monoid->is_right_complemented())
+  if(not monoid->has_right_complement())
     RuntimeError("Monoid is not right complemented");
   return (void*)new Word(monoid->right_reverse(*(Word*)w));
 }
@@ -410,7 +436,7 @@ void* mt_right_reverse(void* m,void* w){
 
 void* mt_right_reverse2(void* m,void* den,void* num){
   MonoidTrait* monoid=(MonoidTrait*)m;
-  if(not monoid->is_right_complemented())
+  if(not monoid->has_right_complement())
     RuntimeError("Monoid is not right complemented");
   return (void*)new Word(monoid->right_reverse(*(Word*)den,*(Word*)num));
 }

+ 6 - 0
ext/garside/init.hpp

@@ -79,6 +79,12 @@ void* mt_left_lcm_complement(void* m,void* a,void* b);
 //! Return left numerator
 void* mt_left_numerator(void* m);
 
+//! Return the word under ranked Garside automorphism
+void* mt_phi(void* m,void* r,void* w);
+
+//! Return the word under power of ranked Garside automorphism
+void* mt_phi_power(void* m,void* r,void* w,void* p);
+
 //! Left reverse a word
 void* mt_left_reverse(void* m,void* w);
 

+ 14 - 0
ext/garside/monoid.cpp

@@ -395,6 +395,20 @@ MonoidTrait::left_gcd_x(const Word& a,const Word& b){
   return pair<Word,Word>(left_numerator(),div);
 }
 
+//---------------------------------------
+// MonoidTrait::map_phi(size_t,Word,int)
+//---------------------------------------
+
+Word
+MonoidTrait::map_phi(size_t r,const Word& w,int p){
+  size_t s=w.size();
+  Word res(s);
+  for(size_t i=0;i<s;++i){
+    res[i]=ranked_phi_germ(r,w[i],p);
+  }
+  return res;
+}
+
 //----------------------------------------------------
 // MonoidTrait::right_complement(Generator,Generator)
 //----------------------------------------------------

+ 36 - 13
ext/garside/monoid.hpp

@@ -38,6 +38,8 @@ typedef int(*SetComplement)(const Generator& x,const Generator& y,Generator* com
 typedef string(*DisplayGenerator)(const Generator& x);
 //! Return the number of generators of the monoid of rank n among a monoid familly
 typedef size_t(*GeneratorsNumber)(size_t n);
+//! Ranked Generator bijection
+typedef Generator(*RankedGeneratorBijection)(size_t r,const Generator& x,int p);
 
 //***************************
 //* Early class definitions *
@@ -163,7 +165,9 @@ public:
   LeftReversing* left_reversing;
   //! Pointer to a RightReversing
   RightReversing* right_reversing;
-
+  //! Ranked Garside automorphism germ
+  RankedGeneratorBijection ranked_phi_germ;
+  
   //! Extra data
   void* data;
   //! Empty constructor
@@ -172,19 +176,22 @@ public:
   //! Destructor
   ~MonoidTrait();
 
-  //! Test if the family is left complemented
-  bool is_left_complemented() const;
+  //! Test if the family has a left complement
+  bool has_left_complement() const;
+   
+  //! Test if the family has a right complement
+  bool has_right_complement() const;
 
+  //! test if the famile has a Garside automorphism
+  bool has_garside_automorphism() const;
+  
   //! Test if a is left divisible by b, i.e.,if it exists c such that a=b.c */
   bool is_left_divisible(const Word& a,const Word& b);
 
   //! Return a Couple (f,c) such that f equals true if a is left divisible by b,
   //! i.e.,if it exists c such that a=b.c 
   pair <bool,Word> is_left_divisible_x(const Word& a,const Word& b);
-  
-  //! Test if the family is right complemented
-  bool is_right_complemented() const;
-
+ 
   //! Test if a is right divisible by b, i.e.,if it exists c such that a=c.b
   bool is_right_divisible(const Word& a,const Word& b);
 
@@ -222,6 +229,9 @@ public:
   //! Left reverse the u.v^(-1)
   Word left_reverse(const Word& u,const Word& v);
 
+  //! Return the word obtained under phi_r^p
+  Word map_phi(size_t r,const Word& w,int p=1);
+  
   //! Return right complement of x and y
   Word right_complement(const Generator& x,const Generator& y);
   
@@ -257,6 +267,9 @@ public:
 
   //! Set right complement
   void set_right_complement(SetComplement sc);
+
+  //! Set ranked phi germ
+  void set_ranked_phi_germ(RankedGeneratorBijection rpg);
 };
 
 //--------------
@@ -432,13 +445,24 @@ inline
 MonoidTrait::MonoidTrait(){
   left_reversing=nullptr;
   right_reversing=nullptr;
+  ranked_phi_germ=nullptr;
 }
 
 inline bool
-MonoidTrait::is_left_complemented() const{
+MonoidTrait::has_left_complement() const{
   return left_reversing!=nullptr;
 }
 
+inline bool
+MonoidTrait::has_right_complement() const{
+  return right_reversing!=nullptr;
+}
+
+inline bool
+MonoidTrait::has_garside_automorphism() const{
+  return ranked_phi_germ!=nullptr;
+}
+
 inline bool
 MonoidTrait::is_left_divisible(const Word& a,const Word& b){
   right_reversing->set_word(b,a);
@@ -451,11 +475,6 @@ MonoidTrait::is_right_divisible(const Word& a,const Word& b){
   return left_reversing->check_positivity();
 }
 
-inline bool
-MonoidTrait::is_right_complemented() const{
-  return right_reversing!=nullptr;
-}
-
 inline Word
 MonoidTrait::left_denominator(){
   return left_reversing->denominator();
@@ -536,6 +555,10 @@ MonoidTrait::set_right_complement(SetComplement sc){
   right_reversing=new RightReversing(sc);
 }
 
+inline void
+MonoidTrait::set_ranked_phi_germ(RankedGeneratorBijection rpg){
+  ranked_phi_germ=rpg;
+}
 
 //------
 // Word

+ 0 - 22
ext/garside/temp

@@ -1,22 +0,0 @@
-//Artin Monoid of type A
-    {"Boolean","is_left_divisible",{"DualMonoidFamilyA","DualWordA","DualWordA"},(void*)mt_is_left_divisible},
-    {"Tuple","is_left_divisible_x",{"DualMonoidFamilyA","DualWordA","DualWordA"},(void*)mt_is_left_divisible_x},
-    {"Boolean","is_right_divisible",{"DualMonoidFamilyA","DualWordA","DualWordA"},(void*)mt_is_right_divisible},
-    {"Tuple","is_right_divisible_x",{"DualMonoidFamilyA","DualWordA","DualWordA"},(void*)mt_is_right_divisible_x},
-    {"DualWordA","left_denominator",{"DualMonoidFamilyA"},(void*)mt_left_denominator},
-    {"DualWordA","left_lcm",{"DualMonoidFamilyA","DualWordA","DualWordA"},(void*)mt_left_lcm},
-    {"DualWordA","left_lcm_complement",{"DualMonoidFamilyA","DualWordA","DualWordA"},(void*)mt_left_lcm_complement},
-    {"DualWordA","left_gcd",{"DualMonoidFamilyA","DualWordA","DualWordA"},(void*)mt_left_gcd},
-    {"Tuple","left_gcd_x",{"DualMonoidFamilyA","DualWordA","DualWordA"},(void*)mt_left_gcd_x},
-    {"DualWordA","left_numerator",{"DualMonoidFamilyA"},(void*)mt_left_numerator},
-    {"DualWordA","left_reverse",{"DualMonoidFamilyA","DualWordA"},(void*)mt_left_reverse},
-    {"DualWordA","left_reverse",{"DualMonoidFamilyA","DualWordA","DualWordA"},(void*)mt_left_reverse2},
-    {"DualWordA","right_denominator",{"DualMonoidFamilyA"},(void*)mt_right_denominator},
-    {"DualWordA","right_lcm",{"DualMonoidFamilyA","DualWordA","DualWordA"},(void*)mt_right_lcm},
-    {"DualWordA","right_lcm_complement",{"DualMonoidFamilyA","DualWordA","DualWordA"},(void*)mt_right_lcm_complement},
-    {"DualWordA","right_gcd",{"DualMonoidFamilyA","DualWordA","DualWordA"},(void*)mt_right_gcd},
-    {"Tuple","right_gcd_x",{"DualMonoidFamilyA","DualWordA","DualWordA"},(void*)mt_right_gcd_x},
-    {"DualWordA","right_numerator",{"DualMonoidFamilyA"},(void*)mt_right_numerator},
-    {"DualWordA","right_reverse",{"DualMonoidFamilyA","DualWordA"},(void*)mt_right_reverse},
-    {"DualWordA","right_reverse",{"DualMonoidFamilyA","DualWordA","DualWordA"},(void*)mt_right_reverse2},
-