public int resolve(boolean enhancedVerbosity) {
        if (upper.equals(BigInteger.ZERO))
            return 0;
        if (upper.equals(BigInteger.ONE))
            return 1;

        int rightMostBit = upper.getLowestSetBit();
        BigInteger oddDivisor = upper.shiftRight(rightMostBit);

        int first = resolveTwoOverLower(rightMostBit);

        int third = resolveSign(oddDivisor);

        if (oddDivisor.equals(BigInteger.ONE)) {
            if (this.logger != null && enhancedVerbosity) {
                this.logger.log(String.format("%s over %s = %d", upper.toString(), lower.toString(), first * third));
            }
            return first * third;
        }

        int second = new JacobiSymbol(lower.mod(oddDivisor), oddDivisor, logger).resolve(enhancedVerbosity);

        if (this.logger != null && enhancedVerbosity) {
            this.logger.log(String.format("%s over %s = %d", upper.toString(), lower.toString(), first * second * third));
        }
        return first * second * third;
    }