org.lsmp.djep.groupJep.groups.FreeGroup Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of jep Show documentation
Show all versions of jep Show documentation
JEP is a Java library for parsing and evaluating mathematical expressions.
The newest version!
/* @author rich
* Created on 09-Mar-2004
*/
package org.lsmp.djep.groupJep.groups;
import org.lsmp.djep.groupJep.interfaces.*;
import org.lsmp.djep.groupJep.values.*;
import org.nfunk.jep.*;
import org.nfunk.jep.type.*;
import java.util.*;
/**
* A free group generated by a symbol t.
*
* @author Rich Morris
* Created on 09-Mar-2004
*/
public class FreeGroup extends Group implements RingI {
protected RingI baseRing;
protected FreeGroupElement zeroPoly;
protected FreeGroupElement unitPoly;
protected FreeGroupElement tPoly; // t
protected String symbol;
protected Complex rootVal=new Complex(Double.NaN);
/**
* Create the ring K(t) where t is a free variable.
*
* @param K the Ring this is an extension of.
* @param symbol the name of the free variable.
*/
public FreeGroup(RingI K,String symbol) {
super();
this.symbol = symbol;
this.baseRing=K;
// construct the zero poly
zeroPoly = new FreeGroupElement(this,new Number[]{
baseRing.getZERO()});
// construct the unit poly
unitPoly = new FreeGroupElement(this,new Number[]{
baseRing.getONE()});
// construct the polynomial t
tPoly = new FreeGroupElement(this,new Number[]{
baseRing.getZERO(),
baseRing.getONE()});
}
public Number add(Number a,Number b)
{
return ((FreeGroupElement) a).add((FreeGroupElement) b);
}
public Number sub(Number a,Number b)
{
return ((FreeGroupElement) a).sub((FreeGroupElement) b);
}
public Number mul(Number a,Number b)
{
return ((FreeGroupElement) a).mul((FreeGroupElement) b);
}
public boolean equals(Number a,Number b)
{
return ((FreeGroupElement) a).equals((FreeGroupElement) b);
}
public Number valueOf(String s) {
Number coeffs[] = new Number[]{baseRing.valueOf(s)};
return valueOf(coeffs);
}
public Number valueOf(Number coeffs[]) {
return new FreeGroupElement(this, coeffs);
}
public Number getZERO() { return zeroPoly; }
public Number getONE() { return unitPoly; }
public Number getTPoly() { return tPoly; }
public Number getInverse(Number a) {
return sub(zeroPoly,a);
}
public void addStandardConstants(JEP j)
{
baseRing.addStandardConstants(j);
SymbolTable st = j.getSymbolTable();
for(Enumeration en=st.elements();en.hasMoreElements();)
{
Variable val = (Variable) en.nextElement();
st.remove(val.getName());
Number num = (Number) val.getValue();
Number p = this.valueOf(new Number[]{
num});
j.addConstant(val.getName(),p);
}
j.addConstant(symbol,tPoly);
}
public String toString()
{
return baseRing.toString() +"["+symbol+"]";
}
/** Returns the base ring of this extension. */
public RingI getBaseRing() {
return baseRing;
}
/** Sets the value used to approximate the root as a complex number. */
public void setRootVal(Complex complex) {
rootVal = complex;
}
/** Sets the root value for given symbol.
*
* @param sym the symbol to set
* @param val the complex value
* @return true is sym is a symbol for either this group or its baseRing or the basrRing's baseRing etc.
*/
public boolean setRootVal(String sym,Complex val) {
if(symbol.equals(sym))
{
rootVal = val;
return true;
}
else if(baseRing instanceof FreeGroup)
return ((FreeGroup) baseRing).setRootVal(sym,val);
return false;
}
/** Returns an approximation to the value of the root as a complex number. */
public Complex getRootVal() {
return rootVal;
}
/** Returns the symbol used to denote the generator. */
public String getSymbol() {
return symbol;
}
/** Whether the given polynomial is constant. */
public boolean isConstantPoly(Number poly) {
return ((FreeGroupElement) poly).isConstantPoly();
}
}