Questions relating to the Gram–Schmidt process, which takes a set of input vectors and produces an orthonormal set of vectors that spans the same subspace as the input set.
Orthonormal bases in linear algebra are easier to work with, especially in vector spaces where the basis may not be immediately obvious such as modular forms. The Gram–Schmidt process produces, from an arbitrary set of $n$ linearly independent vectors $\{\mathbf v_1,\mathbf v_2,\dots,\mathbf v_n\}$, an orthonormal set of vectors $\{\mathbf e_1,\mathbf e_2,\dots,\mathbf e_n\}$ with $\operatorname{span}(\{\mathbf e_i\})=\operatorname{span}(\{\mathbf v_i\})$. It does so by repeatedly projecting vectors onto each other.
Defining the projection operator as $$\operatorname{proj}_{\mathbf u}(\mathbf v)=\frac{\langle\mathbf v,\mathbf u\rangle}{\langle\mathbf u,\mathbf u\rangle}\mathbf u$$ with $\langle\cdot\rangle$ the inner product, the classical process first constructs an intermediate set of orthogonal vectors $\{\mathbf u_i\}$ as $$\mathbf u_i=\mathbf v_i-\sum_{j=1}^{i-1}\mathrm{proj}_{\mathbf u_j}(\mathbf v_k)$$ starting from $\mathbf u_1$ and going to $\mathbf u_n$. Normalising these vectors ($\mathbf e_i=\mathbf u_i/\Vert\mathbf u_i\Vert$) yields the orthonormal basis $\{\mathbf e_i\}$.
This classical process is numerically unstable, but may be stabilised by computing additional intermediate values for each $\mathbf u_i$. Applications of the process include QR decomposition of matrices and constructing the Legendre polynomials.