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 // alphas, betas, gammas
112 alphas, betas, gammas, zx := R1CSToQAP(a, b, c)
113 fmt.Println(alphas)
114 fmt.Println(betas)
115 fmt.Println(gammas)
116 fmt.Print("Z(x): ")
117 fmt.Println(zx)
118 zexpected := []*big.Float{big.NewFloat(float64(24)), big.NewFloat(float64(-50)), big.NewFloat(float64(35)), big.NewFloat(float64(-10)), big.NewFloat(float64(1))}
119 assert.Equal(t, zx, zexpected)
120
121 // witness
122 w := []*big.Float{b1, b3, b35, b9, b27, b30}
123 fmt.Print("w: ")
124 fmt.Println(w)
125 // QAP A(x), B(x), C(x)
126 ax, bx, cx, px := CombinePolynomials(w, alphas, betas, gammas)
127 fmt.Print("A(x), B(x), C(x), P(x): ")
128 fmt.Println(ax)
129 fmt.Println(bx)
130 fmt.Println(cx)
131 fmt.Println(px)
132
133 hx := DivisorPolinomial(px, zx)
134 fmt.Print("H(x): ")
135 fmt.Println(hx)
136
137}