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

package org.bouncycastle.pqc.crypto.mldsa;

class Rounding
{
    static void power2RoundAll(final int[] array, final int[] array2) {
        final int n = 13;
        final int n2 = 256;
        final int n3 = (1 << n - 1) - 1;
        final int n4 = -1 << n;
        for (int i = 0; i < n2; ++i) {
            final int n5 = array[i];
            final int n6 = n5 + n3;
            final int n7 = n5 - (n6 & n4);
            array[i] = n6 >> n;
            array2[i] = n7;
        }
    }
    
    public static int[] decompose(final int n, final int n2) {
        final int n3 = n + 127 >> 7;
        int n4;
        if (n2 == 261888) {
            n4 = (n3 * 1025 + 2097152 >> 22 & 0xF);
        }
        else {
            if (n2 != 95232) {
                throw new RuntimeException("Wrong Gamma2!");
            }
            final int n5 = n3 * 11275 + 8388608 >> 24;
            n4 = (n5 ^ (43 - n5 >> 31 & n5));
        }
        final int n6 = n - n4 * 2 * n2;
        return new int[] { n6 - (4190208 - n6 >> 31 & 0x7FE001), n4 };
    }
    
    public static int makeHint(final int n, final int n2, final MLDSAEngine mldsaEngine) {
        final int dilithiumGamma2 = mldsaEngine.getDilithiumGamma2();
        final int n3 = 8380417;
        if (n <= dilithiumGamma2 || n > n3 - dilithiumGamma2 || (n == n3 - dilithiumGamma2 && n2 == 0)) {
            return 0;
        }
        return 1;
    }
    
    public static int useHint(final int n, final int n2, final int n3) {
        final int[] decompose = decompose(n, n3);
        final int n4 = decompose[0];
        final int n5 = decompose[1];
        if (n2 == 0) {
            return n5;
        }
        if (n3 == 261888) {
            if (n4 > 0) {
                return n5 + 1 & 0xF;
            }
            return n5 - 1 & 0xF;
        }
        else {
            if (n3 != 95232) {
                throw new RuntimeException("Wrong Gamma2!");
            }
            if (n4 > 0) {
                return (n5 == 43) ? 0 : (n5 + 1);
            }
            return (n5 == 0) ? 43 : (n5 - 1);
        }
    }
}
