11 #pragma region structors 20 for(uint8_t i=0; i<
m_nSize; i++)
35 for(uint8_t i=1; i<n; i++)
36 factorial[i] = uint32_t(i)*factorial[i - 1];
38 const uintx_t nfactorial = uint32_t(n)*factorial[n - 1];
41 uint32_t* c =
new uint32_t[n];
42 uint32_t* d =
new uint32_t[n];
44 for(
int i=0; i<n; i++){
51 for(
int i=n-1; i>0; i--){
52 c[i] = uint32_t(m/factorial[i]);
58 for(
int i=n-1; i>=0; i--){
60 for(
int j=c[i]; j<i; j++)
77 for(uint8_t i=0; i<
m_nSize; i++)
85 for(uint8_t i=0; i<
m_nSize; i++)
95 #pragma endregion structors 100 #pragma region randomization 107 for(uint8_t i=0; i<
m_nSize-1; i++){
108 const int j = rng()%((uint64_t)
m_nSize - i) + i;
120 for(uint8_t i=0; i<
m_nSize-2; i++){
121 const int j = rng()%((uint64_t)
m_nSize - i) + i;
140 for(uint8_t i=0; i<
m_nSize-1; i++){
141 const uint8_t j = s[i]%(
m_nSize - i) + i;
142 printf(
"(%u, %u) ", i, j);
148 #pragma endregion randomization 153 #pragma region readersandtests 168 for(uint8_t i=0; i<
m_nSize; i++)
169 if(
m_nMap[i] != i)
return false;
174 #pragma endregion readersandtests 179 #pragma region printing 184 for(uint8_t i=0; i<
m_nSize-1; i++)
185 printf(
"%u, ",
m_nMap[i]);
192 printf(
"%s\n", GetNum<uintx_t>().GetString().c_str());
195 #pragma endregion printing 200 #pragma region operators 245 for(uint8_t i=0; i<p0.
m_nSize && ok; i++)
256 const uint8_t* pmap = p.
m_nMap;
258 for(uint8_t i=0; i<
m_nSize; i++){
277 for(uint8_t i=1; i<
m_nSize; i++){
281 for(uint8_t j=0; j<i; j++)
284 n += count*ifactorial;
293 template uintx_t CPerm::GetNum<uintx_t>()
const;
294 template uint64_t CPerm::GetNum<uint64_t>()
const;
295 template uint32_t CPerm::GetNum<uint32_t>()
const;
296 template uint16_t CPerm::GetNum<uint16_t>()
const;
297 template uint8_t CPerm::GetNum<uint8_t>()
const;
299 #pragma endregion operators bool IsIdentity() const
Identity permutation test.
uint8_t operator[](uint8_t n) const
Get nth element of map.
uint8_t m_nSize
Number of things being permuted.
uint GetNum() const
Get reverse lexicographic number.
void printnum() const
Print reverse lexicographic number.
void printmap() const
Print as a map.
CPerm(uint8_t n)
Constructor.
uint8_t GetSize() const
Get size.
const CPerm & operator *=(const CPerm &p)
Permutation composition.
The extensible unsigned integer class.
bool operator==(const CPerm &p0, const CPerm &p1)
Is equal to.
uint8_t * m_nMap
Permutation sends i to m_nMap[i].
Declaration of the permutation CPerm.
void RandomizeOdd(uint64_t(*rng)(void))
Set to random odd permutation.
void Randomize(uint64_t(*rng)(void))
Set to random permutation.
bool operator!=(const CPerm &p0, const CPerm &p1)
Is not equal to.
CPerm & operator=(const CPerm &p)
Assignment operator.