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