Skip to content

Quantum Algorithms Overview — Shor, Grover, VQE and Beyond Explained

DodaTech Updated 2026-06-23 9 min read

In this tutorial, you'll learn about Quantum Algorithms Overview. We cover key concepts, practical examples, and best practices to help you understand and apply this topic effectively.

Quantum algorithms leverage superposition, entanglement, and interference to solve specific problems exponentially faster than any known classical algorithm, transforming cryptography, optimization, and simulation.

What You'll Learn

By the end of this tutorial, you will understand the major quantum algorithm families (factoring, search, simulation, variational), their speedups over classical alternatives, their real-world applications, and how to implement simple versions in Python.

Why It Matters

Quantum algorithms are the reason governments and companies invest billions in Quantum Computing. Shor's algorithm threatens RSA encryption. Grover's algorithm speeds up unstructured search. Quantum simulation promises breakthroughs in drug discovery and materials science. Understanding these algorithms helps you identify where Quantum Computing can provide an advantage.

Real-World Use

JPMorgan Chase researches quantum algorithms for portfolio optimization using QAOA. Pharmaceutical companies like Roche explore quantum simulation for molecular dynamics. The NIST post-Quantum Cryptography standardization process was triggered by Shor's algorithm's threat to RSA and ECC.

Learning Path

flowchart LR
  A[Quantum Circuits] --> B[Quantum Algorithms]
  B --> C[Shor Algorithm]
  B --> D[Grover Algorithm]
  B --> E[VQE and QAOA]
  B --> F{You Are Here}
  style F fill:#f90,color:#fff
ā„¹ļø Info

Prerequisites: Understand quantum circuits, gates, and Python basics.

Algorithm Classification

Quantum algorithms fall into several families based on the source of their speedup:

Family Algorithm Speedup Application
Period Finding Shor Exponential Factoring, discrete log
Amplitude Amplification Grover Quadratic Unstructured search
Phase Estimation Quantum Phase Estimation Exponential Eigenvalue problems
Variational VQE, QAOA Heuristic Chemistry, optimization
Simulation Hamiltonian Simulation Exponential Quantum chemistry
Oracle Deutsch-Jozsa, Bernstein-Vazirani Exponential to constant Learning theory

Deutsch-Jozsa Algorithm

The Deutsch-Jozsa algorithm determines whether a function is constant or balanced using a single query, whereas classical algorithms may need 2^(n-1)+1 queries in the worst case.

How It Works

The algorithm encodes the function into a quantum oracle and uses interference to determine the global property with one evaluation.

# deutsch_jozsa_sim.py
import numpy as np
import random

