go-snark/r1csqapFloat/r1csqapFloat_test.go
r1csqapFloat/r1csqapFloat_test.goRaw
1package r1csqapFloat
2
3import (
4 "fmt"
5 "math/big"
6 "testing"
7
8 "github.com/stretchr/testify/assert"
9)
10
11func TestTranspose(t *testing.T) {
12 b0 := big.NewFloat(float64(0))
13 b1 := big.NewFloat(float64(1))
14 bFive := big.NewFloat(float64(5))
15 a := [][]*big.Float{
16 []*big.Float{b0, b1, b0, b0, b0, b0},
17 []*big.Float{b0, b0, b0, b1, b0, b0},
18 []*big.Float{b0, b1, b0, b0, b1, b0},
19 []*big.Float{bFive, b0, b0, b0, b0, b1},
20 }
21 aT := Transpose(a)
22 assert.Equal(t, aT, [][]*big.Float{
23 []*big.Float{b0, b0, b0, bFive},
24 []*big.Float{b1, b0, b1, b0},
25 []*big.Float{b0, b0, b0, b0},
26 []*big.Float{b0, b1, b0, b0},
27 []*big.Float{b0, b0, b1, b0},
28 []*big.Float{b0, b0, b0, b1},
29 })
30}
31
32func TestPol(t *testing.T) {
33 b0 := big.NewFloat(float64(0))
34 b1 := big.NewFloat(float64(1))
35 // b1neg := big.NewFloat(float64(-1))
36 // b2 := big.NewFloat(float64(2))
37 b2neg := big.NewFloat(float64(-2))
38 b3 := big.NewFloat(float64(3))
39 b4 := big.NewFloat(float64(4))
40 b5 := big.NewFloat(float64(5))
41 b6 := big.NewFloat(float64(6))
42 b16 := big.NewFloat(float64(16))
43
44 a := []*big.Float{b1, b0, b5}
45 b := []*big.Float{b3, b0, b1}
46
47 // polynomial multiplication
48 c := PolMul(a, b)
49 assert.Equal(t, c, []*big.Float{b3, b0, b16, b0, b5})
50
51 // polynomial addition
52 c = PolAdd(a, b)
53 assert.Equal(t, c, []*big.Float{b4, b0, b6})
54
55 // polynomial subtraction
56 c = PolSub(a, b)
57 assert.Equal(t, c, []*big.Float{b2neg, b0, b4})
58
59 // FloatPow
60 p := FloatPow(big.NewFloat(float64(5)), 3)
61 assert.Equal(t, p, big.NewFloat(float64(125)))
62 p = FloatPow(big.NewFloat(float64(5)), 0)
63 assert.Equal(t, p, big.NewFloat(float64(1)))
64
65 // NewPolZeroAt
66 r := NewPolZeroAt(3, 4, b4)
67 assert.Equal(t, PolEval(r, big.NewFloat(3)), b4)
68 r = NewPolZeroAt(2, 4, b3)
69 assert.Equal(t, PolEval(r, big.NewFloat(2)), b3)
70}
71
72func TestLagrangeInterpolation(t *testing.T) {
73 b0 := big.NewFloat(float64(0))
74 b5 := big.NewFloat(float64(5))
75 a := []*big.Float{b0, b0, b0, b5}
76 alpha := LagrangeInterpolation(a)
77
78 assert.Equal(t, PolEval(alpha, big.NewFloat(4)), b5)
79 aux, _ := PolEval(alpha, big.NewFloat(3)).Int64()
80 assert.Equal(t, aux, int64(0))
81
82}
83
84func TestR1CSToQAP(t *testing.T) {
85 b0 := big.NewFloat(float64(0))
86 b1 := big.NewFloat(float64(1))
87 b3 := big.NewFloat(float64(3))
88 b5 := big.NewFloat(float64(5))
89 b9 := big.NewFloat(float64(9))
90 b27 := big.NewFloat(float64(27))
91 b30 := big.NewFloat(float64(30))
92 b35 := big.NewFloat(float64(35))
93 a := [][]*big.Float{
94 []*big.Float{b0, b1, b0, b0, b0, b0},
95 []*big.Float{b0, b0, b0, b1, b0, b0},
96 []*big.Float{b0, b1, b0, b0, b1, b0},
97 []*big.Float{b5, b0, b0, b0, b0, b1},
98 }
99 b := [][]*big.Float{
100 []*big.Float{b0, b1, b0, b0, b0, b0},
101 []*big.Float{b0, b1, b0, b0, b0, b0},
102 []*big.Float{b1, b0, b0, b0, b0, b0},
103 []*big.Float{b1, b0, b0, b0, b0, b0},
104 }
105 c := [][]*big.Float{
106 []*big.Float{b0, b0, b0, b1, b0, b0},
107 []*big.Float{b0, b0, b0, b0, b1, b0},
108 []*big.Float{b0, b0, b0, b0, b0, b1},
109 []*big.Float{b0, b0, b1, b0, b0, b0},
110 }
111 ap, bp, cp, z := R1CSToQAP(a, b, c)
112 fmt.Println(ap)
113 fmt.Println(bp)
114 fmt.Println(cp)
115 fmt.Println(z)
116 zexpected := []*big.Float{big.NewFloat(float64(24)), big.NewFloat(float64(-50)), big.NewFloat(float64(35)), big.NewFloat(float64(-10)), big.NewFloat(float64(1))}
117 assert.Equal(t, z, zexpected)
118
119 w := []*big.Float{b1, b3, b35, b9, b27, b30}
120 alpha, beta, gamma, px := SolPolynomials(w, ap, bp, cp)
121 fmt.Println(alpha)
122 fmt.Println(beta)
123 fmt.Println(gamma)
124 fmt.Println(px)
125
126 h := DivisorPolinomial(px, z)
127 fmt.Println(h)
128}