언어를 보여주는 데 유용한 샘플 양자 알고리즘


9

다른 양자 언어의 구문을 보여주기 위해 사용할 수있는 양자 알고리즘을 찾고 있습니다. 내 질문은 유사하다 , 나를 위해, 그러나, "좋은"수단 :

  • 그 내용은 1-2 단락에 설명되어 있으며 이해하기 쉬워야합니다.
  • "양자 프로그래밍 세계"의 더 많은 요소를 사용해야합니다 (알고리즘은 가능한 한 고전적인 상수, 측정, 조건, qregister, 연산자 등을 사용해야 함을 의미합니다).
  • 알고리즘은 작아야합니다 (최대 15-25 개의 의사 코드 행 길이).

유용한 알고리즘은 종종 너무 길거나 어렵지만 Deutsch의 알고리즘 은 많은 요소를 사용하지 않습니다. 누군가 나에게 좋은 알고리즘을 제안 할 수 있습니까?


클래식 입력과 클래식 출력을 가진 "알고리즘"이어야하며 동등한 알고리즘이 작동하는 방식과 분명한 이점 / 차이가 있어야합니까?
DaftWullie

@DaftWullie 필수는 아닙니다. 연산자의 매개 변수 또는 클래식 상수 초기화는 "입력"을 나타낼 수 있으며 필요한 경우 출력 형식을 제공합니다. 특별 할 필요는 없습니다. 언어의 구문에 중점을두고 설명은 다른 언어의 코드가 동일한 지 확인하기위한 것입니다. 알고리즘의 의미는 관련이 없습니다.
klenium

Quantum Computing SE에 오신 것을 환영합니다! 확인하기 만하면 좋은 대답을위한 기준이 가장 짧은 의사 코드에서 가장 많은 요소입니까?
Mithrandir24601

1
감사합니다! 그렇습니다.
klenium

답변:


3

고유 값 / 고유 벡터 추정 프로토콜을 살펴 보는 것이 좋습니다. 문제를 원하는만큼 쉽고 어렵게 만들 수있는 많은 유연성이 있습니다.

두 개의 매개 변수를 선택하여 시작하십시오. nk. 당신은 디자인하고 싶어n큐빗 단일, U 그 형태의 고유 값을 갖는 e2πiq/2k 정수 q. 고유 값 중 하나 이상이 고유한지 확인하고ω. 또한 간단한 제품 상태가|0n, 고유 값의 고유 벡터와 0이 아닌 겹침 ω.

목표는 이것에 대해 위상 추정 알고리즘을 구현하는 것입니다. k, 벡터 출력 작업 |ψ 즉 고유 값에 해당하는 고유 벡터입니다. ω. 일반적으로 이것은 회로를 구성합니다n+k 큐 비트 (제어 된U).

이것은 다음과 같이 작동합니다.

  • 두 개의 레지스터 중 하나를 설정 k 큐빗과 다른 n큐빗. ( 양자 레지스터 사용 )

  • 모든 큐비 트는 상태에서 초기화됩니다 |0. ( 양자 레지스터 초기화 )

  • 첫 번째 레지스터의 각 큐 비트에하다 마드를 적용합니다 ( 싱글 큐 비트 게이트 )

  • 큐빗에서 r 첫 번째 레지스터에서 통제 적용U2r, 두 번째 레지스터를 대상으로 함 ( 멀티 큐빗 제어 게이트 )

  • 첫 번째 레지스터에 역 푸리에 변환을 적용하고 표준으로 첫 번째 레지스터의 모든 큐 비트를 측정합니다. 이들은 반 고전적 푸리에 변환을 구현하여 결합 될 수 있습니다 . ( 클래식 데이터의 측정피드 포워드 )

  • 올바른 측정 결과를 위해 두 번째 레지스터는 원하는 상태입니다 |ψ.

간단하게, 당신은 선택할 수 있습니다 n=2, k=1그래서 당신은 4×4 고유 값을 갖는 단일 행렬 ±1. 나는 같은 것을 사용할 것이다.

