polycompress function
Compresses a polynomial into a compact byte array using 3 bits per coefficient.
Implementation
Uint8List polycompress(Poly a) {
Uint8List r = Uint8List(KYBER_POLYCOMPRESSEDBYTES);
Poly t = polyreduce(Poly()..coeffs = List<int>.from(a.coeffs));
int pos = 0;
for (int i = 0; i < KYBER_N; i += 8) {
int t0 = (((t.coeffs[i] << 3) + (KYBER_Q >> 1)) ~/ KYBER_Q) & 0x7;
int t1 = (((t.coeffs[i + 1] << 3) + (KYBER_Q >> 1)) ~/ KYBER_Q) & 0x7;
int t2 = (((t.coeffs[i + 2] << 3) + (KYBER_Q >> 1)) ~/ KYBER_Q) & 0x7;
int t3 = (((t.coeffs[i + 3] << 3) + (KYBER_Q >> 1)) ~/ KYBER_Q) & 0x7;
int t4 = (((t.coeffs[i + 4] << 3) + (KYBER_Q >> 1)) ~/ KYBER_Q) & 0x7;
int t5 = (((t.coeffs[i + 5] << 3) + (KYBER_Q >> 1)) ~/ KYBER_Q) & 0x7;
int t6 = (((t.coeffs[i + 6] << 3) + (KYBER_Q >> 1)) ~/ KYBER_Q) & 0x7;
int t7 = (((t.coeffs[i + 7] << 3) + (KYBER_Q >> 1)) ~/ KYBER_Q) & 0x7;
int packed = t0 | (t1 << 3) | (t2 << 6) | (t3 << 9) | (t4 << 12) | (t5 << 15) | (t6 << 18) | (t7 << 21);
r[pos + 0] = packed & 0xFF;
r[pos + 1] = (packed >> 8) & 0xFF;
r[pos + 2] = (packed >> 16) & 0xFF;
pos += 3;
}
return r;
}