言語のデモに役立つサンプル量子アルゴリズム


9

さまざまな量子言語の構文を示すために使用できる量子アルゴリズムを探しています。私の質問はこれに似ていますが、私にとって「良い」とは次のことを意味します。

  • それが何をするかは1〜2段落で説明でき、理解しやすいはずです。
  • 「量子プログラミング世界」のより多くの要素を使用する必要があります(つまり、アルゴリズムは、いくつかの古典的な定数、測定、条件、qレジスタ、演算子などをできるだけ多く使用する必要があることを意味します)。
  • アルゴリズムは小さくなければなりません(長くても15から25の疑似コード行)。

多くの場合、有用なアルゴリズムは長すぎる/難しいですが、Deutschのアルゴリズムはそれほど多くの要素を使用していません。誰かが私にデモに適したアルゴリズムを提案できますか?


あなたの要件は、それが古典的な入力と古典的な出力を備えた「アルゴリズム」であり、同等の古典的なアルゴリズムが機能する方法との明確な利点/違いであることも必要ですか?
DaftWullie

@DaftWullieこれらは必須ではありません。オペレーターのパラメーターまたはクラシック定数の初期化は、「入力」を表すことができ、必要に応じて出力フォーマットを提供します。特別なことをする必要はありません。焦点は言語の構文にあり、説明は異なる言語のコードが同じであることを検証するためだけのものです。アルゴリズムの意味は無関係です。
クレニウム

Quantum Computing SEへようこそ!確認するために、良い答えの基準は最も短い疑似コードのほとんどの要素ですか?
Mithrandir24601

1
@ Mithrandir24601ありがとう!はい、どういうわけか。
クレニウム

回答:


3

固有値/固有ベクトル推定プロトコルを見ることをお勧めします。問題を必要なだけ簡単または困難にするための柔軟性がたくさんあります。

まず、2つのパラメーターkを選択します。あなたは設計したいnは、単一の-qubit U形の固有値持っている電子- 2 π I のq / 2 k個の整数のためのQを。それらの固有値の少なくとも1つが一意であることを確認し、ωと呼びます。また、製品の状態が単純であることを確認してください0 N、固有値の固有ベクトルを有する非ゼロオーバーラップ有するωをkUe2πq/2kqω|0ω

目的は、これに位相推定アルゴリズムを実装し、値が通知され、ベクトルを出力することです| ψ 固有値に対応する固有ベクトルですω。一般に、これはn + kキュビットの回路で構成されます(制御されたUを実装するためにアンシラが必要な場合を除く)。k|ψω+kU

これは次のように機能します。

  • 二つのレジスタの一つに設定の量子ビット、および他のn個の量子ビット。(量子レジスタの使用k

  • すべてのキュービットは次の状態で初期化されます。(量子レジスタの初期化|0

  • 最初のレジスタの各キュビットにアダマールを適用します(単一キュビットゲート

  • 最初のレジスタのキュービットから、制御されたU 2 rを適用し、2番目のレジスタをターゲットにします(マルチキュービット制御ゲートrU2r

  • 最初のレジスタに逆フーリエ変換を適用し、標準ベースで最初のレジスタのすべての量子ビットを測定します。これらを組み合わせて、半古典的フーリエ変換を実装できます。(古典的なデータの測定フィードフォワード

  • 正しい測定結果を得るために、2番目のレジスターは望ましい状態にあります|ψ

簡単にするために、k = 1を選択できるため、固有値± 1の4 × 4ユニタリ行列が必要です。私のようなものを使用したいU 1U 2C U 1U 2Cは制御NOT意味を。固有値-1の固有ベクトルは1つだけですψ = U 1U 2=2k=14×4±1

U1U2CU1U2
C、そしてU1U2の選択をいじくり回して、ユニバーサルゲートセットの観点から分解を使用してUの実装を調査することができます(おそらくこれを予備的な問題として設定します)。次に、制御されたUは、制御されたNOTを制御された制御されたNOT(Toffoli)ゲートに置き換えるだけで簡単に実装されます。最後に、逆フーリエ変換はアダマールゲートにすぎません。|ψ=U1U2|1|0|1/2U1U2UU

もう少し複雑な場合は、Cをスワップゲートの平方根 1 0 0 0 0 1k=Cω=E±Iπ/4| ψ=U1U2|01±|10/

100001220021200001
ω=e±π/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")

もちろん、これはそれほど量的ではありません。したがって、代わりに2つの異なる絵文字を重ね合わせることができます。最も簡単な例は、;)を8)で重ね合わせることです。これらのビット文字列は、量子ビット8と9でのみ異なるためです。

;)  =  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はの重ね合わせにそれを作る00112つの量子ビットに。これは、;)およびで唯一必要な重ね合わせです8)

これの実際の実装を見たい場合は、QISKitチュートリアル(完全な開示:私が作成したもの)にあります。


そのリンクには404が表示されます。ファイルを別の場所に移動しましたか?
クレニウム

チュートリアルが更新されたようです。リンクを変更したので、今はうまくいくはずです。
James Wootton

1

(完全な)1ビット乱数ジェネレータを提案します。それはほとんど簡単です:

|0H|0|1

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.