File size: 2,118 Bytes
98d5347 | 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 | //
// Copyright (c) 2026 BEL ESPRIT D ACCORD TRUST HOLDINGS INC
// All rights reserved.
// BlackHoleEngine/Quantinuum.qs
// Hardware-specific: Quantinuum H1/H2 (all-to-all, native ZZ)
namespace BlackHoleEngine.Quantinuum {
open Microsoft.Quantum.Intrinsic;
open Microsoft.Quantum.Canon;
open BlackHoleEngine.Primitives;
operation QuantinuumXX(q1 : Qubit, q2 : Qubit, theta : Double) : Unit is Adj + Ctl {
within {
H(q1); H(q2);
} apply {
Exp([PauliZ, PauliZ], theta, [q1, q2]);
}
}
operation QuantinuumHaydenPreskill(
qubits : Qubit[],
scrambleTime : Double,
couplings : Double[][],
fields : Double[]
) : Unit is Adj + Ctl {
let n = Length(qubits);
let dt = scrambleTime / 5.0;
let steps = 5;
for _ in 1..steps {
for i in 0..n-1 {
Rz(2.0 * fields[i] * dt, qubits[i]);
}
for layer in GetXXLayers(n, couplings) {
for (i, j) in layer {
let J = couplings[i][j];
if (AbsD(J) > 1e-10) {
QuantinuumXX(qubits[i], qubits[j], 2.0 * J * dt);
}
}
}
}
}
operation QuantinuumLindbladStep(
ancilla : Qubit,
qubits : Qubit[],
viol : ViolatingAssignment,
gamma_dt : Double
) : Unit {
let sqrt_gamma = Sqrt(gamma_dt);
let theta = 2.0 * Arcsin(sqrt_gamma);
Ry(theta, ancilla);
let (va, vb, vc) = viol;
if (va) { X(qubits[0]); }
if (vb) { X(qubits[1]); }
if (vc) { X(qubits[2]); }
// Quantinuum has high-fidelity CCZ
CCZ(ancilla, qubits[0], qubits[1]);
CCZ(ancilla, qubits[0], qubits[2]);
CCZ(ancilla, qubits[1], qubits[2]);
if (va) { X(qubits[0]); }
if (vb) { X(qubits[1]); }
if (vc) { X(qubits[2]); }
let outcome = M(ancilla);
Reset(ancilla);
}
}
|