in python3/frodokem.py [0:0]
def decode(self, K):
"""Decode a mod-q integer matrix into a bitstring (represented in Python
as a bytes object) (FrodoKEM specification, Algorithm 2)"""
k = bitstring.BitArray(length=self.B * self.mbar * self.nbar)
# 1. for i = 0; i < mbar; i += 1
for i in range(self.mbar):
# 2. for j = 0; j < nbar; j += 1
for j in range(self.nbar):
# 3. tmp = dc(K[i][j]) = round(K[i][j] * 2^B / q) mod 2^B
tmp = round(K[i][j] * (2 ** self.B) / self.q) % (2 ** self.B)
# 4. tmp' = sum_{l=0}^{B-1} tmp_l * 2^l
tmpbits = [0 for l in range(self.B)]
for l in range(self.B):
tmpbits[l] = tmp % 2
tmp >>= 1
# 5. for l = 0; l < B; l += 1
for l in range(self.B):
# 6. k[(i*nbar+j)*B+l] = tmpbits[l]
k.set(tmpbits[l], (i * self.nbar + j) * self.B + l)
return FrodoKEM.__bit_array_to_bytes(k)