Advertisement
Guest User

Untitled

a guest
Feb 28th, 2020
113
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.44 KB | None | 0 0
  1. #pragma once
  2.  
  3. #include <array>
  4. #include <utility>
  5.  
  6. constexpr int get_cofactor_coef(int i, int j) {
  7.     return (i + j) % 2 == 0 ? 1 : -1;
  8. }
  9.  
  10. template <std::size_t N>
  11. constexpr std::array<std::array<int, N - 1>, N - 1> get_submatrix_of_a(
  12.     const std::array<std::array<int, N>, N>& a, int i, int j) {
  13.     std::array<std::array<int, N - 1>, N - 1> r{};
  14.     for (int ii = 0; ii != N - 1; ++ii) {
  15.         for (int jj = 0; jj != N - 1; ++jj) {
  16.             (&std::get<0>(((&std::get<0>(r))[ii])))[jj] =
  17.                 a[ii + (ii >= i ? 1 : 0)][jj + (jj >= j ? 1 : 0)];
  18.         }
  19.     }
  20.     return r;
  21. }
  22.  
  23. template <int N>
  24. constexpr int determinant(const std::array<std::array<int, N>, N>& a) {
  25.     int det = 0;
  26.  
  27.     for (size_t i = 0u; i < N; ++i) {
  28.         det +=
  29.             get_cofactor_coef(i, 1) * a[i][0] * determinant<N - 1>(get_submatrix_of_a<N>(a, i, 0));
  30.     }
  31.  
  32.     return det;
  33. }
  34.  
  35. template <>
  36. constexpr int determinant<3>(const std::array<std::array<int, 3>, 3>& a) {
  37.     return a[0][0] * a[1][1] * a[2][2] + a[1][0] * a[2][1] * a[0][2] + a[0][1] * a[1][2] * a[2][0] -
  38.            a[0][2] * a[1][1] * a[2][0] - a[1][0] * a[0][1] * a[2][2] - a[2][1] * a[1][2] * a[0][0];
  39. }
  40.  
  41. template <>
  42. constexpr int determinant<2>(const std::array<std::array<int, 2>, 2>& a) {
  43.     return a[0][0] * a[1][1] - a[0][1] * a[1][0];
  44. }
  45.  
  46. template <>
  47. constexpr int determinant<1>(const std::array<std::array<int, 1>, 1>& a) {
  48.     return a[0][0];
  49. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement