1
0
mirror of https://github.com/vlang/v.git synced 2023-08-10 21:13:21 +03:00
v/examples/spectral.v

70 lines
1.2 KiB
V
Raw Normal View History

2019-07-06 17:29:50 +03:00
/*
https://benchmarksgame-team.pages.debian.net/benchmarksgame/performance/spectralnorm.html
Added: Pradeep Verghese
Benchmarks:
2019-07-06 18:13:34 +03:00
Used v -prod spectral.v
Command: time ./spectral 5500
Output: 1.274224153
2019-07-06 17:29:50 +03:00
2019-07-06 18:13:34 +03:00
Time: 11.67s user 0.02s system 99% cpu 11.721 total
2019-07-06 17:29:50 +03:00
*/
module main
2019-07-06 17:29:50 +03:00
import math
import os
2020-05-29 07:41:56 +03:00
import strconv
2019-07-06 17:29:50 +03:00
fn evala(i int, j int) int {
return ((i + j) * (i + j + 1) / 2 + i + 1)
2019-07-06 17:29:50 +03:00
}
2020-06-04 11:35:40 +03:00
fn times(mut v []f64, u []f64) {
for i in 0 .. v.len {
mut a := f64(0)
for j in 0 .. u.len {
a += u[j] / f64(evala(i, j))
}
v[i] = a
}
2019-07-06 17:29:50 +03:00
}
2020-06-04 11:35:40 +03:00
fn times_trans(mut v []f64, u []f64) {
for i in 0 .. v.len {
mut a := f64(0)
for j in 0 .. u.len {
a += u[j] / f64(evala(j, i))
}
v[i] = a
}
2019-07-06 17:29:50 +03:00
}
2020-06-04 11:35:40 +03:00
fn a_times_transp(mut v []f64, u []f64) {
mut x := []f64{len: u.len, init: 0}
times(mut x, u)
times_trans(mut v, x)
}
2019-07-06 17:29:50 +03:00
fn main() {
args := os.args
2020-05-29 07:41:56 +03:00
mut n := 0
if args.len == 2 {
2020-05-29 07:41:56 +03:00
n = strconv.atoi(args[1])
} else {
n = 0
}
mut u := []f64{len: n, init: 1}
mut v := []f64{len: n, init: 1}
for _ in 0 .. 10 {
a_times_transp(mut v, u)
a_times_transp(mut u, v)
}
mut vbv := f64(0)
mut vv := f64(0)
for i in 0 .. n {
vbv += u[i] * v[i]
vv += v[i] * v[i]
}
ans := math.sqrt(vbv / vv)
println('${ans:0.9f}')
2019-07-06 17:29:50 +03:00
}