# How to implement replacement rule for products of variables?

If I have an expression in terms of multiplications of (pairs of) variables, e.g. $$x_1$$ ... $$x_N$$ such that the expression I want to manipulate is of the form

$$A_{1,1}x_1^2+A_{1,2}x_1x_2+\ldots + A_{N,N-1}x_{N-1}x_N+A_{N,N}x_N^2$$

What is the easiest way to implement the custom replacement rules

$$x_ix_j\to C_{i,j}$$

which can't be achieved with simple algebraic replacements for the individual $$x_i$$ (For instance $$x_ix_j$$ might represent the product of two random variables such that the replacement rules effect an expectation and thus give a correlation, i.e. $$x_i^2\to \mathbb{E}[x_i^2]=\rho_i$$ whilst $$x_ix_j\to\mathbb{E}[x_ix_j]=0$$, for example)?

Practically, I might have $$x_1,\ldots,x_4$$, say, but very large expressions that make manual substitution tedious.

• If what you want for your actual project is an algorithm for Wick contractions of Gaussian variables there are answers for that here on stack exchange, one of which I use regularly. Commented Dec 21, 2022 at 17:18
• If all of the $x_i$ random variables have the same distribution, you might want to consider getting familiar with PowerSymmetricPolynomial, AugmentedSymmetricPolynomial, SymmetricPolynomial, and MomentConvert.
– JimB
Commented Dec 22, 2022 at 1:22

I think you want something like the following (?)

Sum[A[i, j] x[i] x[j], {i, 1, 2}, {j, 1, 2}] /. {x[i_] x[j_] ->
c[i, j], x[i_] x[i_] -> c[i, i]}


As a possibility, let:

expr = a[1, 1] x[1]^2 + a[1, 2] x[1] x[2] + a[2, 3] x[2] x[3]

rule = {Times[y__, x_[a_Integer] x_[b_Integer]] :> y C[a, b]
, Times[y__, x_[a_Integer] x_[a_Integer]] :> y G[a, a]
};


Test:

expr /. rule

a[1, 2] C[1, 2] + a[2, 3] C[2, 3] + a[1, 1] G[1, 1]


I'm not sure whether this would work for you here, but this reminds me of similar cases where Plus and Times would give me headaches. An easy fix was to just replace as expr /. Times -> times (and/or Plus to plus), do whatever, and replace back when you're ready.

(I believe this is also the idea behind Deactivate and related functions, but they seemed slightly more finicky to me.)

Try the following. Here is your polynomial:

expr = Sum[
Subscript[A, i, j]*Subscript[x, i]*Subscript[x, j], {i, 1, 5}, {j,
1, 5}]


Here is the replacement:

expr /. {Subscript[x, i_]*Subscript[x, j_] -> Subscript[c, i,
j], \!$$\*SubsuperscriptBox[\(x$$, $$i_$$, $$2$$] ->
\*SubscriptBox[$$c$$, $$i, i$$]\)}


with the following effect

Have fun!