(U1U2)C(U1U2),
어디 C제어 된 -NOT를 나타냅니다. 고유 값 -1을 갖는 고유 벡터가 하나뿐입니다.|ψ=(U1U2)|1(|0|1)/2, 그리고 당신은 선택을 망칠 수 있습니다 U1U2 의 구현을 탐구 U범용 게이트 세트 측면에서 분해 사용 (아마도 이것을 예비 문제로 설정했을 것입니다). 그런 다음 제어U제어 된 NOT를 제어 된 제어 된 NOT (Toffoli) 게이트로 교체하기 만하면 쉽게 구현됩니다. 마지막으로 역 푸리에 변환은 단지하다 마드 게이트입니다.

좀 더 복잡한 것을 위해 k=3교체 C 스왑 게이트의 제곱근으로

(1000012i200i21200001)
ω=e±iπ/4|ψ=(U1U2)(|01±|10)/2.

3

양자 "Hello World"를 원하는 것처럼 들립니다. 이것의 가장 간단한 양자 버전은 텍스트의 이진 인코딩 버전 Hello World을 큐 비트 레지스터에 쓰는 것 입니다. 그러나 이것은 ~ 100 큐 비트가 필요하며 코드 길이의 상한보다 길다.

짧은 텍스트 조각을 작성합시다. 작성해 봅시다. ;)길이가 16 인 비트 문자열이 필요합니다. 구체적으로 ASCII 인코딩을 사용합니다

;)  =  00111011 00101001

QISKit을 사용하면 다음 코드를 사용하여이 작업을 수행합니다.

from qiskit import QuantumProgram
import Qconfig

qp = QuantumProgram()
qp.set_api(Qconfig.APItoken, Qconfig.config["url"]) # set the APIToken and API url

# set up registers and program
qr = qp.create_quantum_register('qr', 16)
cr = qp.create_classical_register('cr', 16)
qc = qp.create_circuit('smiley_writer', [qr], [cr])

# rightmost eight (qu)bits have ')' = 00101001
qc.x(qr[0])
qc.x(qr[3])
qc.x(qr[5])

# second eight (qu)bits have 00111011
# these differ only on the rightmost two bits
qc.x(qr[9])
qc.x(qr[8])
qc.x(qr[11])
qc.x(qr[12])
qc.x(qr[13])

# measure
for j in range(16):
    qc.measure(qr[j], cr[j])

# run and get results
results = qp.execute(["smiley_writer"], backend='ibmqx5', shots=1024)
stats = results.get_counts("smiley_writer")

물론 이것은 양자가 아닙니다. 대신 두 개의 다른 이모티콘을 겹쳐서 사용할 수 있습니다. 가장 쉬운 예는 비트 문자열이 큐 비트 8과 9에서만 다르기 때문에;)를 8)과 겹치는 것입니다.

;)  =  00111011 00101001
8)  =  00111000 00101001

따라서 간단히 줄을 바꿀 수 있습니다

qc.x(qr[9])
qc.x(qr[8])

위에서

qc.h(qr[9]) # create superposition on 9
qc.cx(qr[9],qr[8]) # spread it to 8 with a cnot

마드는의 중첩을 생성 0하고 1, 상기 CNOT는의 중첩으로하게 00하고 11두 개의 큐빗에. ;)and에 대한 유일한 필수 중첩입니다 8).

실제 구현을보고 싶다면 QISKit 튜토리얼 에서 찾을 수 있습니다 (전체 공개 : 나에 의해 작성되었습니다).


해당 링크에 대해 404를 얻습니다. 파일을 다른 곳으로 옮겼습니까?
klenium

튜토리얼이 방금 업데이트 된 것 같습니다. 링크를 변경 했으므로 지금 작동해야합니다.
제임스 우튼

1

(완벽한) 1 비트 난수 생성기를 제안합니다. 거의 간단합니다.

일반적인 초기 상태에서 단일 큐 비트로 시작합니다. |0. 그런 다음하다 마드 게이트를 적용합니다H 이는 동일한 중첩을 생성합니다 |0|1. 마지막으로이 큐 비트를 측정하여 각각 50 % 확률로 0 또는 1을 얻습니다.

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