class LagrangePolynomial

Attributes

points[RW]
values[RW]

Public Class Methods

new(input) click to toggle source
# File lib/polynomial_ruby/lagrange_polynomial.rb, line 4
def initialize(input)
  self.points = input.map { |a, _| a }
  self.values = input.map { |_, b| b }
end

Public Instance Methods

call() click to toggle source
# File lib/polynomial_ruby/lagrange_polynomial.rb, line 9
def call
  basis_polynomials.zip(values)
                   .map { |p, v| p * v }
                   .reduce(:+)
end

Private Instance Methods

basis_polynomials() click to toggle source
# File lib/polynomial_ruby/lagrange_polynomial.rb, line 17
def basis_polynomials
  Array.new(points.size) { |j|
    numerator = Polynomial.new([BigDecimal(1)])
    denominator = BigDecimal(1)
    points.each_with_index { |el, m|
      numerator *= Polynomial.new([BigDecimal(0), BigDecimal(1)]) - el unless(j == m)
    }
    points.each_with_index { |el, m|
      denominator *= (points[j] - points[m]) unless(j == m)
    }
    numerator / denominator
  }
end