はじめに
この記事は量子コンピュータによる素因数分解のアルゴリズムである「Shorのアルゴリズム」の解説記事第2回目です。1回目は以下の記事です:
今回の目標は「べき剰余 (Modular exponentiation):を計算する量子回路を構成することです。後の記事で説明しますが、これが素因数分解に重要な回路です。
参考文献はVedralSamNです。基本的にはVedralに基づいて書かれています。SamNは大変わかりやすいShorのアルゴリズムの日本語による解説記事です。
剰余和 (Adder modulo )
以下を計算する量子回路を組みます:
であることに注意すれば、を計算して、overflowが起こらなければ、すなわちならばこれそのものがです(負になると最上位ビットが立つ。これをoverflowと呼ぶ)。もしoverflowが起こればです。和・差を計算する量子回路は前回の加算器とそれを逆回ししたもので実現できるので、簡単に量子回路を組めるように思います。
ただし回路が可逆になるように組むので、そこが少し複雑です。Ref.Vedralでは以下のような量子回路を組んでいます:
剰余和(Adder mod)の量子回路。はのビット反転を表す
Add, Subtractはそれぞれ「加算器」「減算器」を表します。加算器は
前回
説明しました。減算器は加算器の逆回し("")で実現できます。
図に関し、2つほどコメントです:
- の最上位ビット(Vedralでは"most significant bit"と呼ばれる)は、のとき、のときです。この最上位ビットをとします。すなわち
です。図のとはのビット反転を表します。 - 最後のAddの左側での最上位ビットがとなっています。これは以下のようにしてわかります:
・もしならばの最上位ビットは0。このときであるからこの量の最上位ビットは1
・もしならばの最上位ビットは1。このときであるからこの量の最上位ビットは0
以上からの最上位ビットはになります。
制御剰余乗算 (Control-Multiplier modulo)
ゼロ以上の整数および正の整数が与えられたときを計算する量子回路を作ります。ただし今後の目的のため、フラグとなるなる数を用意して以下のような変換を行う回路を構成します(Ref.Vedral):
制御剰余乗算 (Control-multiplier modulo )
これは前章のAdder Modを組み合わせて作られます。をのように2進数表示します。は
と表されるので、のとき、かつが1の場合にをで足していけば目的が達成されます。
Ref.Vedralではこの量子回路を以下のように組んでいます:
制御剰余乗算 (Control-multiplier modulo )の量子回路。青い文字はすべてであることに注意
茶色の太線は1 qubitではなくqubit群を表します。上から下に伸びる矢印はと両方が1のときに矢印の先のqubit群にをセットする操作を表します(論文ではは明示されていないですが、implicitにどこかに蓄えられています)。Adder Modは前章の回路です。これを通した直後の矢印は、セットされている(かもしれない)を消去する作業を表します。下の桁から再帰的に1桁ずつの和を計算し、それが一番下のqubit群に蓄えられます。最後の方の曲がった矢印は、が0のときにを一番下のqubit群にコピーする操作です。一番上のqubitの最後のほうでに一時的にNOTをかけてビット反転しているのはそのためです。
べき剰余 (Modular exponentiation)
以下の計算を実現する回路を作ります:
べき剰余 (Modular exponentiation)
上記しましたが、これが因数分解に重要な量子回路です。この回路を作るためにここまでその部品となる回路を構成してきました。
Ref.Vedralには以下のような回路が描かれています:
べき剰余 (Modular exponentiation)の量子回路。青い文字はすべてであることに注意
これも行っていることは簡単です。まず
です。ここで
なので、
です。各桁のは前章のCtrl Mult Modを用いてのときのように再帰的に計算して作れます(図3参照)。Ctrl Mult Modでそれらを掛け算していけば、最終的にが計算できます。はCtrl Mult Modを計算する前に片方のqubitを0にリセットするための操作です。もう片方のqubitにそれまで掛け算した数の情報が蓄えられます。
おしまい & つづく。