pyqpanda_alg.HHL

The HHL algorithm(Harrow - Hassidim - Lloyd algorithm) is a quantumThe HHL algorithm(Harrow - Hassidim - Lloyd algorithm) is a quantum computing algorithm used to solve linear equations. The algorithm takes advantage of the parallelism and entanglement of qubits and can solve linear equation sets faster than classical computers in certain cases.

Submodules

Functions

build_HHL_circuit(matrix_A, data_b[, precision_cnt])

Build the quantum circuit for HHL algorithm to solve the target linear systems of equations \(Ax = b\)

HHL_solve_linear_equations(matrix_A, data_b[, ...])

Use HHL algorithm to solve the target linear systems of equations \(Ax = b\)

expand_linear_equations(matrix_A, data_b)

Extending linear equations to \(N\) dimension, \(N = 2^n\)

Package Contents

pyqpanda_alg.HHL.build_HHL_circuit(matrix_A: List[complex], data_b: List[float], precision_cnt: int = 0)

Build the quantum circuit for HHL algorithm to solve the target linear systems of equations \(Ax = b\)

Parameters

matrix_A : list

Parameter matrix_A for a unitary matrix or Hermitian \(N*N\) matrix with \(N = 2^n\)

data_b : list

Parameter matrix_A for a given vector

precision_cnt : integer

Parameter precision_cnt for the count of digits after the decimal point, default is 0, indicates that there are only integer solutions

Return

QCircuit : QCircuit

The whole quantum circuit for HHL algorithm

Example

Run a build HHL algorithm circuit of solving problem \(Ax = b\) with \(A = [[1, 0], [0, 1]]\) and \(b = [0.6, 0.8]^T\).

#!/usr/bin/env python
from pyqpanda_alg.HHL import build_HHL_circuit

if __name__ == "__main__":

    A=[1.0, 0, 0, 1.0]
    b=[0.6, 0.8]
    prog = build_HHL_circuit(A, b, 1)
    print(prog)

The output result should be identical to the right-hand side vector, which is \([0.6,0.8]\), with the imaginary component set to 0. Small perturbations may introduce minor errors.

          ┌──────────────┐ ┌──────┐ ┌──────┐ ┌──────┐ ┌──────┐ ┌──────┐ ┌──────┐                                                          >
q_0:  |0>─┤RY(1.85459044)├ ┤ORACLE├ ┤ORACLE├ ┤ORACLE├ ┤ORACLE├ ┤ORACLE├ ┤ORACLE├ ─────── ──────────────────── ─────────────────────────── >
          ├─┬────────────┘ └───┬──┘ └───┬──┘ └───┬──┘ └───┬──┘ └───┬──┘ └───┬──┘ ┌─────┐                                                  >
q_1:  |0>─┤H├───────────── ────┼─── ────┼─── ────┼─── ────┼─── ────┼─── ────*─── ┤H.dag├ ──────────*───────── ─────────────────*───────── >
          ├─┤                  │        │        │        │        │             └─────┘ ┌─────────┴────────┐ ┌─────┐          │          >
q_2:  |0>─┤H├───────────── ────┼─── ────┼─── ────┼─── ────┼─── ────*─── ──────── ─────── ┤CP(1.57079633).dag├ ┤H.dag├──────────┼───────── >
          ├─┤                  │        │        │        │                              └──────────────────┘ └─────┘┌─────────┴────────┐ >
q_3:  |0>─┤H├───────────── ────┼─── ────┼─── ────┼─── ────*─── ──────── ──────── ─────── ──────────────────── ───────┤CP(0.78539816).dag├ >
          ├─┤                  │        │        │                                                                   └──────────────────┘ >
q_4:  |0>─┤H├───────────── ────┼─── ────┼─── ────*─── ──────── ──────── ──────── ─────── ──────────────────── ─────────────────────────── >
          ├─┤                  │        │                                                                                                 >
q_5:  |0>─┤H├───────────── ────┼─── ────*─── ──────── ──────── ──────── ──────── ─────── ──────────────────── ─────────────────────────── >
          ├─┤                  │                                                                                                          >
q_6:  |0>─┤H├───────────── ────*─── ──────── ──────── ──────── ──────── ──────── ─────── ──────────────────── ─────────────────────────── >
          └─┘                                                                                                                             >
q_7:  |0>───────────────── ──────── ──────── ──────── ──────── ──────── ──────── ─────── ──────────────────── ─────────────────────────── >
                                                                                                                                          >
c :   / ════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════
... ...

Note

The higher the precision is, the more qubit number and circuit - depth will be, for example: 1 - bit precision, 4 additional qubits are required, for 2 - bit precision, we need 7 additional qubits, and so on. The final solution = (HHL result) * (normalization factor for b) * (1 << ceil(log2(pow(10, precision_cnt)))).

pyqpanda_alg.HHL.HHL_solve_linear_equations(matrix_A: List[complex], data_b: List[float], precision_cnt: int = 0)

Use HHL algorithm to solve the target linear systems of equations \(Ax = b\)

Parameters

matrix_A : list

Parameter matrix_A for a unitary matrix or Hermitian \(N*N\) matrix with \(N = 2^n\)

data_b : list

Parameter matrix_A for a given vector

precision_cnt : integer

Parameter precision_cnt for the count of digits after the decimal point, default is 0, indicates that there are only integer solutions.

Return

QStat : list

The solution of equation, i.e.x for \(Ax = b\)

Example

Run a HHL algorithm circuit of solving problem \(Ax = b\) with \(A = [[1, 0], [0, 1]]\) and \(b = [0.6, 0.8]^T\).

#!/usr/bin/env python
import numpy as np
from pyqpanda_alg.HHL import HHL_solve_linear_equations

if __name__ == "__main__":

    A=[1,0,0,1]
    b=[0.6,0.8]
    result = HHL_solve_linear_equations(A,b,1)

    # print HHL result
    for key in result:
        print(key)

The output result should be identical to the right-hand side vector, which is \([0.6,0.8]\), with the imaginary component set to 0. Small perturbations may introduce minor errors.

(0.5999999999999998+0j)
(0.7999999999999994+0j)

Note

The higher the precision is, the more qubit number and circuit - depth will be, for example: 1 - bit precision, 4 additional qubits are required, for 2 - bit precision, we need 7 additional qubits, and so on.

pyqpanda_alg.HHL.expand_linear_equations(matrix_A: List[complex], data_b: List[float])

Extending linear equations to \(N\) dimension, \(N = 2^n\)

Parameters

matrix_A : list

Parameter matrix_A for a source matrix, which will be extend to \(N*N\) with \(N = 2^n\)

data_b : list

Parameter matrix_A for a given vector, which will be extend to \(2^n\)

Return

Result : list

The list of matrix and vector, which are extended

Example

Run Extending linear equations to \(N\) dimension, \(N = 2^n\) with \(A = [[2.0, 1.0, 0], [1.0, 2.0, 1.0], [0, 1.0, 2.0]]\) and \(b = [1.0, 1.0, 1.0]^T\).

#!/usr/bin/env python
from pyqpanda_alg.HHL import expand_linear_equations

if __name__ == "__main__":

    A = [2.0, 1.0, 0, 1.0, 2.0, 1.0, 0, 1.0, 2.0]
    b = [1.0, 1.0, 1.0]
    result = expand_linear_equations(A, b)
    print(result[0])
    print(result[1])

The codes above would give results like:

[(2+0j), (1+0j), 0j, 0j, (1+0j), (2+0j), (1+0j), 0j, 0j, (1+0j), (2+0j), 0j, 0j, 0j, 0j, 0j]
[1.0, 1.0, 1.0, 0.0]