...
1 package ff
2
3 import "fmt"
4
5
6 const Fp4Size = 4 * FpSize
7
8
9 type Fp4 [2]Fp2
10
11 func (z Fp4) String() string { return fmt.Sprintf("%s + ( %s )*t", z[0], z[1]) }
12
13 func (z *Fp4) SetOne() {
14 z[0].SetOne()
15 z[1] = Fp2{}
16 }
17
18 func (z *Fp4) IsZero() int {
19 return z.IsEqual(&Fp4{})
20 }
21
22 func (z *Fp4) IsEqual(x *Fp4) int {
23 return z[0].IsEqual(&x[0]) & z[1].IsEqual(&x[1])
24 }
25
26 func (z *Fp4) Neg() {
27 z[0].Neg()
28 z[1].Neg()
29 }
30
31 func (z *Fp4) Add(x *Fp4, y *Fp4) {
32 z[0].Add(&x[0], &y[0])
33 z[1].Add(&x[1], &y[1])
34 }
35
36 func (z *Fp4) Sub(x *Fp4, y *Fp4) {
37 z[0].Sub(&x[0], &y[0])
38 z[1].Sub(&x[1], &y[1])
39 }
40
41 func (z *Fp4) Mul(x *Fp4, y *Fp4) {
42 var x0y0, x1y1, sx, sy, k Fp2
43 x0y0.Mul(&x[0], &y[0])
44 x1y1.Mul(&x[1], &y[1])
45 sx.Add(&x[0], &x[1])
46 sy.Add(&y[0], &y[1])
47 k.Mul(&sx, &sy)
48 k.Sub(&k, &x0y0)
49 k.Sub(&k, &x1y1)
50
51 z[1] = k
52
53 z[0][1].Add(&x1y1[0], &x1y1[1])
54 z[0][0].Sub(&x1y1[0], &x1y1[1])
55 z[0].Add(&z[0], &x0y0)
56 }
57
58 func (z *Fp4) Sqr(x *Fp4) {
59 var x0s, x1s, sx, k Fp2
60 x0s.Sqr(&x[0])
61 x1s.Sqr(&x[1])
62 sx.Add(&x[0], &x[1])
63 k.Sqr(&sx)
64 k.Sub(&k, &x0s)
65 k.Sub(&k, &x1s)
66
67 z[1] = k
68
69 z[0][1].Add(&x1s[0], &x1s[1])
70 z[0][0].Sub(&x1s[0], &x1s[1])
71 z[0].Add(&z[0], &x0s)
72 }
73
74 func (z *Fp4) Inv(x *Fp4) {
75
76 var denom, x0sqr, x1sqr Fp2
77 x0sqr.Sqr(&x[0])
78 x1sqr.Sqr(&x[1])
79 denom[1].Add(&x1sqr[0], &x1sqr[1])
80 denom[0].Sub(&x1sqr[0], &x1sqr[1])
81 denom.Sub(&x0sqr, &denom)
82 denom.Inv(&denom)
83 z[0] = x[0]
84 z[1].Sub(&z[1], &x[1])
85 z.mulSubfield(z, &denom)
86 }
87
88 func (z *Fp4) mulSubfield(x *Fp4, y *Fp2) {
89 z[0].Mul(&x[0], y)
90 z[1].Mul(&x[1], y)
91 }
92
93 func (z *Fp4) mulT(x *Fp4) {
94 var t Fp4
95 t[1] = x[0]
96 t[0][1].Add(&x[1][0], &x[1][1])
97 t[0][0].Sub(&x[1][0], &x[1][1])
98 *z = t
99 }
100
View as plain text