#include "gr_vec.h"
#include "gr_poly.h"
int
_gr_poly_interpolate_exact_newton(gr_ptr res, gr_srcptr xs, gr_srcptr ys, slong len, gr_ctx_t ctx)
{
int status;
status = _gr_poly_newton_basis_interpolate_exact(res, xs, ys, len, ctx);
status |= _gr_poly_newton_basis_to_monomial(res, xs, res, len, ctx);
return status;
}
int
gr_poly_interpolate_exact_newton(gr_poly_t poly,
const gr_vec_t xs, const gr_vec_t ys, gr_ctx_t ctx)
{
int status;
slong n = xs->length;
if (n != ys->length)
return GR_DOMAIN;
gr_poly_fit_length(poly, n, ctx);
status = _gr_poly_interpolate_exact_newton(poly->coeffs, xs->entries, ys->entries, n, ctx);
_gr_poly_set_length(poly, n, ctx);
_gr_poly_normalise(poly, ctx);
return status;
}
int
_gr_poly_interpolate_newton(gr_ptr res, gr_srcptr xs, gr_srcptr ys, slong len, gr_ctx_t ctx)
{
int status;
status = _gr_poly_newton_basis_interpolate(res, xs, ys, len, ctx);
status |= _gr_poly_newton_basis_to_monomial(res, xs, res, len, ctx);
return status;
}
int
gr_poly_interpolate_newton(gr_poly_t poly,
const gr_vec_t xs, const gr_vec_t ys, gr_ctx_t ctx)
{
int status;
slong n = xs->length;
if (n != ys->length)
return GR_DOMAIN;
gr_poly_fit_length(poly, n, ctx);
status = _gr_poly_interpolate_newton(poly->coeffs, xs->entries, ys->entries, n, ctx);
_gr_poly_set_length(poly, n, ctx);
_gr_poly_normalise(poly, ctx);
return status;
}