All Downloads are FREE. Search and download functionalities are using the official Maven repository.

jscl.math.function.Conjugate Maven / Gradle / Ivy

There is a newer version: 1.0.11
Show newest version
package jscl.math.function;

import jscl.math.*;
import jscl.mathml.MathML;

import javax.annotation.Nonnull;

import static jscl.math.function.Constants.Generic.I;

public class Conjugate extends Function {
	public Conjugate(Generic generic) {
		super("conjugate", new Generic[]{generic});
	}

	public Generic antiDerivative(int n) throws NotIntegrableException {
		return Constants.Generic.HALF.multiply(selfExpand().pow(2));
	}

	public Generic derivative(int n) {
		return JsclInteger.valueOf(1);
	}

	public Generic selfExpand() {
		try {
			return parameters[0].integerValue();
		} catch (NotIntegerException e) {
		}
		if (parameters[0] instanceof Matrix) {
			return ((Matrix) parameters[0]).conjugate();
		} else if (parameters[0] instanceof JsclVector) {
			return ((JsclVector) parameters[0]).conjugate();
		}
		return expressionValue();
	}

	public Generic selfElementary() {
		try {
			return parameters[0].integerValue();
		} catch (NotIntegerException e) {
		}
		return expressionValue();
	}

	public Generic selfSimplify() {
		try {
			return parameters[0].integerValue();
		} catch (NotIntegerException e) {
		}

		if (parameters[0].signum() < 0) {
			return new Conjugate(parameters[0].negate()).selfSimplify().negate();
		} else if (parameters[0].compareTo(I) == 0) {
			return I.negate();
		}

		try {
			Variable v = parameters[0].variableValue();
			if (v instanceof Conjugate) {
				Generic g[] = ((Conjugate) v).getParameters();
				return g[0];
			} else if (v instanceof Exp) {
				Generic g[] = ((Exp) v).getParameters();
				return new Exp(new Conjugate(g[0]).selfSimplify()).selfSimplify();
			} else if (v instanceof Ln) {
				Generic g[] = ((Ln) v).getParameters();
				return new Ln(new Conjugate(g[0]).selfSimplify()).selfSimplify();
			} else if (v instanceof Lg) {
				Generic g[] = ((Lg) v).getParameters();
				return new Lg(new Conjugate(g[0]).selfSimplify()).selfSimplify();
			}
		} catch (NotVariableException e) {
			Generic a[] = parameters[0].sumValue();
			if (a.length > 1) {
				Generic s = JsclInteger.valueOf(0);
				for (int i = 0; i < a.length; i++) {
					s = s.add(new Conjugate(a[i]).selfSimplify());
				}
				return s;
			} else {
				Generic p[] = a[0].productValue();
				Generic s = JsclInteger.valueOf(1);
				for (int i = 0; i < p.length; i++) {
					Power o = p[i].powerValue();
					s = s.multiply(new Conjugate(o.value()).selfSimplify().pow(o.exponent()));
				}
				return s;
			}
		}
		Generic n[] = Fraction.separateCoefficient(parameters[0]);
		if (n[0].compareTo(JsclInteger.valueOf(1)) == 0 && n[1].compareTo(JsclInteger.valueOf(1)) == 0) ;
		else return new Conjugate(n[2]).selfSimplify().multiply(
				new Fraction(n[0], n[1]).selfSimplify()
		);
		return expressionValue();
	}

	public Generic selfNumeric() {
		return ((NumericWrapper) parameters[0]).conjugate();
	}

	public String toJava() {
		StringBuffer buffer = new StringBuffer();
		buffer.append(parameters[0].toJava());
		buffer.append(".conjugate()");
		return buffer.toString();
	}

	public void toMathML(MathML element, Object data) {
		int exponent = data instanceof Integer ? ((Integer) data).intValue() : 1;
		if (exponent == 1) bodyToMathML(element);
		else {
			MathML e1 = element.element("msup");
			MathML e2 = element.element("mfenced");
			bodyToMathML(e2);
			e1.appendChild(e2);
			e2 = element.element("mn");
			e2.appendChild(element.text(String.valueOf(exponent)));
			e1.appendChild(e2);
			element.appendChild(e1);
		}
	}

	void bodyToMathML(MathML element) {
		MathML e1 = element.element("mover");
		parameters[0].toMathML(e1, null);
		MathML e2 = element.element("mo");
		e2.appendChild(element.text("_"));
		e1.appendChild(e2);
		element.appendChild(e1);
	}

	@Nonnull
	public Variable newInstance() {
		return new Conjugate(null);
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy