Do singular values change when an arbitrary matrix is multiplied by a unitary matrix? Let X be an arbitrary matrix, and let U be a unitary matrix.
Is it so that the singular values of X are the same as the singular values of UX?
Does the same apply for XU?
 A: First, we can think about this geometrically. The SVD $X = \Phi\Sigma\Psi^\top$ tells us that any linear transformation ($X$) can be decomposed into a rotation ($\Psi^\top$), a dilation ($\Sigma$), and another rotation ($\Phi$). If we apply a unitary matrix $U$---which represents a rotation---to either side of $X$, we will change one of the rotations, but not the dilation. So the singular values will not be changed.
Now let's be a bit more precise. Let $X = \Phi\Sigma\Psi^\top$ be the SVD of $X$. Then $UX = (U\Phi)\Sigma\Psi^\top$. If this is the singular value decomposition for $UX$ (i.e., if $U\Phi$ is the matrix of left singular vectors for $UX$), then $X$ and $UX$ have the same singular values (i.e., they have the same $\Sigma$ in their singular value decompositions; recall that the SVD is unique up to signs). In order for that to be true, $U\Phi$ has to be unitary. We know that $U$ and $\Phi$ are individually unitary, so $U^\top U = I$ and $\Phi^\top \Phi = I$. Now observe that $(U\Phi)^\top (U\Phi) = \Phi^\top U^\top U \Phi = \Phi^\top I \Phi = \Phi^\top \Phi = I$, so $U\Phi$ is indeed unitary. Therefore, $X$ and $UX$ have the same singular values.
For the second case, we have $XU = \Phi\Sigma(\Psi^\top U)$. What can you say here?
Here's a quick numerical sanity check for the first case in Python.
>>> import numpy as np
>>> import scipy.linalg as la

# Get a random test matrix X and take its SVD.
>>> n = 10
>>> X = np.random.random((n,n))
>>> sigma = la.svdvals(X)

# Get a random unitary matrix of the same size as X.
>>> U = la.qr(np.random.random((n,n)))[0]
>>> np.allclose(sigma, la.svdvals(U @ X))
True

You'll notice that this example uses square matrices. Does anything change if you use non-square matrices?
