Q# とは

完了

Q# は、量子アルゴリズムを開発および実行するための高度なオープンソース プログラミング言語です。 これは Azure Quantum 開発キット (Modern QDK) の一部であり、ハードウェアに依存せず、さまざまな量子アプリケーションに合わせてスケーリングし、実行を最適化するように設計されています。

なぜ量子プログラミング言語なのか

量子プログラミング言語を構築する理由は多数ありますが、簡単な答えとしては、回路ではなくアルゴリズムを記述するためです。

アルゴリズムを記述するときには、言語、コンパイラ、ランタイムに関する次の要件を満たす必要があります。

  • 抽象量子ビット 量子アルゴリズムでは、特定のハードウェアまたはレイアウトに関連付けられていない量子ビットが使用されます。 コンパイラとランタイムにより、プログラムの量子ビットから物理量子ビットへのマッピングが処理されます。
  • 量子と従来型の計算 "ユニバーサル" 量子コンピューターでは、従来型の計算および量子計算を実行する機能が不可欠です。
  • 物理法則の量子アルゴリズムは、量子物理学の規則に従います。 たとえば、量子ビットの状態を直接コピーまたはアクセスすることはできません。

Q# の特性

Q# を使用して、量子アルゴリズムを記述し、従来のコンピューターでシミュレートした後、実際の量子コンピューターでそれらを実行できます。 Q# には、量子ビットの操作や量子計算の実行に使用される、量子ゲートや量子測定などの組み込みの量子演算のライブラリも用意されています。

@EntryPoint()
operation MeasureOneQubit() : Result {
    // The following using block creates a fresh qubit and initializes it
    // in the |0 state.
    use qubit = Qubit();
    // We apply a Hadamard operation to the state, thereby preparing the
    // state 1 / sqrt(2) (|0> + |1>).   
    H(qubit);
    // Now we measure the qubit in Z-basis.
    let result = M(qubit);
    // As the qubit is now in an eigenstate of the measurement operator,
    // we reset the qubit before releasing it.
    if result == One { X(qubit); }
    // Finally, we return the result of the measurement.
    return result;
}

以降のセクションでは、Q# の主な機能について説明します。

ドメイン固有ライブラリ

Q# ライブラリを使用すると、低レベルの演算シーケンスを設計しなくても、複雑な量子演算を実行できます。

  • 標準ライブラリには、Q# で量子プログラムを記述するときに使用できる、基本的な一連の関数と演算が用意されています。
  • 量子数値ライブラリでは、さまざまな数値機能のサポートが提供されます。

量子ビットの管理

Q# では、量子ビットは、必要なときにランタイムから要求され、使用されなくなったときに返されるリソースです。 このメソッドは、従来の言語がヒープ メモリを処理する方法に似ています。

非依存型の量子ビットの種類

Q# 言語では、プログラム内の量子ビットが論理か物理どうかや、量子ビット テクノロジの種類は指定されません。 ランタイムにより、プログラム内の量子ビット変数から実際の論理または物理量子ビットへのマッピングが決定されます。 そのマッピングは、トポロジとその他のターゲット デバイスの詳細が判明するまで遅延させることができます。

コンパイラによって生成される制御型および随伴型の特性

Q# を使用すると自動的に演算が元に戻せるようになり、制御可能になります。 この機能により、アルゴリズムの記述が容易になり、コンパイラ駆動型の量子コードの最適化が可能になります。

ファースト クラスの演算

Q# の演算と関数は、他の演算に渡したり、変数に割り当てたり、他の値と同様に使用したりできます。 この機能により、振幅増幅、位相推定などのプロトコルを簡単に表現できます。

従来の制御フロー

Q# では、アルゴリズムの実行中に従来の制御フローがサポートされます。 たとえば、グローバーの検索などの確率論的アルゴリズムに必要なループは、Q# で簡単に表現できます。 この種類のフローでは、結果が Oracle を満たすかどうかをテストするために従来のドライバーに戻り、満たされない場合は再実行する必要がありません。

従来型の計算と量子計算の混在

Q# では、豊富な古典的計算と量子演算がサポートされており、ランダム ウォーク位相推定操作などの適合アルゴリズムをクリーンに表現できます。 このようなアルゴリズムを量子ゲートの固定シーケンスの回路モデルで直接表現することは困難です。