Advertisement
Guest User

Untitled

a guest
Aug 23rd, 2017
68
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.38 KB | None | 0 0
  1. import numpy as np
  2. from numpy import random as rd
  3.  
  4. im = np.sqrt(-1 + 0j)
  5.  
  6. # Adjoint operator
  7. def dag(a):
  8. return np.transpose(np.conj(a))
  9.  
  10. # Matrix product
  11. def mp(ms):
  12. out = np.dot(ms[0], ms[1])
  13. if(len(ms) > 2):
  14. for m in ms[2:]:
  15. out = np.dot(out, m)
  16. return out
  17.  
  18. # Kronecker delta
  19. def kron(a, b):
  20. return 1 if a == b else 0
  21.  
  22. # Generate 2-dimensional state
  23. def genstate():
  24. theta = np.pi * rd.rand()
  25. phi = 2 * np.pi * rd.rand()
  26. return [[np.cos(theta / 2)], [np.exp(im * phi) * np.sin(theta / 2)]]
  27.  
  28. def genunitary(d):
  29. mat = np.zeros((d, d)) + im * np.zeros((d,d)) # Create blank complex matrix
  30.  
  31. # Fill matrix with IID normally distributed complex numbers
  32. for (x, y), value in np.ndenumerate(mat):
  33. mat[x, y] = rd.normal(0, 1) + im * rd.normal(0, 1)
  34.  
  35. U = np.linalg.qr(mat)[0] # Perform QR decomposition, take Q
  36. return U
  37.  
  38. # randfixedsum to generate probability distribution by Roger Stafford, ported by Björn Brandenburg
  39. def genprob(n, u = 1, nsets = 1):
  40. #deal with n=1 case
  41. if n == 1:
  42. return np.tile(np.array([u]),[nsets,1])
  43.  
  44. k = np.floor(u)
  45. s = u
  46. step = 1 if k < (k-n+1) else -1
  47. s1 = s - np.arange( k, (k-n+1)+step, step )
  48. step = 1 if (k+n) < (k-n+1) else -1
  49. s2 = np.arange( (k+n), (k+1)+step, step ) - s
  50.  
  51. tiny = np.finfo(float).tiny
  52. huge = np.finfo(float).max
  53.  
  54. w = np.zeros((n, n+1))
  55. w[0,1] = huge
  56. t = np.zeros((n-1,n))
  57.  
  58. for i in np.arange(2, (n+1)):
  59. tmp1 = w[i-2, np.arange(1,(i+1))] * s1[np.arange(0,i)]/float(i)
  60. tmp2 = w[i-2, np.arange(0,i)] * s2[np.arange((n-i),n)]/float(i)
  61. w[i-1, np.arange(1,(i+1))] = tmp1 + tmp2;
  62. tmp3 = w[i-1, np.arange(1,(i+1))] + tiny;
  63. tmp4 = np.array( (s2[np.arange((n-i),n)] > s1[np.arange(0,i)]) )
  64. t[i-2, np.arange(0,i)] = (tmp2 / tmp3) * tmp4 + (1 - tmp1/tmp3) * (np.logical_not(tmp4))
  65.  
  66. m = nsets
  67. x = np.zeros((n,m))
  68. rt = np.random.uniform(size=(n-1,m)) #rand simplex type
  69. rs = np.random.uniform(size=(n-1,m)) #rand position in simplex
  70. s = np.repeat(s, m);
  71. j = np.repeat(int(k+1), m);
  72. sm = np.repeat(0, m);
  73. pr = np.repeat(1, m);
  74.  
  75. for i in np.arange(n-1,0,-1): #iterate through dimensions
  76. e = ( rt[(n-i)-1,...] <= t[i-1,j-1] ) #decide which direction to move in this dimension (1 or 0)
  77. sx = rs[(n-i)-1,...] ** (1/float(i)) #next simplex coord
  78. sm = sm + (1-sx) * pr * s/float(i+1)
  79. pr = sx * pr
  80. x[(n-i)-1,...] = sm + pr * e
  81. s = s - e
  82. j = j - e #change transition table column if required
  83.  
  84. x[n-1,...] = sm + pr * s
  85.  
  86. #iterated in fixed dimension order but needs to be randomised
  87. #permute x row order within each column
  88. for i in range(0,m):
  89. x[...,i] = x[np.random.permutation(n),i]
  90.  
  91. return np.transpose(x)[0];
  92.  
  93. # Generate n x n density operator
  94. def genrho(n):
  95. # Create standard basis of Rn
  96. basis = []
  97. for i in range(n):
  98. vec = []
  99. for j in range(n):
  100. vec.append(kron(i,j))
  101. basis.append(vec)
  102. # Convert to column vectors
  103. basis = [np.array(np.transpose(np.matrix(x))) for x in basis]
  104.  
  105. p = genprob(n) # Generate uniform probability distribution using randfixedsum
  106. U = genunitary(n) # Generate unitary matrix
  107.  
  108. # Create density operator
  109. rho = np.zeros((n,n)).astype(complex)
  110. for i in range(n):
  111. rho += p[i] * mp([U, basis[i], dag(basis[i]), dag(U)])
  112. return rho
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement