@@ -4,9 +4,10 @@ import (
4
4
"bytes"
5
5
"errors"
6
6
"math"
7
+ "math/big"
7
8
)
8
9
9
- func polyRecover (xs []int , ys []int ) []int {
10
+ func polyRecover (xs []int , ys []* big. Int ) []* big. Int {
10
11
if len (xs ) != len (ys ) {
11
12
panic ("array length mismatch" )
12
13
}
@@ -15,7 +16,7 @@ func polyRecover(xs []int, ys []int) []int {
15
16
ns := make ([][]int , length )
16
17
ds := make ([]int , length )
17
18
for i := 0 ; i < length ; i ++ {
18
- ns [i ], ds [i ] = lagrange (xs [ i ], length )
19
+ ns [i ], ds [i ] = lagrange (xs , i )
19
20
}
20
21
bigR := 1
21
22
for i := 0 ; i < length ; i ++ {
@@ -30,34 +31,34 @@ func polyRecover(xs []int, ys []int) []int {
30
31
}
31
32
32
33
// Recover polynomial
33
- t := make ([]int , 0 )
34
+ t := make ([]* big. Int , 0 )
34
35
for i := 0 ; i < length ; i ++ {
35
- poly := make ([]int , len (ns [i ]))
36
+ poly := make ([]* big. Int , len (ns [i ]))
36
37
for j := 0 ; j < len (ns [i ]); j ++ {
37
- poly [j ] = ns [i ][j ] * ys [i ]
38
+ poly [j ] = new (big. Int ). Mul ( big . NewInt ( int64 ( ns [i ][j ])), ys [i ])
38
39
}
39
40
t = polyAdd (t , poly )
40
41
}
41
42
for i := 0 ; i < len (t ); i ++ {
42
- t [i ] /= bigR
43
+ t [i ] = new (big. Int ). Div ( t [ i ], big . NewInt ( int64 ( bigR )))
43
44
}
44
45
return t
45
46
}
46
47
47
- func lagrange (x int , n int ) ([]int , int ) {
48
+ func lagrange (xs [] int , n int ) ([]int , int ) {
48
49
numerator := []int {1 }
49
- for i := 0 ; i < n ; i ++ {
50
- if x == i {
50
+ for i := 0 ; i < len ( xs ) ; i ++ {
51
+ if n == i {
51
52
continue
52
53
}
53
- numerator = polyMul (numerator , []int {- i , 1 })
54
+ numerator = polyMul (numerator , []int {- xs [ i ] , 1 })
54
55
}
55
56
denominator := 1
56
- for i := 0 ; i < n ; i ++ {
57
- if x == i {
57
+ for i := 0 ; i < len ( xs ) ; i ++ {
58
+ if n == i {
58
59
continue
59
60
}
60
- denominator *= x - i
61
+ denominator *= xs [ n ] - xs [ i ]
61
62
}
62
63
return numerator , denominator
63
64
}
@@ -74,23 +75,23 @@ func polyMul(p1 []int, p2 []int) []int {
74
75
}
75
76
76
77
// (a0+a1x+a2x^2)+(b0+b1x+b2x^2)
77
- func polyAdd (p1 []int , p2 []int ) []int {
78
+ func polyAdd (p1 []* big. Int , p2 []* big. Int ) []* big. Int {
78
79
if len (p1 ) > len (p2 ) {
79
- r := make ([]int , len (p1 ))
80
+ r := make ([]* big. Int , len (p1 ))
80
81
for i := 0 ; i < len (p2 ); i ++ {
81
- r [i ] = p1 [i ] + p2 [i ]
82
+ r [i ] = new (big. Int ). Add ( p1 [i ], p2 [i ])
82
83
}
83
84
for i := len (p2 ); i < len (p1 ); i ++ {
84
- r [i ] = p1 [i ]
85
+ r [i ] = new (big. Int ). Set ( p1 [i ])
85
86
}
86
87
return r
87
88
} else {
88
- r := make ([]int , len (p2 ))
89
+ r := make ([]* big. Int , len (p2 ))
89
90
for i := 0 ; i < len (p1 ); i ++ {
90
- r [i ] = p1 [i ] + p2 [i ]
91
+ r [i ] = new (big. Int ). Add ( p1 [i ], p2 [i ])
91
92
}
92
93
for i := len (p1 ); i < len (p2 ); i ++ {
93
- r [i ] = p2 [i ]
94
+ r [i ] = new (big. Int ). Set ( p2 [i ])
94
95
}
95
96
return r
96
97
}
0 commit comments