go-snark/bn128/fqn_test.go
bn128/fqn_test.goRaw
1package bn128
2
3import (
4 "math/big"
5 "testing"
6
7 "github.com/stretchr/testify/assert"
8)
9
10func iToBig(a int) *big.Int {
11 return big.NewInt(int64(a))
12}
13
14func iiToBig(a, b int) [2]*big.Int {
15 return [2]*big.Int{iToBig(a), iToBig(b)}
16}
17
18func iiiToBig(a, b int) [2]*big.Int {
19 return [2]*big.Int{iToBig(a), iToBig(b)}
20}
21
22func TestFq1(t *testing.T) {
23 fq1 := NewFq(iToBig(7))
24
25 res := fq1.Add(iToBig(4), iToBig(4))
26 assert.Equal(t, iToBig(1), fq1.Affine(res))
27
28 res = fq1.Double(iToBig(5))
29 assert.Equal(t, iToBig(3), fq1.Affine(res))
30
31 res = fq1.Sub(iToBig(5), iToBig(7))
32 assert.Equal(t, iToBig(5), fq1.Affine(res))
33
34 res = fq1.Neg(iToBig(5))
35 assert.Equal(t, iToBig(2), fq1.Affine(res))
36
37 res = fq1.Mul(iToBig(5), iToBig(11))
38 assert.Equal(t, iToBig(6), fq1.Affine(res))
39
40 res = fq1.Inverse(iToBig(4))
41 assert.Equal(t, iToBig(2), res)
42
43 res = fq1.Square(iToBig(5))
44 assert.Equal(t, iToBig(4), res)
45}
46
47func TestFq2(t *testing.T) {
48 fq1 := NewFq(iToBig(7))
49 nonResidueFq2str := "-1" // i/j
50 nonResidueFq2, ok := new(big.Int).SetString(nonResidueFq2str, 10)
51 assert.True(t, ok)
52 assert.Equal(t, nonResidueFq2.String(), nonResidueFq2str)
53
54 fq2 := Fq2{fq1, nonResidueFq2}
55
56 res := fq2.Add(iiToBig(4, 4), iiToBig(3, 4))
57 assert.Equal(t, iiToBig(0, 1), fq2.Affine(res))
58
59 res = fq2.Double(iiToBig(5, 3))
60 assert.Equal(t, iiToBig(3, 6), fq2.Affine(res))
61
62 res = fq2.Sub(iiToBig(5, 3), iiToBig(7, 2))
63 assert.Equal(t, iiToBig(5, 1), fq2.Affine(res))
64
65 res = fq2.Neg(iiToBig(4, 4))
66 assert.Equal(t, iiToBig(3, 3), fq2.Affine(res))
67
68 res = fq2.Mul(iiToBig(4, 4), iiToBig(3, 4))
69 assert.Equal(t, iiToBig(3, 0), fq2.Affine(res))
70
71 res = fq2.Inverse(iiToBig(4, 4))
72 assert.Equal(t, iiToBig(1, 6), fq2.Affine(res))
73
74 res = fq2.Square(iiToBig(4, 4))
75 assert.Equal(t, iiToBig(0, 4), fq2.Affine(res))
76 res2 := fq2.Mul(iiToBig(4, 4), iiToBig(4, 4))
77 assert.Equal(t, fq2.Affine(res), fq2.Affine(res2))
78 assert.True(t, fq2.Equal(res, res2))
79
80 res = fq2.Square(iiToBig(3, 5))
81 assert.Equal(t, iiToBig(5, 2), fq2.Affine(res))
82 res2 = fq2.Mul(iiToBig(3, 5), iiToBig(3, 5))
83 assert.Equal(t, fq2.Affine(res), fq2.Affine(res2))
84}
85
86func TestFq6(t *testing.T) {
87 bn128, err := NewBn128()
88 assert.Nil(t, err)
89
90 a := [3][2]*big.Int{
91 iiToBig(1, 2),
92 iiToBig(3, 4),
93 iiToBig(5, 6)}
94 b := [3][2]*big.Int{
95 iiToBig(12, 11),
96 iiToBig(10, 9),
97 iiToBig(8, 7)}
98
99 mulRes := bn128.Fq6.Mul(a, b)
100 divRes := bn128.Fq6.Div(mulRes, b)
101 assert.Equal(t, bn128.Fq6.Affine(a), bn128.Fq6.Affine(divRes))
102}
103
104func TestFq12(t *testing.T) {
105 q, ok := new(big.Int).SetString("21888242871839275222246405745257275088696311157297823662689037894645226208583", 10) // i
106 assert.True(t, ok)
107 fq1 := NewFq(q)
108 nonResidueFq2, ok := new(big.Int).SetString("21888242871839275222246405745257275088696311157297823662689037894645226208582", 10) // i
109 assert.True(t, ok)
110 nonResidueFq6 := iiToBig(9, 1)
111
112 fq2 := Fq2{fq1, nonResidueFq2}
113 fq6 := Fq6{fq2, nonResidueFq6}
114 fq12 := Fq12{fq6, fq2, nonResidueFq6}
115
116 a := [2][3][2]*big.Int{
117 {
118 iiToBig(1, 2),
119 iiToBig(3, 4),
120 iiToBig(5, 6),
121 },
122 {
123 iiToBig(7, 8),
124 iiToBig(9, 10),
125 iiToBig(11, 12),
126 },
127 }
128 b := [2][3][2]*big.Int{
129 {
130 iiToBig(12, 11),
131 iiToBig(10, 9),
132 iiToBig(8, 7),
133 },
134 {
135 iiToBig(6, 5),
136 iiToBig(4, 3),
137 iiToBig(2, 1),
138 },
139 }
140
141 res := fq12.Add(a, b)
142 assert.Equal(t,
143 [2][3][2]*big.Int{
144 {
145 iiToBig(13, 13),
146 iiToBig(13, 13),
147 iiToBig(13, 13),
148 },
149 {
150 iiToBig(13, 13),
151 iiToBig(13, 13),
152 iiToBig(13, 13),
153 },
154 },
155 res)
156
157 mulRes := fq12.Mul(a, b)
158 divRes := fq12.Div(mulRes, b)
159 assert.Equal(t, fq12.Affine(a), fq12.Affine(divRes))
160}