/*****************************************

IntMatrix.h -- class definition of a Matrix with
	       Integer elements

******************************************/

class IntMatrix
{
   private:
     //choose your own private variables
     
   public:
     // default constructor
     IntMatrix();

     IntMatrix(const IntMatrix &M);
     IntMatrix& operator =(const IntMatrix &M);

     // Create a row x col sized matrix with zero entries
     // we use row major form.
     IntMatrix(int rows, int columns);

     // Create a row x col sized matrix with entries from **array
     IntMatrix(int **array, int rows, int columns);

     // prints contents of matrix to stdout
     void print();
     int GetNumRows() const;
     int GetNumCols() const;
     
     // Sets the value of m_ij to val, no effect if out of range.
     void SetValue(int i, int j, int val);

     //returns value of m_ij, we index from 0 to row-1 (col-1 respectively)
     // so m_ij is row i, column j
     int GetValue(int i, int j) const;
     
     // returns true if symmetric, false otherwise
     bool IsSymmetric();
     
     // returns true if matrix is empty, i.e. 0x0
     bool IsEmpty();
};

bool isEqual(IntMatrix A, IntMatrix B);

//each of these should be obvious.  If the dimensions make
//the operation invalid, return a 0x0 matrix.
IntMatrix MatrixAdd(IntMatrix A, IntMatrix B);
IntMatrix MatrixSub(IntMatrix A, IntMatrix B);
IntMatrix MatrixMult(IntMatrix A, IntMatrix B);
IntMatrix MatrixTranspose(IntMatrix A);

//update: This returns a matrix, A^k if valid, 0x0 matrix if not
IntMatrix MatrixPower(IntMatrix A, int k);

