package org.geogebra.common.kernel.advanced;
import org.geogebra.common.kernel.Construction;
import org.geogebra.common.kernel.algos.AlgoElement;
import org.geogebra.common.kernel.commands.Commands;
import org.geogebra.common.kernel.geos.GeoBoolean;
import org.geogebra.common.kernel.geos.GeoElement;
import org.geogebra.common.kernel.geos.GeoNumberValue;
import org.geogebra.common.util.MyMath;
public class AlgoIsPrime extends AlgoElement {
private GeoBoolean result;
private GeoNumberValue number;
public AlgoIsPrime(Construction cons, String label, GeoNumberValue number) {
super(cons);
result = new GeoBoolean(cons);
this.number = number;
setInputOutput();
compute();
result.setLabel(label);
}
@Override
protected void setInputOutput() {
setOnlyOutput(result);
input = new GeoElement[] { number.toGeoElement() };
setDependencies();
}
@Override
public void compute() {
double n = Math.round(number.getDouble());
result.setDefined();
if (n == 1) {
result.setValue(false);
return;
}
if (n < 2 || n > MyMath.LARGEST_INTEGER) {
result.setUndefinedProverOnly();
return;
}
result.setValue(true);
for (int i = 2; i <= n / i; i++) {
if (n % i == 0) {
result.setValue(false);
return;
}
}
}
@Override
public Commands getClassName() {
return Commands.IsPrime;
}
public GeoBoolean getResult() {
return result;
}
}