シミュレーション内で量子コンピューターをゼロから構築したい場合(Nand2Tetrisコースで古典的なコンピューターをゼロから構築する方法など)、それは可能ですか?
はいの場合、いくつかの可能なアプローチは何ですか?
また、特定の量の古典的な計算能力が与えられた場合、そのようなシミュレートされたマシンの制限は何になりますか?たとえば、平均的なデスクトップ/ラップトップを選択した場合、制限は何になりますか?スーパーコンピューター(Titanなど)を使用する場合、制限はどうなりますか?
シミュレーション内で量子コンピューターをゼロから構築したい場合(Nand2Tetrisコースで古典的なコンピューターをゼロから構築する方法など)、それは可能ですか?
はいの場合、いくつかの可能なアプローチは何ですか?
また、特定の量の古典的な計算能力が与えられた場合、そのようなシミュレートされたマシンの制限は何になりますか?たとえば、平均的なデスクトップ/ラップトップを選択した場合、制限は何になりますか?スーパーコンピューター(Titanなど)を使用する場合、制限はどうなりますか?
回答:
質問の最初の部分は、既存のQC SEの投稿の複製のようです。量子コンピューター用のエミュレーターはありますか?。
シミュレーションの中で量子コンピューターをゼロから構築することがどういう意味なのか完全にはわかりません。ただし、はい、平均的なラップトップ/デスクトップを使用して、量子コンピューターのソフトウェアシミュレーションを行うことができます。正確な「制限」は、コンピューターの仕様によって異なります。
量子コンピューターはChurch-Turing論文に違反しないため、理論的には理想的なチューリングマシンを使用して量子コンピューターをシミュレートすることは間違いなく可能です。そのようなシステムをシミュレートするための明白なアプローチは、古典的なコンピューターで指数時間を必要とし、空間の複雑さはシミュレートされた量子ビット数の指数関数です。たとえば、ビットの量子コンピューターをシミュレートすると、毎回約2 nビットの情報を古典的なコンピューターに保存する必要があります。さらに、量子ゲートの実装には、時間と空間の複雑さの点で再び膨大なリソースが必要になります。n-量子ビットで動作する量子ゲートの実装は、ビット(サイズ 2 n × 2 nの行列としてすべての量子ゲート操作を表すことができるため)の情報ビット。
古典的なコンピューターの仕様に応じて、「制限」をある程度見積もることができます。お使いの古典コンピュータの(アクセス)メモリサイズは約ある場合たとえば、 TB私はあなたがシミュレートすることができ期待ログ4(8 × 10 12)≈ 21ビットの量子コンピュータを(安全側のLETの言う上にある20)。ただし、古典的なコンピューターは、実際の量子コンピューター(量子コンピューターのハードウェアに依存)に比べて、情報の個々のビットすべてにアクセスするのに非常に長い時間がかかることに注意してください。だから遅くなります実際の量子コンピューターよりも!他のいくつかの制限は、キュービットゲートの各アクションの後に、どの出力キュービットが絡まっているかを追跡する必要があることです。これはNP困難な問題です。また、測定は、古典的に全く存在しないため、正確に、古典コンピュータ上でシミュレートすることがcannnot 真にランダム数発生器。
さて、私は現在、量子コンピューターのシミュレーターに取り組んでいます。もちろん、量子コンピューティングの基本的な考え方は、ベクトルで表されるキュービットに適用される行列で表されるゲートです。Pythonのnumpyパッケージを使用すると、これは最も基本的な意味でプログラミングするのは難しくありません。
そこから、もちろんインターフェースを拡張するかもしれません。また、非理想的な量子コンピューターのシミュレーターにすること、つまり、デコヒーレンス時間とエラー修正を考慮に入れることを検討することもできます。
次に、あなたは非常に未知の領域に入ります。量子コンピューターの命令セットをどのように構築しますか?知るか。あなたが理解する必要があります。また、アセンブリのバージョン、さらには高レベルのプログラミング言語のバージョンを把握する必要があります。
それで、これで古典的なコンピューターの限界は?さて、これは本当に複雑な質問です(個別に質問する価値はあります)が、ここに簡単な要約があります。
この答えの大部分は、何かを「シミュレート」することの意味の根本的な誤解にかかっていると感じています。
一般的に、複雑なシステムを「シミュレートする」とは、そのようなシステムの特定の機能を、より簡単に制御できるプラットフォーム(常にではないが、古典的なコンピューター)で再現することを意味します。
したがって、「古典的なコンピューターで量子コンピューターをシミュレートできるか」という問題は、やや不適切です。「量子コンピューター」のあらゆる側面を複製したい場合、古典的なシステムのあらゆる側面をシミュレートすることは決してできないのと同じように、それは決して起こりません。もちろんシステム)。
一方、「量子コンピューター」のような複雑なデバイスの多くの側面を確実にシミュレートできます。たとえば、量子回路内の状態の進化をシミュレートしたい場合があります。実際、これは非常に簡単です!たとえば、コンピューターにpythonがある場合は、次を実行します。
import numpy as np
identity_2d = np.diag([1, 1])
pauliX_gate = np.array([[0, 1], [1, 0]])
hadamard_gate = np.array([[1, 1], [1, -1]]) / np.sqrt(2)
cnot_gate = np.kron(identity_2d, pauliX_gate)
H1_gate = np.kron(hadamard_gate, identity_2d)
awesome_entangling_gate = np.dot(cnot_gate, H1_gate)
initial_state = np.array([1, 0, 0, 0])
final_state = np.dot(awesome_entangling_gate, initial_state)
print(final_state)
おめでとう、分離可能な2量子ビット状態からベル状態への進化を「シミュレート」しただけです。
ただし、たとえば40量子ビットと自明でないゲートを使用して同じことを行おうとすると、これを簡単に実行できなくなります。素朴な理由は、ただの状態を保存することです-qubit(非スパース)状態〜を指定する必要があります複素数であり、これは非常に迅速に大量のメモリを消費し始めます。多くの場合、この問題を回避できるトリックが存在する可能性があるため、ここでは「単純」と言います。。これが、多くの人々が古典的なコンピューターで量子回路(および他のタイプの量子システム)をシミュレートするための巧妙なトリックを見つけようと努力する理由であり、これは簡単なことではありません。
この難しさのさまざまな側面についてはすでに他の回答が触れており、この他の質問への回答は、量子アルゴリズムのさまざまな側面をシミュレート/エミュレートするための多くの利用可能なプラットフォームについて既に言及しているため、ここには行きません。
(1) この興味深い例は、ボソンサンプリングデバイスをシミュレートする問題です(これは、一連のゲートを介して進化する状態という意味での量子アルゴリズムではありませんが、それでも非自明な量子デバイスの例です)。BosonSamplingは、サンプリング問題 1は、問題を担当している、サンプリングを特定の確率分布から、これは(可能性の高い仮定の下で)古典的なデバイスで効率的に行うことが不可能であることが示されています。この硬度の基本的な側面であるとは決して示されませんでしたが、ボソンサンプリングデバイスのシミュレーションに関連する確かに重要な問題は、サンプリングする指数関数的に多数の確率を計算する必要があるということです。ただし、最近では、実際に確率のセット全体を計算してサンプリングする必要がないことが示されました(1705.00686および1706.01260)。これは、原則として、任意の時点でシステムの状態全体を保存することなく、量子回路内の多くのキュービットの進化をシミュレートすることから遠いものではありません。より直接的な量子回路に関して、シミュレーション機能の最近のブレークスルーの例は1704.01127 および1710.05867です(また、まだ公開されていない超最新のものは1802.06952です)。
(2) 実際、ほとんどの量子回路を効率的にシミュレートすることは不可能であることが示されています(または、むしろ、事実について強力な証拠が提供されています)。1504.07999を参照してください。