-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathPolynomial.java
More file actions
141 lines (112 loc) · 4.21 KB
/
Polynomial.java
File metadata and controls
141 lines (112 loc) · 4.21 KB
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
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
package ckks;
import java.util.Arrays;
public class Polynomial {
final static boolean debug = false;
private Context context;
private long[][] crt;
// c'tors
public Polynomial() {
}
public Polynomial(Context context, long[][] crt) {
this.context = context;
this.crt = crt;
}
public Polynomial(Polynomial poly) {
this.context = poly.context;
this.crt = new long[context.primes.length][context.slots * 2];
for (int i = 0; i < context.primes.length; i++)
for (int j = 0; j < context.slots * 2; j++)
this.crt[i][j] = poly.crt[i][j];
}
// methods
public Polynomial add(Polynomial that) {
Polynomial res = new Polynomial(this);
res.add_inplace(that);
return res;
}
public void add_inplace(Polynomial that) {
for (int primeIdx = 0; primeIdx < context.primes.length; primeIdx++)
for (int i = 0; i < context.slots * 2; i++)
crt[primeIdx][i] = Maths.mod(crt[primeIdx][i] + that.crt[primeIdx][i], context.primes[primeIdx]);
}
public Polynomial sub(Polynomial that) {
Polynomial res = new Polynomial(this);
res.sub_inplace(that);
return res;
}
public void sub_inplace(Polynomial that) {
for (int primeIdx = 0; primeIdx < context.primes.length; primeIdx++)
for (int i = 0; i < context.slots * 2; i++)
crt[primeIdx][i] = Maths.mod(crt[primeIdx][i] - that.crt[primeIdx][i], context.primes[primeIdx]);
}
public Polynomial mult(Polynomial that) {
Polynomial res = new Polynomial(this);
res.mult_inplace(that);
return res;
}
public void mult_inplace(Polynomial that) {
if (debug) {
System.out.println("Polynomial mult_inplace:");
System.out.println("this crt:");
System.out.println(Arrays.deepToString(crt));
System.out.println("that crt:");
System.out.println(Arrays.deepToString(that.crt));
}
for (int primeIdx = 0; primeIdx < context.primes.length; primeIdx++)
for (int i = 0; i < context.slots * 2; i++) {
if (debug)
System.out.println("calculating " + crt[primeIdx][i] + " * " + that.crt[primeIdx][i] + " mod "
+ context.primes[primeIdx]);
crt[primeIdx][i] = Maths.modMult(crt[primeIdx][i], that.crt[primeIdx][i], context.primes[primeIdx]);
if (debug)
System.out.println("result= " + crt[primeIdx][i]);
}
if (debug) {
System.out.println("res crt:");
System.out.println(Arrays.deepToString(crt));
System.out.println();
}
}
public Polynomial mult(int scalar) {
Polynomial res = new Polynomial(this);
res.mult_inplace(scalar);
return res;
}
public void mult_inplace(int scalar) {
for (int primeIdx = 0; primeIdx < context.primes.length; primeIdx++)
for (int i = 0; i < context.slots * 2; i++)
crt[primeIdx][i] = Maths.modMult(crt[primeIdx][i], scalar, context.primes[primeIdx]);
}
public Polynomial square() {
Polynomial res = new Polynomial(this);
res.square_inplace();
return res;
}
public void square_inplace() {
mult_inplace(this);
}
public long[][] getCrt() {
return crt;
}
public long[] serialize() {
long[] res = new long[2 + crt.length * crt[0].length];
int idx = 0;
res[idx++] = crt.length;
res[idx++] = crt[0].length;
for (int i = 0; i < crt.length; i++)
for (int j = 0; j < crt[0].length; j++)
res[idx++] = crt[i][j];
return res;
}
public void deserialize(Context context, long[] serialization) {
this.context = context;
int idx = 0;
crt = new long[(int) serialization[idx++]][(int) serialization[idx++]];
for (int i = 0; i < crt.length; i++)
for (int j = 0; j < crt[0].length; j++)
crt[i][j] = serialization[idx++];
}
public void debugPrint() {
System.out.println(Arrays.deepToString(crt));
}
}