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