銀の光と碧い空

クラウドなインフラとC#なアプリ開発の狭間にいるエンジニアの日々

Quantum Development Kit 0.4がリリースされていました

知る限り特にアナウンスなどはなかったと思うのですが、Quantum Development Kit 0.4.1901がリリースされていました。リリースノートは更新されています。

docs.microsoft.com

更新方法は、いつもの通り.NET Coreのプロジェクトテンプレートの更新で、既存プロジェクトはNuGetライブラリの参照バージョンを更新する必要があります。

> dotnet new -i Microsoft.Quantum.ProjectTemplates

docs.microsoft.com

既存プロジェクトを0.4.1901にアップグレードする場合、csproj内の以下の2つの参照ライブラリのバージョンを更新します。

  <ItemGroup>
    <PackageReference Include="Microsoft.Quantum.Canon" Version="0.4.1901.3104" />
    <PackageReference Include="Microsoft.Quantum.Development.Kit" Version="0.4.1901.3104" />
  </ItemGroup>

0.3と違い、0.4は破壊的変更はなく、3つの機能追加になっているようです。

BigInt 型を追加

C#のBigInteger型に対応する型としてQ#にBigInt型を追加しました。任意の桁の整数を表現できます。リテラル表記は以下のドキュメントにある通り、Lを末尾につけます。0xを先頭につけることで16進表記もできます。

let bigZero = 0L;
let bigHex = 0x123456789abcdef123456789abcdefL;
let bigOne = bigZero + 1L;

docs.microsoft.com

高速かつ多くの量子ビットで動作できるToffoli シミュレーターを追加

今まで利用できたシミュレーターは、Q#で用意されているすべての操作をサポートする代わりに、量子ビット数が増えるほどマシンパワーを必要としており、例えばラップトップだと数十量子ビット程度で動作に限界が発生していました。例えば以下の用意したすべての量子ビットにXゲートを適用するだけのoperationの場合、せいぜい50量子ビットを指定するとメモリ16GB程度のマシンであっても限界がくると思います。

    operation TooManyQubits () : Unit {
        let num = 50;
        Message($"Start {num}");
        using(qs = Qubit[num])
        {
            ApplyToEachCA(X, qs);
            ResetAll(qs);
        }
        Message("End");
    }

そこで、Toffoli シミュレーターというのが追加され、サポートされる操作はX, CNOT, 複数ビットを制御ゲートするXなど一部ではあるものの、高速かつ、より多くの量子ビットで動作できるようになりました。

docs.microsoft.com

具体的には次のように使います。ToffoliSimulatorIDisposableではないのでusing節では使えません。用意する量子ビット数でデフォルトが65536らしいのですが、コンストラクタの引数で指定できます。上のQ#のコードでlet num = 500000とし、下のコードで実行すると、実際に50万量子ビットでの操作が正常に完了しました。

var tsim = new ToffoliSimulator(500000);
TooManyQubits.Run(tsim).Wait();

利用するリソースを推定できるResourcesEstimatorを追加

指定したQ#のoperationを実行するのにどのくらいのリソースが必要となるかを推定できるResourcesEstimatorが追加されました。これもToffoliSimulator同様IDisposableではないので以下のようなコードで使えます。operationを実行した後、ResourcesEstimator.ToTSV()でTSV形式で推定結果を出力できます。それ以外にもいくつか推定結果の取得に関したプロパティ、メソッドが用意されています。

var estimator = new ResourcesEstimator();
TeleportClassicalMessage.Run(estimator, false).Wait();
Console.WriteLine(estimator.ToTSV());

結果はこのように表示されます。

Metric          Sum
CNOT            2
QubitClifford   5
R               0
Measure         5
T               0
Depth           0
Width           3
BorrowedWidth   0

docs.microsoft.com

Q# コーディングコンテスト

こちらはQuantum Development Kit 0.4とは関係ないですが、昨年夏にあったQ# Coding Contestが再び開催されるようです。warm up roundが2月22-25日、本戦が3月1-4日の予定です。

cloudblogs.microsoft.com