benchmark/bench/spectralnorm.groovy (40 lines of code) (raw):

/* * The Computer Language Shootout * http://shootout.alioth.debian.org/ * * contributed by Jochen Hinrichsen */ def approximate(n) { // create unit vector def u = [1.0D] * n // 20 steps of the power method def v = [0.0D] * n for (i in 1..10) { MultiplyAtAv(n, u, v) MultiplyAtAv(n, v, u) } // B=AtA A multiplied by A transposed // v.Bv / (v.v) eigenvalue of v double vBv = vv = 0.0D for (i in 0..<n) { vBv += u[i]*v[i] vv += v[i]*v[i] } return Math.sqrt(vBv / vv) } /* return element i,j of infinite matrix A */ def A(i, j) { return 1.0D / ((i+j) * (i + j + 1.0D) / 2.0D + i + 1.0D) } /* multiply vector v by matrix A */ def MultiplyAv(n, v, Av) { for (i in 0..<n) { Av[i] = 0.0D for (j in 0..<n) Av[i] += A(i,j) * v[j] } } /* multiply vector v by matrix A transposed */ def MultiplyAtv(n, v, Atv) { for (i in 0..<n) { Atv[i] = 0.0D for (j in 0..<n) Atv[i] += A(j,i) * v[j] } } /* multiply vector v by matrix A and then by matrix A transposed */ def MultiplyAtAv(n, v, AtAv) { double[] u = new double[n] MultiplyAv(n, v, u) MultiplyAtv(n, u, AtAv) } def n = (args.length == 0 ? 100 : args[0].toInteger()) def nf = java.text.NumberFormat.getInstance() nf.setMaximumFractionDigits(9) nf.setMinimumFractionDigits(9) nf.setGroupingUsed(false) println(nf.format(approximate(n)))