ファンクター適用
ファンクターは、callable の特定の特殊実装にアクセスできるようにするファクトリです。 Q# では現在、Adjoint
と Controlled
の 2 つのファンクターがサポートされています。いずれも、必要な特殊化を提供する演算に適用できます。
Controlled
および Adjoint
ファンクターは、ApplyUnitary
が両方のファンクターをサポートする演算の場合、可換です。その場合、Controlled Adjoint ApplyUnitary
と Adjoint Controlled ApplyUnitary
に違いはありません。
どちらも同じ型を持ち、呼び出し時に、 controlled adjoint
specialization に対して定義された実装を実行。
Adjoint ファンクター
演算 ApplyUnitary
で量子状態のユニタリ変換 U が定義されている場合、Adjoint ApplyUnitary
は U† の実装にアクセスします。 Adjoint
ファンクターは、それ自体の逆です。これは、定義上、(U†)† = U であるためです。 例えば、Adjoint Adjoint ApplyUnitary
は ApplyUnitary
と同じです。
式 Adjoint ApplyUnitary
は、ApplyUnitary
と同じ型の演算です。同じ引数と戻り値の型を持ち、同じファンクターをサポートします。 任意の演算と同様に、適切な型の引数を使用して呼び出すことができます。 次の式は、ApplyUnitary
の Adjoint 特殊化を引数 arg
に適用します。
Adjoint ApplyUnitary(arg)
Controlled ファンクター
量子状態のユニタリ変換 U を定義する演算 ApplyUnitary
の場合、Controlled ApplyUnitary
は、|1⟩ 状態にある制御量子ビットの配列内のすべての量子ビットに U 条件を適用する実装にアクセスします。
式 Controlled ApplyUnitary
は、ApplyUnitary
と戻り値の型と演算の特性が同じ演算であり、同じファンクターをサポートしています。
これは、(Qubit[], <TIn>)
型の引数を受け取ります。ここで、<TIn>
は 単一タプルの等価性を考慮して、ApplyUnitary
型の引数に置き換える必要があります。
操作 | 引数の型 | 制御された引数の型 |
---|---|---|
x | Qubit |
(Qubit[], Qubit) |
SWAP | (Qubit, Qubit) |
(Qubit[], (Qubit, Qubit)) |
具体的には、cs
に量子ビットの配列が含まれており、q1
と q2
が 2 つの量子ビットで、演算 SWAP
がここで定義されているとおりの場合、次の式は、cs
のすべての量子ビットが |1⟩ 状態にある場合に q1
と q2
の状態を交換します。
Controlled SWAP(cs, (q1, q2))
Note
|1⟩状態以外の状態にある制御量子ビットに基づいて操作を条件付きで適用するには、呼び出し前に適切な隣接可能な変換を制御量子ビットに適用し、その後に逆を適用します。 たとえば、|0⟩ 状態にあるすべての制御量子ビットに対する変換を条件付けるには、変換の前後に X
演算を適用します。 これは、共役を使用して簡単に表現できます。 ただし、このような構成体の詳細性は、将来のよりコンパクトな構文において追加サポートのメリットを得られる可能性があります。