私はDeutschのアルゴリズム(Deutsch-Joszaアルゴリズムの基本ケース)をシミュレートしようとしていますが、アルゴリズムの目的を無効にして「見ている」ことなく、アルゴリズムが機能するために必要な量子オラクルを実装する方法を完全に確信していません入力された関数が何であるか、関数を評価することによって。
私はDeutschのアルゴリズム(Deutsch-Joszaアルゴリズムの基本ケース)をシミュレートしようとしていますが、アルゴリズムの目的を無効にして「見ている」ことなく、アルゴリズムが機能するために必要な量子オラクルを実装する方法を完全に確信していません入力された関数が何であるか、関数を評価することによって。
回答:
ここで2つの質問があります。最初の質問では、これを実際にコードに実装する方法を尋ね、2番目の質問では、渡されるOracleがわかっている場合のポイントを尋ねます。
おそらく最良の方法はIsBlackBoxConstant
、oracleを入力として受け取る関数を作成してから、Deutsch Oracleプログラムを実行して、それが定数かどうかを判別することです。必要に応じて、オラクルをランダムに選択できます。ここでは、Q#で実装されています。
operation IsBlackBoxConstant(blackBox: ((Qubit, Qubit) => ())) : (Bool)
{
body
{
mutable inputResult = Zero;
mutable outputResult = Zero;
// Allocate two qbits
using (qbits = Qubit[2])
{
// Label qbits as inputs and outputs
let input = qbits[0];
let output = qbits[1];
// Pre-processing
X(input);
X(output);
H(input);
H(output);
// Send qbits into black box
blackBox(input, output);
// Post-processing
H(input);
H(output);
// Measure both qbits
set inputResult = M(input);
set outputResult = M(output);
// Clear qbits before release
ResetAll(qbits);
}
// If input qbit is 1, then black box is constant; if 0, is variable
return One == inputResult;
}
}
計算の複雑さは、入力サイズの関数として消費するリソースの量に応じてアルゴリズムを分類することに関するフィールドです。これらのリソースには、時間(ステップ/命令で測定)、メモリ、およびクエリの複雑度と呼ばれるものも含まれます。クエリの複雑さは、アルゴリズムがブラックボックスオラクル関数をクエリする回数に関係します。
量子アルゴリズムはブラックボックスを1回クエリするだけでよく、従来のアルゴリズムはブラックボックスを2回クエリする必要があるため、Deutsch oracle問題は複雑性理論家にとって興味深いものです。ビットのオラクルが定数または平衡のどちらかである関数を含む一般化されたDeutsch-Josza問題では、量子アルゴリズムは再び一度だけクエリする必要がありますが、(決定論的)古典的アルゴリズムはクエリを必要とします。
オラクルの入力をランダムにサンプリングすることにより、未満のクエリでDeutsch-Josza問題を解く確率的古典アルゴリズムが存在することに注意してください。オラクルが入力に関係なく同じ値を出力し続ける場合、神託は一定です非常に急速に成長します。これは、Deutsch-Joszaが量子至上主義/アドバンテージ問題の良い候補ではないことを意味します。
複雑さの理論家でない場合は、クエリの複雑さをあまり気にせず、ブラックボックスの内部を見ることが許可されている「ルールなし」の世界でDeutsch oracle問題が重要である理由を知りたいと思うかもしれません。オラクルの問題を非オラクルの問題として分析しようとすることは困難を伴います。オラクル回路の分析が許可されているときに、誰もがドイツのオラクル問題に対する最良の古典的アルゴリズムの問題を解決したとは思いません。あなたは考えるかもしれません-分析するものは何ですか?可能な回路は4つだけです!実際、それははるかに複雑です。
1ビットのDeutsch Oracle の最も単純な表現を見ると、ゲートの構成は次のようになります。
アイデンティティ:
ただし、これらはオラクルを実装する唯一の方法ではありません。これらはすべて、数百、数千、さらには数百万もの論理ゲートを使用して書き換えることができます。重要なのは、これらの論理ゲートの累積効果が上記の単純な構造と同等であることです。次のConstant-1の代替実装を検討してください。
どんな入力に対しても、これまでに与えることができることがわかりました。
だから私たちは:
主に、Deutsch Oracleの問題は、歴史的および教育学的理由から重要です。これは最も単純なため学生に教えられた最初のアルゴリズムであり、あまり多くの質問をしない限り、量子スピードアップを実証するようです。また、Simonの周期性問題を学習し、次にShorのアルゴリズムを学習するための良い出発点としても機能します。
Deutschのアルゴリズムのポイントを無効にしない方法でオラクルを構築する方法はありません。それがオラクルベースのアルゴリズムである理由です。
つまり、オラクルベースのアルゴリズムは、その構造に問題がある場合(つまり、関数の特定のプロパティのみを知りたい場合)にスピードアップできることを証明しますが、そのような問題が存在します。
したがって、Deutschを実装する場合、オラクルを実行する方法はすべて問題ありません。これは「原理実証」アルゴリズムであり、実際の問題で実際のスピードアップを実現しません(少なくとも、私たちが知る限りでは)。
アルゴリズムに関する 2つの例がIBM Q Experienceページにあります。関数の例を示しています。これは私が望むシミュレーションのインスピレーションになるかもしれません。
私はドイツのアルゴリズム便利のために例を持っていないが、こことここにドイツ・Jozsaアルゴリズムと、それはQ#で使用しています神託を実装する手順を歩く2つのチュートリアルがあります。
これら2つのアルゴリズムの考え方は同じです。別の場所に実装された操作として、アルゴリズムにオラクルを提供する必要があります。このようにして、アルゴリズムは、与えられているオラクルを認識しておらず、それを呼び出す以外にオラクルを「見る」方法がありません。これらのチュートリアルには、Oracleが呼び出された回数をカウントするハーネスもあるので、ソリューションがそれを複数回呼び出した場合、テストに失敗します。
確かに、これにはまだオラクルアルゴリズムが頻繁に抱えている問題があります。人間は、テストと合格したオラクルの実装を見て、どのオラクルが実装されているかを理解することで答えを理解できます。DaftWullieが示唆したように、これはオラクルの選択をランダム化することで対抗できます。
そのahelwer
答えは、アルゴリズムの複雑さについて私たちが考えるいくつかの方法に触れていると思います。ただし、クエリを実行したい現実の世界に文字どおり「オラクル」がないため、クエリの複雑さやオラクルのアイデアをなぜ心配するのか疑問に思われるかもしれません。私はこれについていくつかの視点を与えようとします。特に、浮気をしているように感じない方法で「ドイツジョシャオラクル」を構築する方法を考えようとする方法を説明します。
(Norbert Schuch
指摘したように、Deutsch–Joszaの基本的なケースであるDeutsch問題については、洞察の余地はあまりありませんが、オラクルについてのあなたの質問がより一般的にも当てはまると思います。それについては、ここで話します。)
オラクルの概念は、私たちが計算問題について語る方法を簡単にできるようにする方法です。
オラクルの概念の最初の適用は、原理的にどうやってそれを行うことができるかを約束することなく、困難な問題、さらには不可能な問題を解決できたら、私たちが何ができるかを仮想的に考えることでした。しかし、最近の計算の複雑さでは、特に、量子計算では、たとえば 、Deutsch–Josza、Bernstein–Vazirani、およびその他のオラクル問題の場合では、状況が異なります。オラクルは問題の基礎である関数を記述します。それが「オラクル」であるという事実は、問題の中心にある関数をどのように記述するかを構造化する方法です。関数がどのように計算されるかを決して考えてはならないのではなく、この情報は単に一部として提供されていないということです問題の時間、およびその機能に関連する時間やその他の複雑さに関係がないこと。
このアプローチを取ると、実際には計算の非常に難しい質問に関連する答えを得ることができます。たとえば、P ≠ NPまたはP = NPを証明する方法がわからないが、P A ≠ NP Aを示すことができる神託Aがあることを示すことができることを知っているかもしれません。ここでオラクルAが行うことは、コンピューター(より正確には、確定的チューリングマシンまたは非確定的チューリングマシン)が問題を解決するのを助けるものではありません。コンピューターが解決しなければならない問題を表しています。場合によっては、P A ≠ NP Aは、PがNPと実際に異なることを意味するわけではありません。それは、非決定性を使用するだけで、計算モデルが持つ重要なリソースであることを意味します。これにより、いくつかの問題を効率的に解決でき、方法がありません一般的に、決定論的コンピューターで非決定論を効率的にシミュレートします。したがって、Aの計算に関連する問題を解決する場合は、Aを効率的に計算できる関数の構造に関する情報が絶対に必要になります。
これはオラクルの主なものの1つです。問題に関する限られた情報が提供されている場合に、計算モデルが問題を解決できる方法とできない方法について話し合うことができます。
Deutsch–JoszaアルゴリズムまたはBernstein–Vaziraniアルゴリズムは、原則として、自分のために実行するアルゴリズムではありません。(そうではありません。次のセクションを参照してください。)これらは、問題を解決する方法を表しています。彼らはどのような問題を解決しますか?それらは、関心のある関数の特定の機能を発見することを可能にします-それが定数/バランスであるかどうか、またはどのベクトルがベクトルのスカラー値線形関数に関連付けられているか。
どのような機能を実行しますか?—回答に関心のあるすべての機能でそれらを実行します。
オラクルベースのアルゴリズムとしてのこれらの説明は重要ではありません。オラクルの問題は基本的に、理想的な量子コンピューターを使用すると、実際に関数を効率的に評価できれば、関数についてほとんど知らなくても問題を解決できることを知ることができます。もちろん、そのような関数を実際に評価するには、評価方法の説明が必要です。そのため、oracle設定よりも多くの情報が得られます。ただし、同じアルゴリズムを使用できなくなるわけではありません。
オラクルの設定よりも多くの情報がある場合、何が起こるかというと、突然問題を解決できる方法が他にもあるということです。具体的には、古典的に効率的に問題を解くことが可能になるかもしれません。(これはと同じ観察であるP A ≠ NP A:それはである問題があることを証明しているNP任意の効率的な決定論的アルゴリズムが少なくとも必要とするであろう、実際の構造情報を解くことができるように-あなたは説明を提供するときにそれは「オラクル」ではなく、効率的に計算可能な関数の場合、問題が発生する可能性がありますP。)これは、量子アルゴリズムは、提示された特定の問題を解決する際に、古典的なアルゴリズムと同じ利点を持たない可能性があることを意味します。
最後に、何かを解くための量子アルゴリズムがあるからといって、それが必ずしも何かを解くための最良の方法であるとは限りません。これは間違いなくドイツジョッザアルゴリズムに当てはまります。オラクルの設定でさえ、ランダム性の使用はほぼ同じくらい良く、信頼できる大きな量子コンピューターがまだないので、はるかに良いです!しかし、再び...
Deutsch–Joszaアルゴリズムを実装する目的は、「Hello、World!」を実装することと同じです。差し迫った未解決の問題を解決するのではなく、他のことを行うのに役立つツールを使用して練習することです。
コーディングを練習するには、オラクルを実装するアイデアと、オラクルを評価するコンピューターのアイデアに完全にリラックスして快適に感じる必要があります。原則として、これがあなたがやりたいことのポイントです。古典的なコンピューターが重ね合わせのすべての分岐を実際に評価し、それが問題の答えを明示的に見つけて、それが量子コンピューターであると少しだけ遠回りに振る舞う古典的なエミュレーターを使用している場合でも、それはそうです—あなたは他のことに役立つかもしれない、そしてある日は古典的なコンピュータでは実行されないであろうツールの使い方を練習しています。
では、オラクルを実装するにはどうすればよいでしょうか?
(i)実践しているという考えに本当にコミットしている場合、魔法のようなことをしているふりをする必要はありません。結果が一定であるか、バランスが取れているかが偶然の観察者に明らかに明白であっても、oracle関数を実装するためのあらゆる方法を考え出します。アルゴリズムの実現を練習しようとしているだけです。誰かが詐欺師であると非難し、癌を治すふりをしているが実際にはレゴで遊んでいることを心配しないでください。あなたは癌を治すふりをしたことはありません、そしてあなたは意図的な選択によってレゴと遊んでいます。それを受け入れて、それをやってください。
、そして古典的にそれを解決する方法が明らかでない場合、それは重要です。
たとえば、
定数関数または平衡関数のいずれかを評価することが保証された構造を得るために、上記の構造をいくらか複雑化/難読化することができ、これら2つのどちらが発生するかが明らかではなく、さらに難しい場合でも、私はできる現時点では、どのように考えるか。
これは実際に行うのが非常に難しいことを覚えておいてください。しかし、それを行う方法を見ることができるなら、それは非常に価値があるでしょう。量子複雑度と古典的複雑度の間の小さいが無条件の分離を示すこと。これは、過去数年間に量子複雑度で発生する最も興味深いことの1つでした。
神託を「評価」しているという事実に気を取られないでください。
何かに汗をかいたら、関数の実際の記述が量子コンピューターなしで同じ問題を簡単に解決できるかもしれないことを心配するだけです。
あなたの動機が量子プログラミングで練習することだけであるならば、それについてさえ心配しないでください。地球温暖化のような価値のある問題の心配を省いてください。それまでの間、何かを構築しながらレゴで遊んでください。