Beispiel #1
0
        /*
         *  Performs a<sup>2</sup>
         *  @param a The number to square.
         *  @param aLen The length of the number to square.
         */
        internal static int[] square(int[] a, int aLen, int[] res)
        {
            long carry;

            for (int i = 0; i < aLen; i++)
            {
                carry = 0;
                for (int j = i + 1; j < aLen; j++)
                {
                    carry      = unsignedMultAddAdd(a[i], a[j], res[i + j], (int)carry);
                    res[i + j] = (int)carry;
                    carry      = java.dotnet.lang.Operator.shiftRightUnsignet(carry, 32);
                }
                res[i + aLen] = (int)carry;
            }

            BitLevel.shiftLeftOneBit(res, res, aLen << 1);

            carry = 0;
            for (int i = 0, index = 0; i < aLen; i++, index++)
            {
                carry      = unsignedMultAddAdd(a[i], a[i], res[index], (int)carry);
                res[index] = (int)carry;
                carry      = java.dotnet.lang.Operator.shiftRightUnsignet(carry, 32);
                index++;
                carry     += res[index] & 0xFFFFFFFFL;
                res[index] = (int)carry;
                carry      = java.dotnet.lang.Operator.shiftRightUnsignet(carry, 32);
            }
            return(res);
        }