Tôi cũng đang làm việc về vấn đề này. Là người mới bắt đầu và là một lập trình viên cổ điển (nghĩa là tôi không nói Cơ học lượng tử), thật khó để hiểu được các khái niệm mà không có ví dụ hoàn chỉnh. Tôi đã làm việc với mẫu Tìm kiếm cơ sở dữ liệu của Microsoft Q # . Nó chỉ đơn giản là tìm kiếm một chỉ mục / khóa cụ thể trong cơ sở dữ liệu, không hữu ích lắm. Tôi đã mở rộng dựa trên mẫu đó để tìm kiếm danh sách các giá trị trong cơ sở dữ liệu và trả về khóa tương ứng.
Như với ví dụ của bạn, có một "thanh ghi khóa" hai qubit cho các chỉ mục và một thanh ghi hai qubit riêng cho các giá trị. Ngoài ra còn có một "qubit được đánh dấu" thứ năm đến từ mẫu của Microsoft, để cho biết khi nào tìm thấy giá trị mong muốn. Các khóa và giá trị được liên kết thông qua sự vướng víu. Điều đó được thể hiện tốt nhất với một mạch. Nhấn vào đây để xem mạch Quirk thực tế .
Lưu ý rằng mạch này chỉ chứa các lời tiên tri. Nó không thực hiện tất cả các thuật toán của Grover.
- Hai qubit trên cùng là thanh ghi chính, hai qubit tiếp theo là thanh ghi giá trị và qubit dưới cùng là qubit được đánh dấu.
- Phần đầu tiên đặt thanh ghi khóa vào vị trí chồng đồng nhất bằng cách sử dụng cổng Haramard, theo yêu cầu của thuật toán Grover.
- Phần thứ hai là nơi các khóa được liên kết với các giá trị thông qua sự vướng víu. Mỗi khóa được vướng với một giá trị tương ứng trong thanh ghi giá trị bằng cách áp dụng các cổng X được điều khiển (Chống). Vì vậy, khi thanh ghi khóa là 0, thì thanh ghi giá trị sẽ được đặt thành 3. Khi khóa là 1, giá trị được đặt thành 2, v.v.
- Phần thứ ba của mạch là nhà tiên tri tìm kiếm. Thanh ghi giá trị bị vướng với qubit được đánh dấu. Trong ví dụ này, giá trị mong muốn là 2. Khi thanh ghi giá trị chứa 2, qubit được đánh dấu sẽ được đặt thành 1.
- Thuật toán của Grover xem xét thanh ghi khóa và qubit được đánh dấu. Nhà tiên tri tìm kiếm nhìn vào thanh ghi giá trị và đặt qubit được đánh dấu. Điều này sẽ khiến khóa 1 được khuếch đại khi giá trị là 2.
Thật thú vị khi lưu ý rằng các khóa và giá trị không được lưu trữ trong các qubit, mà là trong mạch / chương trình. Bạn có thể nói nó không thực sự là một cơ sở dữ liệu. Nó giống như một câu lệnh chuyển đổi / trường hợp, nhưng một câu lệnh có thể chạy trên sự chồng chất của các giá trị.
Để biết thêm chi tiết, hãy cẩn thận và mã Q #, xem kho GitHub của tôi .
EDIT: Một cái gì đó tôi hiểu rõ hơn kể từ khi trả lời ... bạn phải đảo ngược / hoàn tác mạch như một phần của mỗi lần lặp. Trong mã Q #, lệnh gọi Adjoint StatePreparationOracle () trong hoạt động ReflectStart () xử lý việc này, vì vậy tôi không phải thực hiện một cách rõ ràng. Tôi không biết nếu Qiskit có một tính năng tương tự. Nếu tôi đã thực hiện đúng bản dịch, đây là một mạch hoàn chỉnh cho ví dụ trên.