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

Commit 18d5be1

Browse files
committed
fix poly recover and use bigint
1 parent b7e58cc commit 18d5be1

File tree

2 files changed

+29
-20
lines changed

2 files changed

+29
-20
lines changed

utils.go

+21-20
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,10 @@ import (
44
"bytes"
55
"errors"
66
"math"
7+
"math/big"
78
)
89

9-
func polyRecover(xs []int, ys []int) []int {
10+
func polyRecover(xs []int, ys []*big.Int) []*big.Int {
1011
if len(xs) != len(ys) {
1112
panic("array length mismatch")
1213
}
@@ -15,7 +16,7 @@ func polyRecover(xs []int, ys []int) []int {
1516
ns := make([][]int, length)
1617
ds := make([]int, length)
1718
for i := 0; i < length; i++ {
18-
ns[i], ds[i] = lagrange(xs[i], length)
19+
ns[i], ds[i] = lagrange(xs, i)
1920
}
2021
bigR := 1
2122
for i := 0; i < length; i++ {
@@ -30,34 +31,34 @@ func polyRecover(xs []int, ys []int) []int {
3031
}
3132

3233
// Recover polynomial
33-
t := make([]int, 0)
34+
t := make([]*big.Int, 0)
3435
for i := 0; i < length; i++ {
35-
poly := make([]int, len(ns[i]))
36+
poly := make([]*big.Int, len(ns[i]))
3637
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])
3839
}
3940
t = polyAdd(t, poly)
4041
}
4142
for i := 0; i < len(t); i++ {
42-
t[i] /= bigR
43+
t[i] = new(big.Int).Div(t[i], big.NewInt(int64(bigR)))
4344
}
4445
return t
4546
}
4647

47-
func lagrange(x int, n int) ([]int, int) {
48+
func lagrange(xs []int, n int) ([]int, int) {
4849
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 {
5152
continue
5253
}
53-
numerator = polyMul(numerator, []int{-i, 1})
54+
numerator = polyMul(numerator, []int{-xs[i], 1})
5455
}
5556
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 {
5859
continue
5960
}
60-
denominator *= x - i
61+
denominator *= xs[n] - xs[i]
6162
}
6263
return numerator, denominator
6364
}
@@ -74,23 +75,23 @@ func polyMul(p1 []int, p2 []int) []int {
7475
}
7576

7677
// (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 {
7879
if len(p1) > len(p2) {
79-
r := make([]int, len(p1))
80+
r := make([]*big.Int, len(p1))
8081
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])
8283
}
8384
for i := len(p2); i < len(p1); i++ {
84-
r[i] = p1[i]
85+
r[i] = new(big.Int).Set(p1[i])
8586
}
8687
return r
8788
} else {
88-
r := make([]int, len(p2))
89+
r := make([]*big.Int, len(p2))
8990
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])
9192
}
9293
for i := len(p1); i < len(p2); i++ {
93-
r[i] = p2[i]
94+
r[i] = new(big.Int).Set(p2[i])
9495
}
9596
return r
9697
}

utils_test.go

+8
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,17 @@
11
package tpke
22

33
import (
4+
"math/big"
45
"testing"
56
)
67

8+
func TestRecover(t *testing.T) {
9+
p := polyRecover([]int{1, 2, 3, 4, 5}, []*big.Int{big.NewInt(3), big.NewInt(7), big.NewInt(13), big.NewInt(21), big.NewInt(31)})
10+
if p[0].Int64() != 1 || p[1].Int64() != 1 || p[2].Int64() != 1 || p[3].Int64() != 0 || p[4].Int64() != 0 {
11+
t.Fatalf("recover failed. %v", p)
12+
}
13+
}
14+
715
func TestDeterminant(t *testing.T) {
816
matrix := [][]int{{7, 8, 9, 4, 3}, {4, 9, 7, 0, 0}, {3, 6, 1, 0, 0}, {0, 5, 6, 0, 0}, {0, 6, 8, 0, 0}}
917
result, _ := determinant(matrix, len(matrix))

0 commit comments

Comments
 (0)