private static Tensor[] reIm(Tensor sum) { IntArrayList im = new IntArrayList(sum.size()); for (int i = sum.size() - 1; i >= 0; --i) { if (sum.get(i) instanceof Complex && !((Complex) sum.get(i)).getImaginary().isZero()) im.add(i); else if (sum.get(i) instanceof Product && !((Product) sum.get(i)).getFactor().getImaginary().isZero()) im.add(i); } Tensor[] parts = new Tensor[2]; int[] positions = im.toArray(); parts[0] = ((Sum) sum).select(positions); parts[1] = ((Sum) sum).remove(positions); return parts; }
private Tensor factorSymbolicTerms(Tensor tensor) { FromParentToChildIterator iterator = new FromParentToChildIterator(tensor); Tensor c; while ((c = iterator.next()) != null) { if (!(c instanceof Sum)) continue; Tensor remainder = c, temp; IntArrayList symbolicPositions = new IntArrayList(); for (int i = c.size() - 1; i >= 0; --i) { temp = c.get(i); if (isSymbolic(temp)) { symbolicPositions.add(i); if (remainder instanceof Sum) remainder = ((Sum) remainder).remove(i); else remainder = Complex.ZERO; } } Tensor symbolicPart = ((Sum) c).select(symbolicPositions.toArray()); symbolicPart = factorSymbolicTerm(symbolicPart); if (remainder instanceof Sum) { SumBuilder sb = new SumBuilder(remainder.size()); for (Tensor tt : remainder) sb.put(factorSymbolicTerms(tt)); remainder = sb.build(); } else remainder = factorSymbolicTerms(remainder); iterator.set(Tensors.sum(symbolicPart, remainder)); } return iterator.result(); }