1 | /* |
2 | https://benchmarksgame-team.pages.debian.net/benchmarksgame/performance/spectralnorm.html |
3 | Added: Pradeep Verghese |
4 | Benchmarks: |
5 | Used v -prod spectral.v |
6 | Command: time ./spectral 5500 |
7 | Output: 1.274224153 |
8 | |
9 | Time: 11.67s user 0.02s system 99% cpu 11.721 total |
10 | */ |
11 | module main |
12 | |
13 | import math |
14 | import os |
15 | import strconv |
16 | |
17 | fn evala(i int, j int) int { |
18 | return (i + j) * (i + j + 1) / 2 + i + 1 |
19 | } |
20 | |
21 | fn times(mut v []f64, u []f64) { |
22 | for i in 0 .. v.len { |
23 | mut a := f64(0) |
24 | for j in 0 .. u.len { |
25 | a += u[j] / f64(evala(i, j)) |
26 | } |
27 | v[i] = a |
28 | } |
29 | } |
30 | |
31 | fn times_trans(mut v []f64, u []f64) { |
32 | for i in 0 .. v.len { |
33 | mut a := f64(0) |
34 | for j in 0 .. u.len { |
35 | a += u[j] / f64(evala(j, i)) |
36 | } |
37 | v[i] = a |
38 | } |
39 | } |
40 | |
41 | fn a_times_transp(mut v []f64, u []f64) { |
42 | mut x := []f64{len: u.len, init: 0} |
43 | times(mut x, u) |
44 | times_trans(mut v, x) |
45 | } |
46 | |
47 | fn main() { |
48 | mut n := 0 |
49 | if os.args.len == 2 { |
50 | n = strconv.atoi(os.args[1]) or { 0 } |
51 | } else { |
52 | n = 0 |
53 | } |
54 | mut u := []f64{len: n, init: 1} |
55 | mut v := []f64{len: n, init: 1} |
56 | for _ in 0 .. 10 { |
57 | a_times_transp(mut v, u) |
58 | a_times_transp(mut u, v) |
59 | } |
60 | mut vbv := f64(0) |
61 | mut vv := f64(0) |
62 | for i in 0 .. n { |
63 | vbv += u[i] * v[i] |
64 | vv += v[i] * v[i] |
65 | } |
66 | ans := math.sqrt(vbv / vv) |
67 | println('${ans:0.9f}') |
68 | } |