public Generic selfElementary() { return selfExpand(); }
@Nonnull public Generic divide(@Nonnull Generic that) throws NotDivisibleException { if (that instanceof JsclVector) { throw new ArithmeticException("Unable to divide vector by vector!"); } else if (that instanceof Matrix) { return multiply(that.inverse()); } else { final JsclVector result = (JsclVector) newInstance(); for (int i = 0; i < rows; i++) { try { result.elements[i] = elements[i].divide(that); } catch (NotDivisibleException e) { result.elements[i] = new Fraction(elements[i], that).selfExpand(); } } return result; } }
@Nonnull public Generic divide(@Nonnull Generic that) throws NotDivisibleException { if (that instanceof Matrix) { return multiply(that.inverse()); } else if (that instanceof JsclVector) { throw new ArithmeticException("Unable to divide matrix by vector: matrix could not be divided by vector!"); } else { Matrix m = (Matrix) newInstance(); for (int i = 0; i < rows; i++) { for (int j = 0; j < cols; j++) { try { m.elements[i][j] = elements[i][j].divide(that); } catch (NotDivisibleException e) { m.elements[i][j] = new Fraction(elements[i][j], that).selfExpand(); } } } return m; } }
public Generic selfExpand() { if (isZero()) return JsclInteger.valueOf(0); try { int s = subscript.integerValue().intValue(); switch (degree()) { case 1: return new Fraction(parameters[0], parameters[1]).selfExpand().negate(); } } catch (NotIntegerException e) { } return expressionValue(); }
public Generic selfSimplify() { if (parameters[0].signum() < 0) { return new Fraction(parameters[0].negate(), parameters[1]).selfSimplify().negate(); } if (parameters[1].signum() < 0) { return new Fraction(parameters[0].negate(), parameters[1].negate()).selfSimplify(); } return selfExpand(); }
return new Generic[]{na[0], nd[0], new Fraction(na[1], nd[1]).selfExpand()};
Generic hermite(Generic a, Generic d) { Debug.println("hermite(" + a + ", " + d + ")"); UnivariatePolynomial sd[] = ((UnivariatePolynomial) factory.valueOf(d)).squarefreeDecomposition(); int m = sd.length - 1; if (m < 2) return trager(a, d); else { Generic u = sd[0].genericValue(); for (int i = 1; i < m; i++) { u = u.multiply(sd[i].genericValue().pow(i)); } Generic v = sd[m].genericValue(); Generic vprime = sd[m].derivative().genericValue(); Generic uvprime = u.multiply(vprime); Generic r[] = bezout(uvprime, v); Generic b = r[0].multiply(a); Generic c = r[1].multiply(a); Generic s = r[2]; r = divideAndRemainder(b, v); b = r[1]; c = c.multiply(r[2]).add(r[0].multiply(uvprime)); s = new Inverse(s.multiply(r[2]).multiply(JsclInteger.valueOf(1 - m))).selfExpand(); b = b.multiply(s); c = c.multiply(s); Generic bprime = ((UnivariatePolynomial) factory.valueOf(b)).derivative().genericValue(); return new Fraction(b, v.pow(m - 1)).selfExpand().add(hermite(JsclInteger.valueOf(1 - m).multiply(c).subtract(u.multiply(bprime)), u.multiply(v.pow(m - 1)))); } }