2
0

math-spectral-norm.js 1.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. // The Great Computer Language Shootout
  2. // http://shootout.alioth.debian.org/
  3. //
  4. // contributed by Ian Osgood
  5. function A(i,j) {
  6. return 1/((i+j)*(i+j+1)/2+i+1);
  7. }
  8. function Au(u,v) {
  9. for (var i=0; i<u.length; ++i) {
  10. var t = 0;
  11. for (var j=0; j<u.length; ++j)
  12. t += A(i,j) * u[j];
  13. v[i] = t;
  14. }
  15. }
  16. function Atu(u,v) {
  17. for (var i=0; i<u.length; ++i) {
  18. var t = 0;
  19. for (var j=0; j<u.length; ++j)
  20. t += A(j,i) * u[j];
  21. v[i] = t;
  22. }
  23. }
  24. function AtAu(u,v,w) {
  25. Au(u,w);
  26. Atu(w,v);
  27. }
  28. function spectralnorm(n) {
  29. var i, u=[], v=[], w=[], vv=0, vBv=0;
  30. for (i=0; i<n; ++i) {
  31. u[i] = 1; v[i] = w[i] = 0;
  32. }
  33. for (i=0; i<10; ++i) {
  34. AtAu(u,v,w);
  35. AtAu(v,u,w);
  36. }
  37. for (i=0; i<n; ++i) {
  38. vBv += u[i]*v[i];
  39. vv += v[i]*v[i];
  40. }
  41. return Math.sqrt(vBv/vv);
  42. }
  43. var total = 0;
  44. for (var i = 6; i <= 48; i *= 2) {
  45. total += spectralnorm(i);
  46. }
  47. var expected = 5.086694231303284;
  48. if (total != expected)
  49. throw "ERROR: bad result: expected " + expected + " but got " + total;