@@ -6,6 +6,96 @@ import (
6
6
"math"
7
7
)
8
8
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
+
9
99
func feldman (matrix [][]int ) (int , []int ) {
10
100
// Compute D, D1
11
101
d , coeff := determinant (matrix , len (matrix ))
0 commit comments