jscl.math.function.Ln Maven / Gradle / Ivy
package jscl.math.function;
import jscl.math.*;
import javax.annotation.Nonnull;
public class Ln extends Function {
public Ln(Generic generic) {
super("ln", new Generic[]{generic});
}
public Generic antiDerivative(int n) throws NotIntegrableException {
return parameters[0].multiply(new Ln(parameters[0]).selfExpand().subtract(JsclInteger.ONE));
}
public Generic derivative(int n) {
return new Inverse(parameters[0]).selfExpand();
}
public Generic selfExpand() {
if (parameters[0].compareTo(JsclInteger.valueOf(1)) == 0) {
return JsclInteger.valueOf(0);
}
return expressionValue();
}
public Generic selfElementary() {
return selfExpand();
}
public Generic selfSimplify() {
try {
JsclInteger en = parameters[0].integerValue();
if (en.signum() < 0) {
return Constants.Generic.I_BY_PI.add(new Ln(en.negate()).selfSimplify());
} else {
Generic a = en.factorize();
Generic p[] = a.productValue();
Generic s = JsclInteger.valueOf(0);
for (int i = 0; i < p.length; i++) {
Power o = p[i].powerValue();
s = s.add(JsclInteger.valueOf(o.exponent()).multiply(new Ln(o.value(true)).expressionValue()));
}
return s;
}
} catch (NotIntegerException e) {
}
try {
Variable v = parameters[0].variableValue();
if (v instanceof Sqrt) {
Generic g[] = ((Sqrt) v).getParameters();
return Constants.Generic.HALF.multiply(new Ln(g[0]).selfSimplify());
}
} catch (NotVariableException e) {
}
Generic n[] = Fraction.separateCoefficient(parameters[0]);
if (n[0].compareTo(JsclInteger.valueOf(1)) == 0 && n[1].compareTo(JsclInteger.valueOf(1)) == 0) ;
else return new Ln(n[2]).selfSimplify().add(
new Ln(n[0]).selfSimplify()
).subtract(
new Ln(n[1]).selfSimplify()
);
return expressionValue();
}
public Generic selfNumeric() {
return ((NumericWrapper) parameters[0]).ln();
}
@Nonnull
public Variable newInstance() {
return new Ln(null);
}
}