ldlFft function
LDL* decomposition of a 2x2 Gram matrix g in FFT representation.
Corresponds to algorithm 8 (LDL*) of the Falcon documentation.
Implementation
LdlFft ldlFft(List<List<List<Complex>>> g) {
final deg = g[0][0].length;
final zero = List<Complex>.filled(deg, Complex.zero);
final one = List<Complex>.filled(deg, Complex.one);
final d00 = List<Complex>.from(g[0][0]);
final l10 = FalconFFT.divFft(g[1][0], g[0][0]);
final d11 = FalconFFT.subFft(
g[1][1],
FalconFFT.mulFft(FalconFFT.mulFft(l10, FalconFFT.adjFft(l10)), g[0][0]),
);
return LdlFft(
[
[one, zero],
[l10, one],
],
[
[d00, zero],
[zero, d11],
],
);
}