-
Notifications
You must be signed in to change notification settings - Fork 0
/
spin.ts
82 lines (69 loc) · 2.28 KB
/
spin.ts
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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
import { Complex } from "./complex";
import { identity, Matrix } from "./matrix";
import { L_minus } from "./operator";
function print_decomposed(state: Matrix, s1: number, s2: number) {
let i = 0;
for (let m1 = s1; m1 >= -s1; m1 -= 1) {
for (let m2 = s2; m2 >= -s2; m2 -= 1) {
if (!state.at(0, i).equals(new Complex(0, 0))) {
let sign = state.at(0, i).real > 0 ? 1 : -1;
process.stdout.write(`${(sign * state.at(0, i).real * state.at(0, i).real).toPrecision(2)} |${m1} ${m2}> `);
}
i++;
}
}
console.log("");
}
// Gram-Schmidt
export function find_orthogonal_subspace(vectors: Matrix[]): Matrix {
let out = Matrix.zero(1, vectors[0].height());
for (let a of vectors) {
for (let i = 0; i < a.height(); i++) {
if (!a.at(0, i).equals(new Complex(0, 0))) {
out.set(0, i, new Complex(1, 0));
}
}
}
for (let a of vectors) {
let proj = a.mulScalar(out.adjoint().mulMatrix(a).at(0, 0));
out = out.sub(proj).normalize();
}
return out;
}
let l1 = 1.5;
let particleOne = new Matrix([[new Complex(1, 0), new Complex(0, 0), new Complex(0, 0), new Complex(0, 0)]]).transpose();
let l2 = 1;
let particleTwo = new Matrix([[new Complex(1, 0), new Complex(0, 0), new Complex(0, 0)]]).transpose();
let lminus = L_minus(l1)
.tensor(identity(2 * l2 + 1))
.add(identity(2 * l1 + 1).tensor(L_minus(l2)));
let previous_subspace = [particleOne.tensor(particleTwo)];
// console.log(`l1=${l1} l2=${l2}`);
console.log(l1 + l2);
process.stdout.write(`|${l1 + l2} ${l1 + l2}> = `);
print_decomposed(previous_subspace[0], l1, l2);
for (let M = l1 + l2 - 1; M >= -l1 + -l2; M -= 1) {
console.log(M);
let current_subspace = [];
for (let prev of previous_subspace) {
current_subspace.push(lminus.mulMatrix(prev).normalize());
}
if (M > 0 && l1 + l2 != M) {
current_subspace.push(find_orthogonal_subspace(current_subspace));
}
previous_subspace = current_subspace;
if (M + 1 < 0) {
previous_subspace.pop();
}
let i = 0;
for (let prev of previous_subspace) {
process.stdout.write(`|${l1 + l2 - i} ${M}> = `);
print_decomposed(prev, l1, l2);
i++;
}
// state = lminus.mulMatrix(state).normalize();
// if (Math.abs(M) != math.abs(l1 + l2)) {
// }
// previous_subspace = [state];
// state.print();
}