diff options
Diffstat (limited to 'tester/src/main.rs')
| -rw-r--r-- | tester/src/main.rs | 91 |
1 files changed, 82 insertions, 9 deletions
diff --git a/tester/src/main.rs b/tester/src/main.rs index 2c2e72c..96fc86f 100644 --- a/tester/src/main.rs +++ b/tester/src/main.rs @@ -1,15 +1,88 @@ use libpsi_core::*; fn main() { - let quantum_registers = [ - QuantumRegister::new("qr0", &["q0", "q1", "q2", "q3"]), - QuantumRegister::new("qr1", &["k0", "k1", "k2", "k3"]), - ]; + println!("Bell State Creation: |Φ+⟩ = (|00⟩ + |11⟩)/√2"); + println!(" Circuit: H(q0) → CNOT(q0, q1)"); + let mut bell = QuantumCircuit::new(2); + bell.h(0).cnot(0, 1); + println!("{}", bell); - let classical_registers = [ - ClassicalRegister::new("cr0", &["c0", "c1", "c2", "c3"]), - ClassicalRegister::new("cr1", &["a0", "a1", "a2", "a3"]), - ]; + print!("\n------\n\n"); - QuantumCircuit::new(&quantum_registers, &classical_registers); + println!("GHZ State (3-qubit entanglement): |GHZ> = (|000⟩ + |111⟩)/√2"); + println!(" Circuit: H(q0) → CNOT(q0, q1) → CNOT(q0, q2)"); + let mut ghz = QuantumCircuit::new(3); + ghz.h(0).cnot(0, 1).cnot(0, 2); + println!("{}", ghz); + + print!("\n------\n\n"); + + println!("SWAP via 3 CNOTs"); + println!(" Start with |10>, apply CNOT chain"); + let mut swap_circuit = QuantumCircuit::new(2); + swap_circuit + .x(0) // Set to |10⟩ + .cnot(0, 1) + .cnot(1, 0) + .cnot(0, 1); + println!("{}", swap_circuit); + + print!("\n------\n\n"); + + println!("Toffoli Gate (Reversible AND)"); + println!(" CCNOT flips q2 only when q0=1 AND q1=1"); + let mut toffoli_circuit = QuantumCircuit::new(3); + toffoli_circuit + .x(0) + .x(1) // Set to |110⟩ + .toffoli(0, 1, 2); + println!("{}", toffoli_circuit); + + print!("\n------\n\n"); + + println!("Fredkin Gate (Controlled SWAP)"); + println!(" CSWAP swaps q1 and q2 only when q0=1"); + let mut fredkin_circuit = QuantumCircuit::new(3); + fredkin_circuit + .x(0) + .x(1) // Set to |110⟩ + .fredkin(0, 1, 2); + println!("{}", fredkin_circuit); + + print!("\n------\n\n"); + + println!("6. Non-contiguous CNOT (q0 controls q2, skipping q1)"); + let mut nc_circuit = QuantumCircuit::new(3); + nc_circuit + .x(0) // |100⟩ + .cnot(0, 2); // CNOT with control=q0, target=q2 + println!("{}", nc_circuit); + + print!("\n------\n\n"); + + println!("Full Superposition (H on all qubits)"); + let mut super_circuit = QuantumCircuit::new(3); + super_circuit.h(0).h(1).h(2); + println!("{}", super_circuit); + + print!("\n------\n\n"); + + println!("Probability Test"); + let mut prob_circuit = QuantumCircuit::new(2); + prob_circuit.h(0).cnot(0, 1); + println!(" Bell state probabilities:"); + let probs = prob_circuit.probabilities(); + for (i, p) in probs.iter().enumerate() { + if *p > 1e-10 { + println!(" |{:02b}⟩: {:.4}", i, p); + } + } + println!(); + + print!("\n------\n\n"); + + println!("Complex Circuit with Method Chaining"); + let mut complex = QuantumCircuit::new(4); + complex.h(0).h(1).cnot(0, 2).cnot(1, 3).cz(2, 3).swap(0, 1); + println!("{}", complex); } |
