// 
// Decompiled by Procyon v0.6.0
// 

package org.bouncycastle.pqc.crypto.mlkem;

final class CBD
{
    public static void mlkemCBD(final Poly poly, final byte[] array, final int n) {
        switch (n) {
            case 3: {
                for (int i = 0; i < 64; ++i) {
                    final long convertByteTo24BitUnsignedInt = convertByteTo24BitUnsignedInt(array, 3 * i);
                    final long n2 = (convertByteTo24BitUnsignedInt & 0x249249L) + (convertByteTo24BitUnsignedInt >> 1 & 0x249249L) + (convertByteTo24BitUnsignedInt >> 2 & 0x249249L);
                    for (int j = 0; j < 4; ++j) {
                        poly.setCoeffIndex(4 * i + j, (short)((short)(n2 >> 6 * j + 0 & 0x7L) - (short)(n2 >> 6 * j + 3 & 0x7L)));
                    }
                }
                break;
            }
            default: {
                for (int k = 0; k < 32; ++k) {
                    final long convertByteTo32BitUnsignedInt = convertByteTo32BitUnsignedInt(array, 4 * k);
                    final long n3 = (convertByteTo32BitUnsignedInt & 0x55555555L) + (convertByteTo32BitUnsignedInt >> 1 & 0x55555555L);
                    for (int l = 0; l < 8; ++l) {
                        poly.setCoeffIndex(8 * k + l, (short)((short)(n3 >> 4 * l + 0 & 0x3L) - (short)(n3 >> 4 * l + n & 0x3L)));
                    }
                }
                break;
            }
        }
    }
    
    private static long convertByteTo32BitUnsignedInt(final byte[] array, final int n) {
        return (long)(array[n] & 0xFF) | (long)(array[n + 1] & 0xFF) << 8 | (long)(array[n + 2] & 0xFF) << 16 | (long)(array[n + 3] & 0xFF) << 24;
    }
    
    private static long convertByteTo24BitUnsignedInt(final byte[] array, final int n) {
        return (long)(array[n] & 0xFF) | (long)(array[n + 1] & 0xFF) << 8 | (long)(array[n + 2] & 0xFF) << 16;
    }
}
