small additions to permutations
This commit is contained in:
		
							parent
							
								
									13c23fb85d
								
							
						
					
					
						commit
						1ee984eda2
					
				@ -135,11 +135,27 @@ if(n!=q.size()) laerror("product of incompatible permutations");
 | 
				
			|||||||
NRPerm<T> r(n);
 | 
					NRPerm<T> r(n);
 | 
				
			||||||
for(T i=1; i<=n; ++i) r[i] = (*this)[q[i]];
 | 
					for(T i=1; i<=n; ++i) r[i] = (*this)[q[i]];
 | 
				
			||||||
return r;
 | 
					return r;
 | 
				
			||||||
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
template <typename T>
 | 
					template <typename T>
 | 
				
			||||||
NRPerm<T> NRPerm<T>::conjugate_by(const NRPerm<T> &q) const
 | 
					NRPerm<T> NRPerm<T>::multiply(const NRPerm<T> &q, bool inverse) const
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					#ifdef DEBUG
 | 
				
			||||||
 | 
					        if(!this->is_valid() || !q.is_valid()) laerror("multiplication of invalid permutation");
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					T n=this->size();
 | 
				
			||||||
 | 
					if(n!=q.size()) laerror("product of incompatible permutations");
 | 
				
			||||||
 | 
					NRPerm<T> r(n);
 | 
				
			||||||
 | 
					if(inverse) for(T i=1; i<=n; ++i) r[q[i]] = (*this)[i];
 | 
				
			||||||
 | 
					else for(T i=1; i<=n; ++i) r[i] = (*this)[q[i]];
 | 
				
			||||||
 | 
					return r;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					template <typename T>
 | 
				
			||||||
 | 
					NRPerm<T> NRPerm<T>::conjugate_by(const NRPerm<T> &q, bool inverse) const
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
#ifdef DEBUG
 | 
					#ifdef DEBUG
 | 
				
			||||||
        if(!this->is_valid() || !q.is_valid()) laerror("multiplication of invalid permutation");
 | 
					        if(!this->is_valid() || !q.is_valid()) laerror("multiplication of invalid permutation");
 | 
				
			||||||
@ -149,11 +165,30 @@ T n=this->size();
 | 
				
			|||||||
if(n!=q.size()) laerror("product of incompatible permutations");
 | 
					if(n!=q.size()) laerror("product of incompatible permutations");
 | 
				
			||||||
NRPerm<T> qi=q.inverse();
 | 
					NRPerm<T> qi=q.inverse();
 | 
				
			||||||
NRPerm<T> r(n);
 | 
					NRPerm<T> r(n);
 | 
				
			||||||
for(T i=1; i<=n; ++i) r[i] = qi[(*this)[q[i]]];
 | 
					if(inverse)  for(T i=1; i<=n; ++i) r[i] = q[(*this)[qi[i]]];
 | 
				
			||||||
 | 
					else for(T i=1; i<=n; ++i) r[i] = qi[(*this)[q[i]]];
 | 
				
			||||||
return r;
 | 
					return r;
 | 
				
			||||||
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					template <typename T>
 | 
				
			||||||
 | 
					NRPerm<T> NRPerm<T>::commutator(const NRPerm<T> &q, bool inverse) const
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					#ifdef DEBUG
 | 
				
			||||||
 | 
					        if(!this->is_valid() || !q.is_valid()) laerror("multiplication of invalid permutation");
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					T n=this->size();
 | 
				
			||||||
 | 
					if(n!=q.size()) laerror("product of incompatible permutations");
 | 
				
			||||||
 | 
					NRPerm<T> qi=q.inverse();
 | 
				
			||||||
 | 
					NRPerm<T> pi=this->inverse();
 | 
				
			||||||
 | 
					NRPerm<T> r(n);
 | 
				
			||||||
 | 
					if(inverse)  for(T i=1; i<=n; ++i) r[i] = qi[pi[q[(*this)[i]]]];
 | 
				
			||||||
 | 
					else for(T i=1; i<=n; ++i) r[i] = pi[qi[(*this)[q[i]]]];
 | 
				
			||||||
 | 
					return r;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
template <typename T>
 | 
					template <typename T>
 | 
				
			||||||
CyclePerm<T> CyclePerm<T>::conjugate_by(const CyclePerm<T> &q) const
 | 
					CyclePerm<T> CyclePerm<T>::conjugate_by(const CyclePerm<T> &q) const
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
				
			|||||||
@ -67,7 +67,9 @@ public:
 | 
				
			|||||||
	NRPerm operator|(const NRPerm &rhs) const; //concatenate the permutations rhs,this, renumbering rhs (not commutative)
 | 
						NRPerm operator|(const NRPerm &rhs) const; //concatenate the permutations rhs,this, renumbering rhs (not commutative)
 | 
				
			||||||
	NRPerm operator*(const NRPerm &q) const; //q is rhs and applied first, this applied second
 | 
						NRPerm operator*(const NRPerm &q) const; //q is rhs and applied first, this applied second
 | 
				
			||||||
	NRPerm operator*(const CyclePerm<T> &r) const;
 | 
						NRPerm operator*(const CyclePerm<T> &r) const;
 | 
				
			||||||
	NRPerm conjugate_by(const NRPerm &q) const; //q^-1 p q
 | 
						NRPerm multiply(const NRPerm<T> &q, bool inverse) const; //multiplication but optionally q inversed
 | 
				
			||||||
 | 
						NRPerm conjugate_by(const NRPerm &q, bool reverse=false) const; //q^-1 p q or q p q^-1
 | 
				
			||||||
 | 
						NRPerm commutator(const NRPerm &q, bool inverse=false) const;  //p^-1 q^-1 p q or q^-1 p^-1 q p
 | 
				
			||||||
	int parity() const; //returns +/- 1
 | 
						int parity() const; //returns +/- 1
 | 
				
			||||||
	void randomize(void); //uniformly random by Fisher-Yates shuffle
 | 
						void randomize(void); //uniformly random by Fisher-Yates shuffle
 | 
				
			||||||
	bool next(); //generate next permutation in lex order
 | 
						bool next(); //generate next permutation in lex order
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user