153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giropackage org.bouncycastle.math.raw;
253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro
353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giroimport java.math.BigInteger;
453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro
553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giroimport org.bouncycastle.util.Pack;
653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro
753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giropublic abstract class Nat256
853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro{
953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    private static final long M = 0xFFFFFFFFL;
1053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro
1153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    public static int add(int[] x, int[] y, int[] z)
1253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    {
1353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long c = 0;
1453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (x[0] & M) + (y[0] & M);
1553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[0] = (int)c;
1653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
1753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (x[1] & M) + (y[1] & M);
1853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[1] = (int)c;
1953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
2053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (x[2] & M) + (y[2] & M);
2153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[2] = (int)c;
2253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
2353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (x[3] & M) + (y[3] & M);
2453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[3] = (int)c;
2553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
2653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (x[4] & M) + (y[4] & M);
2753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[4] = (int)c;
2853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
2953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (x[5] & M) + (y[5] & M);
3053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[5] = (int)c;
3153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
3253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (x[6] & M) + (y[6] & M);
3353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[6] = (int)c;
3453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
3553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (x[7] & M) + (y[7] & M);
3653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[7] = (int)c;
3753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
3853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        return (int)c;
3953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    }
4053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro
4153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    public static int add(int[] x, int xOff, int[] y, int yOff, int[] z, int zOff)
4253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    {
4353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long c = 0;
4453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (x[xOff + 0] & M) + (y[yOff + 0] & M);
4553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[zOff + 0] = (int)c;
4653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
4753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (x[xOff + 1] & M) + (y[yOff + 1] & M);
4853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[zOff + 1] = (int)c;
4953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
5053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (x[xOff + 2] & M) + (y[yOff + 2] & M);
5153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[zOff + 2] = (int)c;
5253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
5353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (x[xOff + 3] & M) + (y[yOff + 3] & M);
5453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[zOff + 3] = (int)c;
5553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
5653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (x[xOff + 4] & M) + (y[yOff + 4] & M);
5753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[zOff + 4] = (int)c;
5853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
5953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (x[xOff + 5] & M) + (y[yOff + 5] & M);
6053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[zOff + 5] = (int)c;
6153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
6253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (x[xOff + 6] & M) + (y[yOff + 6] & M);
6353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[zOff + 6] = (int)c;
6453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
6553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (x[xOff + 7] & M) + (y[yOff + 7] & M);
6653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[zOff + 7] = (int)c;
6753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
6853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        return (int)c;
6953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    }
7053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro
7153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    public static int addBothTo(int[] x, int[] y, int[] z)
7253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    {
7353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long c = 0;
7453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (x[0] & M) + (y[0] & M) + (z[0] & M);
7553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[0] = (int)c;
7653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
7753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (x[1] & M) + (y[1] & M) + (z[1] & M);
7853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[1] = (int)c;
7953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
8053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (x[2] & M) + (y[2] & M) + (z[2] & M);
8153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[2] = (int)c;
8253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
8353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (x[3] & M) + (y[3] & M) + (z[3] & M);
8453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[3] = (int)c;
8553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
8653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (x[4] & M) + (y[4] & M) + (z[4] & M);
8753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[4] = (int)c;
8853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
8953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (x[5] & M) + (y[5] & M) + (z[5] & M);
9053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[5] = (int)c;
9153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
9253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (x[6] & M) + (y[6] & M) + (z[6] & M);
9353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[6] = (int)c;
9453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
9553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (x[7] & M) + (y[7] & M) + (z[7] & M);
9653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[7] = (int)c;
9753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
9853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        return (int)c;
9953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    }
10053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro
10153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    public static int addBothTo(int[] x, int xOff, int[] y, int yOff, int[] z, int zOff)
10253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    {
10353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long c = 0;
10453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (x[xOff + 0] & M) + (y[yOff + 0] & M) + (z[zOff + 0] & M);
10553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[zOff + 0] = (int)c;
10653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
10753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (x[xOff + 1] & M) + (y[yOff + 1] & M) + (z[zOff + 1] & M);
10853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[zOff + 1] = (int)c;
10953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
11053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (x[xOff + 2] & M) + (y[yOff + 2] & M) + (z[zOff + 2] & M);
11153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[zOff + 2] = (int)c;
11253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
11353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (x[xOff + 3] & M) + (y[yOff + 3] & M) + (z[zOff + 3] & M);
11453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[zOff + 3] = (int)c;
11553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
11653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (x[xOff + 4] & M) + (y[yOff + 4] & M) + (z[zOff + 4] & M);
11753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[zOff + 4] = (int)c;
11853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
11953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (x[xOff + 5] & M) + (y[yOff + 5] & M) + (z[zOff + 5] & M);
12053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[zOff + 5] = (int)c;
12153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
12253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (x[xOff + 6] & M) + (y[yOff + 6] & M) + (z[zOff + 6] & M);
12353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[zOff + 6] = (int)c;
12453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
12553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (x[xOff + 7] & M) + (y[yOff + 7] & M) + (z[zOff + 7] & M);
12653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[zOff + 7] = (int)c;
12753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
12853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        return (int)c;
12953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    }
13053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro
13153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    public static int addTo(int[] x, int[] z)
13253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    {
13353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long c = 0;
13453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (x[0] & M) + (z[0] & M);
13553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[0] = (int)c;
13653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
13753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (x[1] & M) + (z[1] & M);
13853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[1] = (int)c;
13953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
14053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (x[2] & M) + (z[2] & M);
14153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[2] = (int)c;
14253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
14353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (x[3] & M) + (z[3] & M);
14453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[3] = (int)c;
14553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
14653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (x[4] & M) + (z[4] & M);
14753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[4] = (int)c;
14853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
14953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (x[5] & M) + (z[5] & M);
15053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[5] = (int)c;
15153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
15253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (x[6] & M) + (z[6] & M);
15353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[6] = (int)c;
15453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
15553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (x[7] & M) + (z[7] & M);
15653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[7] = (int)c;
15753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
15853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        return (int)c;
15953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    }
16053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro
16153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    public static int addTo(int[] x, int xOff, int[] z, int zOff, int cIn)
16253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    {
16353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long c = cIn & M;
16453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (x[xOff + 0] & M) + (z[zOff + 0] & M);
16553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[zOff + 0] = (int)c;
16653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
16753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (x[xOff + 1] & M) + (z[zOff + 1] & M);
16853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[zOff + 1] = (int)c;
16953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
17053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (x[xOff + 2] & M) + (z[zOff + 2] & M);
17153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[zOff + 2] = (int)c;
17253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
17353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (x[xOff + 3] & M) + (z[zOff + 3] & M);
17453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[zOff + 3] = (int)c;
17553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
17653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (x[xOff + 4] & M) + (z[zOff + 4] & M);
17753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[zOff + 4] = (int)c;
17853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
17953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (x[xOff + 5] & M) + (z[zOff + 5] & M);
18053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[zOff + 5] = (int)c;
18153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
18253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (x[xOff + 6] & M) + (z[zOff + 6] & M);
18353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[zOff + 6] = (int)c;
18453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
18553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (x[xOff + 7] & M) + (z[zOff + 7] & M);
18653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[zOff + 7] = (int)c;
18753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
18853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        return (int)c;
18953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    }
19053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro
19153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    public static int addToEachOther(int[] u, int uOff, int[] v, int vOff)
19253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    {
19353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long c = 0;
19453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (u[uOff + 0] & M) + (v[vOff + 0] & M);
19553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        u[uOff + 0] = (int)c;
19653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        v[vOff + 0] = (int)c;
19753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
19853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (u[uOff + 1] & M) + (v[vOff + 1] & M);
19953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        u[uOff + 1] = (int)c;
20053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        v[vOff + 1] = (int)c;
20153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
20253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (u[uOff + 2] & M) + (v[vOff + 2] & M);
20353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        u[uOff + 2] = (int)c;
20453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        v[vOff + 2] = (int)c;
20553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
20653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (u[uOff + 3] & M) + (v[vOff + 3] & M);
20753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        u[uOff + 3] = (int)c;
20853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        v[vOff + 3] = (int)c;
20953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
21053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (u[uOff + 4] & M) + (v[vOff + 4] & M);
21153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        u[uOff + 4] = (int)c;
21253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        v[vOff + 4] = (int)c;
21353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
21453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (u[uOff + 5] & M) + (v[vOff + 5] & M);
21553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        u[uOff + 5] = (int)c;
21653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        v[vOff + 5] = (int)c;
21753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
21853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (u[uOff + 6] & M) + (v[vOff + 6] & M);
21953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        u[uOff + 6] = (int)c;
22053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        v[vOff + 6] = (int)c;
22153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
22253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (u[uOff + 7] & M) + (v[vOff + 7] & M);
22353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        u[uOff + 7] = (int)c;
22453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        v[vOff + 7] = (int)c;
22553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
22653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        return (int)c;
22753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    }
22853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro
22953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    public static void copy(int[] x, int[] z)
23053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    {
23153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[0] = x[0];
23253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[1] = x[1];
23353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[2] = x[2];
23453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[3] = x[3];
23553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[4] = x[4];
23653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[5] = x[5];
23753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[6] = x[6];
23853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[7] = x[7];
23953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    }
24053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro
241bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro    public static void copy64(long[] x, long[] z)
242bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro    {
243bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro        z[0] = x[0];
244bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro        z[1] = x[1];
245bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro        z[2] = x[2];
246bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro        z[3] = x[3];
247bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro    }
248bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro
24953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    public static int[] create()
25053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    {
25153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        return new int[8];
25253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    }
25353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro
254bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro    public static long[] create64()
255bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro    {
256bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro        return new long[4];
257bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro    }
258bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro
25953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    public static int[] createExt()
26053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    {
26153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        return new int[16];
26253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    }
26353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro
264bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro    public static long[] createExt64()
265bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro    {
266bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro        return new long[8];
267bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro    }
268bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro
26953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    public static boolean diff(int[] x, int xOff, int[] y, int yOff, int[] z, int zOff)
27053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    {
27153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        boolean pos = gte(x, xOff, y, yOff);
27253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        if (pos)
27353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        {
27453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            sub(x, xOff, y, yOff, z, zOff);
27553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        }
27653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        else
27753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        {
27853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            sub(y, yOff, x, xOff, z, zOff);
27953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        }
28053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        return pos;
28153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    }
28253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro
28353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    public static boolean eq(int[] x, int[] y)
28453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    {
28553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        for (int i = 7; i >= 0; --i)
28653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        {
28753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            if (x[i] != y[i])
28853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            {
28953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro                return false;
29053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            }
29153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        }
29253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        return true;
29353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    }
29453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro
295bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro    public static boolean eq64(long[] x, long[] y)
296bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro    {
297bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro        for (int i = 3; i >= 0; --i)
298bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro        {
299bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro            if (x[i] != y[i])
300bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro            {
301bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro                return false;
302bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro            }
303bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro        }
304bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro        return true;
305bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro    }
306bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro
30753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    public static int[] fromBigInteger(BigInteger x)
30853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    {
30953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        if (x.signum() < 0 || x.bitLength() > 256)
31053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        {
31153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            throw new IllegalArgumentException();
31253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        }
31353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro
31453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        int[] z = create();
31553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        int i = 0;
31653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        while (x.signum() != 0)
31753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        {
31853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            z[i++] = x.intValue();
31953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            x = x.shiftRight(32);
32053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        }
32153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        return z;
32253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    }
32353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro
324bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro    public static long[] fromBigInteger64(BigInteger x)
325bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro    {
326bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro        if (x.signum() < 0 || x.bitLength() > 256)
327bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro        {
328bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro            throw new IllegalArgumentException();
329bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro        }
330bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro
331bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro        long[] z = create64();
332bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro        int i = 0;
333bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro        while (x.signum() != 0)
334bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro        {
335bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro            z[i++] = x.longValue();
336bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro            x = x.shiftRight(64);
337bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro        }
338bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro        return z;
339bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro    }
340bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro
34153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    public static int getBit(int[] x, int bit)
34253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    {
34353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        if (bit == 0)
34453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        {
34553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            return x[0] & 1;
34653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        }
34753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        if ((bit & 255) != bit)
34853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        {
34953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            return 0;
35053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        }
35153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        int w = bit >>> 5;
35253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        int b = bit & 31;
35353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        return (x[w] >>> b) & 1;
35453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    }
35553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro
35653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    public static boolean gte(int[] x, int[] y)
35753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    {
35853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        for (int i = 7; i >= 0; --i)
35953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        {
36053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            int x_i = x[i] ^ Integer.MIN_VALUE;
36153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            int y_i = y[i] ^ Integer.MIN_VALUE;
36253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            if (x_i < y_i)
36353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro                return false;
36453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            if (x_i > y_i)
36553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro                return true;
36653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        }
36753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        return true;
36853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    }
36953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro
37053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    public static boolean gte(int[] x, int xOff, int[] y, int yOff)
37153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    {
37253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        for (int i = 7; i >= 0; --i)
37353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        {
37453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            int x_i = x[xOff + i] ^ Integer.MIN_VALUE;
37553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            int y_i = y[yOff + i] ^ Integer.MIN_VALUE;
37653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            if (x_i < y_i)
37753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro                return false;
37853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            if (x_i > y_i)
37953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro                return true;
38053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        }
38153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        return true;
38253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    }
38353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro
38453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    public static boolean isOne(int[] x)
38553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    {
38653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        if (x[0] != 1)
38753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        {
38853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            return false;
38953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        }
39053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        for (int i = 1; i < 8; ++i)
39153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        {
39253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            if (x[i] != 0)
39353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            {
39453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro                return false;
39553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            }
39653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        }
39753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        return true;
39853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    }
39953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro
400bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro    public static boolean isOne64(long[] x)
401bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro    {
402bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro        if (x[0] != 1L)
403bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro        {
404bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro            return false;
405bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro        }
406bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro        for (int i = 1; i < 4; ++i)
407bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro        {
408bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro            if (x[i] != 0L)
409bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro            {
410bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro                return false;
411bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro            }
412bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro        }
413bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro        return true;
414bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro    }
415bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro
41653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    public static boolean isZero(int[] x)
41753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    {
41853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        for (int i = 0; i < 8; ++i)
41953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        {
42053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            if (x[i] != 0)
42153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            {
42253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro                return false;
42353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            }
42453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        }
42553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        return true;
42653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    }
42753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro
428bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro    public static boolean isZero64(long[] x)
429bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro    {
430bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro        for (int i = 0; i < 4; ++i)
431bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro        {
432bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro            if (x[i] != 0L)
433bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro            {
434bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro                return false;
435bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro            }
436bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro        }
437bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro        return true;
438bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro    }
439bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro
44053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    public static void mul(int[] x, int[] y, int[] zz)
44153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    {
44253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long y_0 = y[0] & M;
44353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long y_1 = y[1] & M;
44453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long y_2 = y[2] & M;
44553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long y_3 = y[3] & M;
44653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long y_4 = y[4] & M;
44753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long y_5 = y[5] & M;
44853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long y_6 = y[6] & M;
44953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long y_7 = y[7] & M;
45053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro
45153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        {
45253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            long c = 0, x_0 = x[0] & M;
45353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c += x_0 * y_0;
45453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz[0] = (int)c;
45553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c >>>= 32;
45653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c += x_0 * y_1;
45753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz[1] = (int)c;
45853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c >>>= 32;
45953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c += x_0 * y_2;
46053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz[2] = (int)c;
46153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c >>>= 32;
46253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c += x_0 * y_3;
46353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz[3] = (int)c;
46453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c >>>= 32;
46553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c += x_0 * y_4;
46653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz[4] = (int)c;
46753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c >>>= 32;
46853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c += x_0 * y_5;
46953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz[5] = (int)c;
47053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c >>>= 32;
47153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c += x_0 * y_6;
47253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz[6] = (int)c;
47353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c >>>= 32;
47453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c += x_0 * y_7;
47553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz[7] = (int)c;
47653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c >>>= 32;
47753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz[8] = (int)c;
47853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        }
47953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro
48053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        for (int i = 1; i < 8; ++i)
48153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        {
48253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            long c = 0, x_i = x[i] & M;
48353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c += x_i * y_0 + (zz[i + 0] & M);
48453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz[i + 0] = (int)c;
48553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c >>>= 32;
48653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c += x_i * y_1 + (zz[i + 1] & M);
48753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz[i + 1] = (int)c;
48853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c >>>= 32;
48953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c += x_i * y_2 + (zz[i + 2] & M);
49053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz[i + 2] = (int)c;
49153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c >>>= 32;
49253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c += x_i * y_3 + (zz[i + 3] & M);
49353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz[i + 3] = (int)c;
49453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c >>>= 32;
49553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c += x_i * y_4 + (zz[i + 4] & M);
49653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz[i + 4] = (int)c;
49753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c >>>= 32;
49853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c += x_i * y_5 + (zz[i + 5] & M);
49953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz[i + 5] = (int)c;
50053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c >>>= 32;
50153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c += x_i * y_6 + (zz[i + 6] & M);
50253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz[i + 6] = (int)c;
50353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c >>>= 32;
50453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c += x_i * y_7 + (zz[i + 7] & M);
50553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz[i + 7] = (int)c;
50653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c >>>= 32;
50753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz[i + 8] = (int)c;
50853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        }
50953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    }
51053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro
51153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    public static void mul(int[] x, int xOff, int[] y, int yOff, int[] zz, int zzOff)
51253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    {
51353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long y_0 = y[yOff + 0] & M;
51453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long y_1 = y[yOff + 1] & M;
51553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long y_2 = y[yOff + 2] & M;
51653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long y_3 = y[yOff + 3] & M;
51753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long y_4 = y[yOff + 4] & M;
51853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long y_5 = y[yOff + 5] & M;
51953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long y_6 = y[yOff + 6] & M;
52053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long y_7 = y[yOff + 7] & M;
52153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro
52253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        {
52353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            long c = 0, x_0 = x[xOff + 0] & M;
52453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c += x_0 * y_0;
52553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz[zzOff + 0] = (int)c;
52653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c >>>= 32;
52753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c += x_0 * y_1;
52853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz[zzOff + 1] = (int)c;
52953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c >>>= 32;
53053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c += x_0 * y_2;
53153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz[zzOff + 2] = (int)c;
53253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c >>>= 32;
53353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c += x_0 * y_3;
53453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz[zzOff + 3] = (int)c;
53553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c >>>= 32;
53653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c += x_0 * y_4;
53753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz[zzOff + 4] = (int)c;
53853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c >>>= 32;
53953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c += x_0 * y_5;
54053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz[zzOff + 5] = (int)c;
54153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c >>>= 32;
54253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c += x_0 * y_6;
54353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz[zzOff + 6] = (int)c;
54453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c >>>= 32;
54553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c += x_0 * y_7;
54653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz[zzOff + 7] = (int)c;
54753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c >>>= 32;
54853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz[zzOff + 8] = (int)c;
54953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        }
55053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro
55153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        for (int i = 1; i < 8; ++i)
55253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        {
55353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            ++zzOff;
55453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            long c = 0, x_i = x[xOff + i] & M;
55553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c += x_i * y_0 + (zz[zzOff + 0] & M);
55653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz[zzOff + 0] = (int)c;
55753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c >>>= 32;
55853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c += x_i * y_1 + (zz[zzOff + 1] & M);
55953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz[zzOff + 1] = (int)c;
56053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c >>>= 32;
56153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c += x_i * y_2 + (zz[zzOff + 2] & M);
56253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz[zzOff + 2] = (int)c;
56353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c >>>= 32;
56453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c += x_i * y_3 + (zz[zzOff + 3] & M);
56553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz[zzOff + 3] = (int)c;
56653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c >>>= 32;
56753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c += x_i * y_4 + (zz[zzOff + 4] & M);
56853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz[zzOff + 4] = (int)c;
56953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c >>>= 32;
57053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c += x_i * y_5 + (zz[zzOff + 5] & M);
57153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz[zzOff + 5] = (int)c;
57253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c >>>= 32;
57353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c += x_i * y_6 + (zz[zzOff + 6] & M);
57453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz[zzOff + 6] = (int)c;
57553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c >>>= 32;
57653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c += x_i * y_7 + (zz[zzOff + 7] & M);
57753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz[zzOff + 7] = (int)c;
57853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c >>>= 32;
57953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz[zzOff + 8] = (int)c;
58053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        }
58153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    }
58253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro
58353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    public static int mulAddTo(int[] x, int[] y, int[] zz)
58453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    {
58553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long y_0 = y[0] & M;
58653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long y_1 = y[1] & M;
58753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long y_2 = y[2] & M;
58853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long y_3 = y[3] & M;
58953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long y_4 = y[4] & M;
59053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long y_5 = y[5] & M;
59153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long y_6 = y[6] & M;
59253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long y_7 = y[7] & M;
59353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro
59453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long zc = 0;
59553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        for (int i = 0; i < 8; ++i)
59653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        {
59753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            long c = 0, x_i = x[i] & M;
59853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c += x_i * y_0 + (zz[i + 0] & M);
59953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz[i + 0] = (int)c;
60053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c >>>= 32;
60153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c += x_i * y_1 + (zz[i + 1] & M);
60253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz[i + 1] = (int)c;
60353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c >>>= 32;
60453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c += x_i * y_2 + (zz[i + 2] & M);
60553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz[i + 2] = (int)c;
60653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c >>>= 32;
60753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c += x_i * y_3 + (zz[i + 3] & M);
60853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz[i + 3] = (int)c;
60953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c >>>= 32;
61053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c += x_i * y_4 + (zz[i + 4] & M);
61153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz[i + 4] = (int)c;
61253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c >>>= 32;
61353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c += x_i * y_5 + (zz[i + 5] & M);
61453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz[i + 5] = (int)c;
61553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c >>>= 32;
61653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c += x_i * y_6 + (zz[i + 6] & M);
61753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz[i + 6] = (int)c;
61853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c >>>= 32;
61953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c += x_i * y_7 + (zz[i + 7] & M);
62053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz[i + 7] = (int)c;
62153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c >>>= 32;
62253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c += zc + (zz[i + 8] & M);
62353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz[i + 8] = (int)c;
62453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zc = c >>> 32;
62553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        }
62653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        return (int)zc;
62753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    }
62853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro
62953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    public static int mulAddTo(int[] x, int xOff, int[] y, int yOff, int[] zz, int zzOff)
63053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    {
63153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long y_0 = y[yOff + 0] & M;
63253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long y_1 = y[yOff + 1] & M;
63353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long y_2 = y[yOff + 2] & M;
63453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long y_3 = y[yOff + 3] & M;
63553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long y_4 = y[yOff + 4] & M;
63653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long y_5 = y[yOff + 5] & M;
63753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long y_6 = y[yOff + 6] & M;
63853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long y_7 = y[yOff + 7] & M;
63953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro
64053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long zc = 0;
64153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        for (int i = 0; i < 8; ++i)
64253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        {
64353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            long c = 0, x_i = x[xOff + i] & M;
64453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c += x_i * y_0 + (zz[zzOff + 0] & M);
64553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz[zzOff + 0] = (int)c;
64653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c >>>= 32;
64753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c += x_i * y_1 + (zz[zzOff + 1] & M);
64853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz[zzOff + 1] = (int)c;
64953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c >>>= 32;
65053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c += x_i * y_2 + (zz[zzOff + 2] & M);
65153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz[zzOff + 2] = (int)c;
65253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c >>>= 32;
65353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c += x_i * y_3 + (zz[zzOff + 3] & M);
65453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz[zzOff + 3] = (int)c;
65553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c >>>= 32;
65653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c += x_i * y_4 + (zz[zzOff + 4] & M);
65753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz[zzOff + 4] = (int)c;
65853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c >>>= 32;
65953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c += x_i * y_5 + (zz[zzOff + 5] & M);
66053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz[zzOff + 5] = (int)c;
66153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c >>>= 32;
66253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c += x_i * y_6 + (zz[zzOff + 6] & M);
66353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz[zzOff + 6] = (int)c;
66453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c >>>= 32;
66553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c += x_i * y_7 + (zz[zzOff + 7] & M);
66653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz[zzOff + 7] = (int)c;
66753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c >>>= 32;
66853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c += zc + (zz[zzOff + 8] & M);
66953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz[zzOff + 8] = (int)c;
67053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zc = c >>> 32;
67153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            ++zzOff;
67253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        }
67353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        return (int)zc;
67453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    }
67553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro
67653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    public static long mul33Add(int w, int[] x, int xOff, int[] y, int yOff, int[] z, int zOff)
67753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    {
67853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        // assert w >>> 31 == 0;
67953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro
68053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long c = 0, wVal = w & M;
68153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long x0 = x[xOff + 0] & M;
68253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += wVal * x0 + (y[yOff + 0] & M);
68353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[zOff + 0] = (int)c;
68453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
68553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long x1 = x[xOff + 1] & M;
68653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += wVal * x1 + x0 + (y[yOff + 1] & M);
68753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[zOff + 1] = (int)c;
68853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
68953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long x2 = x[xOff + 2] & M;
69053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += wVal * x2 + x1 + (y[yOff + 2] & M);
69153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[zOff + 2] = (int)c;
69253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
69353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long x3 = x[xOff + 3] & M;
69453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += wVal * x3 + x2 + (y[yOff + 3] & M);
69553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[zOff + 3] = (int)c;
69653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
69753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long x4 = x[xOff + 4] & M;
69853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += wVal * x4 + x3 + (y[yOff + 4] & M);
69953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[zOff + 4] = (int)c;
70053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
70153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long x5 = x[xOff + 5] & M;
70253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += wVal * x5 + x4 + (y[yOff + 5] & M);
70353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[zOff + 5] = (int)c;
70453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
70553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long x6 = x[xOff + 6] & M;
70653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += wVal * x6 + x5 + (y[yOff + 6] & M);
70753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[zOff + 6] = (int)c;
70853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
70953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long x7 = x[xOff + 7] & M;
71053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += wVal * x7 + x6 + (y[yOff + 7] & M);
71153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[zOff + 7] = (int)c;
71253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
71353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += x7;
71453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        return c;
71553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    }
71653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro
71753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    public static int mulByWord(int x, int[] z)
71853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    {
71953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long c = 0, xVal = x & M;
72053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += xVal * (z[0] & M);
72153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[0] = (int)c;
72253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
72353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += xVal * (z[1] & M);
72453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[1] = (int)c;
72553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
72653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += xVal * (z[2] & M);
72753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[2] = (int)c;
72853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
72953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += xVal * (z[3] & M);
73053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[3] = (int)c;
73153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
73253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += xVal * (z[4] & M);
73353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[4] = (int)c;
73453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
73553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += xVal * (z[5] & M);
73653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[5] = (int)c;
73753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
73853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += xVal * (z[6] & M);
73953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[6] = (int)c;
74053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
74153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += xVal * (z[7] & M);
74253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[7] = (int)c;
74353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
74453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        return (int)c;
74553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    }
74653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro
74753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    public static int mulByWordAddTo(int x, int[] y, int[] z)
74853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    {
74953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long c = 0, xVal = x & M;
75053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += xVal * (z[0] & M) + (y[0] & M);
75153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[0] = (int)c;
75253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
75353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += xVal * (z[1] & M) + (y[1] & M);
75453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[1] = (int)c;
75553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
75653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += xVal * (z[2] & M) + (y[2] & M);
75753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[2] = (int)c;
75853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
75953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += xVal * (z[3] & M) + (y[3] & M);
76053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[3] = (int)c;
76153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
76253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += xVal * (z[4] & M) + (y[4] & M);
76353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[4] = (int)c;
76453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
76553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += xVal * (z[5] & M) + (y[5] & M);
76653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[5] = (int)c;
76753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
76853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += xVal * (z[6] & M) + (y[6] & M);
76953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[6] = (int)c;
77053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
77153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += xVal * (z[7] & M) + (y[7] & M);
77253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[7] = (int)c;
77353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
77453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        return (int)c;
77553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    }
77653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro
77753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    public static int mulWordAddTo(int x, int[] y, int yOff, int[] z, int zOff)
77853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    {
77953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long c = 0, xVal = x & M;
78053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += xVal * (y[yOff + 0] & M) + (z[zOff + 0] & M);
78153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[zOff + 0] = (int)c;
78253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
78353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += xVal * (y[yOff + 1] & M) + (z[zOff + 1] & M);
78453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[zOff + 1] = (int)c;
78553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
78653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += xVal * (y[yOff + 2] & M) + (z[zOff + 2] & M);
78753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[zOff + 2] = (int)c;
78853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
78953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += xVal * (y[yOff + 3] & M) + (z[zOff + 3] & M);
79053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[zOff + 3] = (int)c;
79153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
79253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += xVal * (y[yOff + 4] & M) + (z[zOff + 4] & M);
79353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[zOff + 4] = (int)c;
79453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
79553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += xVal * (y[yOff + 5] & M) + (z[zOff + 5] & M);
79653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[zOff + 5] = (int)c;
79753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
79853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += xVal * (y[yOff + 6] & M) + (z[zOff + 6] & M);
79953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[zOff + 6] = (int)c;
80053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
80153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += xVal * (y[yOff + 7] & M) + (z[zOff + 7] & M);
80253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[zOff + 7] = (int)c;
80353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
80453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        return (int)c;
80553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    }
80653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro
80753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    public static int mul33DWordAdd(int x, long y, int[] z, int zOff)
80853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    {
80953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        // assert x >>> 31 == 0;
81053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        // assert zOff <= 4;
81153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro
81253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long c = 0, xVal = x & M;
81353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long y00 = y & M;
81453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += xVal * y00 + (z[zOff + 0] & M);
81553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[zOff + 0] = (int)c;
81653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
81753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long y01 = y >>> 32;
81853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += xVal * y01 + y00 + (z[zOff + 1] & M);
81953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[zOff + 1] = (int)c;
82053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
82153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += y01 + (z[zOff + 2] & M);
82253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[zOff + 2] = (int)c;
82353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
82453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (z[zOff + 3] & M);
82553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[zOff + 3] = (int)c;
82653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
82753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        return c == 0 ? 0 : Nat.incAt(8, z, zOff, 4);
82853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    }
82953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro
83053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    public static int mul33WordAdd(int x, int y, int[] z, int zOff)
83153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    {
83253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        // assert x >>> 31 == 0;
83353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        // assert zOff <= 5;
83453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro
83553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long c = 0, xVal = x & M, yVal = y & M;
83653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += yVal * xVal + (z[zOff + 0] & M);
83753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[zOff + 0] = (int)c;
83853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
83953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += yVal + (z[zOff + 1] & M);
84053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[zOff + 1] = (int)c;
84153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
84253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (z[zOff + 2] & M);
84353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[zOff + 2] = (int)c;
84453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
84553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        return c == 0 ? 0 : Nat.incAt(8, z, zOff, 3);
84653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    }
84753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro
84853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    public static int mulWordDwordAdd(int x, long y, int[] z, int zOff)
84953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    {
85053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        // assert zOff <= 5;
85153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long c = 0, xVal = x & M;
85253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += xVal * (y & M) + (z[zOff + 0] & M);
85353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[zOff + 0] = (int)c;
85453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
85553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += xVal * (y >>> 32) + (z[zOff + 1] & M);
85653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[zOff + 1] = (int)c;
85753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
85853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (z[zOff + 2] & M);
85953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[zOff + 2] = (int)c;
86053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
86153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        return c == 0 ? 0 : Nat.incAt(8, z, zOff, 3);
86253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    }
86353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro
86453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    public static int mulWord(int x, int[] y, int[] z, int zOff)
86553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    {
86653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long c = 0, xVal = x & M;
86753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        int i = 0;
86853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        do
86953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        {
87053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c += xVal * (y[i] & M);
87153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            z[zOff + i] = (int)c;
87253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c >>>= 32;
87353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        }
87453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        while (++i < 8);
87553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        return (int)c;
87653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    }
87753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro
87853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    public static void square(int[] x, int[] zz)
87953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    {
88053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long x_0 = x[0] & M;
88153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long zz_1;
88253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro
88353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        int c = 0, w;
88453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        {
88553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            int i = 7, j = 16;
88653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            do
88753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            {
88853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro                long xVal = (x[i--] & M);
88953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro                long p = xVal * xVal;
89053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro                zz[--j] = (c << 31) | (int)(p >>> 33);
89153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro                zz[--j] = (int)(p >>> 1);
89253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro                c = (int)p;
89353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            }
89453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            while (i > 0);
89553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro
89653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            {
89753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro                long p = x_0 * x_0;
89853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro                zz_1 = ((c << 31) & M) | (p >>> 33);
89953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro                zz[0] = (int)p;
90053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro                c = (int)(p >>> 32) & 1;
90153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            }
90253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        }
90353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro
90453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long x_1 = x[1] & M;
90553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long zz_2 = zz[2] & M;
90653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro
90753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        {
90853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_1 += x_1 * x_0;
90953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            w = (int)zz_1;
91053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz[1] = (w << 1) | c;
91153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c = w >>> 31;
91253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_2 += zz_1 >>> 32;
91353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        }
91453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro
91553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long x_2 = x[2] & M;
91653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long zz_3 = zz[3] & M;
91753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long zz_4 = zz[4] & M;
91853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        {
91953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_2 += x_2 * x_0;
92053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            w = (int)zz_2;
92153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz[2] = (w << 1) | c;
92253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c = w >>> 31;
92353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_3 += (zz_2 >>> 32) + x_2 * x_1;
92453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_4 += zz_3 >>> 32;
92553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_3 &= M;
92653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        }
92753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro
92853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long x_3 = x[3] & M;
9294caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro        long zz_5 = (zz[5] & M) + (zz_4 >>> 32); zz_4 &= M;
9304caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro        long zz_6 = (zz[6] & M) + (zz_5 >>> 32); zz_5 &= M;
93153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        {
93253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_3 += x_3 * x_0;
93353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            w = (int)zz_3;
93453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz[3] = (w << 1) | c;
93553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c = w >>> 31;
93653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_4 += (zz_3 >>> 32) + x_3 * x_1;
93753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_5 += (zz_4 >>> 32) + x_3 * x_2;
93853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_4 &= M;
93953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_6 += zz_5 >>> 32;
94053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_5 &= M;
94153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        }
94253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro
94353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long x_4 = x[4] & M;
9444caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro        long zz_7 = (zz[7] & M) + (zz_6 >>> 32); zz_6 &= M;
9454caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro        long zz_8 = (zz[8] & M) + (zz_7 >>> 32); zz_7 &= M;
94653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        {
94753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_4 += x_4 * x_0;
94853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            w = (int)zz_4;
94953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz[4] = (w << 1) | c;
95053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c = w >>> 31;
95153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_5 += (zz_4 >>> 32) + x_4 * x_1;
95253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_6 += (zz_5 >>> 32) + x_4 * x_2;
95353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_5 &= M;
95453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_7 += (zz_6 >>> 32) + x_4 * x_3;
95553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_6 &= M;
95653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_8 += zz_7 >>> 32;
95753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_7 &= M;
95853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        }
95953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro
96053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long x_5 = x[5] & M;
9614caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro        long zz_9 = (zz[9] & M) + (zz_8 >>> 32); zz_8 &= M;
9624caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro        long zz_10 = (zz[10] & M) + (zz_9 >>> 32); zz_9 &= M;
96353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        {
96453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_5 += x_5 * x_0;
96553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            w = (int)zz_5;
96653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz[5] = (w << 1) | c;
96753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c = w >>> 31;
96853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_6 += (zz_5 >>> 32) + x_5 * x_1;
96953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_7 += (zz_6 >>> 32) + x_5 * x_2;
97053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_6 &= M;
97153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_8 += (zz_7 >>> 32) + x_5 * x_3;
97253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_7 &= M;
97353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_9 += (zz_8 >>> 32) + x_5 * x_4;
97453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_8 &= M;
97553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_10 += zz_9 >>> 32;
97653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_9 &= M;
97753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        }
97853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro
97953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long x_6 = x[6] & M;
9804caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro        long zz_11 = (zz[11] & M) + (zz_10 >>> 32); zz_10 &= M;
9814caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro        long zz_12 = (zz[12] & M) + (zz_11 >>> 32); zz_11 &= M;
98253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        {
98353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_6 += x_6 * x_0;
98453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            w = (int)zz_6;
98553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz[6] = (w << 1) | c;
98653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c = w >>> 31;
98753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_7 += (zz_6 >>> 32) + x_6 * x_1;
98853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_8 += (zz_7 >>> 32) + x_6 * x_2;
98953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_7 &= M;
99053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_9 += (zz_8 >>> 32) + x_6 * x_3;
99153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_8 &= M;
99253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_10 += (zz_9 >>> 32) + x_6 * x_4;
99353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_9 &= M;
99453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_11 += (zz_10 >>> 32) + x_6 * x_5;
99553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_10 &= M;
99653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_12 += zz_11 >>> 32;
99753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_11 &= M;
99853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        }
99953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro
100053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long x_7 = x[7] & M;
10014caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro        long zz_13 = (zz[13] & M) + (zz_12 >>> 32); zz_12 &= M;
10024caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro        long zz_14 = (zz[14] & M) + (zz_13 >>> 32); zz_13 &= M;
100353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        {
100453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_7 += x_7 * x_0;
100553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            w = (int)zz_7;
100653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz[7] = (w << 1) | c;
100753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c = w >>> 31;
100853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_8 += (zz_7 >>> 32) + x_7 * x_1;
100953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_9 += (zz_8 >>> 32) + x_7 * x_2;
101053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_10 += (zz_9 >>> 32) + x_7 * x_3;
101153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_11 += (zz_10 >>> 32) + x_7 * x_4;
101253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_12 += (zz_11 >>> 32) + x_7 * x_5;
101353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_13 += (zz_12 >>> 32) + x_7 * x_6;
101453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_14 += zz_13 >>> 32;
101553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        }
101653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro
101753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        w = (int)zz_8;
101853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        zz[8] = (w << 1) | c;
101953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c = w >>> 31;
102053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        w = (int)zz_9;
102153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        zz[9] = (w << 1) | c;
102253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c = w >>> 31;
102353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        w = (int)zz_10;
102453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        zz[10] = (w << 1) | c;
102553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c = w >>> 31;
102653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        w = (int)zz_11;
102753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        zz[11] = (w << 1) | c;
102853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c = w >>> 31;
102953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        w = (int)zz_12;
103053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        zz[12] = (w << 1) | c;
103153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c = w >>> 31;
103253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        w = (int)zz_13;
103353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        zz[13] = (w << 1) | c;
103453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c = w >>> 31;
103553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        w = (int)zz_14;
103653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        zz[14] = (w << 1) | c;
103753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c = w >>> 31;
10384caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro        w = zz[15] + (int)(zz_14 >>> 32);
103953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        zz[15] = (w << 1) | c;
104053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    }
104153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro
104253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    public static void square(int[] x, int xOff, int[] zz, int zzOff)
104353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    {
104453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long x_0 = x[xOff + 0] & M;
104553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long zz_1;
104653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro
104753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        int c = 0, w;
104853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        {
104953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            int i = 7, j = 16;
105053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            do
105153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            {
105253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro                long xVal = (x[xOff + i--] & M);
105353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro                long p = xVal * xVal;
105453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro                zz[zzOff + --j] = (c << 31) | (int)(p >>> 33);
105553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro                zz[zzOff + --j] = (int)(p >>> 1);
105653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro                c = (int)p;
105753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            }
105853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            while (i > 0);
105953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro
106053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            {
106153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro                long p = x_0 * x_0;
106253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro                zz_1 = ((c << 31) & M) | (p >>> 33);
106353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro                zz[zzOff + 0] = (int)p;
106453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro                c = (int)(p >>> 32) & 1;
106553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            }
106653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        }
106753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro
106853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long x_1 = x[xOff + 1] & M;
106953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long zz_2 = zz[zzOff + 2] & M;
107053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro
107153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        {
107253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_1 += x_1 * x_0;
107353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            w = (int)zz_1;
107453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz[zzOff + 1] = (w << 1) | c;
107553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c = w >>> 31;
107653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_2 += zz_1 >>> 32;
107753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        }
107853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro
107953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long x_2 = x[xOff + 2] & M;
108053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long zz_3 = zz[zzOff + 3] & M;
108153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long zz_4 = zz[zzOff + 4] & M;
108253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        {
108353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_2 += x_2 * x_0;
108453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            w = (int)zz_2;
108553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz[zzOff + 2] = (w << 1) | c;
108653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c = w >>> 31;
108753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_3 += (zz_2 >>> 32) + x_2 * x_1;
108853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_4 += zz_3 >>> 32;
108953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_3 &= M;
109053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        }
109153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro
109253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long x_3 = x[xOff + 3] & M;
10934caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro        long zz_5 = (zz[zzOff + 5] & M) + (zz_4 >>> 32); zz_4 &= M;
10944caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro        long zz_6 = (zz[zzOff + 6] & M) + (zz_5 >>> 32); zz_5 &= M;
109553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        {
109653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_3 += x_3 * x_0;
109753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            w = (int)zz_3;
109853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz[zzOff + 3] = (w << 1) | c;
109953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c = w >>> 31;
110053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_4 += (zz_3 >>> 32) + x_3 * x_1;
110153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_5 += (zz_4 >>> 32) + x_3 * x_2;
110253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_4 &= M;
110353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_6 += zz_5 >>> 32;
110453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_5 &= M;
110553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        }
110653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro
110753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long x_4 = x[xOff + 4] & M;
11084caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro        long zz_7 = (zz[zzOff + 7] & M) + (zz_6 >>> 32); zz_6 &= M;
11094caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro        long zz_8 = (zz[zzOff + 8] & M) + (zz_7 >>> 32); zz_7 &= M;
111053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        {
111153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_4 += x_4 * x_0;
111253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            w = (int)zz_4;
111353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz[zzOff + 4] = (w << 1) | c;
111453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c = w >>> 31;
111553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_5 += (zz_4 >>> 32) + x_4 * x_1;
111653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_6 += (zz_5 >>> 32) + x_4 * x_2;
111753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_5 &= M;
111853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_7 += (zz_6 >>> 32) + x_4 * x_3;
111953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_6 &= M;
112053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_8 += zz_7 >>> 32;
112153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_7 &= M;
112253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        }
112353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro
112453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long x_5 = x[xOff + 5] & M;
11254caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro        long zz_9 = (zz[zzOff + 9] & M) + (zz_8 >>> 32); zz_8 &= M;
11264caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro        long zz_10 = (zz[zzOff + 10] & M) + (zz_9 >>> 32); zz_9 &= M;
112753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        {
112853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_5 += x_5 * x_0;
112953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            w = (int)zz_5;
113053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz[zzOff + 5] = (w << 1) | c;
113153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c = w >>> 31;
113253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_6 += (zz_5 >>> 32) + x_5 * x_1;
113353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_7 += (zz_6 >>> 32) + x_5 * x_2;
113453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_6 &= M;
113553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_8 += (zz_7 >>> 32) + x_5 * x_3;
113653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_7 &= M;
113753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_9 += (zz_8 >>> 32) + x_5 * x_4;
113853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_8 &= M;
113953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_10 += zz_9 >>> 32;
114053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_9 &= M;
114153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        }
114253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro
114353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long x_6 = x[xOff + 6] & M;
11444caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro        long zz_11 = (zz[zzOff + 11] & M) + (zz_10 >>> 32); zz_10 &= M;
11454caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro        long zz_12 = (zz[zzOff + 12] & M) + (zz_11 >>> 32); zz_11 &= M;
114653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        {
114753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_6 += x_6 * x_0;
114853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            w = (int)zz_6;
114953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz[zzOff + 6] = (w << 1) | c;
115053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c = w >>> 31;
115153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_7 += (zz_6 >>> 32) + x_6 * x_1;
115253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_8 += (zz_7 >>> 32) + x_6 * x_2;
115353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_7 &= M;
115453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_9 += (zz_8 >>> 32) + x_6 * x_3;
115553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_8 &= M;
115653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_10 += (zz_9 >>> 32) + x_6 * x_4;
115753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_9 &= M;
115853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_11 += (zz_10 >>> 32) + x_6 * x_5;
115953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_10 &= M;
116053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_12 += zz_11 >>> 32;
116153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_11 &= M;
116253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        }
116353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro
116453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long x_7 = x[xOff + 7] & M;
11654caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro        long zz_13 = (zz[zzOff + 13] & M) + (zz_12 >>> 32); zz_12 &= M;
11664caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro        long zz_14 = (zz[zzOff + 14] & M) + (zz_13 >>> 32); zz_13 &= M;
116753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        {
116853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_7 += x_7 * x_0;
116953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            w = (int)zz_7;
117053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz[zzOff + 7] = (w << 1) | c;
117153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c = w >>> 31;
117253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_8 += (zz_7 >>> 32) + x_7 * x_1;
117353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_9 += (zz_8 >>> 32) + x_7 * x_2;
117453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_10 += (zz_9 >>> 32) + x_7 * x_3;
117553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_11 += (zz_10 >>> 32) + x_7 * x_4;
117653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_12 += (zz_11 >>> 32) + x_7 * x_5;
117753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_13 += (zz_12 >>> 32) + x_7 * x_6;
117853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_14 += zz_13 >>> 32;
117953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        }
118053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro
118153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        w = (int)zz_8;
118253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        zz[zzOff + 8] = (w << 1) | c;
118353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c = w >>> 31;
118453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        w = (int)zz_9;
118553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        zz[zzOff + 9] = (w << 1) | c;
118653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c = w >>> 31;
118753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        w = (int)zz_10;
118853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        zz[zzOff + 10] = (w << 1) | c;
118953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c = w >>> 31;
119053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        w = (int)zz_11;
119153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        zz[zzOff + 11] = (w << 1) | c;
119253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c = w >>> 31;
119353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        w = (int)zz_12;
119453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        zz[zzOff + 12] = (w << 1) | c;
119553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c = w >>> 31;
119653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        w = (int)zz_13;
119753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        zz[zzOff + 13] = (w << 1) | c;
119853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c = w >>> 31;
119953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        w = (int)zz_14;
120053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        zz[zzOff + 14] = (w << 1) | c;
120153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c = w >>> 31;
12024caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro        w = zz[zzOff + 15] + (int)(zz_14 >>> 32);
120353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        zz[zzOff + 15] = (w << 1) | c;
120453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    }
120553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro
120653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    public static int sub(int[] x, int[] y, int[] z)
120753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    {
120853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long c = 0;
120953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (x[0] & M) - (y[0] & M);
121053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[0] = (int)c;
121153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>= 32;
121253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (x[1] & M) - (y[1] & M);
121353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[1] = (int)c;
121453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>= 32;
121553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (x[2] & M) - (y[2] & M);
121653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[2] = (int)c;
121753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>= 32;
121853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (x[3] & M) - (y[3] & M);
121953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[3] = (int)c;
122053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>= 32;
122153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (x[4] & M) - (y[4] & M);
122253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[4] = (int)c;
122353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>= 32;
122453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (x[5] & M) - (y[5] & M);
122553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[5] = (int)c;
122653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>= 32;
122753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (x[6] & M) - (y[6] & M);
122853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[6] = (int)c;
122953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>= 32;
123053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (x[7] & M) - (y[7] & M);
123153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[7] = (int)c;
123253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>= 32;
123353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        return (int)c;
123453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    }
123553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro
123653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    public static int sub(int[] x, int xOff, int[] y, int yOff, int[] z, int zOff)
123753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    {
123853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long c = 0;
123953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (x[xOff + 0] & M) - (y[yOff + 0] & M);
124053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[zOff + 0] = (int)c;
124153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>= 32;
124253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (x[xOff + 1] & M) - (y[yOff + 1] & M);
124353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[zOff + 1] = (int)c;
124453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>= 32;
124553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (x[xOff + 2] & M) - (y[yOff + 2] & M);
124653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[zOff + 2] = (int)c;
124753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>= 32;
124853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (x[xOff + 3] & M) - (y[yOff + 3] & M);
124953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[zOff + 3] = (int)c;
125053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>= 32;
125153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (x[xOff + 4] & M) - (y[yOff + 4] & M);
125253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[zOff + 4] = (int)c;
125353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>= 32;
125453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (x[xOff + 5] & M) - (y[yOff + 5] & M);
125553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[zOff + 5] = (int)c;
125653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>= 32;
125753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (x[xOff + 6] & M) - (y[yOff + 6] & M);
125853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[zOff + 6] = (int)c;
125953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>= 32;
126053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (x[xOff + 7] & M) - (y[yOff + 7] & M);
126153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[zOff + 7] = (int)c;
126253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>= 32;
126353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        return (int)c;
126453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    }
126553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro
126653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    public static int subBothFrom(int[] x, int[] y, int[] z)
126753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    {
126853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long c = 0;
126953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (z[0] & M) - (x[0] & M) - (y[0] & M);
127053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[0] = (int)c;
127153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>= 32;
127253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (z[1] & M) - (x[1] & M) - (y[1] & M);
127353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[1] = (int)c;
127453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>= 32;
127553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (z[2] & M) - (x[2] & M) - (y[2] & M);
127653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[2] = (int)c;
127753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>= 32;
127853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (z[3] & M) - (x[3] & M) - (y[3] & M);
127953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[3] = (int)c;
128053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>= 32;
128153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (z[4] & M) - (x[4] & M) - (y[4] & M);
128253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[4] = (int)c;
128353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>= 32;
128453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (z[5] & M) - (x[5] & M) - (y[5] & M);
128553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[5] = (int)c;
128653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>= 32;
128753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (z[6] & M) - (x[6] & M) - (y[6] & M);
128853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[6] = (int)c;
128953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>= 32;
129053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (z[7] & M) - (x[7] & M) - (y[7] & M);
129153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[7] = (int)c;
129253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>= 32;
129353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        return (int)c;
129453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    }
129553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro
129653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    public static int subFrom(int[] x, int[] z)
129753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    {
129853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long c = 0;
129953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (z[0] & M) - (x[0] & M);
130053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[0] = (int)c;
130153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>= 32;
130253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (z[1] & M) - (x[1] & M);
130353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[1] = (int)c;
130453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>= 32;
130553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (z[2] & M) - (x[2] & M);
130653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[2] = (int)c;
130753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>= 32;
130853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (z[3] & M) - (x[3] & M);
130953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[3] = (int)c;
131053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>= 32;
131153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (z[4] & M) - (x[4] & M);
131253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[4] = (int)c;
131353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>= 32;
131453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (z[5] & M) - (x[5] & M);
131553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[5] = (int)c;
131653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>= 32;
131753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (z[6] & M) - (x[6] & M);
131853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[6] = (int)c;
131953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>= 32;
132053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (z[7] & M) - (x[7] & M);
132153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[7] = (int)c;
132253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>= 32;
132353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        return (int)c;
132453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    }
132553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro
132653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    public static int subFrom(int[] x, int xOff, int[] z, int zOff)
132753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    {
132853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long c = 0;
132953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (z[zOff + 0] & M) - (x[xOff + 0] & M);
133053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[zOff + 0] = (int)c;
133153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>= 32;
133253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (z[zOff + 1] & M) - (x[xOff + 1] & M);
133353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[zOff + 1] = (int)c;
133453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>= 32;
133553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (z[zOff + 2] & M) - (x[xOff + 2] & M);
133653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[zOff + 2] = (int)c;
133753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>= 32;
133853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (z[zOff + 3] & M) - (x[xOff + 3] & M);
133953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[zOff + 3] = (int)c;
134053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>= 32;
134153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (z[zOff + 4] & M) - (x[xOff + 4] & M);
134253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[zOff + 4] = (int)c;
134353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>= 32;
134453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (z[zOff + 5] & M) - (x[xOff + 5] & M);
134553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[zOff + 5] = (int)c;
134653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>= 32;
134753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (z[zOff + 6] & M) - (x[xOff + 6] & M);
134853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[zOff + 6] = (int)c;
134953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>= 32;
135053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (z[zOff + 7] & M) - (x[xOff + 7] & M);
135153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[zOff + 7] = (int)c;
135253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>= 32;
135353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        return (int)c;
135453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    }
135553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro
135653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    public static BigInteger toBigInteger(int[] x)
135753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    {
135853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        byte[] bs = new byte[32];
135953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        for (int i = 0; i < 8; ++i)
136053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        {
136153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            int x_i = x[i];
136253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            if (x_i != 0)
136353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            {
136453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro                Pack.intToBigEndian(x_i, bs, (7 - i) << 2);
136553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            }
136653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        }
136753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        return new BigInteger(1, bs);
136853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    }
136953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro
1370bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro    public static BigInteger toBigInteger64(long[] x)
1371bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro    {
1372bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro        byte[] bs = new byte[32];
1373bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro        for (int i = 0; i < 4; ++i)
1374bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro        {
1375bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro            long x_i = x[i];
1376bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro            if (x_i != 0L)
1377bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro            {
1378bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro                Pack.longToBigEndian(x_i, bs, (3 - i) << 3);
1379bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro            }
1380bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro        }
1381bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro        return new BigInteger(1, bs);
1382bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro    }
1383bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro
138453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    public static void zero(int[] z)
138553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    {
138653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[0] = 0;
138753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[1] = 0;
138853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[2] = 0;
138953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[3] = 0;
139053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[4] = 0;
139153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[5] = 0;
139253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[6] = 0;
139353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[7] = 0;
139453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    }
139553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro}
1396