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

package org.bouncycastle.pqc.crypto.cmce;

import org.bouncycastle.math.raw.Interleave;

final class GF13 extends GF
{
    @Override
    protected void gf_mul_poly(final int n, final int[] array, final short[] array2, final short[] array3, final short[] array4, final int[] array5) {
        array5[0] = this.gf_mul_ext(array3[0], array4[0]);
        for (int i = 1; i < n; ++i) {
            array5[i + i - 1] = 0;
            final short n2 = array3[i];
            final short n3 = array4[i];
            for (int j = 0; j < i; ++j) {
                final int n4 = i + j;
                array5[n4] ^= this.gf_mul_ext_par(n2, array4[j], array3[j], n3);
            }
            array5[i + i] = this.gf_mul_ext(n2, n3);
        }
        for (int k = (n - 1) * 2; k >= n; --k) {
            final int n5 = array5[k];
            for (int l = 0; l < array.length; ++l) {
                final int n6 = k - n + array[l];
                array5[n6] ^= n5;
            }
        }
        for (int n7 = 0; n7 < n; ++n7) {
            array2[n7] = this.gf_reduce(array5[n7]);
        }
    }
    
    @Override
    protected void gf_sqr_poly(final int n, final int[] array, final short[] array2, final short[] array3, final int[] array4) {
        array4[0] = this.gf_sq_ext(array3[0]);
        for (int i = 1; i < n; ++i) {
            array4[i + i - 1] = 0;
            array4[i + i] = this.gf_sq_ext(array3[i]);
        }
        for (int j = (n - 1) * 2; j >= n; --j) {
            final int n2 = array4[j];
            for (int k = 0; k < array.length; ++k) {
                final int n3 = j - n + array[k];
                array4[n3] ^= n2;
            }
        }
        for (int l = 0; l < n; ++l) {
            array2[l] = this.gf_reduce(array4[l]);
        }
    }
    
    @Override
    protected short gf_frac(final short n, final short n2) {
        final short gf_sqmul = this.gf_sqmul(n, n);
        final short gf_sq2mul = this.gf_sq2mul(gf_sqmul, gf_sqmul);
        return this.gf_sqmul(this.gf_sq2mul(this.gf_sq2(this.gf_sq2mul(this.gf_sq2(gf_sq2mul), gf_sq2mul)), gf_sq2mul), n2);
    }
    
    @Override
    protected short gf_inv(final short n) {
        return this.gf_frac(n, (short)1);
    }
    
    @Override
    protected short gf_mul(final short n, final short n2) {
        int n3 = n * (n2 & 0x1);
        for (int i = 1; i < 13; ++i) {
            n3 ^= n * (n2 & 1 << i);
        }
        return this.gf_reduce(n3);
    }
    
    @Override
    protected int gf_mul_ext(final short n, final short n2) {
        int n3 = n * (n2 & 0x1);
        for (int i = 1; i < 13; ++i) {
            n3 ^= n * (n2 & 1 << i);
        }
        return n3;
    }
    
    private int gf_mul_ext_par(final short n, final short n2, final short n3, final short n4) {
        int n5 = n * (n2 & 0x1);
        int n6 = n3 * (n4 & 0x1);
        for (int i = 1; i < 13; ++i) {
            n5 ^= n * (n2 & 1 << i);
            n6 ^= n3 * (n4 & 1 << i);
        }
        return n5 ^ n6;
    }
    
    @Override
    protected short gf_reduce(final int n) {
        final int n2 = n & 0x1FFF;
        final int n3 = n >>> 13;
        final int n4 = n3 << 4 ^ n3 << 3 ^ n3 << 1;
        final int n5 = n4 >>> 13;
        return (short)(n2 ^ n3 ^ n5 ^ (n4 & 0x1FFF) ^ (n5 << 4 ^ n5 << 3 ^ n5 << 1));
    }
    
    @Override
    protected short gf_sq(final short n) {
        return this.gf_reduce(Interleave.expand16to32(n));
    }
    
    @Override
    protected int gf_sq_ext(final short n) {
        return Interleave.expand16to32(n);
    }
    
    private short gf_sq2(final short n) {
        return this.gf_reduce(Interleave.expand16to32(this.gf_reduce(Interleave.expand16to32(n))));
    }
    
    private short gf_sqmul(final short n, final short n2) {
        final long n3 = n;
        final long n4 = n2;
        final long n5 = (n4 << 6) * (n3 & 0x40L);
        final long n6 = n3 ^ n3 << 7;
        final long n7 = n5 ^ (n4 << 0) * (n6 & 0x4001L) ^ (n4 << 1) * (n6 & 0x8002L) ^ (n4 << 2) * (n6 & 0x10004L) ^ (n4 << 3) * (n6 & 0x20008L) ^ (n4 << 4) * (n6 & 0x40010L) ^ (n4 << 5) * (n6 & 0x80020L);
        final long n8 = n7 & 0x1FFC000000L;
        return this.gf_reduce((int)(n7 ^ (n8 >>> 18 ^ n8 >>> 20 ^ n8 >>> 24 ^ n8 >>> 26)) & 0x3FFFFFF);
    }
    
    private short gf_sq2mul(final short n, final short n2) {
        final long n3 = n;
        final long n4 = n2;
        final long n5 = (n4 << 18) * (n3 & 0x40L);
        final long n6 = n3 ^ n3 << 21;
        final long n7 = n5 ^ (n4 << 0) * (n6 & 0x10000001L) ^ (n4 << 3) * (n6 & 0x20000002L) ^ (n4 << 6) * (n6 & 0x40000004L) ^ (n4 << 9) * (n6 & 0x80000008L) ^ (n4 << 12) * (n6 & 0x100000010L) ^ (n4 << 15) * (n6 & 0x200000020L);
        final long n8 = n7 & 0x1FFFF80000000000L;
        final long n9 = n7 ^ (n8 >>> 18 ^ n8 >>> 20 ^ n8 >>> 24 ^ n8 >>> 26);
        final long n10 = n9 & 0x7FFFC000000L;
        return this.gf_reduce((int)(n9 ^ (n10 >>> 18 ^ n10 >>> 20 ^ n10 >>> 24 ^ n10 >>> 26)) & 0x3FFFFFF);
    }
}
