Guest User

Untitled

a guest
Jun 18th, 2018
70
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.42 KB | None | 0 0
  1. #include <iostream>
  2. #include <cmath>
  3. #include <vector>
  4.  
  5. namespace gsk
  6. {
  7. const int bitsInTypeOfData = 8 ;
  8. }
  9.  
  10. class Matrix
  11. {
  12. public:
  13. Matrix( int arrSize ) : size( arrSize ) , trueSize( ( (size * size) / 8 ) + ((size * size) % 8 == 0 ? 0 : 1 ) )
  14. {
  15. array = new unsigned char[ trueSize ] ;
  16.  
  17. for( int i = 0 ; i < trueSize ; i++ )
  18. array[i] = 0 ;
  19.  
  20. for( int i = 0 ; i < gsk::bitsInTypeOfData ; i++ )
  21. {
  22. bitValues[i] = 1 << i ;
  23. }
  24.  
  25. for( int i = 0 ; i < size * size ; i++ )
  26. {
  27. array[ ( i / gsk::bitsInTypeOfData ) ] |= rand()%2 * bitValues[ i % gsk::bitsInTypeOfData ] ;
  28. }
  29. }
  30.  
  31. Matrix( const Matrix & matrix ) : size( matrix.size) , trueSize( matrix.trueSize )
  32. {
  33. array = new unsigned char[ trueSize ] ;
  34.  
  35. for( int i = 0 ; i < gsk::bitsInTypeOfData ; i++ )
  36. {
  37. bitValues[i] = matrix.bitValues[i] ;
  38. }
  39.  
  40. for( int i = 0 ; i < trueSize ; i++ )
  41. array[i] = matrix.array[i] ;
  42.  
  43.  
  44. }
  45.  
  46. ~Matrix()
  47. {
  48. delete [] array ;
  49. }
  50.  
  51. Matrix operator=( const Matrix & matrix )
  52. {
  53. if( size == matrix.size )
  54. {
  55. for( int i = 0 ; i < trueSize ; i++ )
  56. array[i] = matrix.array[i] ;
  57. }
  58.  
  59. return *this ;
  60. }
  61.  
  62. bool get( int firstIndex , int secondIndex ) const
  63. {
  64. int trueIndex = ((secondIndex * size + firstIndex) / gsk::bitsInTypeOfData) ;
  65. return ( array[ trueIndex ] & bitValues[ (secondIndex * size + firstIndex) % gsk::bitsInTypeOfData ] ) == bitValues[ (secondIndex * size + firstIndex) % gsk::bitsInTypeOfData ] ;
  66. }
  67.  
  68. void set( int firstIndex , int secondIndex , bool value )
  69. {
  70. if( get( firstIndex , secondIndex ) != value )
  71. {
  72. int trueIndex = ((secondIndex * size + firstIndex) / gsk::bitsInTypeOfData) ;
  73. array[ trueIndex ] += ( value == true ? 1 : -1 ) * bitValues[ (secondIndex * size + firstIndex) % gsk::bitsInTypeOfData ];
  74. }
  75. }
  76.  
  77. const int getSize() const
  78. {
  79. return size ;
  80. }
  81.  
  82. private:
  83. const int size ;
  84. const int trueSize ;
  85. int bitValues[gsk::bitsInTypeOfData] ;
  86. unsigned char * array ;
  87. };
  88.  
  89. Matrix matrixMultiplying( const Matrix & firstMatrix , const Matrix & secondMatrix )
  90. {
  91. static long long int count = 0 ;
  92.  
  93. Matrix resultMatrix( firstMatrix.getSize() ) ;
  94.  
  95. unsigned char tmpArr[resultMatrix.getSize()][resultMatrix.getSize()] ;
  96.  
  97. for( int i = 0 ; i < resultMatrix.getSize() ; i++ )
  98. for( int j = 0 ; j < resultMatrix.getSize() ; j++ )
  99. {
  100. resultMatrix.set( i , j , firstMatrix.get( i ,0 ) & secondMatrix.get( 0 , j ) ) ;
  101. for( int k = 1 ; k < resultMatrix.getSize() ; k++ )
  102. {
  103. resultMatrix.set( i , j , (firstMatrix.get( i , k ) & secondMatrix.get( k , j ) ) | resultMatrix.get( i , j ) ) ;
  104. count++;
  105. if( resultMatrix.get( i , j ) )
  106. break ;
  107. }
  108. }
  109.  
  110.  
  111.  
  112. return resultMatrix ;
  113. }
  114.  
  115. Matrix matrixExponentiation( const Matrix & matrix , unsigned int grade )
  116. {
  117. const unsigned int bitsInGradeNumber = static_cast<int>( log2(grade) + 1 ) ;
  118. Matrix resultMatrix( matrix.getSize() ) , tmpMatrix(matrix) ;
  119. int tmp = 1 ;
  120. bool wasTrueBit = false ;
  121.  
  122. for( int i = 0 ; i < bitsInGradeNumber ; i++ )
  123. {
  124.  
  125. if( grade & tmp == tmp )
  126. {
  127. if( wasTrueBit )
  128. {
  129. resultMatrix = matrixMultiplying( resultMatrix , tmpMatrix ) ;
  130. }
  131. else
  132. {
  133. resultMatrix = tmpMatrix ;
  134. wasTrueBit = true ;
  135. }
  136. }
  137.  
  138. if( i < bitsInGradeNumber - 1 )
  139. {
  140. tmp = tmp << 1 ;
  141. tmpMatrix = matrixMultiplying( tmpMatrix , tmpMatrix ) ;
  142. }
  143.  
  144.  
  145. }
  146.  
  147. return resultMatrix;
  148. }
  149.  
  150. int main()
  151. {
  152. srand( time(NULL) ) ;
  153. for( int i = 0 ; i < 1000 ; i++ )
  154. {
  155. Matrix matrix(110) ;
  156. matrix = matrixExponentiation( matrix , 110 ) ;
  157. }
  158.  
  159. return 0 ;
  160. }
Add Comment
Please, Sign In to add comment