* is all done in one step. Otherwise it is broken into parts.
     * @param decimalPlaces
     * @param a_RoundingMode
     * @return x^y accurate to decimalPlaces
     */
    //private static BigDecimal power(
    public static BigDecimal power(
            BigDecimal x,
            int y,
            int div,
            int decimalPlaces,
            RoundingMode a_RoundingMode) {
        return power(
                x,
                BigInteger.valueOf(y),
                div,
                decimalPlaces,
                a_RoundingMode);
//        
//        if (div < 2) {
//            div = 2;
//        } else {
//            if (div > 256) {
//                div = 256;
//            }
//        }
//        // Deal with special cases
//        if (y == 0) {
//            return BigDecimal.ONE;
//        }
//        if (y == 1) {
//            BigDecimal result = new BigDecimal(x.toString());
//            return result;
//            //return round(new BigDecimal(x.toString()), decimalPlaces, a_RoundingMode);
//        }
//        if (y < 0) {
//            BigDecimal powerminusy = power(
//                    x,
//                    -y,
//                    div,
//                    decimalPlaces,
//                    a_RoundingMode);
//            BigDecimal result = reciprocal(
//                    powerminusy,
//                    decimalPlaces,
//                    a_RoundingMode);
//            return result;
//            //return round(result, decimalPlaces, a_RoundingMode);
//        }
//        if (x.compareTo(BigDecimal.ZERO) == -1) {
//            BigDecimal result = power(
//                    x.negate(),
//                    y,
//                    div,
//                    decimalPlaces,
//                    a_RoundingMode);
//            if (Generic_int.isEven(y)) {
//                return result.negate();
//            } else {
//                return result;
//            }
//        }
//        BigDecimal result = BigDecimal.ONE;
//        BigDecimal result0;
//        if (y < div) {
//            result0 = power(
//                    x,
//                    y,
//                    decimalPlaces,
//                    a_RoundingMode);
//        } else {
//            int party0 = y / div;
//            result0 = power(
//                    x,
//                    party0,
//                    div,
//                    decimalPlaces,
//                    a_RoundingMode);
//            result0 = power(
//                    result0,
//                    div,
//                    decimalPlaces,
//                    a_RoundingMode);
//            int party1 = y % div;
//            if (party1 != 0) {
//                BigDecimal resultRemainder = power(
//                        x,
//                        party1,
//                        div / 2,
//                        decimalPlaces,
//                        a_RoundingMode);
//                result0 = multiply(
//                        result0,
//                        resultRemainder,
//                        decimalPlaces,
//                        a_RoundingMode);
//            }
//        }
//        result = multiply(
//                result,
//                result0,
//                decimalPlaces,
//                a_RoundingMode);
//        return result;
//        //return round(result, decimalPlaces, a_RoundingMode);
    }