package org.matheclipse.core.expression;
import org.apache.commons.math3.Field;
import org.apache.commons.math3.FieldElement;
import org.matheclipse.core.interfaces.IBigNumber;
import org.matheclipse.core.interfaces.IComplex;
import org.matheclipse.core.interfaces.IExpr;
import org.matheclipse.core.interfaces.IFraction;
import org.matheclipse.core.interfaces.INumber;
public class ExprFieldElement implements FieldElement, Comparable {
private final IExpr val;
public ExprFieldElement(IExpr v) {
if (v.isFraction()) {
val = ((IFraction) v).normalize();
return;
} else if (v.isComplex()) {
val = ((IComplex) v).normalize();
return;
}
val = v;
}
@Override
public ExprFieldElement add(ExprFieldElement a) {
if (val.isAtom() && a.val.isAtom()) {
return new ExprFieldElement(val.plus(a.val));
}
return new ExprFieldElement(F.evalExpandAll(F.Plus(val, a.val)));
}
@Override
public int compareTo(ExprFieldElement o) {
return val.compareTo(o.val);
}
@Override
public ExprFieldElement divide(ExprFieldElement a) throws ArithmeticException {
if (val.isAtom() && a.val.isAtom()) {
return new ExprFieldElement(val.divide(a.val));
}
return new ExprFieldElement(F.evalExpandAll(F.Divide(val, a.val)));
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj instanceof ExprFieldElement) {
IExpr arg2 = ((ExprFieldElement) obj).val;
if (val.isNumeric()) {
if (arg2 instanceof IBigNumber) {
return val.isSame(((IBigNumber) arg2).numericNumber());
}
if (arg2.isNumeric()) {
return val.isSame(arg2);
}
return false;
} else if (arg2.isNumeric()) {
if (val instanceof IBigNumber) {
return arg2.isSame(((IBigNumber) val).numericNumber());
}
return false;
}
return val.equals(((ExprFieldElement) obj).val);
}
return false;
}
final public IExpr getExpr() {
return val;
}
@Override
public Field getField() {
return ExprField.CONST;
}
@Override
public int hashCode() {
return val.hashCode();
}
@Override
public ExprFieldElement multiply(ExprFieldElement a) {
if (val.isAtom() && a.val.isAtom()) {
return new ExprFieldElement(val.times(a.val));
}
return new ExprFieldElement(F.evalExpandAll(F.Times(val, a.val)));
}
@Override
public ExprFieldElement multiply(int a) {
if (val.isAtom()) {
return new ExprFieldElement(val.times(F.integer(a)));
}
return new ExprFieldElement(F.evalExpandAll(F.Times(val, F.integer(a))));
}
@Override
public ExprFieldElement negate() {
if (val.isNumber()) {
return new ExprFieldElement(((INumber) val).opposite());
}
return new ExprFieldElement(F.evalExpandAll(F.Times(val, F.CN1)));
}
@Override
public ExprFieldElement reciprocal() {
if (val.isNumber()) {
return new ExprFieldElement(((INumber) val).inverse());
}
return new ExprFieldElement(F.evalExpandAll(val.power(-1)));
}
@Override
public ExprFieldElement subtract(ExprFieldElement a) {
if (val.isAtom() && a.val.isAtom()) {
return new ExprFieldElement(val.minus(a.val));
}
return new ExprFieldElement(F.evalExpandAll(F.Subtract(val, a.val)));
}
@Override
public String toString() {
return val.toString();
}
}
Ads help maintain this website.