Advertisement
JosepRivaille

P61883: Powers of a matrix

Mar 23rd, 2016
130
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.47 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. using namespace std;
  4.  
  5. typedef vector<int> Row;
  6. typedef vector<Row> Matrix;
  7.  
  8.  
  9. Matrix mult_M(const Matrix &M, const Matrix &N, int m)
  10. //Strassen algorithm
  11. {
  12.   int p1, p2, p3, p4, p5, p6, p7;
  13.   p1 = M[0][0]*(N[0][1]-N[1][1]); // A(F-H)
  14.   p2 = (M[0][0]+M[0][1])*N[1][1]; // (A+B)H
  15.   p3 = (M[1][0]+M[1][1])*N[0][0]; // (C+D)E
  16.   p4 = M[1][1]*(N[1][0]-N[0][0]); // D(G-E)
  17.   p5 = (M[0][0]+M[1][1])*(N[0][0]+N[1][1]); // (A+D)(E+H)
  18.   p6 = (M[0][1]-M[1][1])*(N[1][0]+N[1][1]); // (B-D)(G+H)
  19.   p7 = (M[0][0]-M[1][0])*(N[0][0]+N[0][1]); // (A-C)(E+F)
  20.   Matrix R(2, Row(2));
  21.   R[0][0] = (p5 + p4 - p2 + p6)%m;
  22.   R[0][1] = (p1 + p2)%m;
  23.   R[1][0] = (p3 + p4)%m;
  24.   R[1][1] = (p1 + p5 - p3 - p7)%m;
  25.   return R;
  26. }
  27.  
  28. Matrix power_matrix(const Matrix &M, int n, int m)
  29. {
  30.   Matrix R(2, Row(2));
  31.   if (n == 0) {
  32.     R[0][0] = R[1][1] = 1;
  33.     R[1][0] = R[0][1] = 0;
  34.     return R;
  35.   }
  36.   else {
  37.     R = power_matrix(M, n/2, m);
  38.     Matrix aux(2, Row(2));
  39.     aux = mult_M(R, R, m);
  40.     if (n%2 == 0) return aux;
  41.     else return mult_M(aux, M, m);
  42.   }
  43. }
  44.  
  45.  
  46. void write_matrix(const Matrix &M)
  47. {
  48.   cout << M[0][0] << " " << M[0][1] << endl;
  49.   cout << M[1][0] << " " << M[1][1] << endl;
  50.   cout << "----------" << endl;
  51. }
  52.  
  53. int main()
  54. {
  55.   Matrix M(2, Row(2));
  56.   while (cin >> M[0][0] >> M[0][1] >> M[1][0] >> M[1][1]) {
  57.     int n, m;
  58.     cin >> n >> m;
  59.     Matrix R = power_matrix(M, n, m);
  60.     write_matrix(R);
  61.   }
  62. }
  63.  
  64. //JosepRivaille
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement