#ifndef JIKKA_MATRIX_HPP #define JIKKA_MATRIX_HPP /** * @file jikka/matrix.hpp * @author Kimiyuki Onaka * @copyright Apache License 2.0 */ #include namespace jikka { template using matrix = std::array, H>; namespace mat { template std::array ap(const matrix &a, const std::array &b) { std::array c = {}; for (size_t y = 0; y < H; ++y) { for (size_t x = 0; x < W; ++x) { c[y] += a[y][x] * b[x]; } } return c; } template matrix zero() { return {}; } template matrix one() { matrix a = {}; for (size_t i = 0; i < N; ++i) { a[i][i] = 1; } return a; } template matrix add(const matrix &a, const matrix &b) { matrix c; for (size_t y = 0; y < H; ++y) { for (size_t x = 0; x < W; ++x) { c[y][x] = a[y][x] + b[y][x]; } } return c; } template matrix mul(const matrix &a, const matrix &b) { matrix c = {}; for (size_t y = 0; y < H; ++y) { for (size_t z = 0; z < N; ++z) { for (size_t x = 0; x < W; ++x) { c[y][x] += a[y][z] * b[z][x]; } } } return c; } template matrix pow(matrix x, int64_t k) { matrix y = one(); for (; k; k >>= 1) { if (k & 1) { y = mul(y, x); } x = mul(x, x); } return y; } } // namespace mat } // namespace jikka #endif // JIKKA_MATRIX_HPP