summaryrefslogtreecommitdiff
path: root/benchmark/so_spectralnorm.yml
blob: 45373b647604c0b6b2a8a97309e985ee3ffe2dbe (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
prelude: |
  # The Computer Language Shootout
  # http://shootout.alioth.debian.org/
  # Contributed by Sokolov Yura
benchmark:
  so_spectralnorm: |

    def eval_A(i,j)
    	return 1.0/((i+j)*(i+j+1)/2+i+1)
    end

    def eval_A_times_u(u)
            v, i = nil, nil
    	(0..u.length-1).collect { |i|
                    v = 0
    		for j in 0..u.length-1
    			v += eval_A(i,j)*u[j]
                    end
                    v
            }
    end

    def eval_At_times_u(u)
    	v, i = nil, nil
    	(0..u.length-1).collect{|i|
                    v = 0
    		for j in 0..u.length-1
    			v += eval_A(j,i)*u[j]
                    end
                    v
            }
    end

    def eval_AtA_times_u(u)
    	return eval_At_times_u(eval_A_times_u(u))
    end

    n = 500 # ARGV[0].to_i

    u=[1]*n
    for i in 1..10
            v=eval_AtA_times_u(u)
            u=eval_AtA_times_u(v)
    end
    vBv=0
    vv=0
    for i in 0..n-1
            vBv += u[i]*v[i]
            vv += v[i]*v[i]
    end

    str = "%0.9f" % (Math.sqrt(vBv/vv)), "\n"
    # print str
loop_count: 1