/** * Multiplies each element in specified sum on some factor. * * @param sum sum * @param factor factor * @return resulting sum */ public static Tensor multiplySumElementsOnFactor(Sum sum, Tensor factor) { return multiplySumElementsOnFactor(sum, factor, new Transformation[0]); }
moved = FastTensors.multiplySumElementsOnFactor((Sum) moved, spinors); else moved = multiply(moved, spinors);
/** * Multiplies each element in specified sum on some factor. * * @param sum sum * @param factor factor * @return resulting sum */ public static Tensor multiplySumElementsOnFactorAndResolveDummies(Sum sum, Tensor factor) { Tensor[] pair = resolveDummy(sum, factor); int i = pair[0] instanceof Sum ? 0 : 1; return multiplySumElementsOnFactor((Sum) pair[i], pair[1 - i], new Transformation[0]); }
/** * Multiplies each element in specified sum on some factor (not a sum) and expands indexless parts. * * @param sum sum * @param factor factor * @return resulting sum * @throws IllegalArgumentException if factor is sum */ public static Tensor multiplySumElementsOnFactorAndExpand(Sum sum, Tensor factor) { if (factor instanceof Sum && factor.getIndices().size() != 0) throw new IllegalArgumentException(); return multiplySumElementsOnFactor(sum, factor, new Transformation[]{ExpandUtils.expandIndexlessSubproduct}); }
private Tensor factorSum1(Tensor sum) { Tensor[] parts = reIm(sum); if (!TensorUtils.isZero(parts[0])) { Tensor im = parts[0]; if (im instanceof Sum) im = FastTensors.multiplySumElementsOnFactor((Sum) im, Complex.IMAGINARY_UNIT); else im = Tensors.multiply(im, Complex.IMAGINARY_UNIT); im = factorizationEngine.transform(im); im = Tensors.multiply(im, Complex.NEGATIVE_IMAGINARY_UNIT); parts[0] = im; } if (!TensorUtils.isZero(parts[1])) parts[1] = factorizationEngine.transform(parts[1]); return Tensors.sum(parts[0], parts[1]); }
private Tensor order0(Tensor[] gammas) { if (gammas.length == 1) return gammas[0]; else if (gammas.length == 2) return metric(gammas); else { Tensor[] a = gammas.clone(); a[0] = Complex.TWO; a[1] = metric(gammas); Tensor[] b0 = gammas.clone(); swapAdj(b0, 0); Tensor b = order(Arrays.copyOfRange(b0, 1, b0.length)); if (b instanceof Sum) { Tensor[] pair = resolveDummy(b, b0[0]); b = FastTensors.multiplySumElementsOnFactor((Sum) pair[0], pair[1]); } else b = multiplyAndRenameConflictingDummies(b, b0[0]); return expandAndEliminate.transform(subtract(multiply(a), b)); } }
public static Tensor multiplySumElementsOnFactor(Sum sum, Tensor factor, Transformation[] transformations) { if (TensorUtils.isZero(factor)) return Complex.ZERO; if (TensorUtils.isOne(factor)) return sum; if (TensorUtils.haveIndicesIntersections(sum, factor)) { SumBuilder sb = new SumBuilder(sum.size()); for (Tensor t : sum) sb.put(apply(transformations, multiply(t, factor))); return sb.build(); } else return apply(transformations, FastTensors.multiplySumElementsOnFactor(sum, factor)); }
Complex frac = new Complex(new Rational(BigInteger.ONE, factor)); if (t instanceof Sum) return FastTensors.multiplySumElementsOnFactor((Sum) t, frac); return Tensors.multiply(frac, t); } else
private Tensor simplify(Element el, IntArrayList gPositions, ProductContent pc) { Tensor[] gammas = new Tensor[el.gIndex2 - el.gIndex1 + 1]; for (int i = el.gIndex1; i <= el.gIndex2; ++i) { gammas[i - el.gIndex1] = pc.get(gPositions.get(i)); if (!isGamma(pc.get(gPositions.get(i)))) return null;//can not simplify } Tensor r = order(gammas); Tensor m = multiply(pc.get(el.tIndex1), pc.get(el.tIndex2)); if (r instanceof Sum) r = FastTensors.multiplySumElementsOnFactor((Sum) r, m); else r = multiply(r, m); r = expandAndEliminate.transform(r); r = traceOfOne.transform(r); r = deltaTrace.transform(r); return r; }
adj = multiply(cadj); adj = adj instanceof Sum ? multiplySumElementsOnFactor((Sum) adj, metric) : multiply(adj, metric); sb.put(adj);
tensor = FastTensors.multiplySumElementsOnFactor((Sum) tensor, Complex.NEGATIVE_IMAGINARY_UNIT);
adj = multiply(cadj); adj = adj instanceof Sum ? multiplySumElementsOnFactor((Sum) adj, metric) : multiply(adj, metric); if (swaps % 2 == 1) adj = negate(adj);
adj = multiply(cadj); adj = adj instanceof Sum ? multiplySumElementsOnFactor((Sum) adj, metric) : multiply(adj, metric); sb.put(adj);