Grover-Algorithm은 데이터베이스에 어떻게 적용됩니까?


12

질문

Grover-Algorithm을 사용하여 정렬되지 않은 데이터베이스에서 x 요소를 검색하고 싶습니다 . 이제 질문이 발생하는데 어떻게 qubits로 데이터베이스의 인덱스와 값을 초기화합니까?

  • 4 큐 비트 가 있다고 가정 해 봅시다 . 따라서 24=16 클래식 값을 매핑 할 수 있습니다.
  • 정렬되지 않은 데이터베이스 d 에는 다음 요소가 있습니다. d[Value]=[3,2,0,1] .
  • 내가 검색 할 x=2d=10b=|10 .
  • 내 접근 방식 : d [ ( Index, Value ) ] = [ ( 0 , 3 ) , ( 1 , 2 ) , ( 2 , 0 ) , ( 3 , 1 ) ]으로 데이터베이스 d 를 인덱싱하십시오 . 레지스터 01 인덱스 레지스터에 대해 23 의 값에 대한. 그런 다음 Grover-Algorithm을 레지스터 23 에만 적용하십시오 ( Valued[(Index, Value)]=[(0,3),(1,2),(2,0),(3,1)]012323(Value) . 이것이 실현 될 수 있습니까? 다른 접근법이 있습니까?

내가 이미 구현 한 것 ( GitHub에서 )

"2-, 3-, 4-Qubits가 포함 된 그루버 알고리즘"은 간단하지만 비트는 |0 오라클 내 용액 마크 것이다 x (다만 번호처럼 2d=10b 는 그로버 부는 상기 선택된 요소의 확률 증가) x 다른 모든 확률이 감소하고 큐빗이 됨으로써 판독을 클래식 비트에 매핑됩니다. 우리는이 과정을 연속적으로 실행을 여러 번 할 수있어 가장 높은 확률은 우리의 추구 요소가 확률 분포, 얻을 수 x .

출력은 항상 오라클에 표시된 것과 동일합니다. 오라클을 구축 할 당시에 알지 못한 출력에서 ​​더 많은 정보를 어떻게 생성 할 수 있습니까?

답변:


9

나는이 문제에 대해서도 노력하고 있습니다. 초보자이자 고전 프로그래머 (즉, Quantum Mechanics를 말하지 않음)로서 완전한 예제없이 개념을 이해하기는 어렵습니다. 나는 함께 일한지 마이크로 소프트 Q # 데이터베이스 검색 샘플 . 단순히 데이터베이스에서 특정 인덱스 / 키를 검색하기 때문에 그다지 유용하지 않습니다. 해당 샘플을 확장하여 데이터베이스에서 값 목록을 검색하고 해당 키를 반환했습니다.

귀하의 예와 같이, 인덱스에 대한 2 큐 비트 "키 레지스터"와 값에 대한 별도의 2 큐 비트 레지스터가 있습니다. 원하는 값을 찾을 수있는 시점을 표시하기 위해 Microsoft 샘플에서 제공되는 다섯 번째 "표시된 qubit"도 있습니다. 키와 값은 얽힘을 통해 연결됩니다. 그것은 회로로 가장 잘 설명됩니다. 실제 Quirk 회로를 보려면 여기를 클릭하십시오 .

키 / 값 오라클 회로

이 회로에는 오라클 만 포함되어 있습니다. 모든 Grover 알고리즘을 구현하지는 않습니다.

  • 맨 위 두 큐비 트는 키 레지스터이고 다음 두 큐빗은 값 레지스터이며 맨 아래 큐빗은 표시된 큐 비트입니다.
  • 첫 번째 섹션은 Grover 알고리즘에 따라 Haramard 게이트를 사용하여 키 레지스터를 균일 한 중첩으로 배치합니다.
  • 두 번째 섹션은 키가 얽힘을 통해 값과 연결되는 위치입니다. 각 키는 (Anti-) Controlled X 게이트를 적용하여 값 레지스터에 해당 값과 얽혀 있습니다. 따라서 키 레지스터가 0이면 값 레지스터가 3으로 설정됩니다. 키가 1이면 값이 2로 설정됩니다.
  • 회로의 세 번째 섹션은 검색 오라클입니다. 값 레지스터는 표시된 qubit와 얽혀 있습니다. 이 예에서 원하는 값은 2입니다. 값 레지스터에 2가 포함되어 있으면 표시된 qubit가 1로 설정됩니다.
  • Grover의 알고리즘은 키 레지스터와 표시된 qubit를 봅니다. 검색 오라클은 값 레지스터를보고 표시된 큐 비트를 설정합니다. 값이 2 일 때 키 1이 증폭됩니다.

키와 값이 큐 비트에 저장되는 것이 아니라 회로 / 프로그램에 저장된다는 점에 주목하는 것이 흥미 롭습니다. 실제로 데이터베이스 자체가 아니라고 말할 수 있습니다. switch / case 문과 비슷하지만 중첩 된 값에서 실행될 수 있습니다.

자세한 내용, 경고 및 Q # 코드는 내 GitHub 리포지토리를 참조하십시오 .

편집 : 대답 후 내가 더 잘 이해하는 것 ... 각 반복의 일부로 회로를 반전 / 취소해야합니다. Q # 코드에서 ReflectStart () 작업 내의 Adjoint StatePreparationOracle () 호출이이를 처리하므로 명시 적으로 수행하지 않아도됩니다. Qiskit에 비슷한 기능이 있는지 모르겠습니다. 번역을 올바르게 수행했다면 위의 예에 대한 완전한 회로 가 있습니다.


감사! 바로 내가 찾던 것입니다.
alex

Grover-Part의 경우 : 키 레지스터 (이 예제에서는 2 큐 비트)만으로 증폭 작업을 수행해야합니까? 표시된 큐 비트와 어떻게 연결되어 있습니까?
alex

Q # 샘플에 따르면 "Grover의 알고리즘에는 표시된 상태 및 시작 상태에 대한 반영이 필요하므로"표시된 qubit 및 키 레지스터로 작동해야합니다. QuantumSearch () 작업에서 코드를 따르면 ReflectMarked ()가 표시된 qubit로만 호출되는 것을 볼 수 있습니다. ReflectZero ()는 나중에 표시된 qubit와 키 레지스터의 조합으로 호출됩니다. 또한 위의 편집을 참조하십시오.
Joel Leach

3

n=4

i|i|d(i)
f(i)=2

양자 검색 알고리즘을 목록 / 데이터베이스에서 검색하는 대신 함수를 최적화하는 것으로 생각하는 것이 좋습니다. 다음은 알고리즘에 대한 이해를 더 추구하고자 할 때 양자 검색을 사용하여 조합 최대화 문제를 해결하는 방법에 대한 기사 입니다.


당신의 답변에 감사드립니다! 따라서 Grover-Algorithm은 데이터베이스 검색에 적합하지 않습니다. 여기서 관련 질문을 찾았 습니다 .
alex

이 DB 검색 문제를 해결하기위한 의사 코드 (또는 Qiskit 코드)가 있습니까?
alex

살펴 봐야하지만 프레임 워크에서 쉽게 찾을 수 있습니다.
cnada

3

Oracle도 데이터베이스를 보유하도록 변환해야하므로 결과적으로 일반 Oracle (Phase Inversion)에는 두 개의 하위 Oracle이 있습니다. 데이터베이스 검색을위한 일반 Grover 알고리즘 회로

준비해야 할 첫 번째 서브 오라클은 메모리 회로이며, 양자 데이터 (상태)를 본문에 저장하는 QRAM과 달리이 메모리 (배열) 회로는 프레임에 고전적인 정보 만 저장하도록 준비되어 있습니다. 바이너리 배열 [010, 110, 100, 011]을 저장하는 회로의 예는 다음과 같습니다. 메모리 회로의 예 자세한 내용은 이 백서를 참조하십시오 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.