71 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			V
		
	
	
			
		
		
	
	
			71 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			V
		
	
	
/*
 | 
						|
https://benchmarksgame-team.pages.debian.net/benchmarksgame/performance/spectralnorm.html
 | 
						|
Added: Pradeep Verghese
 | 
						|
Benchmarks:
 | 
						|
Used v -prod spectral.v
 | 
						|
Command: time ./spectral 5500
 | 
						|
Output: 1.274224153
 | 
						|
 | 
						|
Time: 11.67s user 0.02s system 99% cpu 11.721 total
 | 
						|
*/
 | 
						|
module main
 | 
						|
 | 
						|
import math
 | 
						|
import os
 | 
						|
 | 
						|
fn evala(i, j int) int {
 | 
						|
	return ((i + j) * (i + j + 1) / 2 + i + 1)
 | 
						|
}
 | 
						|
 | 
						|
fn times(v mut []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
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
fn times_trans(v mut []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
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
fn a_times_transp(v mut []f64, u []f64) {
 | 
						|
	mut x := [f64(0)].repeat(u.len)
 | 
						|
	times(mut x, u)
 | 
						|
	times_trans(mut v, x)
 | 
						|
}
 | 
						|
 | 
						|
fn main() {
 | 
						|
	args := os.args
 | 
						|
	mut n := int(0)
 | 
						|
	if args.len == 2 {
 | 
						|
		n = args[1].int()
 | 
						|
	}
 | 
						|
	else {
 | 
						|
		n = 0
 | 
						|
	}
 | 
						|
	mut u := [f64(1.0)].repeat(n)
 | 
						|
	mut v := [f64(1.0)].repeat(n)
 | 
						|
	for i 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}')
 | 
						|
}
 | 
						|
 |