1 |
|
2 |
|
3 | function approximate(n: number): number {
|
4 | let u = Array(n), v = Array(n)
|
5 | for (let i = 0; i < n; ++i) {
|
6 | u[i] = 1.0
|
7 | }
|
8 | for (let i = 0; i < 10; ++i) {
|
9 | multiplyAtAv(n, u, v)
|
10 | multiplyAtAv(n, v, u)
|
11 | }
|
12 | let vBv = 0.0, vv = 0.0
|
13 | for (let i = 0; i < 10; ++i) {
|
14 | vBv += u[i] * v[i]
|
15 | vv += v[i] * v[i]
|
16 | }
|
17 | return Math.sqrt(vBv / vv)
|
18 | }
|
19 |
|
20 | function a(i, j: number): number {
|
21 | return 1.0 / ((i + j) * ((i + j) + 1) / 2 + i + 1)
|
22 | }
|
23 |
|
24 | function multiplyAv(n: number, v: number[], av: number[]) {
|
25 | for (let i = 0; i < n - 1; ++i) {
|
26 | av[i] = 0.0
|
27 | for (let j = 0; j < n - 1; ++j) {
|
28 | av[i] += a(i, j) * v[j]
|
29 | }
|
30 | }
|
31 | }
|
32 |
|
33 | function multiplyAtv(n: number, v: number[], atv: number[]) {
|
34 | for (let i = 0; i < n - 1; ++i) {
|
35 | atv[i] = 0.0
|
36 | for (let j = 0; j < n - 1; ++j) {
|
37 | atv[i] += a(j, i) * v[j]
|
38 | }
|
39 | }
|
40 | }
|
41 |
|
42 | function multiplyAtAv(n: number, v: number[], atAv: number[]) {
|
43 | let u = new Array(n)
|
44 | multiplyAv(n, v, u)
|
45 | multiplyAtv(n, u, atAv)
|
46 | }
|
47 |
|
48 | {
|
49 | let start = Date.now()
|
50 | echo(approximate(5500).toFixed(9))
|
51 | echo(Date.now() - start + "ms")
|
52 | }
|