-
Notifications
You must be signed in to change notification settings - Fork 0
/
CFTMatrixElements.py
56 lines (48 loc) · 2.29 KB
/
CFTMatrixElements.py
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
#CFT matrix elements
import math
import itertools
def ladderOperatorMatrixElements(ups, downs, gamma, state1, state2):
answer = 1
f = math.factorial
ladders = tuple([-i for i in ups]) + downs
for i in set(ups):
occupancyNumber = sum([1 for j in state1 if j == i])
numberToTakeAway = sum([1 for j in ups if j == i])
answer = answer*math.sqrt(f(occupancyNumber)//f(occupancyNumber - numberToTakeAway))
for i in set(downs):
occupancyNumber = sum([1 for j in state2 if j == i])
numberToTakeAway = sum([1 for j in downs if j == i])
answer = answer*math.sqrt(f(occupancyNumber)//f(occupancyNumber - numberToTakeAway))
answer = answer*sum([operatorPrefactor(x, gamma) for x in set(itertools.permutations(ladders))])
return answer
def operatorPrefactor(ladders, gamma):
answer = 1
for i in range(len(ladders)):
answer = answer*math.sqrt(abs(ladders[i]))*kappa(ladders[i], gamma[i])
return answer
def kappa(n, gamma):
answer = 1
for i in range(gamma - 1):
answer = answer*(n + i + 1)
return answer
def possibleTerms(state1, state2, gamma):
f = makeLadderOperator
allPossibleLadders = []
for i in (j for j in range(1, len(gamma)) if len(state1) - j == len(state2) - len(gamma) + j and len(state1) - j >= 0 and len(state2) - len(gamma) + j >= 0):
for x in itertools.combinations(range(len(state1)), i):
for y in itertools.combinations(range(len(state2)), len(gamma) - i):
if checkNonZeroTerm(y, x, state2, state1):
allPossibleLadders.append((f(state1, x),f(state2, y)))
return set(allPossibleLadders)
def TOperatorMatrixElement(gamma, state1, state2):
if len(gamma) > len(state1) + len(state2):
return 0
else:
f = makeLadderOperator
terms = possibleTerms(state1, state2, gamma)
answer = sum([ladderOperatorMatrixElements(x, y, gamma, state1, state2) for (x,y) in terms])
return answer*((-1)**sum(gamma))
def checkNonZeroTerm(downsIndex, upsIndex, state2, state1):
return tuple([state1[i] for i in range(len(state1)) if not i in upsIndex]) == tuple([state2[i] for i in range(len(state2)) if not i in downsIndex])
def makeLadderOperator(state, ladderIndex):
return tuple([state[i] for i in ladderIndex])