Advertisement
dmkozyrev

class Matrix

Oct 29th, 2015
100
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.74 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <cmath>
  4. using namespace std;
  5. typedef long long i64;
  6.  
  7. class Matrix
  8. {
  9.   private:
  10.     vector < vector < i64 >> matrix;
  11.     i64 _base;
  12.   public:
  13.       Matrix();
  14.       Matrix(vector < i64 > &v, i64 base = 0);
  15.       Matrix(i64 M, i64 N, i64 val = 0, i64 base = 0);
  16.       Matrix(Matrix & m);
  17.     void print();
  18.     i64 getCountRow();
  19.     i64 getCountCol();
  20.     i64 getBase();
  21.     bool setVal(i64 y, i64 x, i64 val);
  22.     i64 getVal(i64 y, i64 x);
  23.     bool setBase(i64 base);
  24.     bool prod(Matrix & b);
  25.     bool prod(Matrix & a, Matrix & b);
  26.     void power(i64 n);
  27.     void sqr();
  28.     void toId();
  29.       Matrix & operator=(Matrix & m);
  30. };
  31.  
  32. Matrix::Matrix(vector < i64 > &v, i64 base)
  33. {
  34.     matrix.clear();
  35.     _base = base;
  36.     i64 n = round(sqrt(v.size()));
  37.     for (i64 i = 0, k = 0; i < n; ++i)
  38.     {
  39.         vector < i64 > temp;
  40.         for (i64 j = 0; j < n; ++j)
  41.         {
  42.             i64 val = v[k++];
  43.             if (_base != 0)
  44.                 val %= _base;
  45.             temp.push_back(val);
  46.             if (k >= v.size())
  47.                 k %= v.size();
  48.         }
  49.         matrix.push_back(temp);
  50.     }
  51. }
  52.  
  53. void Matrix::toId()
  54. {
  55.     i64 countR = getCountRow(), countC = getCountCol();
  56.     for (int i = 0; i < countR; ++i)
  57.         for (int j = 0; j < countC; ++j)
  58.             setVal(i, j, i == j ? 1 : 0);
  59. }
  60.  
  61. void Matrix::sqr()
  62. {
  63.     Matrix temp = *this;
  64.     prod(temp, temp);
  65. }
  66.  
  67. void Matrix::power(i64 n)
  68. {
  69.     Matrix t = *this;
  70.     t.toId();
  71.     bool notFinished = true;
  72.     while (notFinished)
  73.     {
  74.         if (n % 2 != 0)
  75.             t.prod(*this);
  76.         n /= 2;
  77.         if (n > 0)
  78.             sqr();
  79.         else
  80.             notFinished = false;
  81.     }
  82.     *this = t;
  83. }
  84.  
  85. Matrix::Matrix()
  86. {
  87.     vector < i64 > temp(1, 0);
  88.     matrix.clear();
  89.     matrix.push_back(temp);
  90.     _base = 0;
  91. }
  92.  
  93. i64 Matrix::getVal(i64 y, i64 x)
  94. {
  95.     i64 countR = getCountRow(), countC = getCountCol();
  96.     if (y > countR)
  97.         y %= countR;
  98.     if (x > countC)
  99.         x %= countC;
  100.     return matrix[y][x];
  101. }
  102.  
  103. Matrix::Matrix(Matrix & m)
  104. {
  105.     matrix = m.matrix;
  106.     _base = m._base;
  107. }
  108.  
  109. Matrix & Matrix::operator=(Matrix & m)
  110. {
  111.     matrix = m.matrix;
  112.     _base = m._base;
  113.     return *this;
  114. }
  115.  
  116. bool Matrix::prod(Matrix & b)
  117. {
  118.     Matrix temp = *this;
  119.     return prod(temp, b);
  120. }
  121.  
  122. bool Matrix::prod(Matrix & a, Matrix & b)
  123. {
  124.     i64 countRowsFromA = a.getCountRow(), countColsFromA = a.getCountCol();
  125.     i64 countRowsFromB = b.getCountRow(), countColsFromB = b.getCountCol();
  126.  
  127.     bool flag = countColsFromA == countRowsFromB;
  128.     if (!flag)
  129.         return flag;
  130.     matrix.clear();
  131.     _base = a._base;
  132.  
  133.     for (i64 i = 0; i < countRowsFromA; ++i)
  134.     {
  135.         vector < i64 > temp;
  136.         for (i64 j = 0; j < countColsFromB; ++j)
  137.         {
  138.             i64 temp_val = 0;
  139.             for (i64 k = 0; k < countColsFromA; ++k)
  140.             {
  141.  
  142.                 temp_val += a.getVal(i, k) * b.getVal(k, j);
  143.  
  144.                 if (_base != 0 && (temp_val >= _base || temp_val < 0))
  145.                     temp_val %= _base;
  146.             }
  147.             temp.push_back(temp_val);
  148.         }
  149.         matrix.push_back(temp);
  150.     }
  151.     return flag;
  152. }
  153.  
  154. i64 Matrix::getCountRow()
  155. {
  156.     return matrix.size();
  157. }
  158.  
  159. i64 Matrix::getCountCol()
  160. {
  161.     return matrix.at(0).size();
  162. }
  163.  
  164. i64 Matrix::getBase()
  165. {
  166.     return _base;
  167. }
  168.  
  169. bool Matrix::setBase(i64 base)
  170. {
  171.     bool flag = _base > base;
  172.     _base = base;
  173.     if (flag)
  174.       for (auto & i:matrix)
  175.           for (auto & j:i)
  176.                 j %= _base;
  177.     return flag;
  178. }
  179.  
  180. Matrix::Matrix(i64 M, i64 N, i64 val, i64 base)
  181. {
  182.     _base = base;
  183.     if (_base != 0)
  184.         val %= _base;
  185.     matrix.clear();
  186.     for (int i = 0; i < M; ++i)
  187.     {
  188.         vector < i64 > temp;
  189.         for (int j = 0; j < N; ++j)
  190.             temp.push_back(val);
  191.         matrix.push_back(temp);
  192.     }
  193. }
  194.  
  195. void Matrix::print()
  196. {
  197.   for (auto & i:matrix)
  198.     {
  199.       for (auto & j:i)
  200.             cout << j << " ";
  201.         cout << endl;
  202.     }
  203. }
  204.  
  205. bool Matrix::setVal(i64 y, i64 x, i64 val)
  206. {
  207.     bool flag = y < matrix.size() && x < matrix.at(0).size();
  208.     if (!flag)
  209.         return flag;
  210.     if (_base != 0)
  211.     {
  212.         val %= _base;
  213.     }
  214.  
  215.     matrix[y][x] = val;
  216.     return flag;
  217. }
  218.  
  219. int main()
  220. {
  221.     vector < i64 > v ={0, 2, 1, -1};
  222.     Matrix m(v, 5);
  223.     Matrix n = m, k = m;
  224.     for (int i = 0; i <= 100; ++i)
  225.     {
  226.         cout << "step " << i << ":" << endl;
  227.         m = n;
  228.         m.power(i);
  229.         m.print();
  230.     }
  231.     cout << m.getBase() << endl;
  232.  
  233.     return 0;
  234. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement