simplify_indexed(), to find possible cancellations
unsigned result = 0;
idx i(symbol("i"), 3), j(symbol("j"), 3), k(symbol("k"), 3), l(symbol("l"), 3);
unsigned result = 0;
idx i(symbol("i"), 3), j(symbol("j"), 3), k(symbol("k"), 3), l(symbol("l"), 3);
+ symbol A("A"), B("B"), C("C");
ex e;
result += check_equal(indexed(A, sy_symm(), i, j), indexed(A, sy_symm(), j, i));
ex e;
result += check_equal(indexed(A, sy_symm(), i, j), indexed(A, sy_symm(), j, i));
result += check_equal(symmetrize(e), 0);
result += check_equal(antisymmetrize(e), e);
result += check_equal(symmetrize(e), 0);
result += check_equal(antisymmetrize(e), e);
+ e = (indexed(A, sy_anti(), i, j, k, l) * (indexed(B, j) * indexed(C, k) + indexed(B, k) * indexed(C, j)) + indexed(B, i, l)).expand();
+ result += check_equal_simplify(e, indexed(B, i, l));
+
+ if (sum.is_zero()) {
+ free_indices.clear();
+ return sum;
+ }
+
+ // Symmetrizing over the dummy indices may cancel terms
+ int num_terms_orig = (is_a<add>(sum) ? sum.nops() : 1);
+ if (num_terms_orig > 1 && dummy_indices.size() >= 2) {
+ lst dummy_syms;
+ for (int i=0; i<dummy_indices.size(); i++)
+ dummy_syms.append(dummy_indices[i].op(0));
+ ex sum_symm = sum.symmetrize(dummy_syms);
+ if (sum_symm.is_zero()) {
+ free_indices.clear();
+ return _ex0;
+ }
+ int num_terms = (is_a<add>(sum_symm) ? sum_symm.nops() : 1);
+ if (num_terms < num_terms_orig)
+ return sum_symm;
+ }
+