๐Ÿ” Q# Programming Cheat Sheet for QKD

Master Quantum Key Distribution with Q# Programming
Written by Jullyano Lino

๐ŸŽฏ Overview

This comprehensive cheat sheet covers Q# fundamentals with a specialized focus on Quantum Key Distribution (QKD) protocols like BB84 and E91. Perfect for quantum developers and cryptography enthusiasts.

๐Ÿš€ Your First Q# Program

namespace QKD {
    open Microsoft.Quantum.Core;
    open Microsoft.Quantum.Intrinsic;
    open Microsoft.Quantum.Canon;
    
    @EntryPoint()
    operation Main() : Unit {
        Message("Welcome to Quantum Key Distribution!");
        
        // Your quantum code here
        use qubit = Qubit() {
            H(qubit);                    // Create superposition
            let result = M(qubit);       // Measure qubit
            Message($"Measured: {result}");
            Reset(qubit);                // Always reset!
        }
    }
}
๐Ÿ’ก Key Points:
  • Every Q# program needs a namespace
  • @EntryPoint() marks where execution begins
  • Always Reset() qubits before releasing them
  • Use Message() to print output

๐Ÿ“Š Essential Data Types for QKD

Type Description QKD Usage Example
Qubit Single quantum bit Photon carrying information use q = Qubit();
Qubit[] Array of qubits Multiple photons/qubits use qs = Qubit[4];
Result Measurement outcome Bit values (0 or 1) Zero, One
Bool Classical bit Key bits, basis choices true, false
Int Integer numbers Counters, indices 42, 0, -5
Pauli Measurement basis X-basis, Z-basis PauliX, PauliZ

๐Ÿ”‘ Core Quantum Gates for QKD

State Preparation Gates

// Create |0โŸฉ state (default)
use qubit = Qubit();  // Automatically in |0โŸฉ

// Create |1โŸฉ state
X(qubit);             // Apply NOT gate: |0โŸฉ โ†’ |1โŸฉ

// Create superposition |+โŸฉ = (|0โŸฉ + |1โŸฉ)/โˆš2
H(qubit);             // Hadamard gate

// Create superposition |โˆ’โŸฉ = (|0โŸฉ โˆ’ |1โŸฉ)/โˆš2
X(qubit);
H(qubit);

Measurement Operations

// Standard (Z-basis) measurement: measures |0โŸฉ or |1โŸฉ
let result = M(qubit);

// X-basis measurement: measures |+โŸฉ or |โˆ’โŸฉ
H(qubit);                    // Rotate to Z-basis
let result = M(qubit);       // Then measure

// Check measurement result
if result == Zero {
    Message("Measured 0");
} else {
    Message("Measured 1");
}

๐Ÿ›ก๏ธ BB84 Protocol Implementation

1

Alice Prepares

Random qubits in random bases

2

Bob Measures

Qubits in random bases

3

Compare Bases

Keep matching basis results

4

Extract Key

Shared secret from matches

Step 1: Alice Prepares Random Qubits

operation AlicePrepareQubits(bits : Bool[], bases : Bool[]) : Qubit[] {
    mutable qubits = [];
    
    for i in 0..Length(bits)-1 {
        use qubit = Qubit();
        
        // Prepare bit value (0 or 1)
        if bits[i] {
            X(qubit);  // Prepare |1โŸฉ
        }
        // else qubit is already |0โŸฉ
        
        // Choose basis (false = Z-basis, true = X-basis)
        if bases[i] {
            H(qubit);  // Rotate to X-basis
        }
        
        set qubits += [qubit];
    }
    
    return qubits;
}

Step 2: Bob Measures Qubits

operation BobMeasureQubits(qubits : Qubit[], bases : Bool[]) : Bool[] {
    mutable results = [];
    
    for i in 0..Length(qubits)-1 {
        // Choose measurement basis
        if bases[i] {
            H(qubits[i]);  // Measure in X-basis
        }
        // else measure in Z-basis (default)
        
        let result = M(qubits[i]);
        let bit = result == One;
        set results += [bit];
        
        Reset(qubits[i]);
    }
    
    return results;
}

