in commons-numbers-core/src/main/java/org/apache/commons/numbers/core/ArithmeticUtils.java [339:378]
public static long pow(final long k,
final int e) {
if (e < 0) {
throw new IllegalArgumentException(NEGATIVE_EXPONENT_1 + e + NEGATIVE_EXPONENT_2);
}
if (k == 0L) {
return e == 0 ? 1L : 0L;
}
if (k == 1L) {
return 1L;
}
if (k == -1L) {
return (e & 1) == 0 ? 1L : -1L;
}
if (e >= 63) {
throw new ArithmeticException("long overflow");
}
int exp = e;
long result = 1;
long k2p = k;
while (true) {
if ((exp & 0x1) != 0) {
result = Math.multiplyExact(result, k2p);
}
exp >>= 1;
if (exp == 0) {
break;
}
k2p = Math.multiplyExact(k2p, k2p);
}
return result;
}