spectralnorm.lua 921 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  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 = i+j-1
  6. return 1.0 / (ij * (ij-1) * 0.5 + i)
  7. end
  8. local function Av(x, y, N)
  9. for i=1,N do
  10. local a = 0
  11. for j=1,N do a = a + x[j] * A(i, j) end
  12. y[i] = a
  13. end
  14. end
  15. local function Atv(x, y, N)
  16. for i=1,N do
  17. local a = 0
  18. for j=1,N do a = a + x[j] * A(j, i) end
  19. y[i] = a
  20. end
  21. end
  22. local function AtAv(x, y, t, N)
  23. Av(x, t, N)
  24. Atv(t, y, N)
  25. end
  26. local N = tonumber(arg and arg[1]) or 500
  27. local start = os.clock()
  28. local u, v, t = {}, {}, {}
  29. for i=1,N do u[i] = 1 end
  30. for i=1,10 do AtAv(u, v, t, N) AtAv(v, u, t, N) end
  31. local vBv, vv = 0, 0
  32. for i=1,N do
  33. local ui, vi = u[i], v[i]
  34. vBv = vBv + ui*vi
  35. vv = vv + vi*vi
  36. end
  37. local result = math.sqrt(vBv / vv);
  38. print("spectralnorm", N, os.clock()-start)
  39. io.write(string.format("%0.9f\n", result))