Advertisement
Guest User

Untitled

a guest
Dec 13th, 2017
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.36 KB | None | 0 0
  1. Permutation Permutation::pow (int degree){
  2.      if (degree == 0) {
  3.         return Permutation(_size);
  4.     } else if (degree == 1) {
  5.         return Permutation(*this);
  6.     } else if (degree == -1) {
  7.         return inverse();
  8.     }
  9.  
  10.     Permutation result(*this);
  11.     Permutation tmp(*this);
  12.     if(degree < 0) {
  13.         tmp = tmp.inverse();
  14.         degree = -degree;
  15.     }
  16.  
  17.     --degree;
  18.  
  19.  
  20.     int* cycle = new int[_size];
  21.     bool* used = new bool[_size];
  22.  
  23.     for(size_t i = 0; i < _size; ++i)
  24.         used[i] = false;
  25.     int* cycleStart = tmp._array;
  26.     int cycleSize = 0;
  27.     while (cycleStart < tmp._array+_size) {
  28.         bool flag = true;
  29.         int *currentPtr = cycleStart;
  30.         while (flag || currentPtr != cycleStart) {
  31.             flag = false;
  32.             cycle[cycleSize] = int(currentPtr - tmp._array);
  33.             used[currentPtr -tmp._array] = true;
  34.             ++cycleSize;
  35.             currentPtr = tmp._array + *currentPtr;
  36.         }
  37.         int shift = degree % cycleSize;
  38.         for (int i = 0; i < cycleSize; ++i) {
  39.             result._array[cycle[i]] = cycle[(i + shift) % cycleSize];
  40.         }
  41.         cycleSize = 0;
  42.         while (unsigned(cycleStart - tmp._array) <= _size && used[cycleStart - tmp._array]) {
  43.             ++cycleStart;
  44.         }
  45.     }
  46.  
  47.     delete[] used;
  48.     delete[] cycle;
  49.     return result;
  50. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement