interpolation

package module
v0.0.0-...-6ce53f3 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Aug 27, 2023 License: MIT Imports: 4 Imported by: 0

README

go-lagrange-interpolation

A Lagrange interpolation implementation in Go.

Given a list of points in $\mathbb{F}_p$, outputs all coefficients of interpolating polynomial $P(x)$.

I am shocked by the fact that the majority of Lagrange interpolation implementations only calculate $P(0)$ and not all the coefficients. However, I have recently discovered a well-written implementation in C++ that computes all coefficients of $P(x)$, available on OI Wiki. Therefore, I have personally created a reimplementation of this in Go, which is available in this repository.

Example

The following example codes domonstrate Lagrange interpolation, resulting in a polynomial with coefficients 1, 1, 4, 5, 1, 4.

package main

import (
	"fmt"
	"math/big"

	interpolation "github.com/SadPencil/go-lagrange-interpolation"
	"github.com/SadPencil/go-lagrange-interpolation/field"
)

func main() {
	modulus := big.NewInt(11)
	points := []*interpolation.XYPoint{
		{X: &field.Field{Modulus: modulus, Value: big.NewInt(0)}, Y: &field.Field{Modulus: modulus, Value: big.NewInt(1)}},
		{X: &field.Field{Modulus: modulus, Value: big.NewInt(1)}, Y: &field.Field{Modulus: modulus, Value: big.NewInt(5)}},
		{X: &field.Field{Modulus: modulus, Value: big.NewInt(8)}, Y: &field.Field{Modulus: modulus, Value: big.NewInt(9)}},
		{X: &field.Field{Modulus: modulus, Value: big.NewInt(2)}, Y: &field.Field{Modulus: modulus, Value: big.NewInt(5)}},
		{X: &field.Field{Modulus: modulus, Value: big.NewInt(4)}, Y: &field.Field{Modulus: modulus, Value: big.NewInt(0)}},
		{X: &field.Field{Modulus: modulus, Value: big.NewInt(10)}, Y: &field.Field{Modulus: modulus, Value: big.NewInt(7)}},
		{X: &field.Field{Modulus: modulus, Value: big.NewInt(6)}, Y: &field.Field{Modulus: modulus, Value: big.NewInt(4)}},
	}
	poly, err := interpolation.LagrangeInterpolation(points)
	if err != nil {
		panic(err)
	}
	for i := 0; i < len(poly.Coefficients); i++ {
		fmt.Printf("f[%v]: %v\n", i, poly.Coefficients[i].String())
	}
	for i := 0; i < 11; i++ {
		x := &field.Field{Modulus: modulus, Value: big.NewInt(int64(i))}
		y := poly.EvaluateAt(x)
		fmt.Printf("(%v, %v)\n", x, y)
	}
}

Documentation

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func LagrangeInterpolation

func LagrangeInterpolation(points []*XYPoint) (*polynomial.Polynomial, error)

Types

type XYPoint

type XYPoint struct {
	X *field.Field
	Y *field.Field
}

Directories

Path Synopsis

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL