#include <armadillo>
#include <cmath>

arma::mat create_tridiagonal_matrix(int N, double h);

arma::mat create_dense_matrix(int N, double h);

void normalize_columns(arma::mat& A);

void analytical_solution(int N, double h, arma::vec& eigenvalues, arma::mat& eigenvectors);

double max_offdiag_symmetric(const arma::mat& A, int& k, int &l);

void jacobi_rotate(arma::mat& A, arma::mat& R, int k, int l);

void jacobi_eigensolver(const arma::mat& A, double eps, arma::vec& eigenvalues, arma::mat& eigenvectors, const int maxiter, int& iterations, bool& converged);

void sort_eigenpairs(arma::vec& eigenvalues, arma::mat& eigenvectors);