量子回路の自動コンパイル


12

ここ最近の問題は、単純な1量子ビットと2量子ビットゲートに4量子ビットゲートCCCZ(制御制御の制御-Z)をコンパイルする方法を尋ね、そしてこれまでに与えられた唯一の答えは、63のゲートを必要とします

最初のステップは、Nielsen&Chuang が提供したC n U構造を使用することでした。n

n=3この手段4つのCCNOTゲートと3つのシンプルゲート(1 CNOT及び2 Hadamardsターゲットキュービット及び最後の作業キュビットに最終CZを行うのに十分です)。

この論文の定理1は、一般にCCNOTには9個の1キュービットと6個の2キュービットゲート(合計15)が必要であると述べています。

ここに画像の説明を入力してください


これの意味は:

(4 CCNOT)x(CCNOTごとに15ゲート)+(1 CNOT)+(2アダマール)= 合計63ゲート

コメント、63のゲートはその後さらに理論から、たとえば、「自動処理」を使用してコンパイルすることができることが示唆されている自動グループ

この「自動コンパイル」はどのように行うことができ、この場合1キュービットと2キュービットのゲートの数をどれだけ減らすことができますか?


1
私はいくつかのことの真っ最中ですが、あなたの質問を見つけました。グローバルMølmer–Sørensenゲートは2量子ビットゲートであり、論文「効率的な量子回路構築におけるグローバル相互作用の使用」では、「3つのGMSゲートを使用したCCCZゲートの実装の最適化」について説明しています。役に立ちました。
ロブ

画像内の表現は、4 CCNOTs、ひいては63ゲートの代わりに93が必要
Dyon JドンキウイヴァンVreumingen

@DonKiwi、注目!6ではなく4つのCCNOT。私は今それを更新しています。
user1271772

1
@Rob:2つのアダマールを使用してCCCXのXを共役させることを提案しているようです。その後、上記のNielsen&Chaung回路と同様に、CCCXを分解できます。あれは正しいですか?DonKiwiの質問に対する2番目の回答では、このようなことをしました。あなたのコメントは、私がその答えを入力するのと同じように来たようです、なぜならそれらは5分離れているからです(そして、私がそれを入力するのに5分以上かかりました)。「自明な方法」で回路を構築し、より効率的なものに自動的にコンパイルできるといいので、「自動コンパイル」に関するこの質問は依然として有効です。
user1271772

1
@ user1271772-すべての(qu)ビットが役立ちます。
ロブ

回答:


6

してみましょうg1gMあなたが使用を許可されている基本ゲートすること。この目的のために、CNOT12CNOT13などは別々に扱われます。したがって、Mは、量子ビット数nに多項式的に依存しています。正確な依存関係には、使用するゲートの種類の詳細と、それらがどの程度kローカルであるかが含まれます。たとえば、C Zのような順序に依存しないx単一キュービットゲートとy 2キュービットゲートがある場合、M = x n + nCZM=xn+(n2)y

その場合、回路はこれらのジェネレーターを何らかの順序で生成したものです。しかし、何もしない複数の回路があります。同様CNOT12CNOT12=Id。したがって、それらはグループに関係を与えます。それはそれがあるグループのプレゼンテーション g1gMR1、我々が知らないことを多くの関係が存在する場合。

解決したい問題には、このグループ内の単語が与えられます。これは、同じ要素を表す最短の単語です。一般的なグループプレゼンテーションでは、これは絶望的です。この問題にアクセスできるグループ表示は、自動と呼ばれます。

しかし、より簡単な問題を考えることができます。gi一部を捨てると、前の単語はw1gi1w2gi2wkという形式になります。ここで、各wiは残りの文字のみの単語です。gi含まない関係を使用してそれらを短くすることができた場合、回路全体が短くなります。これは、他の回答で行ったCNOTの最適化に似ています。

たとえば、3台の発電機が存在する場合、ワードがあるA 、B 、B 、B 、CのB 、B 、BのAが、我々が対処する必要はありませんC、我々は代わりに短くなりますwは1 = A bはBのBそしてW 2 = B B BのAに対するW 1及びW 2。私たちは、その後、として戻って一緒にそれらを置くワット 1つの Caababbacbbabacw1=aababbaw2=bbabaw^1w^2w^1cw^2とその元の単語の短縮です。

(一般性を失うことなく)WLOGそれでは、私たちはその問題であると仮定してみましょうすでにg1gMR1私たちは今、指定されたすべてのゲートを使用しています。繰り返しますが、これはおそらく自動グループではありません。しかし、関係の一部を捨てるとどうなるでしょう。次に、私たちが本当に欲しいものまでの商マップを持つ別のグループがあります。

グループg1g2一切関係がありません無料のグループが、その後、あなたは入れた場合g12=id関係など、あなたが得る自由な製品 Z2Z、元からの商マップがあります後で、2を法とする各セグメントのg1の数を減らします。2

破棄する関係は、1階(商マップのソース)が設計により自動的になるような関係になります。残っている関係のみを使用して単語を短縮する場合、それは商グループの短い単語になります。商グループ(商マップのターゲット)には最適ではありませんが、元の長さの長さを持ちます。

それが一般的なアイデアでしたが、どのようにしてこれを特定のアルゴリズムに変えることができますか?

自動グループを取得するために、どのようにgiとリレーションを選択して捨てますか?これは、私たちが通常使用する基本的なゲートの種類の知識が入る場所です。多くの退屈がありますので、それらだけを保持してください。これらは基本的な退屈に過ぎないという事実に注意してください。したがって、ハードウェアがチップ上で大きく分離されたキュービットを交換するのに苦労している場合、これはあなたが簡単にできるものだけに書き込み、その言葉を減らしますできるだけ短くしてください。

