source code
/* The Computer Language Benchmarks Game
http://benchmarksgame.alioth.debian.org/
mostly auto-converted from Jarkko Miettinen's Java program
*/
import java.text.DecimalFormat
import java.text.NumberFormat
class spectralnorm {
private fun Approximate(n: Int): Double {
// create unit vector
val u = DoubleArray(n)
for (i in 0 until n) u[i] = 1.0
// 20 steps of the power method
val v = DoubleArray(n)
for (i in 0 until n) v[i] = 0.0
for (i in 0..9) {
MultiplyAtAv(n, u, v)
MultiplyAtAv(n, v, u)
}
// B=AtA A multiplied by A transposed
// v.Bv /(v.v) eigenvalue of v
var vBv = 0.0
var vv = 0.0
for (i in 0 until n) {
vBv += u[i] * v[i]
vv += v[i] * v[i]
}
return Math.sqrt(vBv / vv)
}
/* return element i,j of infinite matrix A */
private fun A(i: Int, j: Int): Double {
return 1.0 / ((i + j) * (i + j + 1) / 2 + i + 1)
}
/* multiply vector v by matrix A */
private fun MultiplyAv(n: Int, v: DoubleArray, Av: DoubleArray) {
for (i in 0 until n) {
Av[i] = 0.0
for (j in 0 until n) Av[i] += A(i, j) * v[j]
}
}
/* multiply vector v by matrix A transposed */
private fun MultiplyAtv(n: Int, v: DoubleArray, Atv: DoubleArray) {
for (i in 0 until n) {
Atv[i] = 0.0
for (j in 0 until n) Atv[i] += A(j, i) * v[j]
}
}
/* multiply vector v by matrix A and then by matrix A transposed */
private fun MultiplyAtAv(n: Int, v: DoubleArray, AtAv: DoubleArray) {
val u = DoubleArray(n)
MultiplyAv(n, v, u)
MultiplyAtv(n, u, AtAv)
}
companion object {
private val formatter = DecimalFormat("#.000000000")
@JvmStatic fun main(args: Array<String>) {
var n = 100
if (args.size > 0) n = Integer.parseInt(args[0])
System.out.println(formatter.format(spectralnorm().Approximate(n)))
}
}
}