๐ŸŽฒ Random Number Generation for QKD

operation GenerateRandomBit() : Bool {
    use qubit = Qubit() {
        H(qubit);                    // Create superposition
        let result = M(qubit);       // Random measurement
        Reset(qubit);
        return result == One;        // Convert to Bool
    }
}

operation GenerateRandomBits(count : Int) : Bool[] {
    mutable bits = [];
    for _ in 1..count {
        set bits += [GenerateRandomBit()];
    }
    return bits;
}

๐Ÿ”ง Qubit Management (Very Important!)

โœ… Safe Qubit Usage Pattern

// โœ… CORRECT: Always use this pattern
use qubit = Qubit() {
    // Do quantum operations
    H(qubit);
    let result = M(qubit);
    
    // Reset before automatic release
    Reset(qubit);
}  // Qubit automatically released here

โŒ Common Mistakes to Avoid

// โŒ WRONG: Forgetting to reset
use qubit = Qubit() {
    H(qubit);
    let result = M(qubit);
    // Missing Reset(qubit)!
}

// โŒ WRONG: Using qubit after measurement without reset
let result1 = M(qubit);
H(qubit);  // This might not work as expected!

โšก Quick Reference Card

QKD Workflow

  • Generate random bits and bases
  • Prepare qubits based on bits and bases
  • Transmit qubits (simulation: pass array)
  • Measure qubits with random bases
  • Compare bases publicly
  • Extract key from matching bases
  • Verify key security

Key Q# Patterns

  • use qubit = Qubit() { ... Reset(qubit); }
  • H(qubit) for superposition
  • X(qubit) for bit flip
  • M(qubit) for measurement
  • if result == One { ... }

๐Ÿ”— Required Imports for QKD

open Microsoft.Quantum.Core;          // Basic Q# features
open Microsoft.Quantum.Intrinsic;     // H, X, M gates
open Microsoft.Quantum.Canon;         // Standard operations
open Microsoft.Quantum.Arrays;        // Array manipulation
open Microsoft.Quantum.Convert;       // Type conversions
open Microsoft.Quantum.Math;          // Random numbers
open Microsoft.Quantum.Measurement;   // Advanced measurements

๐Ÿ’ก Pro Tips for QKD Development

Development Best Practices:
  • Start Simple: Begin with 1-2 qubits before scaling up
  • Trace Execution: Print intermediate values to understand flow
  • Test Edge Cases: What if all bases match? None match?
  • Understand Physics: Remember why QKD is secure
Technical Reminders:
  • Reset Everything: Unreset qubits cause mysterious errors
  • Use Simulator: Perfect for learning before real quantum hardware
  • Security First: In real QKD, security comes from quantum mechanics laws, not code complexity!

๐Ÿงช Complete BB84 Example

@EntryPoint()
operation BB84Demo() : Unit {
    let keyLength = 8;  // Short key for demo
    
    Message("=== BB84 Quantum Key Distribution Demo ===");
    
    // 1. Alice generates random bits and bases
    let aliceBits = GenerateRandomBits(keyLength);
    let aliceBases = GenerateRandomBits(keyLength);
    
    Message($"Alice's bits:  {aliceBits}");
    Message($"Alice's bases: {aliceBases}");
    
    // 2. Alice prepares qubits
    let qubits = AlicePrepareQubits(aliceBits, aliceBases);
    
    // 3. Bob chooses random measurement bases
    let bobBases = GenerateRandomBits(keyLength);
    Message($"Bob's bases:   {bobBases}");
    
    // 4. Bob measures qubits
    let bobBits = BobMeasureQubits(qubits, bobBases);
    Message($"Bob's bits:    {bobBits}");
    
    // 5. Extract secret key (matching bases only)
    let secretKey = ExtractSecretKey(aliceBits, bobBits, aliceBases, bobBases);
    
    Message($"Secret key:    {secretKey}");
    Message($"Key length:    {Length(secretKey)} bits");
}

