-
Notifications
You must be signed in to change notification settings - Fork 0
/
poly.c
93 lines (73 loc) · 1.9 KB
/
poly.c
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
80
81
82
83
84
85
86
87
88
89
90
91
92
93
#include "poly.h"
void poly_rand_init(Poly* f, size_t t, fq_ctx_t ctx) {
size_t i, j;
f->t = t;
f->xi = (fq_t*) malloc(sizeof(fq_t) * t * t);
f->eta = (fq_t*) malloc(sizeof(fq_t) * t);
flint_rand_t state;
flint_randinit(state);
for (i = 0; i < t; i++) {
for (j = 0; j < t; j++) {
fq_init(f->xi[i * t + j], ctx);
fq_randtest(f->xi[i * t + j], state, ctx);
}
}
for (i = 0; i < t; i++) {
fq_init(f->eta[i], ctx);
fq_randtest(f->eta[i], state, ctx);
}
flint_randclear(state);
}
void poly_clear(Poly* f, fq_ctx_t ctx) {
size_t i, j;
for (i = 0; i < f->t; i++) {
for (j = 0; j < f->t; j++) {
fq_clear(f->xi[i * f->t + j], ctx);
}
}
for (i = 0; i < f->t; i++) {
fq_clear(f->eta[i], ctx);
}
free(f->eta);
free(f->xi);
}
void poly_eval(Poly* f, fq_t* x, fq_t res, fq_ctx_t ctx) {
size_t i, j;
// Temporary variables
fq_t t1;
fq_t t2;
fq_init(t1, ctx);
fq_init(t2, ctx);
// Set to zero
fq_zero(res, ctx);
for (i = 0; i < f->t; i++) {
fq_mul(t1, f->eta[i], x[i], ctx);
fq_add(res, t1, res, ctx);
}
for (i = 0; i < f->t; i++) {
for (j = 0; j < f->t; j++) {
fq_mul(t1, x[i], x[j], ctx);
fq_mul(t2, t1, f->xi[j + i * f->t], ctx);
fq_add(res, t2, res, ctx);
}
}
fq_clear(t1, ctx);
fq_clear(t2, ctx);
}
void poly_print(Poly* f, fq_ctx_t ctx) {
size_t i, j;
printf("Eta: ");
for (i = 0; i < f->t; i++) {
printf("%ld: ", i);
fq_print_pretty(f->eta[i], ctx);
printf(", ");
}
printf("Xi: ");
for (i = 0; i < f->t; i++) {
for (j = 0; j < f->t; j++) {
printf("(%ld %ld): ", i, j);
fq_print_pretty(f->xi[i * f->t + j], ctx);
printf(", ");
}
}
}