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