#
# = Polynomials
# Contents:
# 1. {Polynomial Evaluation}[link:files/rdoc/poly_rdoc.html#1]
# 1. {Solving polynomial equations}[link:files/rdoc/poly_rdoc.html#2]
# 1. {Quadratic Equations}[link:files/rdoc/poly_rdoc.html#2.1]
# 1. {Cubic Equations}[link:files/rdoc/poly_rdoc.html#2.2]
# 1. {General Polynomial Equations}[link:files/rdoc/poly_rdoc.html#2.3]
# 1. {GSL::Poly Class}[link:files/rdoc/poly_rdoc.html#3]
# 1. {Constructors}[link:files/rdoc/poly_rdoc.html#3.1]
# 1. {Methods}[link:files/rdoc/poly_rdoc.html#3.2]
# 1. {Polynomial Fitting}[link:files/rdoc/poly_rdoc.html#4]
# 1. {Divided-difference representations}[link:files/rdoc/poly_rdoc.html#5]
# 1. {Extensions}[link:files/rdoc/poly_rdoc.html#6]
# 1. {Special Polynomials}[link:files/rdoc/poly_rdoc.html#6.1]
# 1. {Polynomial Operations}[link:files/rdoc/poly_rdoc.html#6.2]
#
# == {}[link:index.html"name="1] Polynomial Evaluation
# ---
# * GSL::Poly.eval(c, x)
#
# Evaluates the polynomial c[0] + c[1]x + c[2]x^2 + ....
# The polynomial coefficients c can be an Array,
# a GSL::Vector, or an NArray. The evaluation point x
# is a Numeric, Array, GSL::Vector or NArray.
# From GSL 1.11, x can be a complex number, and c can be a complex polynomial given by a GSL::Vector::Complex or an Array.
#
# Ex)
# >> require("gsl")
# => true
# >> GSL::Poly.eval([1, 2, 3], 2)
# => 17.0
# >> GSL::Poly.eval(GSL::Vector[1, 2, 3], 2)
# => 17.0
# >> GSL::Poly.eval(NArray[1.0, 2, 3], 2)
# => 17.0
# >> GSL::Poly.eval([1, 2, 3], [1, 2, 3])
# => [6.0, 17.0, 34.0]
# >> GSL::Poly.eval([1, 2, 3], GSL::Vector[1, 2, 3])
# => GSL::Vector
# [ 6.000e+00 1.700e+01 3.400e+01 ]
# >> GSL::Poly.eval([1, 2, 3], NArray[1.0, 2, 3])
# => NArray.float(3):
# [ 6.0, 17.0, 34.0 ]
#
# ---
# * GSL::Poly.eval_derivs(c, x)
# * GSL::Poly.eval_derivs(c, x, lenres)
#
# (GSL-1.13) Evaluate and return a polynomial and its derivatives. The output contains the values of d^k P/d x^k for the specified value of x starting with k = 0. The input polynomial c can be an Array, GSL::Poly or an NArray. If lenres is not given, lenres = LENGTH(c) + 1 is used, therefore the last element of the output is 0.
#
# ---
# * GSL::Poly#eval_derivs(x)
# * GSL::Poly#eval_derivs(x, lenres)
#
# (GSL-1.13) Evaluate and return a polynomial and its derivatives. The output contains the values of d^k P/d x^k for the specified value of x starting with k = 0. If lenres is not given, lenres = LENGTH(self) + 1 is used, therefore the last element of the output is 0.
#
# Ex.)
# >> ary = [1, 2, 3]
# => [1, 2, 3]
# >> GSL::Poly.eval_derivs(ary, 1)
# => [6.0, 8.0, 6.0, 0.0]
# >> na = NArray[1.0, 2, 3]
# => NArray.float(3):
# [ 1.0, 2.0, 3.0 ]
# >> GSL::Poly.eval_derivs(na, 1)
# => NArray.float(4):
# [ 6.0, 8.0, 6.0, 0.0 ]
# >> poly = GSL::Poly[1.0, 2, 3]
# => GSL::Poly
# [ 1.000e+00 2.000e+00 3.000e+00 ]
# >> GSL::Poly.eval_derivs(poly, 1)
# => GSL::Poly
# [ 6.000e+00 8.000e+00 6.000e+00 0.000e+00 ]
# >> poly.eval_derivs(1)
# => GSL::Poly
# [ 6.000e+00 8.000e+00 6.000e+00 0.000e+00 ]
# >> poly.eval_derivs(1, 3)
# => GSL::Poly
# [ 6.000e+00 8.000e+00 6.000e+00 ]
#
# == {}[link:index.html"name="2] Solving polynomial equations
# === {}[link:index.html"name="2.1] Quadratic Equations
# ---
# * GSL::Poly::solve_quadratic(a, b, c)
# * GSL::Poly::solve_quadratic([a, b, c])
#
# Find the real roots of the quadratic equation,
# a x^2 + b x + c = 0
# The coefficients are given by 3 numbers, or a Ruby array,
# or a GSL::Vector object. The roots are returned as a GSL::Vector.
#
# * Ex: z^2 - 3z + 2 = 0
# >> GSL::Poly::solve_quadratic(1, -3, 2)
# => GSL::Vector:
# [ 1.000e+00 2.000e+00 ]
#
#
# ---
# * GSL::Poly::complex_solve_quadratic(a, b, c)
# * GSL::Poly::complex_solve_quadratic([a, b, c])
#
# Find the complex roots of the quadratic equation,
# a z^2 + b z + z = 0
# The coefficients are given by 3 numbers or a Ruby array, or a
# GSL::Vector.
# The roots are returned as a GSL::Vector::Complex of two elements.
#
# * Ex: z^2 - 3z + 2 = 0
# >> require("gsl")
# => true
# >> GSL::Poly::complex_solve_quadratic(1, -3, 2)
# [ [1.000e+00 0.000e+00] [2.000e+00 0.000e+00] ]
# => #
# >> GSL::Poly::complex_solve_quadratic(1, -3, 2).real <--- Real part
# => GSL::Vector::View:
# [ 1.000e+00 2.000e+00 ]
#
# === {}[link:index.html"name="2.2] Cubic Equations
# ---
# * GSL::Poly::solve_cubic(same as solve_quadratic)
#
# This method finds the real roots of the cubic equation,
# x^3 + a x^2 + b x + c = 0
#
# ---
# * GSL::Poly::complex_solve_cubic(same as solve_cubic)
#
# This method finds the complex roots of the cubic equation,
# z^3 + a z^2 + b z + c = 0
#
# === {}[link:index.html"name="2.3] General Polynomial Equations
# ---
# * GSL::Poly::complex_solve(c0, c1, c2,,, )
# * GSL::Poly::solve(c0, c1, c2,,, )
#
# Find the complex roots of the polynomial equation. Note that
# the coefficients are given by "ascending" order.
#
# * Ex: x^2 - 3 x + 2 == 0
# >> GSL::Poly::complex_solve(2, -3, 1) <--- different from Poly::quadratic_solve
# [ [1.000e+00 0.000e+00] [2.000e+00 0.000e+00] ]
# => #
#
# == {}[link:index.html"name="3] GSL::Poly Class
# This class expresses polynomials of arbitrary orders.
#
# === {}[link:index.html"name="3.1] Constructors
# ---
# * GSL::Poly.alloc(c0, c1, c2, ....)
# * GSL::Poly[c0, c1, c2, ....]
#
# This creates an instance of the GSL::Poly class,
# which represents a polynomial
# c0 + c1 x + c2 x^2 + ....
# This class is derived from GSL::Vector.
#
# * Ex: x^2 - 3 x + 2
# poly = GSL::Poly.alloc([2, -3, 1])
#
# === {}[link:index.html"name="3.2] Instance Methods
# ---
# * GSL::Poly#eval(x)
# * GSL::Poly#at(x)
#
# Evaluates the polynomial
# c[0] + c[1] x + c[2] x^2 + ... + c[len-1] x^{len-1}
# using Horner's method for stability. The argument x is a
# Numeric, GSL::Vector, Matrix or an Array.
#
# ---
# * GSL::Poly#solve_quadratic
#
# Solve the quadratic equation.
#
# * Ex: z^2 - 3 z + 2 = 0:
# >> a = GSL::Poly[2, -3, 1]
# => GSL::Poly:
# [ 2.000e+00 -3.000e+00 1.000e+00 ]
# >> a.solve_quadratic
# => GSL::Vector:
# [ 1.000e+00 2.000e+00 ]
#
# ---
# * GSL::Poly#solve_cubic
#
# Solve the cubic equation.
#
# ---
# * GSL::Poly#complex_solve
# * GSL::Poly#solve
# * GSL::Poly#roots
#
# These methods find the complex roots of the quadratic equation,
# c0 + c1 z + c2 z^2 + .... = 0
#
# * Ex: z^2 - 3 z + 2 = 0:
# >> a = GSL::Poly[2, -3, 1]
# => GSL::Poly:
# [ 2.000e+00 -3.000e+00 1.000e+00 ]
# >> a.solve
# [ [1.000e+00 0.000e+00] [2.000e+00 0.000e+00] ]
# => #
#
# == {}[link:index.html"name="4] Polynomial fitting
# ---
# * GSL::Poly.fit(x, y, order)
# * GSL::Poly.wfit(x, w, y, order)
#
# Finds the coefficient of a polynomial of order order
# that fits the vector data (x, y) in a least-square sense.
# This provides a higher-level interface to the method
# {GSL::Multifit#linear}[link:files/rdoc/fit_rdoc.html] in a case of polynomial fitting.
#
# Example:
# #!/usr/bin/env ruby
# require("gsl")
#
# x = GSL::Vector[1, 2, 3, 4, 5]
# y = GSL::Vector[5.5, 43.1, 128, 290.7, 498.4]
# # The results are stored in a polynomial "coef"
# coef, cov, chisq, status = Poly.fit(x, y, 3)
#
# x2 = GSL::Vector.linspace(1, 5, 20)
# graph([x, y], [x2, coef.eval(x2)], "-C -g 3 -S 4")
#
# == {}[link:index.html"name="5] Divided-difference representations
#
# ---
# * GSL::Poly::dd_init(xa, ya)
#
# This method computes a divided-difference representation of the
# interpolating polynomial for the points (xa, ya).
#
# ---
# * GSL::Poly::DividedDifference#eval(x)
#
# This method evaluates the polynomial stored in divided-difference form
# self at the point x.
#
# ---
# * GSL::Poly::DividedDifference#taylor(xp)
#
# This method converts the divided-difference representation of a polynomial
# to a Taylor expansion. On output the Taylor coefficients of the polynomial
# expanded about the point xp are returned.
#
# == {}[link:index.html"name="6] Extensions
# === {}[link:index.html"name="6.1] Special Polynomials
# ---
# * GSL::Poly.hermite(n)
#
# This returns coefficients of the n-th order Hermite polynomial, H(x; n).
# For order of n >= 3, this method uses the recurrence relation
# H(x; n+1) = 2 x H(x; n) - 2 n H(x; n-1)
# * Ex:
# >> GSL::Poly.hermite(2)
# => GSL::Poly::Int:
# [ -2 0 4 ] <----- 4x^2 - 2
# >> GSL::Poly.hermite(5)
# => GSL::Poly::Int:
# [ 0 120 0 -160 0 32 ] <----- 32x^5 - 160x^3 + 120x
# >> GSL::Poly.hermite(7)
# => GSL::Poly::Int:
# [ 0 -1680 0 3360 0 -1344 0 128 ]
#
# ---
# * GSL::Poly.cheb(n)
# * GSL::Poly.chebyshev(n)
#
# Return the coefficients of the n-th order Chebyshev polynomial, T(x; n.
# For order of n >= 3, this method uses the recurrence relation
# T(x; n+1) = 2 x T(x; n) - T(x; n-1)
#
# ---
# * GSL::Poly.cheb_II(n)
# * GSL::Poly.chebyshev_II(n)
#
# Return the coefficients of the n-th order Chebyshev polynomial of type II,
# U(x; n.
# U(x; n+1) = 2 x U(x; n) - U(x; n-1)
#
# ---
# * GSL::Poly.bell(n)
#
# Bell polynomial
#
# ---
# * GSL::Poly.bessel(n)
#
# Bessel polynomial
#
# ---
# * GSL::Poly.laguerre(n)
#
# Retunrs the coefficients of the n-th order Laguerre polynomial
# multiplied by n!.
#
# Ex:
# rb(main):001:0> require("gsl")
# => true
# >> GSL::Poly.laguerre(0)
# => GSL::Poly::Int:
# [ 1 ] <--- 1
# >> GSL::Poly.laguerre(1)
# => GSL::Poly::Int:
# [ 1 -1 ] <--- -x + 1
# >> GSL::Poly.laguerre(2)
# => GSL::Poly::Int:
# [ 2 -4 1 ] <--- (x^2 - 4x + 2)/2!
# >> GSL::Poly.laguerre(3)
# => GSL::Poly::Int:
# [ 6 -18 9 -1 ] <--- (-x^3 + 9x^2 - 18x + 6)/3!
# >> GSL::Poly.laguerre(4)
# => GSL::Poly::Int:
# [ 24 -96 72 -16 1 ] <--- (x^4 - 16x^3 + 72x^2 - 96x + 24)/4!
#
# === {}[link:index.html"name="6.2] Polynomial Operations
# ---
# * GSL::Poly#conv
# * GSL::Poly#deconv
# * GSL::Poly#reduce
# * GSL::Poly#deriv
# * GSL::Poly#integ
# * GSL::Poly#compan
#
#
# {prev}[link:files/rdoc/complex_rdoc.html]
# {next}[link:files/rdoc/sf_rdoc.html]
#
# {Reference index}[link:files/rdoc/ref_rdoc.html]
# {top}[link:files/rdoc/index_rdoc.html]
#
#
#