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 Nat224
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        return (int)c;
3653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    }
3753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro
3853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    public static int add(int[] x, int xOff, int[] y, int yOff, int[] z, int zOff)
3953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    {
4053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long c = 0;
4153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (x[xOff + 0] & M) + (y[yOff + 0] & M);
4253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[zOff + 0] = (int)c;
4353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
4453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (x[xOff + 1] & M) + (y[yOff + 1] & M);
4553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[zOff + 1] = (int)c;
4653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
4753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (x[xOff + 2] & M) + (y[yOff + 2] & M);
4853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[zOff + 2] = (int)c;
4953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
5053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (x[xOff + 3] & M) + (y[yOff + 3] & M);
5153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[zOff + 3] = (int)c;
5253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
5353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (x[xOff + 4] & M) + (y[yOff + 4] & M);
5453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[zOff + 4] = (int)c;
5553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
5653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (x[xOff + 5] & M) + (y[yOff + 5] & M);
5753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[zOff + 5] = (int)c;
5853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
5953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (x[xOff + 6] & M) + (y[yOff + 6] & M);
6053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[zOff + 6] = (int)c;
6153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
6253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        return (int)c;
6353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    }
6453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro
6553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    public static int addBothTo(int[] x, int[] y, int[] z)
6653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    {
6753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long c = 0;
6853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (x[0] & M) + (y[0] & M) + (z[0] & M);
6953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[0] = (int)c;
7053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
7153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (x[1] & M) + (y[1] & M) + (z[1] & M);
7253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[1] = (int)c;
7353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
7453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (x[2] & M) + (y[2] & M) + (z[2] & M);
7553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[2] = (int)c;
7653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
7753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (x[3] & M) + (y[3] & M) + (z[3] & M);
7853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[3] = (int)c;
7953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
8053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (x[4] & M) + (y[4] & M) + (z[4] & M);
8153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[4] = (int)c;
8253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
8353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (x[5] & M) + (y[5] & M) + (z[5] & M);
8453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[5] = (int)c;
8553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
8653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (x[6] & M) + (y[6] & M) + (z[6] & M);
8753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[6] = (int)c;
8853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
8953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        return (int)c;
9053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    }
9153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro
9253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    public static int addBothTo(int[] x, int xOff, int[] y, int yOff, int[] z, int zOff)
9353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    {
9453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long c = 0;
9553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (x[xOff + 0] & M) + (y[yOff + 0] & M) + (z[zOff + 0] & M);
9653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[zOff + 0] = (int)c;
9753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
9853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (x[xOff + 1] & M) + (y[yOff + 1] & M) + (z[zOff + 1] & M);
9953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[zOff + 1] = (int)c;
10053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
10153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (x[xOff + 2] & M) + (y[yOff + 2] & M) + (z[zOff + 2] & M);
10253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[zOff + 2] = (int)c;
10353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
10453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (x[xOff + 3] & M) + (y[yOff + 3] & M) + (z[zOff + 3] & M);
10553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[zOff + 3] = (int)c;
10653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
10753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (x[xOff + 4] & M) + (y[yOff + 4] & M) + (z[zOff + 4] & M);
10853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[zOff + 4] = (int)c;
10953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
11053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (x[xOff + 5] & M) + (y[yOff + 5] & M) + (z[zOff + 5] & M);
11153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[zOff + 5] = (int)c;
11253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
11353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (x[xOff + 6] & M) + (y[yOff + 6] & M) + (z[zOff + 6] & M);
11453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[zOff + 6] = (int)c;
11553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
11653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        return (int)c;
11753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    }
11853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro
11953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    public static int addTo(int[] x, int[] z)
12053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    {
12153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long c = 0;
12253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (x[0] & M) + (z[0] & M);
12353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[0] = (int)c;
12453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
12553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (x[1] & M) + (z[1] & M);
12653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[1] = (int)c;
12753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
12853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (x[2] & M) + (z[2] & M);
12953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[2] = (int)c;
13053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
13153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (x[3] & M) + (z[3] & M);
13253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[3] = (int)c;
13353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
13453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (x[4] & M) + (z[4] & M);
13553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[4] = (int)c;
13653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
13753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (x[5] & M) + (z[5] & M);
13853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[5] = (int)c;
13953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
14053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (x[6] & M) + (z[6] & M);
14153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[6] = (int)c;
14253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
14353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        return (int)c;
14453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    }
14553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro
14653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    public static int addTo(int[] x, int xOff, int[] z, int zOff, int cIn)
14753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    {
14853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long c = cIn & M;
14953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (x[xOff + 0] & M) + (z[zOff + 0] & M);
15053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[zOff + 0] = (int)c;
15153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
15253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (x[xOff + 1] & M) + (z[zOff + 1] & M);
15353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[zOff + 1] = (int)c;
15453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
15553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (x[xOff + 2] & M) + (z[zOff + 2] & M);
15653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[zOff + 2] = (int)c;
15753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
15853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (x[xOff + 3] & M) + (z[zOff + 3] & M);
15953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[zOff + 3] = (int)c;
16053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
16153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (x[xOff + 4] & M) + (z[zOff + 4] & M);
16253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[zOff + 4] = (int)c;
16353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
16453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (x[xOff + 5] & M) + (z[zOff + 5] & M);
16553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[zOff + 5] = (int)c;
16653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
16753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (x[xOff + 6] & M) + (z[zOff + 6] & M);
16853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[zOff + 6] = (int)c;
16953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
17053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        return (int)c;
17153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    }
17253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro
17353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    public static int addToEachOther(int[] u, int uOff, int[] v, int vOff)
17453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    {
17553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long c = 0;
17653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (u[uOff + 0] & M) + (v[vOff + 0] & M);
17753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        u[uOff + 0] = (int)c;
17853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        v[vOff + 0] = (int)c;
17953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
18053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (u[uOff + 1] & M) + (v[vOff + 1] & M);
18153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        u[uOff + 1] = (int)c;
18253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        v[vOff + 1] = (int)c;
18353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
18453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (u[uOff + 2] & M) + (v[vOff + 2] & M);
18553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        u[uOff + 2] = (int)c;
18653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        v[vOff + 2] = (int)c;
18753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
18853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (u[uOff + 3] & M) + (v[vOff + 3] & M);
18953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        u[uOff + 3] = (int)c;
19053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        v[vOff + 3] = (int)c;
19153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
19253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (u[uOff + 4] & M) + (v[vOff + 4] & M);
19353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        u[uOff + 4] = (int)c;
19453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        v[vOff + 4] = (int)c;
19553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
19653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (u[uOff + 5] & M) + (v[vOff + 5] & M);
19753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        u[uOff + 5] = (int)c;
19853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        v[vOff + 5] = (int)c;
19953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
20053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (u[uOff + 6] & M) + (v[vOff + 6] & M);
20153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        u[uOff + 6] = (int)c;
20253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        v[vOff + 6] = (int)c;
20353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
20453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        return (int)c;
20553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    }
20653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro
20753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    public static void copy(int[] x, int[] z)
20853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    {
20953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[0] = x[0];
21053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[1] = x[1];
21153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[2] = x[2];
21253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[3] = x[3];
21353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[4] = x[4];
21453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[5] = x[5];
21553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[6] = x[6];
21653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    }
21753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro
21853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    public static int[] create()
21953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    {
22053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        return new int[7];
22153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    }
22253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro
22353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    public static int[] createExt()
22453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    {
22553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        return new int[14];
22653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    }
22753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro
22853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    public static boolean diff(int[] x, int xOff, int[] y, int yOff, int[] z, int zOff)
22953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    {
23053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        boolean pos = gte(x, xOff, y, yOff);
23153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        if (pos)
23253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        {
23353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            sub(x, xOff, y, yOff, z, zOff);
23453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        }
23553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        else
23653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        {
23753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            sub(y, yOff, x, xOff, z, zOff);
23853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        }
23953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        return pos;
24053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    }
24153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro
24253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    public static boolean eq(int[] x, int[] y)
24353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    {
24453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        for (int i = 6; i >= 0; --i)
24553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        {
24653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            if (x[i] != y[i])
24753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            {
24853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro                return false;
24953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            }
25053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        }
25153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        return true;
25253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    }
25353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro
25453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    public static int[] fromBigInteger(BigInteger x)
25553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    {
25653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        if (x.signum() < 0 || x.bitLength() > 224)
25753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        {
25853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            throw new IllegalArgumentException();
25953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        }
26053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro
26153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        int[] z = create();
26253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        int i = 0;
26353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        while (x.signum() != 0)
26453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        {
26553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            z[i++] = x.intValue();
26653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            x = x.shiftRight(32);
26753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        }
26853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        return z;
26953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    }
27053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro
27153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    public static int getBit(int[] x, int bit)
27253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    {
27353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        if (bit == 0)
27453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        {
27553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            return x[0] & 1;
27653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        }
27753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        int w = bit >> 5;
27853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        if (w < 0 || w >= 7)
27953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        {
28053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            return 0;
28153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        }
28253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        int b = bit & 31;
28353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        return (x[w] >>> b) & 1;
28453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    }
28553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro
28653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    public static boolean gte(int[] x, int[] y)
28753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    {
28853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        for (int i = 6; i >= 0; --i)
28953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        {
29053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            int x_i = x[i] ^ Integer.MIN_VALUE;
29153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            int y_i = y[i] ^ Integer.MIN_VALUE;
29253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            if (x_i < y_i)
29353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro                return false;
29453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            if (x_i > y_i)
29553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro                return true;
29653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        }
29753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        return true;
29853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    }
29953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro
30053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    public static boolean gte(int[] x, int xOff, int[] y, int yOff)
30153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    {
30253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        for (int i = 6; i >= 0; --i)
30353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        {
30453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            int x_i = x[xOff + i] ^ Integer.MIN_VALUE;
30553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            int y_i = y[yOff + i] ^ Integer.MIN_VALUE;
30653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            if (x_i < y_i)
30753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro                return false;
30853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            if (x_i > y_i)
30953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro                return true;
31053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        }
31153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        return true;
31253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    }
31353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro
31453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    public static boolean isOne(int[] x)
31553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    {
31653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        if (x[0] != 1)
31753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        {
31853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            return false;
31953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        }
32053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        for (int i = 1; i < 7; ++i)
32153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        {
32253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            if (x[i] != 0)
32353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            {
32453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro                return false;
32553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            }
32653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        }
32753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        return true;
32853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    }
32953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro
33053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    public static boolean isZero(int[] x)
33153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    {
33253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        for (int i = 0; i < 7; ++i)
33353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        {
33453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            if (x[i] != 0)
33553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            {
33653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro                return false;
33753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            }
33853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        }
33953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        return true;
34053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    }
34153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro
34253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    public static void mul(int[] x, int[] y, int[] zz)
34353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    {
34453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long y_0 = y[0] & M;
34553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long y_1 = y[1] & M;
34653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long y_2 = y[2] & M;
34753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long y_3 = y[3] & M;
34853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long y_4 = y[4] & M;
34953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long y_5 = y[5] & M;
35053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long y_6 = y[6] & M;
35153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro
35253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        {
35353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            long c = 0, x_0 = x[0] & M;
35453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c += x_0 * y_0;
35553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz[0] = (int)c;
35653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c >>>= 32;
35753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c += x_0 * y_1;
35853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz[1] = (int)c;
35953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c >>>= 32;
36053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c += x_0 * y_2;
36153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz[2] = (int)c;
36253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c >>>= 32;
36353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c += x_0 * y_3;
36453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz[3] = (int)c;
36553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c >>>= 32;
36653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c += x_0 * y_4;
36753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz[4] = (int)c;
36853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c >>>= 32;
36953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c += x_0 * y_5;
37053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz[5] = (int)c;
37153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c >>>= 32;
37253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c += x_0 * y_6;
37353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz[6] = (int)c;
37453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c >>>= 32;
37553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz[7] = (int)c;
37653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        }
37753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro
37853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        for (int i = 1; i < 7; ++i)
37953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        {
38053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            long c = 0, x_i = x[i] & M;
38153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c += x_i * y_0 + (zz[i + 0] & M);
38253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz[i + 0] = (int)c;
38353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c >>>= 32;
38453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c += x_i * y_1 + (zz[i + 1] & M);
38553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz[i + 1] = (int)c;
38653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c >>>= 32;
38753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c += x_i * y_2 + (zz[i + 2] & M);
38853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz[i + 2] = (int)c;
38953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c >>>= 32;
39053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c += x_i * y_3 + (zz[i + 3] & M);
39153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz[i + 3] = (int)c;
39253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c >>>= 32;
39353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c += x_i * y_4 + (zz[i + 4] & M);
39453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz[i + 4] = (int)c;
39553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c >>>= 32;
39653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c += x_i * y_5 + (zz[i + 5] & M);
39753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz[i + 5] = (int)c;
39853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c >>>= 32;
39953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c += x_i * y_6 + (zz[i + 6] & M);
40053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz[i + 6] = (int)c;
40153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c >>>= 32;
40253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz[i + 7] = (int)c;
40353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        }
40453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    }
40553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro
40653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    public static void mul(int[] x, int xOff, int[] y, int yOff, int[] zz, int zzOff)
40753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    {
40853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long y_0 = y[yOff + 0] & M;
40953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long y_1 = y[yOff + 1] & M;
41053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long y_2 = y[yOff + 2] & M;
41153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long y_3 = y[yOff + 3] & M;
41253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long y_4 = y[yOff + 4] & M;
41353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long y_5 = y[yOff + 5] & M;
41453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long y_6 = y[yOff + 6] & M;
41553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro
41653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        {
41753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            long c = 0, x_0 = x[xOff + 0] & M;
41853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c += x_0 * y_0;
41953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz[zzOff + 0] = (int)c;
42053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c >>>= 32;
42153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c += x_0 * y_1;
42253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz[zzOff + 1] = (int)c;
42353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c >>>= 32;
42453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c += x_0 * y_2;
42553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz[zzOff + 2] = (int)c;
42653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c >>>= 32;
42753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c += x_0 * y_3;
42853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz[zzOff + 3] = (int)c;
42953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c >>>= 32;
43053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c += x_0 * y_4;
43153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz[zzOff + 4] = (int)c;
43253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c >>>= 32;
43353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c += x_0 * y_5;
43453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz[zzOff + 5] = (int)c;
43553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c >>>= 32;
43653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c += x_0 * y_6;
43753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz[zzOff + 6] = (int)c;
43853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c >>>= 32;
43953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz[zzOff + 7] = (int)c;
44053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        }
44153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro
44253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        for (int i = 1; i < 7; ++i)
44353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        {
44453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            ++zzOff;
44553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            long c = 0, x_i = x[xOff + i] & M;
44653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c += x_i * y_0 + (zz[zzOff + 0] & M);
44753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz[zzOff + 0] = (int)c;
44853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c >>>= 32;
44953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c += x_i * y_1 + (zz[zzOff + 1] & M);
45053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz[zzOff + 1] = (int)c;
45153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c >>>= 32;
45253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c += x_i * y_2 + (zz[zzOff + 2] & M);
45353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz[zzOff + 2] = (int)c;
45453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c >>>= 32;
45553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c += x_i * y_3 + (zz[zzOff + 3] & M);
45653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz[zzOff + 3] = (int)c;
45753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c >>>= 32;
45853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c += x_i * y_4 + (zz[zzOff + 4] & M);
45953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz[zzOff + 4] = (int)c;
46053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c >>>= 32;
46153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c += x_i * y_5 + (zz[zzOff + 5] & M);
46253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz[zzOff + 5] = (int)c;
46353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c >>>= 32;
46453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c += x_i * y_6 + (zz[zzOff + 6] & M);
46553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz[zzOff + 6] = (int)c;
46653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c >>>= 32;
46753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz[zzOff + 7] = (int)c;
46853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        }
46953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    }
47053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro
47153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    public static int mulAddTo(int[] x, int[] y, int[] zz)
47253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    {
47353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long y_0 = y[0] & M;
47453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long y_1 = y[1] & M;
47553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long y_2 = y[2] & M;
47653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long y_3 = y[3] & M;
47753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long y_4 = y[4] & M;
47853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long y_5 = y[5] & M;
47953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long y_6 = y[6] & M;
48053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro
48153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long zc = 0;
48253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        for (int i = 0; i < 7; ++i)
48353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        {
48453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            long c = 0, x_i = x[i] & M;
48553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c += x_i * y_0 + (zz[i + 0] & M);
48653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz[i + 0] = (int)c;
48753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c >>>= 32;
48853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c += x_i * y_1 + (zz[i + 1] & M);
48953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz[i + 1] = (int)c;
49053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c >>>= 32;
49153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c += x_i * y_2 + (zz[i + 2] & M);
49253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz[i + 2] = (int)c;
49353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c >>>= 32;
49453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c += x_i * y_3 + (zz[i + 3] & M);
49553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz[i + 3] = (int)c;
49653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c >>>= 32;
49753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c += x_i * y_4 + (zz[i + 4] & M);
49853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz[i + 4] = (int)c;
49953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c >>>= 32;
50053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c += x_i * y_5 + (zz[i + 5] & M);
50153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz[i + 5] = (int)c;
50253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c >>>= 32;
50353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c += x_i * y_6 + (zz[i + 6] & M);
50453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz[i + 6] = (int)c;
50553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c >>>= 32;
50653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c += zc + (zz[i + 7] & M);
50753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz[i + 7] = (int)c;
50853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zc = c >>> 32;
50953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        }
51053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        return (int)zc;
51153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    }
51253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro
51353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    public static int mulAddTo(int[] x, int xOff, int[] y, int yOff, int[] zz, int zzOff)
51453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    {
51553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long y_0 = y[yOff + 0] & M;
51653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long y_1 = y[yOff + 1] & M;
51753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long y_2 = y[yOff + 2] & M;
51853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long y_3 = y[yOff + 3] & M;
51953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long y_4 = y[yOff + 4] & M;
52053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long y_5 = y[yOff + 5] & M;
52153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long y_6 = y[yOff + 6] & M;
52253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro
52353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long zc = 0;
52453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        for (int i = 0; i < 7; ++i)
52553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        {
52653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            long c = 0, x_i = x[xOff + i] & M;
52753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c += x_i * y_0 + (zz[zzOff + 0] & M);
52853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz[zzOff + 0] = (int)c;
52953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c >>>= 32;
53053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c += x_i * y_1 + (zz[zzOff + 1] & M);
53153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz[zzOff + 1] = (int)c;
53253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c >>>= 32;
53353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c += x_i * y_2 + (zz[zzOff + 2] & M);
53453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz[zzOff + 2] = (int)c;
53553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c >>>= 32;
53653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c += x_i * y_3 + (zz[zzOff + 3] & M);
53753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz[zzOff + 3] = (int)c;
53853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c >>>= 32;
53953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c += x_i * y_4 + (zz[zzOff + 4] & M);
54053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz[zzOff + 4] = (int)c;
54153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c >>>= 32;
54253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c += x_i * y_5 + (zz[zzOff + 5] & M);
54353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz[zzOff + 5] = (int)c;
54453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c >>>= 32;
54553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c += x_i * y_6 + (zz[zzOff + 6] & M);
54653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz[zzOff + 6] = (int)c;
54753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c >>>= 32;
54853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c += zc + (zz[zzOff + 7] & M);
54953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz[zzOff + 7] = (int)c;
55053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zc = c >>> 32;
55153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            ++zzOff;
55253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        }
55353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        return (int)zc;
55453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    }
55553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro
55653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    public static long mul33Add(int w, int[] x, int xOff, int[] y, int yOff, int[] z, int zOff)
55753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    {
55853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        // assert w >>> 31 == 0;
55953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro
56053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long c = 0, wVal = w & M;
56153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long x0 = x[xOff + 0] & M;
56253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += wVal * x0 + (y[yOff + 0] & M);
56353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[zOff + 0] = (int)c;
56453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
56553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long x1 = x[xOff + 1] & M;
56653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += wVal * x1 + x0 + (y[yOff + 1] & M);
56753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[zOff + 1] = (int)c;
56853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
56953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long x2 = x[xOff + 2] & M;
57053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += wVal * x2 + x1 + (y[yOff + 2] & M);
57153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[zOff + 2] = (int)c;
57253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
57353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long x3 = x[xOff + 3] & M;
57453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += wVal * x3 + x2 + (y[yOff + 3] & M);
57553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[zOff + 3] = (int)c;
57653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
57753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long x4 = x[xOff + 4] & M;
57853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += wVal * x4 + x3 + (y[yOff + 4] & M);
57953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[zOff + 4] = (int)c;
58053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
58153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long x5 = x[xOff + 5] & M;
58253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += wVal * x5 + x4 + (y[yOff + 5] & M);
58353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[zOff + 5] = (int)c;
58453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
58553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long x6 = x[xOff + 6] & M;
58653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += wVal * x6 + x5 + (y[yOff + 6] & M);
58753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[zOff + 6] = (int)c;
58853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
58953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += x6;
59053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        return c;
59153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    }
59253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro
59353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    public static int mulByWord(int x, int[] z)
59453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    {
59553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long c = 0, xVal = x & M;
59653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += xVal * (z[0] & M);
59753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[0] = (int)c;
59853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
59953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += xVal * (z[1] & M);
60053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[1] = (int)c;
60153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
60253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += xVal * (z[2] & M);
60353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[2] = (int)c;
60453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
60553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += xVal * (z[3] & M);
60653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[3] = (int)c;
60753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
60853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += xVal * (z[4] & M);
60953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[4] = (int)c;
61053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
61153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += xVal * (z[5] & M);
61253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[5] = (int)c;
61353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
61453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += xVal * (z[6] & M);
61553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[6] = (int)c;
61653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
61753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        return (int)c;
61853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    }
61953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro
62053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    public static int mulByWordAddTo(int x, int[] y, int[] z)
62153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    {
62253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long c = 0, xVal = x & M;
62353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += xVal * (z[0] & M) + (y[0] & M);
62453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[0] = (int)c;
62553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
62653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += xVal * (z[1] & M) + (y[1] & M);
62753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[1] = (int)c;
62853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
62953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += xVal * (z[2] & M) + (y[2] & M);
63053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[2] = (int)c;
63153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
63253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += xVal * (z[3] & M) + (y[3] & M);
63353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[3] = (int)c;
63453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
63553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += xVal * (z[4] & M) + (y[4] & M);
63653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[4] = (int)c;
63753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
63853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += xVal * (z[5] & M) + (y[5] & M);
63953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[5] = (int)c;
64053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
64153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += xVal * (z[6] & M) + (y[6] & M);
64253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[6] = (int)c;
64353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
64453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        return (int)c;
64553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    }
64653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro
64753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    public static int mulWordAddTo(int x, int[] y, int yOff, int[] z, int zOff)
64853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    {
64953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long c = 0, xVal = x & M;
65053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += xVal * (y[yOff + 0] & M) + (z[zOff + 0] & M);
65153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[zOff + 0] = (int)c;
65253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
65353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += xVal * (y[yOff + 1] & M) + (z[zOff + 1] & M);
65453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[zOff + 1] = (int)c;
65553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
65653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += xVal * (y[yOff + 2] & M) + (z[zOff + 2] & M);
65753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[zOff + 2] = (int)c;
65853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
65953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += xVal * (y[yOff + 3] & M) + (z[zOff + 3] & M);
66053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[zOff + 3] = (int)c;
66153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
66253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += xVal * (y[yOff + 4] & M) + (z[zOff + 4] & M);
66353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[zOff + 4] = (int)c;
66453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
66553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += xVal * (y[yOff + 5] & M) + (z[zOff + 5] & M);
66653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[zOff + 5] = (int)c;
66753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
66853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += xVal * (y[yOff + 6] & M) + (z[zOff + 6] & M);
66953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[zOff + 6] = (int)c;
67053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
67153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        return (int)c;
67253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    }
67353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro
67453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    public static int mul33DWordAdd(int x, long y, int[] z, int zOff)
67553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    {
67653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        // assert x >>> 31 == 0;
67753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        // assert zOff <= 3;
67853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro
67953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long c = 0, xVal = x & M;
68053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long y00 = y & M;
68153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += xVal * y00 + (z[zOff + 0] & M);
68253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[zOff + 0] = (int)c;
68353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
68453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long y01 = y >>> 32;
68553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += xVal * y01 + y00 + (z[zOff + 1] & M);
68653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[zOff + 1] = (int)c;
68753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
68853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += y01 + (z[zOff + 2] & M);
68953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[zOff + 2] = (int)c;
69053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
69153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (z[zOff + 3] & M);
69253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[zOff + 3] = (int)c;
69353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
69453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        return c == 0 ? 0 : Nat.incAt(7, z, zOff, 4);
69553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    }
69653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro
69753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    public static int mul33WordAdd(int x, int y, int[] z, int zOff)
69853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    {
69953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        // assert x >>> 31 == 0;
70053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        // assert zOff <= 4;
70153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro
70253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long c = 0, xVal = x & M, yVal = y & M;
70353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += yVal * xVal + (z[zOff + 0] & M);
70453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[zOff + 0] = (int)c;
70553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
70653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += yVal + (z[zOff + 1] & M);
70753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[zOff + 1] = (int)c;
70853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
70953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (z[zOff + 2] & M);
71053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[zOff + 2] = (int)c;
71153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
71253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        return c == 0 ? 0 : Nat.incAt(7, z, zOff, 3);
71353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    }
71453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro
71553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    public static int mulWordDwordAdd(int x, long y, int[] z, int zOff)
71653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    {
71753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        // assert zOff <= 4;
71853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long c = 0, xVal = x & M;
71953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += xVal * (y & M) + (z[zOff + 0] & M);
72053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[zOff + 0] = (int)c;
72153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
72253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += xVal * (y >>> 32) + (z[zOff + 1] & M);
72353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[zOff + 1] = (int)c;
72453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
72553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (z[zOff + 2] & M);
72653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[zOff + 2] = (int)c;
72753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>>= 32;
72853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        return c == 0 ? 0 : Nat.incAt(7, z, zOff, 3);
72953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    }
73053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro
73153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    public static int mulWord(int x, int[] y, int[] z, int zOff)
73253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    {
73353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long c = 0, xVal = x & M;
73453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        int i = 0;
73553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        do
73653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        {
73753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c += xVal * (y[i] & M);
73853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            z[zOff + i] = (int)c;
73953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c >>>= 32;
74053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        }
74153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        while (++i < 7);
74253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        return (int)c;
74353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    }
74453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro
74553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    public static void square(int[] x, int[] zz)
74653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    {
74753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long x_0 = x[0] & M;
74853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long zz_1;
74953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro
75053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        int c = 0, w;
75153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        {
75253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            int i = 6, j = 14;
75353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            do
75453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            {
75553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro                long xVal = (x[i--] & M);
75653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro                long p = xVal * xVal;
75753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro                zz[--j] = (c << 31) | (int)(p >>> 33);
75853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro                zz[--j] = (int)(p >>> 1);
75953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro                c = (int)p;
76053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            }
76153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            while (i > 0);
76253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro
76353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            {
76453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro                long p = x_0 * x_0;
76553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro                zz_1 = ((c << 31) & M) | (p >>> 33);
76653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro                zz[0] = (int)p;
76753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro                c = (int)(p >>> 32) & 1;
76853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            }
76953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        }
77053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro
77153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long x_1 = x[1] & M;
77253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long zz_2 = zz[2] & M;
77353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro
77453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        {
77553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_1 += x_1 * x_0;
77653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            w = (int)zz_1;
77753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz[1] = (w << 1) | c;
77853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c = w >>> 31;
77953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_2 += zz_1 >>> 32;
78053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        }
78153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro
78253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long x_2 = x[2] & M;
78353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long zz_3 = zz[3] & M;
78453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long zz_4 = zz[4] & M;
78553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        {
78653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_2 += x_2 * x_0;
78753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            w = (int)zz_2;
78853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz[2] = (w << 1) | c;
78953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c = w >>> 31;
79053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_3 += (zz_2 >>> 32) + x_2 * x_1;
79153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_4 += zz_3 >>> 32;
79253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_3 &= M;
79353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        }
79453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro
79553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long x_3 = x[3] & M;
7964caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro        long zz_5 = (zz[5] & M) + (zz_4 >>> 32); zz_4 &= M;
7974caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro        long zz_6 = (zz[6] & M) + (zz_5 >>> 32); zz_5 &= M;
79853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        {
79953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_3 += x_3 * x_0;
80053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            w = (int)zz_3;
80153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz[3] = (w << 1) | c;
80253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c = w >>> 31;
80353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_4 += (zz_3 >>> 32) + x_3 * x_1;
80453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_5 += (zz_4 >>> 32) + x_3 * x_2;
80553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_4 &= M;
80653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_6 += zz_5 >>> 32;
80753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_5 &= M;
80853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        }
80953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro
81053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long x_4 = x[4] & M;
8114caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro        long zz_7 = (zz[7] & M) + (zz_6 >>> 32); zz_6 &= M;
8124caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro        long zz_8 = (zz[8] & M) + (zz_7 >>> 32); zz_7 &= M;
81353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        {
81453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_4 += x_4 * x_0;
81553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            w = (int)zz_4;
81653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz[4] = (w << 1) | c;
81753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c = w >>> 31;
81853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_5 += (zz_4 >>> 32) + x_4 * x_1;
81953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_6 += (zz_5 >>> 32) + x_4 * x_2;
82053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_5 &= M;
82153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_7 += (zz_6 >>> 32) + x_4 * x_3;
82253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_6 &= M;
82353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_8 += zz_7 >>> 32;
82453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_7 &= M;
82553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        }
82653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro
82753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long x_5 = x[5] & M;
8284caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro        long zz_9 = (zz[9] & M) + (zz_8 >>> 32); zz_8 &= M;
8294caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro        long zz_10 = (zz[10] & M) + (zz_9 >>> 32); zz_9 &= M;
83053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        {
83153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_5 += x_5 * x_0;
83253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            w = (int)zz_5;
83353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz[5] = (w << 1) | c;
83453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c = w >>> 31;
83553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_6 += (zz_5 >>> 32) + x_5 * x_1;
83653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_7 += (zz_6 >>> 32) + x_5 * x_2;
83753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_6 &= M;
83853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_8 += (zz_7 >>> 32) + x_5 * x_3;
83953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_7 &= M;
84053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_9 += (zz_8 >>> 32) + x_5 * x_4;
84153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_8 &= M;
84253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_10 += zz_9 >>> 32;
84353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_9 &= M;
84453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        }
84553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro
84653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long x_6 = x[6] & M;
8474caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro        long zz_11 = (zz[11] & M) + (zz_10 >>> 32); zz_10 &= M;
8484caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro        long zz_12 = (zz[12] & M) + (zz_11 >>> 32); zz_11 &= M;
84953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        {
85053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_6 += x_6 * x_0;
85153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            w = (int)zz_6;
85253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz[6] = (w << 1) | c;
85353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c = w >>> 31;
85453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_7 += (zz_6 >>> 32) + x_6 * x_1;
85553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_8 += (zz_7 >>> 32) + x_6 * x_2;
85653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_9 += (zz_8 >>> 32) + x_6 * x_3;
85753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_10 += (zz_9 >>> 32) + x_6 * x_4;
85853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_11 += (zz_10 >>> 32) + x_6 * x_5;
85953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_12 += zz_11 >>> 32;
86053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        }
86153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro
86253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        w = (int)zz_7;
86353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        zz[7] = (w << 1) | c;
86453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c = w >>> 31;
86553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        w = (int)zz_8;
86653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        zz[8] = (w << 1) | c;
86753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c = w >>> 31;
86853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        w = (int)zz_9;
86953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        zz[9] = (w << 1) | c;
87053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c = w >>> 31;
87153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        w = (int)zz_10;
87253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        zz[10] = (w << 1) | c;
87353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c = w >>> 31;
87453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        w = (int)zz_11;
87553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        zz[11] = (w << 1) | c;
87653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c = w >>> 31;
87753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        w = (int)zz_12;
87853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        zz[12] = (w << 1) | c;
87953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c = w >>> 31;
8804caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro        w = zz[13] + (int)(zz_12 >>> 32);
88153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        zz[13] = (w << 1) | c;
88253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    }
88353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro
88453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    public static void square(int[] x, int xOff, int[] zz, int zzOff)
88553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    {
88653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long x_0 = x[xOff + 0] & M;
88753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long zz_1;
88853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro
88953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        int c = 0, w;
89053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        {
89153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            int i = 6, j = 14;
89253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            do
89353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            {
89453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro                long xVal = (x[xOff + i--] & M);
89553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro                long p = xVal * xVal;
89653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro                zz[zzOff + --j] = (c << 31) | (int)(p >>> 33);
89753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro                zz[zzOff + --j] = (int)(p >>> 1);
89853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro                c = (int)p;
89953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            }
90053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            while (i > 0);
90153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro
90253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            {
90353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro                long p = x_0 * x_0;
90453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro                zz_1 = ((c << 31) & M) | (p >>> 33);
90553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro                zz[zzOff + 0] = (int)p;
90653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro                c = (int)(p >>> 32) & 1;
90753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            }
90853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        }
90953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro
91053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long x_1 = x[xOff + 1] & M;
91153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long zz_2 = zz[zzOff + 2] & M;
91253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro
91353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        {
91453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_1 += x_1 * x_0;
91553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            w = (int)zz_1;
91653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz[zzOff + 1] = (w << 1) | c;
91753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c = w >>> 31;
91853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_2 += zz_1 >>> 32;
91953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        }
92053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro
92153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long x_2 = x[xOff + 2] & M;
92253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long zz_3 = zz[zzOff + 3] & M;
92353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long zz_4 = zz[zzOff + 4] & M;
92453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        {
92553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_2 += x_2 * x_0;
92653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            w = (int)zz_2;
92753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz[zzOff + 2] = (w << 1) | c;
92853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c = w >>> 31;
92953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_3 += (zz_2 >>> 32) + x_2 * x_1;
93053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_4 += zz_3 >>> 32;
93153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_3 &= M;
93253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        }
93353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro
93453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long x_3 = x[xOff + 3] & M;
9354caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro        long zz_5 = (zz[zzOff + 5] & M) + (zz_4 >>> 32); zz_4 &= M;
9364caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro        long zz_6 = (zz[zzOff + 6] & M) + (zz_5 >>> 32); zz_5 &= M;
93753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        {
93853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_3 += x_3 * x_0;
93953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            w = (int)zz_3;
94053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz[zzOff + 3] = (w << 1) | c;
94153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c = w >>> 31;
94253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_4 += (zz_3 >>> 32) + x_3 * x_1;
94353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_5 += (zz_4 >>> 32) + x_3 * x_2;
94453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_4 &= M;
94553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_6 += zz_5 >>> 32;
94653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_5 &= M;
94753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        }
94853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro
94953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long x_4 = x[xOff + 4] & M;
9504caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro        long zz_7 = (zz[zzOff + 7] & M) + (zz_6 >>> 32); zz_6 &= M;
9514caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro        long zz_8 = (zz[zzOff + 8] & M) + (zz_7 >>> 32); zz_7 &= M;
95253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        {
95353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_4 += x_4 * x_0;
95453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            w = (int)zz_4;
95553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz[zzOff + 4] = (w << 1) | c;
95653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c = w >>> 31;
95753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_5 += (zz_4 >>> 32) + x_4 * x_1;
95853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_6 += (zz_5 >>> 32) + x_4 * x_2;
95953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_5 &= M;
96053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_7 += (zz_6 >>> 32) + x_4 * x_3;
96153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_6 &= M;
96253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_8 += zz_7 >>> 32;
96353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_7 &= M;
96453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        }
96553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro
96653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long x_5 = x[xOff + 5] & M;
9674caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro        long zz_9 = (zz[zzOff + 9] & M) + (zz_8 >>> 32); zz_8 &= M;
9684caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro        long zz_10 = (zz[zzOff + 10] & M) + (zz_9 >>> 32); zz_9 &= M;
96953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        {
97053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_5 += x_5 * x_0;
97153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            w = (int)zz_5;
97253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz[zzOff + 5] = (w << 1) | c;
97353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c = w >>> 31;
97453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_6 += (zz_5 >>> 32) + x_5 * x_1;
97553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_7 += (zz_6 >>> 32) + x_5 * x_2;
97653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_6 &= M;
97753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_8 += (zz_7 >>> 32) + x_5 * x_3;
97853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_7 &= M;
97953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_9 += (zz_8 >>> 32) + x_5 * x_4;
98053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_8 &= M;
98153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_10 += zz_9 >>> 32;
98253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_9 &= M;
98353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        }
98453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro
98553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long x_6 = x[xOff + 6] & M;
9864caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro        long zz_11 = (zz[zzOff + 11] & M) + (zz_10 >>> 32); zz_10 &= M;
9874caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro        long zz_12 = (zz[zzOff + 12] & M) + (zz_11 >>> 32); zz_11 &= M;
98853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        {
98953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_6 += x_6 * x_0;
99053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            w = (int)zz_6;
99153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz[zzOff + 6] = (w << 1) | c;
99253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            c = w >>> 31;
99353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_7 += (zz_6 >>> 32) + x_6 * x_1;
99453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_8 += (zz_7 >>> 32) + x_6 * x_2;
99553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_9 += (zz_8 >>> 32) + x_6 * x_3;
99653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_10 += (zz_9 >>> 32) + x_6 * x_4;
99753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_11 += (zz_10 >>> 32) + x_6 * x_5;
99853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            zz_12 += zz_11 >>> 32;
99953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        }
100053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro
100153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        w = (int)zz_7;
100253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        zz[zzOff + 7] = (w << 1) | c;
100353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c = w >>> 31;
100453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        w = (int)zz_8;
100553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        zz[zzOff + 8] = (w << 1) | c;
100653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c = w >>> 31;
100753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        w = (int)zz_9;
100853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        zz[zzOff + 9] = (w << 1) | c;
100953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c = w >>> 31;
101053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        w = (int)zz_10;
101153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        zz[zzOff + 10] = (w << 1) | c;
101253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c = w >>> 31;
101353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        w = (int)zz_11;
101453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        zz[zzOff + 11] = (w << 1) | c;
101553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c = w >>> 31;
101653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        w = (int)zz_12;
101753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        zz[zzOff + 12] = (w << 1) | c;
101853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c = w >>> 31;
10194caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro        w = zz[zzOff + 13] + (int)(zz_12 >>> 32);
102053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        zz[zzOff + 13] = (w << 1) | c;
102153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    }
102253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro
102353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    public static int sub(int[] x, int[] y, int[] z)
102453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    {
102553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long c = 0;
102653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (x[0] & M) - (y[0] & M);
102753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[0] = (int)c;
102853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>= 32;
102953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (x[1] & M) - (y[1] & M);
103053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[1] = (int)c;
103153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>= 32;
103253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (x[2] & M) - (y[2] & M);
103353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[2] = (int)c;
103453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>= 32;
103553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (x[3] & M) - (y[3] & M);
103653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[3] = (int)c;
103753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>= 32;
103853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (x[4] & M) - (y[4] & M);
103953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[4] = (int)c;
104053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>= 32;
104153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (x[5] & M) - (y[5] & M);
104253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[5] = (int)c;
104353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>= 32;
104453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (x[6] & M) - (y[6] & M);
104553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[6] = (int)c;
104653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>= 32;
104753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        return (int)c;
104853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    }
104953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro
105053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    public static int sub(int[] x, int xOff, int[] y, int yOff, int[] z, int zOff)
105153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    {
105253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long c = 0;
105353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (x[xOff + 0] & M) - (y[yOff + 0] & M);
105453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[zOff + 0] = (int)c;
105553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>= 32;
105653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (x[xOff + 1] & M) - (y[yOff + 1] & M);
105753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[zOff + 1] = (int)c;
105853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>= 32;
105953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (x[xOff + 2] & M) - (y[yOff + 2] & M);
106053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[zOff + 2] = (int)c;
106153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>= 32;
106253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (x[xOff + 3] & M) - (y[yOff + 3] & M);
106353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[zOff + 3] = (int)c;
106453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>= 32;
106553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (x[xOff + 4] & M) - (y[yOff + 4] & M);
106653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[zOff + 4] = (int)c;
106753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>= 32;
106853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (x[xOff + 5] & M) - (y[yOff + 5] & M);
106953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[zOff + 5] = (int)c;
107053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>= 32;
107153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (x[xOff + 6] & M) - (y[yOff + 6] & M);
107253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[zOff + 6] = (int)c;
107353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>= 32;
107453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        return (int)c;
107553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    }
107653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro
107753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    public static int subBothFrom(int[] x, int[] y, int[] z)
107853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    {
107953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long c = 0;
108053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (z[0] & M) - (x[0] & M) - (y[0] & M);
108153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[0] = (int)c;
108253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>= 32;
108353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (z[1] & M) - (x[1] & M) - (y[1] & M);
108453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[1] = (int)c;
108553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>= 32;
108653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (z[2] & M) - (x[2] & M) - (y[2] & M);
108753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[2] = (int)c;
108853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>= 32;
108953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (z[3] & M) - (x[3] & M) - (y[3] & M);
109053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[3] = (int)c;
109153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>= 32;
109253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (z[4] & M) - (x[4] & M) - (y[4] & M);
109353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[4] = (int)c;
109453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>= 32;
109553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (z[5] & M) - (x[5] & M) - (y[5] & M);
109653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[5] = (int)c;
109753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>= 32;
109853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (z[6] & M) - (x[6] & M) - (y[6] & M);
109953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[6] = (int)c;
110053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>= 32;
110153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        return (int)c;
110253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    }
110353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro
110453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    public static int subFrom(int[] x, int[] z)
110553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    {
110653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long c = 0;
110753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (z[0] & M) - (x[0] & M);
110853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[0] = (int)c;
110953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>= 32;
111053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (z[1] & M) - (x[1] & M);
111153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[1] = (int)c;
111253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>= 32;
111353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (z[2] & M) - (x[2] & M);
111453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[2] = (int)c;
111553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>= 32;
111653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (z[3] & M) - (x[3] & M);
111753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[3] = (int)c;
111853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>= 32;
111953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (z[4] & M) - (x[4] & M);
112053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[4] = (int)c;
112153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>= 32;
112253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (z[5] & M) - (x[5] & M);
112353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[5] = (int)c;
112453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>= 32;
112553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (z[6] & M) - (x[6] & M);
112653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[6] = (int)c;
112753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>= 32;
112853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        return (int)c;
112953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    }
113053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro
113153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    public static int subFrom(int[] x, int xOff, int[] z, int zOff)
113253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    {
113353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        long c = 0;
113453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (z[zOff + 0] & M) - (x[xOff + 0] & M);
113553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[zOff + 0] = (int)c;
113653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>= 32;
113753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (z[zOff + 1] & M) - (x[xOff + 1] & M);
113853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[zOff + 1] = (int)c;
113953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>= 32;
114053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (z[zOff + 2] & M) - (x[xOff + 2] & M);
114153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[zOff + 2] = (int)c;
114253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>= 32;
114353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (z[zOff + 3] & M) - (x[xOff + 3] & M);
114453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[zOff + 3] = (int)c;
114553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>= 32;
114653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (z[zOff + 4] & M) - (x[xOff + 4] & M);
114753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[zOff + 4] = (int)c;
114853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>= 32;
114953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (z[zOff + 5] & M) - (x[xOff + 5] & M);
115053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[zOff + 5] = (int)c;
115153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>= 32;
115253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c += (z[zOff + 6] & M) - (x[xOff + 6] & M);
115353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[zOff + 6] = (int)c;
115453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        c >>= 32;
115553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        return (int)c;
115653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    }
115753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro
115853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    public static BigInteger toBigInteger(int[] x)
115953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    {
116053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        byte[] bs = new byte[28];
116153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        for (int i = 0; i < 7; ++i)
116253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        {
116353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            int x_i = x[i];
116453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            if (x_i != 0)
116553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            {
116653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro                Pack.intToBigEndian(x_i, bs, (6 - i) << 2);
116753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            }
116853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        }
116953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        return new BigInteger(1, bs);
117053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    }
117153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro
117253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    public static void zero(int[] z)
117353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    {
117453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[0] = 0;
117553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[1] = 0;
117653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[2] = 0;
117753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[3] = 0;
117853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[4] = 0;
117953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[5] = 0;
118053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        z[6] = 0;
118153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro    }
118253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro}
1183