|
1 | 1 | from qiskit.circuit import QuantumCircuit |
2 | 2 |
|
3 | 3 |
|
4 | | -def create_Ising_circuit(model, dt, timesteps): |
| 4 | +def create_Ising_circuit(model, dt, timesteps, order=1): |
5 | 5 | 'H = J ZZ + g X' |
6 | 6 |
|
7 | 7 | assert model['name'] == 'Ising' |
| 8 | + L = model['L'] |
| 9 | + circ = QuantumCircuit(L) |
8 | 10 |
|
9 | | - # Angle on X rotation |
10 | | - alpha = -2*dt*model['g'] |
11 | | - # Angle on ZZ rotation |
12 | | - beta = -2*dt*model['J'] |
13 | | - |
14 | | - circ = QuantumCircuit(model['L']) |
15 | 11 | for _ in range(timesteps): |
16 | | - for site in range(model['L']): |
17 | | - circ.rx(theta=alpha, qubit=site) |
18 | | - |
19 | | - for site in range(model['L'] // 2): |
20 | | - circ.rzz(beta, qubit1=2*site, qubit2=2*site+1) |
21 | | - # circ.cx(control_qubit=2*site, target_qubit=2*site+1) |
22 | | - # circ.rz(phi=beta, qubit=2*site+1) |
23 | | - # circ.cx(control_qubit=2*site, target_qubit=2*site+1) |
24 | | - |
25 | | - for site in range(1, model['L'] // 2): |
26 | | - circ.rzz(beta, qubit1=2*site-1, qubit2=2*site) |
27 | | - # circ.cx(control_qubit=2*site-1, target_qubit=2*site) |
28 | | - # circ.rz(phi=beta, qubit=2*site) |
29 | | - # circ.cx(control_qubit=2*site-1, target_qubit=2*site) |
30 | | - |
31 | | - if model['L'] % 2 != 0 and model['L'] != 1: |
32 | | - circ.rzz(beta, qubit1=model['L']-2, qubit2=model['L']-1) |
33 | | - # circ.cx(control_qubit=model['L']-2, target_qubit=model['L']-1) |
34 | | - # circ.rz(phi=beta, qubit=model['L']-1) |
35 | | - # circ.cx(control_qubit=model['L']-2, target_qubit=model['L']-1) |
| 12 | + if order == 1: |
| 13 | + # First-order Trotterization: full X rotation then ZZ interactions. |
| 14 | + for site in range(L): |
| 15 | + circ.rx(theta=-2*dt*model['g'], qubit=site) |
| 16 | + # Even bonds: |
| 17 | + for site in range(L//2): |
| 18 | + circ.rzz(-2*dt*model['J'], qubit1=2*site, qubit2=2*site+1) |
| 19 | + # Odd bonds: |
| 20 | + for site in range(1, L//2): |
| 21 | + circ.rzz(-2*dt*model['J'], qubit1=2*site-1, qubit2=2*site) |
| 22 | + if L % 2 != 0 and L != 1: |
| 23 | + circ.rzz(-2*dt*model['J'], qubit1=L-2, qubit2=L-1) |
| 24 | + |
| 25 | + elif order == 2: |
| 26 | + # Second-order Trotterization: half-step X, then full ZZ, then half-step X. |
| 27 | + half_alpha = -2*dt/2*model['g'] |
| 28 | + # First half-step for X rotations: |
| 29 | + for site in range(L): |
| 30 | + circ.rx(theta=half_alpha, qubit=site) |
| 31 | + # Full-step ZZ interactions (same as before): |
| 32 | + for site in range(L//2): |
| 33 | + circ.rzz(-2*dt*model['J'], qubit1=2*site, qubit2=2*site+1) |
| 34 | + for site in range(1, L//2): |
| 35 | + circ.rzz(-2*dt*model['J'], qubit1=2*site - 1, qubit2=2*site) |
| 36 | + if L % 2 != 0 and L != 1: |
| 37 | + circ.rzz(-2*dt*model['J'], qubit1=L-2, qubit2=L-1) |
| 38 | + # Second half-step for X rotations: |
| 39 | + for site in range(L): |
| 40 | + circ.rx(theta=half_alpha, qubit=site) |
| 41 | + |
| 42 | + else: |
| 43 | + raise ValueError("Unsupported Trotterization order. Choose 1 or 2.") |
36 | 44 |
|
37 | 45 | return circ |
38 | 46 |
|
|
0 commit comments