continue on partitions

This commit is contained in:
Jiri Pittner 2021-05-23 10:28:50 +02:00
parent 80eb98411f
commit 222c1cfb8c
3 changed files with 36 additions and 6 deletions

View File

@ -826,6 +826,28 @@ partgen<T>(n,1);
return partitioncount; return partitioncount;
} }
template <typename T>
std::ostream & operator<<(std::ostream &s, const CompressedPartition<T> &x)
{
int n=x.size();
T sum=0;
for(int i=n; i>0;--i)
if(x[i])
{
s<<i;
if(x[i]>1) s<<'^'<<x[i];
sum+= i*x[i];
if(sum<n) s<<',';
}
return s;
}
//////////////////////////////////////////////////////////////////////////////////////
template <typename T> template <typename T>
YoungTableaux<T>::YoungTableaux(const Partition<T> &frame) YoungTableaux<T>::YoungTableaux(const Partition<T> &frame)
: NRVec_from1<NRVec_from1<T> >() : NRVec_from1<NRVec_from1<T> >()
@ -839,6 +861,8 @@ for(int i=1; i<=nlines; ++i) (*this)[i].resize(frame[i]);
} }
/***************************************************************************//** /***************************************************************************//**
* forced instantization in the corresponding object file * forced instantization in the corresponding object file
******************************************************************************/ ******************************************************************************/
@ -846,10 +870,12 @@ template class NRPerm<int>;
template class CyclePerm<int>; template class CyclePerm<int>;
template class CompressedPartition<int>; template class CompressedPartition<int>;
template class Partition<int>; template class Partition<int>;
template class YoungTableaux<int>;
#define INSTANTIZE(T) \ #define INSTANTIZE(T) \
template std::istream & operator>>(std::istream &s, CyclePerm<T> &x); \ template std::istream & operator>>(std::istream &s, CyclePerm<T> &x); \
template std::ostream & operator<<(std::ostream &s, const CyclePerm<T> &x); \ template std::ostream & operator<<(std::ostream &s, const CyclePerm<T> &x); \
template std::ostream & operator<<(std::ostream &s, const CompressedPartition<T> &x); \

View File

@ -108,10 +108,13 @@ public:
explicit CompressedPartition(const Partition<T> &rhs) : NRVec_from1<T>(rhs.size()) {this->clear(); for(int i=1; i<=rhs.size(); ++i) if(!rhs[i]) break; else (*this)[rhs[i]]++; } explicit CompressedPartition(const Partition<T> &rhs) : NRVec_from1<T>(rhs.size()) {this->clear(); for(int i=1; i<=rhs.size(); ++i) if(!rhs[i]) break; else (*this)[rhs[i]]++; }
PERM_RANK_TYPE Sn_class_size() const; PERM_RANK_TYPE Sn_class_size() const;
//@@@output formatted as in the group character table
}; };
template <typename T>
std::ostream & operator<<(std::ostream &s, const CompressedPartition<T> &x);
template <typename T> template <typename T>
class Partition : public NRVec_from1<T> { class Partition : public NRVec_from1<T> {
public: public:
@ -120,7 +123,7 @@ public:
T nparts() const {T s=0; for(int i=1; i<=this->size(); ++i) if((*this)[i]) ++s; return s;} T nparts() const {T s=0; for(int i=1; i<=this->size(); ++i) if((*this)[i]) ++s; return s;}
bool is_valid() const {if(this->size() != this->sum()) return false; for(int i=2; i<=this->size(); ++i) if((*this)[i]>(*this)[i-1]) return false; return true; } bool is_valid() const {if(this->size() != this->sum()) return false; for(int i=2; i<=this->size(); ++i) if((*this)[i]>(*this)[i-1]) return false; return true; }
explicit Partition(const CompressedPartition<T> &rhs) : NRVec_from1<T>(rhs.size()) {this->clear(); int ithru=0; for(int i=rhs.size(); i>=1; --i) for(int j=0; j<rhs[i]; ++j) (*this)[++ithru]=i; } explicit Partition(const CompressedPartition<T> &rhs) : NRVec_from1<T>(rhs.size()) {this->clear(); int ithru=0; for(int i=rhs.size(); i>=1; --i) for(int j=0; j<rhs[i]; ++j) (*this)[++ithru]=i; }
Partition adjoint() const; Partition adjoint() const; //also called conjugate partition
PERM_RANK_TYPE Sn_irrep_dim() const; PERM_RANK_TYPE Sn_irrep_dim() const;
PERM_RANK_TYPE generate_all(void (*callback)(const Partition<T>&), int nparts=0); //nparts <0 means at most to -nparts PERM_RANK_TYPE generate_all(void (*callback)(const Partition<T>&), int nparts=0); //nparts <0 means at most to -nparts
@ -136,7 +139,7 @@ public:
explicit YoungTableaux(const Partition<T> &frame); explicit YoungTableaux(const Partition<T> &frame);
bool is_valid() const; //@@@shape forms a partition bool is_valid() const; //@@@shape forms a partition
bool filled_correctly() const; //is it filled correctly bool filled_correctly() const; //is it filled correctly@@@
}; };

5
t.cc
View File

@ -70,11 +70,12 @@ for(int i=0; i<4; ++i)
void pprintme(const Partition<int> &p) void pprintme(const Partition<int> &p)
{ {
cout<<p; CompressedPartition pc(p);
cout<<'['<<pc<<"] ";
Partition<int> q=p.adjoint(); Partition<int> q=p.adjoint();
cout<<"IR dim "<<p.Sn_irrep_dim()<<endl; cout<<"IR dim "<<p.Sn_irrep_dim()<<endl;
cout <<q;
CompressedPartition qc(q); CompressedPartition qc(q);
cout <<"("<<qc<<')';
cout<<" Class size "<<qc.Sn_class_size()<<endl; cout<<" Class size "<<qc.Sn_class_size()<<endl;
} }