// Ejemplos con TNT y JAMA
// compilar con g++ - I./ templates raices_pol.cpp
#include <iostream>
#include <iomanip>
#include <complex>
#include "algebralineal.h"
using namespace std;
using namespace CALNUM;

typedef long double Real;
//tipo generico Real
Real pol(Vector < Real > a, Real x, Real y)
{
	//Calculo de un polinomio por el algoritmo de Horner
		complex < Real > p = 0.;
	int             n = a.size();
	complex < Real > z = complex < Real > (x, y);
	p = a(n);
	for (int i = n - 1; i >= 1; i--)
		p = p * z + a(i);
	Real            pr = real(p);
	return pr;
}


int main()
{
	cout << "Entrar dimension" << endl;
	int             n;
	cin >> n;
	Matrix < Real > A(n, n);
	Matrix < Real > E(n, n);
	Vector < Real > a(n + 1), lambdar(n), lambdai(n);
	//Definicion de a.En caso general leer n y a de fichero
		a = 1.;

	//Creacion matriz
		for (int i = 0; i < n - 1; i++) {
		A[0][i] = -a[n - i - 1] / a[n];
		A[i + 1][i] = 1.;
	}
	A[0][n - 1] = -a[0] / a[n];
	cout << "A = " << A << endl;

	//valores y vectores propios
		Eigenvalue < Real > val_prop(A); //Se crea un elemennto val_prop de la clase Eingenvalue

		val_prop.getRealEigenvalues(lambdar); //relleno de lambda con los valores propios
		cout << "parte real raices=" << lambdar << endl;
	val_prop.getImagEigenvalues(lambdai);
	cout << "parte imaginaria raices=" << lambdai << endl;
	//Verificacion de las raices
		for (int i = 0; i < n; i++) {
		Real            p = pol(a, lambdar[i], lambdai[i]);
		cout << p << endl;
	}

	return 0;
}
