arnaucube
arnaucube/go-snarkPublic Self-hosted repository
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}