Skip to content
This repository was archived by the owner on Nov 18, 2024. It is now read-only.

Commit b7e58cc

Browse files
committedJun 21, 2024
add lagrange
1 parent eae5f33 commit b7e58cc

File tree

1 file changed

+90
-0
lines changed

1 file changed

+90
-0
lines changed
 

‎utils.go

+90
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,96 @@ import (
66
"math"
77
)
88

9+
func polyRecover(xs []int, ys []int) []int {
10+
if len(xs) != len(ys) {
11+
panic("array length mismatch")
12+
}
13+
// Compute lagrange
14+
length := len(ys)
15+
ns := make([][]int, length)
16+
ds := make([]int, length)
17+
for i := 0; i < length; i++ {
18+
ns[i], ds[i] = lagrange(xs[i], length)
19+
}
20+
bigR := 1
21+
for i := 0; i < length; i++ {
22+
bigR *= ds[i]
23+
}
24+
for i := 0; i < length; i++ {
25+
div := bigR / ds[i]
26+
for j := 0; j < len(ns[i]); j++ {
27+
ns[i][j] *= div
28+
}
29+
ds[i] = bigR
30+
}
31+
32+
// Recover polynomial
33+
t := make([]int, 0)
34+
for i := 0; i < length; i++ {
35+
poly := make([]int, len(ns[i]))
36+
for j := 0; j < len(ns[i]); j++ {
37+
poly[j] = ns[i][j] * ys[i]
38+
}
39+
t = polyAdd(t, poly)
40+
}
41+
for i := 0; i < len(t); i++ {
42+
t[i] /= bigR
43+
}
44+
return t
45+
}
46+
47+
func lagrange(x int, n int) ([]int, int) {
48+
numerator := []int{1}
49+
for i := 0; i < n; i++ {
50+
if x == i {
51+
continue
52+
}
53+
numerator = polyMul(numerator, []int{-i, 1})
54+
}
55+
denominator := 1
56+
for i := 0; i < n; i++ {
57+
if x == i {
58+
continue
59+
}
60+
denominator *= x - i
61+
}
62+
return numerator, denominator
63+
}
64+
65+
// (a0+a1x+a2x^2)*(b0+b1x+b2x^2)
66+
func polyMul(p1 []int, p2 []int) []int {
67+
r := make([]int, len(p1)+len(p2)-1)
68+
for i := 0; i < len(p1); i++ {
69+
for j := 0; j < len(p2); j++ {
70+
r[i+j] += p1[i] * p2[j]
71+
}
72+
}
73+
return r
74+
}
75+
76+
// (a0+a1x+a2x^2)+(b0+b1x+b2x^2)
77+
func polyAdd(p1 []int, p2 []int) []int {
78+
if len(p1) > len(p2) {
79+
r := make([]int, len(p1))
80+
for i := 0; i < len(p2); i++ {
81+
r[i] = p1[i] + p2[i]
82+
}
83+
for i := len(p2); i < len(p1); i++ {
84+
r[i] = p1[i]
85+
}
86+
return r
87+
} else {
88+
r := make([]int, len(p2))
89+
for i := 0; i < len(p1); i++ {
90+
r[i] = p1[i] + p2[i]
91+
}
92+
for i := len(p1); i < len(p2); i++ {
93+
r[i] = p2[i]
94+
}
95+
return r
96+
}
97+
}
98+
999
func feldman(matrix [][]int) (int, []int) {
10100
// Compute D, D1
11101
d, coeff := determinant(matrix, len(matrix))

0 commit comments

Comments
 (0)
This repository has been archived.