Mixed Radix Number
//package aima.core.util.math;
import java.util.List;
/**
* @author Ciaran O'Reilly see:
* http://demonstrations.wolfram.com/MixedRadixNumberRepresentations/
* for useful example.
*/
public class MixedRadixNumber extends Number {
//
private static final long serialVersionUID = 1L;
//
private long value = 0L;
private long maxValue = 0L;
private int[] radixs = null;
private int[] currentNumeralValue = null;
private boolean recalculate = true;
public MixedRadixNumber(long value, int[] radixs) {
this.value = value;
this.radixs = new int[radixs.length];
System.arraycopy(radixs, 0, this.radixs, 0, radixs.length);
calculateMaxValue();
}
public MixedRadixNumber(long value, List<Integer> radixs) {
this.value = value;
this.radixs = new int[radixs.size()];
for (int i = 0; i < radixs.size(); i++) {
this.radixs[i] = radixs.get(i);
}
calculateMaxValue();
}
public long getMaxAllowedValue() {
return maxValue;
}
public boolean increment() {
if (value < maxValue) {
value++;
recalculate = true;
return true;
}
return false;
}
public boolean decrement() {
if (value > 0) {
value--;
recalculate = true;
return true;
}
return false;
}
public int getCurrentNumeralValue(int atPosition) {
if (atPosition >= 0 && atPosition < radixs.length) {
if (recalculate) {
long quotient = value;
for (int i = 0; i < radixs.length; i++) {
if (0 != quotient) {
currentNumeralValue[i] = (int) quotient % radixs[i];
quotient = quotient / radixs[i];
} else {
currentNumeralValue[i] = 0;
}
}
recalculate = false;
}
return currentNumeralValue[atPosition];
}
throw new IllegalArgumentException(
"Argument atPosition must be >=0 and < " + radixs.length);
}
//
// START-Number
@Override
public int intValue() {
return (int) longValue();
}
@Override
public long longValue() {
return value;
}
@Override
public float floatValue() {
return longValue();
}
@Override
public double doubleValue() {
return longValue();
}
// END-Number
//
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < radixs.length; i++) {
sb.append("[");
sb.append(this.getCurrentNumeralValue(i));
sb.append("]");
}
return sb.toString();
}
//
// PRIVATE
//
private void calculateMaxValue() {
if (0 == radixs.length) {
throw new IllegalArgumentException(
"At least 1 radix must be defined.");
}
for (int i = 0; i < radixs.length; i++) {
if (radixs[i] < 2) {
throw new IllegalArgumentException(
"Invalid radix, must be >= 2");
}
}
// Calcualte the maxValue allowed
maxValue = radixs[0];
for (int i = 1; i < radixs.length; i++) {
maxValue *= radixs[i];
}
maxValue -= 1;
if (value > maxValue) {
throw new IllegalArgumentException(
"The value ["
+ value
+ "] cannot be represented with the radixs provided, max value is "
+ maxValue);
}
currentNumeralValue = new int[radixs.length];
}
}
Related examples in the same category