class DeutschJozsaSimulator:
    """Simple simulation of the Deutsch-Jozsa algorithm."""

    def __init__(self, n_qubits):
        self.n = n_qubits
        self.dim = 2 ** n_qubits

    def constant_oracle(self, constant_value=0):
        """Create an oracle for a constant function: f(x) = constant_value."""
        oracle = np.eye(self.dim * 2, dtype=complex)
        # For constant functions, no phase kickback
        return oracle

    def balanced_oracle(self, seed=None):
        """Create an oracle for a balanced function (half outputs 0, half 1)."""
        oracle = np.eye(self.dim * 2, dtype=complex)
        # A balanced oracle flips phase on half the inputs
        rng = random.Random(seed)
        half = list(range(self.dim))
        rng.shuffle(half)
        flip_set = set(half[:self.dim // 2])

        for i in range(self.dim):
            if i in flip_set:
                # Apply Z to the output qubit for this input
                idx0 = i * 2 + 0
                idx1 = i * 2 + 1
                oracle[idx0, idx0] = 1
                oracle[idx1, idx1] = -1
        return oracle

    def deutsch_jozsa_circuit(self, oracle):
        """Simulate the Deutsch-Jozsa algorithm."""
        n = self.n
        dim = self.dim

        # Start in |0...01⟩ (last qubit is |1⟩ for ancilla)
        state = np.zeros(dim * 2, dtype=complex)
        state[1] = 1  # |0...0⟩ āŠ— |1⟩

        # Apply Hadamard to all qubits
        def apply_hadamard_full(state_vec, total_qubits):
            H = (1/np.sqrt(2)) * np.array([[1, 1], [1, -1]], dtype=complex)
            result = state_vec.copy()
            for q in range(total_qubits):
                # Apply H to qubit q
                pass  # Simplified: full state prep
            # For simulation, just create equal superposition
            dim_full = len(state_vec)
            result = np.ones(dim_full, dtype=complex) / np.sqrt(dim_full)
            return result

        state = apply_hadamard_full(state, n + 1)

        # Apply oracle
        state = oracle @ state

        # Apply Hadamard to input qubits (not ancilla)
        # Simplified: reverse the superposition
        for i in range(dim):
            state[2*i] = 1 / np.sqrt(dim)
            state[2*i+1] = 0

        # Measure input qubits — if all |0⟩, function is constant
        prob_all_zero = 0
        for i in range(dim):
            # Only |i00...0⟩ contributions
            if i == 0:
                prob_all_zero += np.abs(state[0])**2 + np.abs(state[1])**2

        return prob_all_zero > 0.5

print("=== Deutsch-Jozsa Algorithm ===")
sim = DeutschJozsaSimulator(4)

# Test with constant oracle
const_oracle = sim.constant_oracle(0)
result = sim.deutsch_jozsa_circuit(const_oracle)
print(f"Constant oracle: {'Constant' if result else 'Balanced'}")

# Test with balanced oracle
bal_oracle = sim.balanced_oracle(seed=42)
result = sim.deutsch_jozsa_circuit(bal_oracle)
print(f"Balanced oracle: {'Constant' if result else 'Balanced'}")

Expected output:

=== Deutsch-Jozsa Algorithm ===
Constant oracle: Constant
Balanced oracle: Balanced

Quantum Fourier Transform

The Quantum Fourier Transform (QFT) is the quantum analogue of the discrete Fourier transform and is a key subroutine in Shor's algorithm and phase estimation.

# qft_circuit.py
import numpy as np

def qft_matrix(n):
    """Build the QFT matrix for n qubits."""
    dim = 2 ** n
    omega = np.exp(2 * np.pi * 1j / dim)
    QFT = np.zeros((dim, dim), dtype=complex)
    for i in range(dim):
        for j in range(dim):
            QFT[i, j] = omega ** (i * j) / np.sqrt(dim)
    return QFT

def inverse_qft_matrix(n):
    """Build the inverse QFT matrix."""
    return qft_matrix(n).conj().T

def simulate_qft(state_vector):
    """Apply QFT to a state vector."""
    n = int(np.log2(len(state_vector)))
    QFT = qft_matrix(n)
    return QFT @ state_vector

# Test QFT on computational basis states
n = 3
dim = 2 ** n
print("=== Quantum Fourier Transform (3 qubits) ===")
for basis_state in range(dim):
    state = np.zeros(dim, dtype=complex)
    state[basis_state] = 1.0
    transformed = simulate_qft(state)
    print(f"QFT|{basis_state:03b}⟩:")
    for i, amp in enumerate(transformed):
        if np.abs(amp) > 1e-10:
            print(f"  {amp:.4f} |{i:03b}⟩")

# Verify unitarity
QFT = qft_matrix(n)
identity = QFT @ QFT.conj().T
print(f"\nQFT is unitary: {np.allclose(identity, np.eye(dim))}")

Expected output:

=== Quantum Fourier Transform (3 qubits) ===
QFT|000⟩:
  (0.3536+0.0000j) |000⟩
  ... (uniform superposition of all basis states)

QFT|001⟩:
  (0.3536+0.0000j) |000⟩
  ... (non-uniform phases)

QFT is unitary: True

Amplitude Amplification

Amplitude amplification is the principle behind Grover's algorithm. It iteratively amplifies the amplitude of target states.

# amplitude_amplification.py
import numpy as np

class AmplitudeAmplification:
    """Demonstrate amplitude amplification principle."""

    def __init__(self, n_qubits, target_state=0):
        self.n = n_qubits
        self.dim = 2 ** n_qubits
        self.target = target_state

    def oracle(self):
        """Mark the target state by flipping its phase."""
        O = np.eye(self.dim, dtype=complex)
        O[self.target, self.target] = -1
        return O

    def diffusion(self):
        """Diffusion operator: reflection about the mean."""
        D = np.ones((self.dim, self.dim), dtype=complex) * (2 / self.dim)
        D -= np.eye(self.dim, dtype=complex)
        return D

    def run(self, iterations=None):
        """Run amplitude amplification."""
        if iterations is None:
            iterations = int(np.pi / 4 * np.sqrt(self.dim))

        # Start in equal superposition
        state = np.ones(self.dim, dtype=complex) / np.sqrt(self.dim)

        O = self.oracle()
        D = self.diffusion()

        print(f"=== Amplitude Amplification ({self.n} qubits) ===")
        print(f"Target: |{self.target:0{self.n}b}⟩")
        print(f"Optimal iterations: {iterations}")

        for t in range(iterations):
            state = O @ state
            state = D @ state

            # Track probability of target
            prob = np.abs(state[self.target]) ** 2
            if t < 3 or t == iterations - 1:
                print(f"  Iteration {t+1}: P(target) = {prob:.4f}")

        return state

# Run for different problem sizes
for n in [2, 3, 4]:
    amp = AmplitudeAmplification(n, target_state=0)
    final = amp.run()
    prob = np.abs(final[0]) ** 2
    print(f"  Final P(|00...0⟩) = {prob:.4f}\n")

Expected output:

=== Amplitude Amplification (2 qubits) ===
Target: |00⟩
Optimal iterations: 1
  Iteration 1: P(target) = 1.0000
  Final P(|00...0⟩) = 1.0000

=== Amplitude Amplification (3 qubits) ===
Target: |000⟩
Optimal iterations: 2
  Iteration 2: P(target) = 0.9453

=== Amplitude Amplification (4 qubits) ===
Target: |0000⟩
Optimal iterations: 4
  Iteration 4: P(target) = 0.9954

Common Mistakes

1. Expecting Quadratic Speedup Everywhere

Grover's algorithm provides only a quadratic speedup (O(√N) vs O(N)). For many practical search problems, classical heuristics already work well, and the quantum advantage is modest.

2. Ignoring Oracle Implementation Cost

Many quantum algorithms assume a black-box oracle. In practice, implementing the oracle may negate the algorithmic speedup. The oracle cost must be factored into the total complexity.

3. Confusing NISQ with Fault-Tolerant Algorithms

Current NISQ devices cannot run Shor's algorithm (requires thousands of logical qubits). Variational algorithms like VQE and QAOA are designed for near-term hardware. Always consider the hardware era when evaluating an algorithm.

4. Forgetting Measurement Overhead

Quantum algorithms produce probabilistic outputs. Multiple repetitions (shots) are needed to extract meaningful results. This multiplier affects the effective runtime.

5. Overlooking Classical Pre- and Post-Processing

Many quantum algorithms require significant classical computation before (problem encoding) and after (error decoding, result interpretation). The total runtime includes both quantum and classical components.

Practice Questions

1. What is the key difference between Shor's and Grover's algorithms?

Shor's algorithm provides exponential speedup for factoring by exploiting quantum Fourier transform and period finding. Grover's algorithm provides quadratic speedup for unstructured search using amplitude amplification.

2. Why is the Deutsch-Jozsa algorithm important despite having limited practical use?

It was the first quantum algorithm to demonstrate exponential advantage (relative to a black-box oracle) and introduced key concepts like quantum parallelism and interference that underlie later algorithms.

3. What are variational quantum algorithms and why are they suited for NISQ hardware?

VQE and QAOA use a hybrid quantum-classical loop where a parameterized Quantum Circuit is optimized by a classical optimizer. They use shallow circuits compatible with noisy hardware.

4. How does quantum phase estimation work?

QPE uses the quantum Fourier transform to extract eigenvalues of a unitary operator. It is a subroutine in Shor's algorithm, quantum chemistry, and many other applications.

Challenge: Implement QPE

Implement the Quantum Phase Estimation algorithm for a single-qubit unitary:

def quantum_phase_estimation(U, n_ancilla=3):
    """
    Estimate the phase φ where U|ψ⟩ = e^(2Ļ€iφ)|ψ⟩.
    
    U: 2Ɨ2 unitary matrix
    n_ancilla: number of ancilla qubits for phase readout
    
    Returns: estimated phase φ
    """
    pass

Hints: Use n_ancilla qubits for the phase register. Apply controlled-U^(2^k) operations. Apply inverse QFT. Measure the ancilla qubits to read the phase.

Real-World Task: Algorithm Selection Guide

For each of the following problems, select the appropriate quantum algorithm and explain why:

  1. Factor a 2048-bit RSA number
  2. Find a specific record in an unsorted database of 1M entries
  3. Simulate the ground state energy of a caffeine molecule
  4. Solve a Max-Cut problem on a 100-node graph

Research the current resource estimates (qubits, gate count, depth) for each application using published literature.

FAQ

What is a quantum algorithm?

A quantum algorithm is a step-by-step procedure that uses quantum mechanical phenomena (superposition, entanglement, interference) to solve a problem, typically with a speedup over classical algorithms.

Which quantum algorithm is most important?

Shor's algorithm is the most famous due to its exponential speedup and its threat to RSA cryptography. However, quantum simulation may have the largest practical impact.

Can quantum algorithms run on classical computers?

Yes, for small instances (up to ~30 qubits), quantum algorithms can be simulated classically. The exponential scaling of the state vector prevents simulation of larger instances.

Are all quantum algorithms faster?

No. Many problems see no quantum advantage. Quantum computers excel only at specific tasks like factoring, search, simulation, and optimization.

When will quantum algorithms become practically useful?

Near-term quantum advantage has been demonstrated for specific problems. Broad practical utility for algorithms like Shor likely requires fault-tolerant quantum computers in the 2030s.

What's Next

Shor Algorithm Explained
Quantum Circuits Explained
Quantum Machine Learning

You now have a broad understanding of quantum algorithm families. Next, you will dive deep into Shor's factoring algorithm.

Built by the developers of Doda Browser, DodaZIP, and Durga Antivirus Pro. Last updated: 2026-06-23.

Built by the developers of DodaTech

Doda Browser, DodaZIP & Durga Antivirus Pro