Before revision:  given a set X of n points in \mathbb{R^{d} and an error parameter \epsilon, this is a linear transformation \Psi: R^{d} } \mathbb{R^{O(\epsilon^{-2}n)} such that \|\Psi x\|_{2} \in (1- \epsilon, }  1 +\epsilon)\cdot \|x\|_{2 for all x\in X, and such that for each x\in X, \Psi x can be computed }  ] ] ]  in time O(d\log{d} + \min\{d\log{n, \epsilon^{-2}\log^{3}{n}\log^{3}(\epsilon^{-1}\log{n}) \}) with only a constant amount of memory overhead.
After revision:  given a set X of n points in \mathbb{R^{d} and an error parameter \epsilon, this is a linear transformation \Psi: R^{d} } \mathbb{R^{O(\epsilon^{-2}n)} such that \|\Psi x\|_{2} \in (1- \epsilon, } 1 +\epsilon)\cdot \|x\|_{2 for all x\in X, and such that for each x\in X, \Psi x can be computed } ] ]. Our algorithm is memory-optimal, and outperforms existing algorithms in regimes when n is sufficiently large and the distortion parameter is sufficiently small. In particular, this confirms a conjecture of Ailon and Chazelle ] in time O(d\log{d} + \min\{d\log{n, \epsilon^{-2}\log^{3}{n}\log^{3}(\epsilon^{-1}\log{n}) \}) with only a constant amount of memory overhead.