public static IntSquareMatrix BinaryExponentiation(IntSquareMatrix a, int n) { if (n == 0) { return(IntSquareMatrix.I(a.N)); } IntSquareMatrix half = BinaryExponentiation(a, n >> 1); IntSquareMatrix full = half * half; if ((n & 1) == 1) { full *= a; } return(full); }