たとえば、IBM構成があるとします。その後s01,s02,s12,s23,s24,s34許さゲートです。一般的な置換を行いたい場合は、それをsi,i+1因子に分解します。つまり、グループ内の単語であるs01,s02,s12,s23,s24,s34R1短くしたい。

これらは標準的な退屈である必要はないことに注意してください。たとえば、Xに加えてR(θ)XR(θ)1を投入できます。Gottesman-Knillの定理を考えてください。しかし、抽象的な方法で、一般化が容易になることを意味します。短い正確なシーケンスの下で、両側に有限の完全な書き換えシステムがある場合、中間グループに1つを取得するプロパティを使用するなど。このコメントは、残りの回答では不要ですが、この回答の例からより一般的な例をより大きく構築する方法を示しています。X

保持される関係は、形式(gigj)mij=1の関係のみです。これにより、Coxeterグループが提供され、自動的に実行されます。実際、この自動構造のアルゴリズムをコーディングするためにゼロから開始する必要さえありません。一般的な目的で既にSage(Pythonベース)に実装されています。あなたがしなければならないのは、mijを指定するだけ、残りの実装はすでに完了しています。その上でいくつかの高速化を行うことができます。

mijゲートの局所性のため、 m i jの計算は非常に簡単です。ゲートが最大でkローカルである場合、mij計算は22k1次元のヒルベルト空間で行うことができます。これは、インデックスがオーバーラップしない場合、mij=2あることがわかっているためです。mij=2は、gigj通勤する場合です。また、エントリの半分未満を計算するだけで済みます。これは、行列mijは対称で、対角線上に1があります((gigi)1=1)。また、ほとんどのエントリは関連するキュービットの名前を変更しているだけなので、(CNOT12H1)、計算をやり直すことなくCNOT37H3順序を知っています。

これにより、せいぜい2つの異なるゲートのみが関係するすべての関係が処理されました(証明:演習)。3つ以上を含む関係はすべて捨てられました。今、それらを元に戻します。それがあるとしましょう。そうすれば、新しい関係を使用してDehnの貪欲なアルゴリズムを実行できます。変更があった場合、それをノックバックして、コクセターグループを再度実行します。変更がなくなるまでこれを繰り返します。

単語が短くなったり、同じ長さを維持したりするたびに、線形または二次の振る舞いを持つアルゴリズムのみを使用しています。これはかなり安価な手順であるため、それを実行し、あなたが愚かなことをしないようにしてください。

自分でテストする場合は、ジェネレーターの数を N、試行するランダムワードの長さK、およびCoxeter行列をmとして指定します。

edge_list=[]
for i1 in range(N):
    for j1 in range(i):
        edge_list.append((j1+1,i1+1,m[i1,j1]))
G3 = Graph(edge_list)
W3 = CoxeterGroup(G3)
s3 = W3.simple_reflections()
word=[choice(list([1,..,N])) for k in range(K)]
print(word)
wTesting=s3[word[0]]
for o in word[1:]:
    wTesting=wTesting*s3[o]
word=wTesting.coset_representative([]).reduced_word()
print(word)

例とN=28し、K=20最初の2行は入力非還元ワードであり、次の二つが減少ワードです。m行列を入力するときにタイプミスをしなかったことを願っています。

[26, 10, 13, 16, 15, 16, 20, 22, 21, 25, 11, 22, 25, 13, 8, 20, 19, 19, 14, 28]

['CNOT_23', 'Y_1', 'Y_4', 'Z_2', 'Z_1', 'Z_2', 'H_1', 'H_3', 'H_2', 'CNOT_12', 'Y_2', 'H_3', 'CNOT_12', 'Y_4', 'X_4', 'H_1', 'Z_5', 'Z_5', 'Y_5', 'CNOT_45']

[14, 8, 28, 26, 21, 10, 15, 20, 25, 11, 25, 20]

['Y_5', 'X_4', 'CNOT_45', 'CNOT_23', 'H_2', 'Y_1', 'Z_1', 'H_1', 'CNOT_12', 'Y_2', 'CNOT_12', 'H_1']

TiTin=1Tiiw1gi1w2gi2wkwiX1T2X1T2X1T2X1

HiHimij1,2


+1 !!! 詳細がたくさん!私はそれを読んでいます:)
user1271772

1
@AHussain、これが私の質問の「単純な」CCCZ構造に適用される例を介して作業することは可能ですか?そして、より少ない数のゲートで終わるでしょうか?CCCZについての元の質問には現在6つの回答があり、それらの多くはゲート数がはるかに少なくなっています。あなたのアプローチはゲート数に何をもたらすのだろうか。
user1271772

4

で説明されている手順を使用する https://arxiv.org/abs/quant-ph/0303063 1で、任意の斜めのゲート-したがって、特にCCCZゲート-は、CNOTや1キュービットの斜めのゲートに関して分解できます。 CNOTは、従来の最適化手順に従って独自に最適化できます。

このリファレンスは、任意の対角4キュービットゲートに16個のCNOTを使用する回路を提供します(図4)。


iIxiI{1,2,3,4}

また、この構成は決して最適である必要はありません。


1注:私は著者です


面白い。それでも手順が何であるかを確認するには、論文を読む必要があります。また、@ AHussainが自動グループの理論を使用してそれを行う方法を教えてくれるのを待っています。
user1271772
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.