package org.matheclipse.core.reflection.system;
import org.matheclipse.core.eval.exception.Validate;
import org.matheclipse.core.eval.interfaces.AbstractFunctionEvaluator;
import org.matheclipse.core.eval.util.IIndexFunction;
import org.matheclipse.core.eval.util.IndexTableGenerator;
import org.matheclipse.core.expression.F;
import org.matheclipse.core.interfaces.IAST;
import org.matheclipse.core.interfaces.IExpr;
import org.matheclipse.core.interfaces.IInteger;
/**
* Hilbert matrix, defined by Ai,j = 1 / (i+j-1). See
* href="http://en.wikipedia.org/wiki/Hilbert_matrix">Wikipedia:Hilbert matrix
*/
public class HilbertMatrix extends AbstractFunctionEvaluator {
public class HilbertFunctionDiagonal implements IIndexFunction {
public HilbertFunctionDiagonal() {
}
public IExpr evaluate(final int[] index) {
int res = index[0] + index[1] + 1;
return F.Power(F.integer(res), F.CN1);
}
}
public HilbertMatrix() {
}
@Override
public IExpr evaluate(final IAST ast) {
Validate.checkRange(ast, 2, 3);
int rowSize = 0;
int columnSize = 0;
if (ast.size() == 2 && ast.arg1().isInteger()) {
rowSize = Validate.checkIntType(ast, 1);
columnSize = rowSize;
} else if (ast.size() == 3 && ast.arg1().isInteger() && ast.arg2().isInteger()) {
rowSize = Validate.checkIntType(ast, 1);
columnSize = Validate.checkIntType(ast, 2);
} else {
return null;
}
final IAST resultList = F.List();
final int[] indexArray = new int[2];
indexArray[0] = rowSize;
indexArray[1] = columnSize;
final IndexTableGenerator generator = new IndexTableGenerator(indexArray, resultList, new HilbertFunctionDiagonal());
final IAST matrix = (IAST) generator.table();
if (matrix != null) {
matrix.addEvalFlags(IAST.IS_MATRIX);
}
return matrix;
}
}
Ads help maintain this website.