Nyaan's Library

This documentation is automatically generated by online-judge-tools/verification-helper

View on GitHub

:heavy_check_mark: matrix/characteristric-polynomial.hpp

Verified with

Code

#pragma once

// calculate det(a - xI)
template <typename mint>
vector<mint> CharacteristicPolynomial(vector<vector<mint>> a) {
  int N = a.size();

  for (int j = 0; j < N - 2; j++) {
    for (int i = j + 1; i < N; i++) {
      if (a[i][j] != 0) {
        swap(a[j + 1], a[i]);
        for (int k = 0; k < N; k++) swap(a[k][j + 1], a[k][i]);
        break;
      }
    }
    if (a[j + 1][j] != 0) {
      mint inv = mint(1) / a[j + 1][j];
      for (int i = j + 2; i < N; i++) {
        if (a[i][j] == 0) continue;
        mint coe = inv * a[i][j];
        for (int l = j; l < N; l++) a[i][l] -= coe * a[j + 1][l];
        for (int k = 0; k < N; k++) a[k][j + 1] += coe * a[k][i];
      }
    }
  }

  vector<vector<mint>> p(N + 1);
  p[0] = {mint(1)};
  for (int i = 1; i <= N; i++) {
    p[i].resize(i + 1);
    for (int j = 0; j < i; j++) {
      p[i][j + 1] -= p[i - 1][j];
      p[i][j] += p[i - 1][j] * a[i - 1][i - 1];
    }
    mint x = 1;
    for (int m = 1; m < i; m++) {
      x *= -a[i - m][i - m - 1];
      mint coe = x * a[i - m - 1][i - 1];
      for (int j = 0; j < i - m; j++) p[i][j] += coe * p[i - m - 1][j];
    }
  }
  return p[N];
}
#line 2 "matrix/characteristric-polynomial.hpp"

// calculate det(a - xI)
template <typename mint>
vector<mint> CharacteristicPolynomial(vector<vector<mint>> a) {
  int N = a.size();

  for (int j = 0; j < N - 2; j++) {
    for (int i = j + 1; i < N; i++) {
      if (a[i][j] != 0) {
        swap(a[j + 1], a[i]);
        for (int k = 0; k < N; k++) swap(a[k][j + 1], a[k][i]);
        break;
      }
    }
    if (a[j + 1][j] != 0) {
      mint inv = mint(1) / a[j + 1][j];
      for (int i = j + 2; i < N; i++) {
        if (a[i][j] == 0) continue;
        mint coe = inv * a[i][j];
        for (int l = j; l < N; l++) a[i][l] -= coe * a[j + 1][l];
        for (int k = 0; k < N; k++) a[k][j + 1] += coe * a[k][i];
      }
    }
  }

  vector<vector<mint>> p(N + 1);
  p[0] = {mint(1)};
  for (int i = 1; i <= N; i++) {
    p[i].resize(i + 1);
    for (int j = 0; j < i; j++) {
      p[i][j + 1] -= p[i - 1][j];
      p[i][j] += p[i - 1][j] * a[i - 1][i - 1];
    }
    mint x = 1;
    for (int m = 1; m < i; m++) {
      x *= -a[i - m][i - m - 1];
      mint coe = x * a[i - m - 1][i - 1];
      for (int j = 0; j < i - m; j++) p[i][j] += coe * p[i - m - 1][j];
    }
  }
  return p[N];
}
Back to top page