spectralnorm.nut 1.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. // The Computer Language Benchmarks Game
  2. // http://benchmarksgame.alioth.debian.org/
  3. // contributed by Mike Pall
  4. local function A(i, j){
  5. local ij = j + i++
  6. return 1.0/(ij++ * ij/2.0+i);
  7. }
  8. local function Av(x, y, N){
  9. local A = A;
  10. for(local i=0; i < N; ++i){
  11. local a = 0
  12. for(local j=0; j < N; ++j) a += x[j] * A(i, j)
  13. y[i] = a
  14. }
  15. }
  16. local function Atv(x, y, N){
  17. local A = A;
  18. for(local i=0; i < N; ++i){
  19. local a = 0
  20. for(local j=0; j < N; ++j) a += x[j] * A(j, i)
  21. y[i] = a
  22. }
  23. }
  24. local function AtAv(x, y, t, N){
  25. Av(x, t, N)
  26. Atv(t, y, N)
  27. }
  28. //check_delayed_release_hooks(false);
  29. local N = vargv.get(1, 500).tointeger();
  30. local start = os.clock()
  31. local u = array(N), v = array(N), t = array(N)
  32. for(local i=0; i < N; ++i) u[i] = 1
  33. for(local i=0; i < 10; ++i){
  34. AtAv(u, v, t, N)
  35. AtAv(v, u, t, N)
  36. }
  37. local vBv = 0.0, vv = 0.0
  38. for(local i=0; i < N; ++i){
  39. local ui = u[i], vi = v[i]
  40. vBv += ui*vi
  41. vv += vi*vi
  42. }
  43. local result = math.sqrt(vBv / vv);
  44. print("spectralnorm", N, os.clock()-start)
  45. print(format("%0.9f\n", result))