This is an old revision of the document!
ExpandAndEliminate expands out product of sums and positive integer powers and permanently eliminates metric and Kronecker deltas.ExpandAndEliminate is equivalent to sequential applying Expand & EliminateMetrics but works faster since applies EliminateMetrics at each level of expand procedure.ExpandAndEliminate is equal to Expand[EliminateMetrics] & EliminateMetrics.ExpandAndEliminate works same as Expand.ExpandAndEliminate[simplifications] or ExpandAndEliminate simplifications will apply additional simplifications at each level of expand procedureExpand product of sums and eliminate metrics:
def t = '(A_a*g_mn + A_m*g_an + A_n*g_am)*(A^a*g^mn + A^m*g^an + A^n*g^am)'.t println ExpandAndEliminate >> t
> 6*A_{n}*A^{n}+3*d^{n}_{n}*A_{m}*A^{m}
When no metric tensors or Kronecker deltas involved, ExpandAndEliminate works same as Expand:
println Expand >> '(A_m^m + 1)**3'.t
> 3*A_{m}^{m}*A_{a}^{a}+A_{m}^{m}*A_{a}^{a}*A_{b}^{b}+1+3*A_{b}^{b}
ExpandAndEliminate is equivalent to sequential applying Expand & EliminateMetrics but works faster since it applies EliminateMetrics at each level of expand procedure. One can check the advantages of ExpandAndEliminate in the following example with random tensors:
//create random generator, which generates
// random tensors consisting of metric and A_m
def randomTensor = new RandomTensor()
randomTensor.clearNamespace()
randomTensor.addToNamespace('g_mn'.t, 'A_m'.t)
def a, b
//loop to warm up JVM
for (def i in 0..1000) {
//next random tensor
def t = randomTensor.nextTensorTree(4, 3, 8, '_a'.si)
//this will typically 10 times faster
timing {
a = ExpandAndEliminate >> t
}
//than this
timing {
b = (Expand & EliminateMetrics) >> t
}
assert a == b
println ''
}
The sample output will looks like:
Time: 14 ms. Time: 88 ms. Time: 52 ms. Time: 553 ms. Time: 40 ms. Time: 577 ms.