go-snark/fields/fqn_test.go
fields/fqn_test.goRaw
1package fields
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 q, ok := new(big.Int).SetString("21888242871839275222246405745257275088696311157297823662689037894645226208583", 10) // i
90 assert.True(t, ok)
91 fq1 := NewFq(q)
92 nonResidueFq2, ok := new(big.Int).SetString("21888242871839275222246405745257275088696311157297823662689037894645226208582", 10) // i
93 assert.True(t, ok)
94 nonResidueFq6 := iiToBig(9, 1)
95
96 fq2 := Fq2{fq1, nonResidueFq2}
97 fq6 := Fq6{fq2, nonResidueFq6}
98
99 a := [3][2]*big.Int{
100 iiToBig(1, 2),
101 iiToBig(3, 4),
102 iiToBig(5, 6)}
103 b := [3][2]*big.Int{
104 iiToBig(12, 11),
105 iiToBig(10, 9),
106 iiToBig(8, 7)}
107
108 mulRes := fq6.Mul(a, b)
109 divRes := fq6.Div(mulRes, b)
110 assert.Equal(t, fq6.Affine(a), fq6.Affine(divRes))
111}
112
113func TestFq12(t *testing.T) {
114 q, ok := new(big.Int).SetString("21888242871839275222246405745257275088696311157297823662689037894645226208583", 10) // i
115 assert.True(t, ok)
116 fq1 := NewFq(q)
117 nonResidueFq2, ok := new(big.Int).SetString("21888242871839275222246405745257275088696311157297823662689037894645226208582", 10) // i
118 assert.True(t, ok)
119 nonResidueFq6 := iiToBig(9, 1)
120
121 fq2 := Fq2{fq1, nonResidueFq2}
122 fq6 := Fq6{fq2, nonResidueFq6}
123 fq12 := Fq12{fq6, fq2, nonResidueFq6}
124
125 a := [2][3][2]*big.Int{
126 {
127 iiToBig(1, 2),
128 iiToBig(3, 4),
129 iiToBig(5, 6),
130 },
131 {
132 iiToBig(7, 8),
133 iiToBig(9, 10),
134 iiToBig(11, 12),
135 },
136 }
137 b := [2][3][2]*big.Int{
138 {
139 iiToBig(12, 11),
140 iiToBig(10, 9),
141 iiToBig(8, 7),
142 },
143 {
144 iiToBig(6, 5),
145 iiToBig(4, 3),
146 iiToBig(2, 1),
147 },
148 }
149
150 res := fq12.Add(a, b)
151 assert.Equal(t,
152 [2][3][2]*big.Int{
153 {
154 iiToBig(13, 13),
155 iiToBig(13, 13),
156 iiToBig(13, 13),
157 },
158 {
159 iiToBig(13, 13),
160 iiToBig(13, 13),
161 iiToBig(13, 13),
162 },
163 },
164 res)
165
166 mulRes := fq12.Mul(a, b)
167 divRes := fq12.Div(mulRes, b)
168 assert.Equal(t, fq12.Affine(a), fq12.Affine(divRes))
169}