forked from cloudflare/circl
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathntt_test.go
79 lines (71 loc) · 1.25 KB
/
ntt_test.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
package common
import "testing"
func (p *Poly) RandLe2Q() {
max := 2 * uint32(Q)
r := randSliceUint32WithMax(N, max)
copy(p[:], r)
}
func TestNTTAgainstGeneric(t *testing.T) {
for k := 0; k < 1000; k++ {
var p Poly
p.RandLe2Q()
q1 := p
q2 := p
q1.NTT()
q2.nttGeneric()
if q1 != q2 {
t.Fatalf("NTT(%v) = %v != %v", p, q1, q2)
}
}
}
func TestNTT(t *testing.T) {
for k := 0; k < 1000; k++ {
var p, q Poly
p.RandLe2Q()
q = p
q.Normalize()
p.NTT()
for i := uint(0); i < N; i++ {
if p[i] > 18*Q {
t.Fatalf("NTT(%v)[%d] = %d > 18*Q", q, i, p[i])
}
}
p.ReduceLe2Q()
p.InvNTT()
for i := uint(0); i < N; i++ {
if p[i] > 2*Q {
t.Fatalf("InvNTT(%v)[%d] > 2*Q", q, i)
}
}
p.Normalize()
for i := uint(0); i < N; i++ {
if p[i] != uint32((uint64(q[i])*uint64(1<<32))%Q) {
t.Fatalf("%v != %v", p, q)
}
}
}
}
func BenchmarkNTTGeneric(b *testing.B) {
var p Poly
for i := 0; i < b.N; i++ {
p.nttGeneric()
}
}
func BenchmarkInvNTTGeneric(b *testing.B) {
var p Poly
for i := 0; i < b.N; i++ {
p.invNttGeneric()
}
}
func BenchmarkNTT(b *testing.B) {
var p Poly
for i := 0; i < b.N; i++ {
p.NTT()
}
}
func BenchmarkInvNTT(b *testing.B) {
var p Poly
for i := 0; i < b.N; i++ {
p.InvNTT()
}
}