Proof
Courtesy of this thread from PhysicsForums.
\begin{align}
\nabla \times (\vec{A} \times \vec{B})
&=\partial_l \hat{e}_l \times (a_i b_j \hat{e}_k \epsilon_{ijk}) \\
&=\partial_l a_i b_j \epsilon_{ijk} \underbrace{ (\hat{e}_l \times \hat{e}_k)}_{(\hat{e}_l \times \hat{e}_k) = \hat{e}_m \epsilon_{lkm} } \\
&=\partial_l a_i b_j \hat{e}_m \underbrace{\epsilon_{ijk} \epsilon_{mlk}}_{\text{contracted epsilon identity}} \\
&=\partial_l a_i b_j \hat{e}_m \underbrace{(\delta_{im} \delta_{jl} - \delta_{il} \delta_{jm})}_{\text{They sift other subscripts}} \\
&=\partial_j (a_i b_j \hat{e}_i)- \partial_i (a_i b_j \hat{e}_j) \\
&=\color{blue}{a_i \partial_j b_j \hat{e}_i + b_j \partial_j a_i \hat{e}_i} - (\color{green}{a_i \partial_i b_j \hat{e}_j + b_j \partial_i a_i \hat{e}_j}) \\
&= \vec{A}(\nabla \cdot \vec{B}) + (\vec{B} \cdot \nabla)\vec{A} - (\vec{A} \cdot \nabla)\vec{B} - \vec{B}(\nabla \cdot \vec{A}) \\
\end{align}
Edit: As is pointed out by @enzotib, the blue and green sums are derivatives of products.
Why did the deltas vanish?
Due to Kronecker $\delta$'s sifting property. Recall the definition of Kronecker delta:
$$\delta_{ij}=\begin{cases}
0,\quad \text{if } i\ne j, \\
1,\quad \text{if } i=j.
\end{cases}$$
Thus, for $j\in\mathrm Z$:
$$\sum\limits_{-\infty}^{\infty}a_i\delta_{ij} = a_j$$
This is just like filtering (or sifting), because only when $i=j$ does $\delta_{ij} = 1$. Other terms are zeroes. This also works for partial derivatives.
For example,
$$\partial_l a_i b_j \hat{e}_m \delta_{im} \delta_{jl} = \partial_l a_i b_j \hat{e}_i \delta_{jl}$$
- If $l\ne j$ then $\partial_l a_i b_j \hat{e}_i \delta_{jl} = \partial_l a_i b_j \hat{e}_i(0) = 0$;
- If $l=j$ then $\partial_l a_i b_j \hat{e}_i \delta_{jl} = \partial_j a_i b_j \hat{e}_i (1) = \partial_j a_i b_j \hat{e}_i$.
Thus,
$$\partial_l a_i b_j \hat{e}_m \delta_{im} \delta_{jl} =\partial_j (a_i b_j \hat{e}_i).$$
Note that $\hat{e}_i$ is a const std::vector<int>
.
Some thoughts
- There are two cross products (one of them is Curl) and we use different subscripts (of partials and Levi-Civita symbol to distinguish them, e.g., $l$ for the curl and $k$ for $\vec{A} \times \vec{B}$.
- We move the variables around quite often.
- The cross product of two basis is explained in the underbrace.
- The contracted epsilon identity is very useful. We replaced them by Kronecker $\delta$-s.
- Kronecker $\delta$-s are known to select things efficiently.
- In many proofs of vector calculus identities (this one included), we add and substract extra terms.
- Do I love Levi-Civita symbols and Einstein Notation? I'm ambivalent.