๐Ÿ” Debugging and Testing

Debug Output

// Print variable values
Message($"Current bit: {bit}");
Message($"Key length: {Length(secretKey)}");

// Print arrays
Message($"Alice's key: {aliceKey}");

// Simulator-only: Show quantum state
DumpMachine();  // Shows full quantum state

Testing Your QKD Implementation

operation TestBB84() : Unit {
    // Test with known values
    let testBits = [true, false, true, false];
    let testBases = [false, false, true, true];  // Z, Z, X, X
    
    let qubits = AlicePrepareQubits(testBits, testBases);
    let results = BobMeasureQubits(qubits, testBases);  // Same bases
    
    // Results should match when bases are same
    for i in 0..Length(testBits)-1 {
        if testBits[i] != results[i] {
            Message($"ERROR: Bit {i} doesn't match!");
        }
    }
    
    Message("BB84 test completed!");
}

๐Ÿ“š Essential Library Functions

Array Operations

open Microsoft.Quantum.Arrays;

let length = Length(myArray);           // Get array size
let firstElement = Head(myArray);       // Get first element
let restElements = Tail(myArray);       // Get all but first
let combined = array1 + array2;         // Concatenate arrays

Type Conversions

open Microsoft.Quantum.Convert;

let boolArray = ResultArrayAsBoolArray(results);
let intValue = BoolArrayAsInt(boolArray);
let resultArray = BoolArrayAsResultArray(boolArray);

Math Functions

open Microsoft.Quantum.Math;

let randomFloat = RandomReal();         // Random [0,1)
let randomInt = RandomInt(10);          // Random [0,9]
let squareRoot = Sqrt(4.0);            // = 2.0

๐Ÿ”„ Control Flow Essentials

Variables and Assignment

// Immutable binding (can't change)
let numberOfPhotons = 100;
let secretBit = true;

// Mutable variable (can change)
mutable matchingBases = 0;
set matchingBases = matchingBases + 1;

// Arrays
let aliceBits = [true, false, true, false];
mutable keyBits = [];
set keyBits += [true];  // Add element to array

Loops for Processing Multiple Qubits

// Process array of qubits
for i in 0..Length(qubits)-1 {
    H(qubits[i]);
    let result = M(qubits[i]);
    Message($"Qubit {i}: {result}");
}

// Repeat until condition
mutable attempts = 0;
repeat {
    // Try quantum operation
    set attempts = attempts + 1;
} until attempts >= maxAttempts;

๐Ÿ“ Measurement Patterns for QKD

Basic Measurement

// Single qubit measurement
let bit = M(qubit) == One;

// Multiple qubits at once
let results = MeasureEachZ(qubits);
let bits = ResultArrayAsBoolArray(results);

Basis Selection

operation MeasureInRandomBasis(qubit : Qubit) : (Bool, Bool) {
    let basisChoice = GenerateRandomBit();  // Random basis
    
    if basisChoice {
        H(qubit);  // Measure in X-basis
    }
    // else measure in Z-basis
    
    let measurementResult = M(qubit) == One;
    Reset(qubit);
    
    return (measurementResult, basisChoice);
}

๐ŸŽฏ Suggested Self Tests

Exercise 1: Single Photon

Create a function that prepares a qubit in state |+โŸฉ and measures it in Z-basis.

Exercise 2: Basis Mismatch

Show what happens when Alice prepares in X-basis but Bob measures in Z-basis.

Exercise 3: Eavesdropping Detection

Implement a simple eavesdropping detection by comparing error rates.

Exercise 4: Mini BB84

Implement BB84 with 4 qubits and trace through the entire protocol.

๐ŸŽ“ Remember

In real QKD, security comes from quantum mechanics laws, not code complexity!

Perfect for GitHub Pages deployment โ€ข Optimized for learning and reference

Home