Some experimentation seems to show that it is v, not vt.
The following test passes. So I think svt returns (u,s,v) such that u*diag(s)*v equal the original matrix.
test("breeze"){
import breeze.linalg._
import scala.util.Random
def maxabsnorm(dim:Int, m:DenseMatrix[Double]):Double = {
(0 until dim).foldLeft(m(0,0)){(acc:Double,row:Int) =>
val x = (0 until dim).foldLeft(m(0,0)){
(acc:Double,col:Int) => math.max(acc,math.abs(m(row,col)))}
math.max(acc,x)
}
}
for{dim <- 1 to 4} {
val dm1: DenseMatrix[Double] = DenseMatrix.tabulate(dim, dim)((_, _)=>Random.between(-10.0, 10.0))
val svd.SVD(u, s, v) = svd(dm1)
val dm2 = u * diag(s) * v
val dist:Double = maxabsnorm(dim,dm2 - dm1)
assert(dist < 0.001, s"dist=$dist dm1=[$dm1] dm2=[$dm2] diff=[${dm2-dm1}]")
}
}