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);
    }