<jupyter_start><jupyter_text>３体問題の２体問題への分解QUBOでは通常２体問題と呼ばれる２つの量子ビットの掛け算までしか計算できません。しかし、時々問題を作っている際に、３量子ビット以上の掛け算が出ることがあります。その際には数学的なテクニックを利用して３体問題を２体問題に分解をします。 ２体問題の解き方例えば下記のようなコスト関数がある時には、そのままその係数をQUBOで計算できます。これは、$q_0$のバイアスと$q_0,q1$間の結合係数を上三角行列で表すことで実現できます。詳しくは他のチュートリアルを参考にしてください。$$E = q_0-q_0q_1$$<jupyter_code>!pip install blueqat
import blueqat.opt as wq
a = wq.opt()
a.qubo = [[1,-1],[0,0]]
a.sa()<jupyter_output><empty_output><jupyter_text>３体問題の解き方では、３体問題という量子ビットが複数掛け算されているものはどうでしょうか？結合係数は２量子ビット同士の係数しかないので、そのままでは設定できません。$$E = q_0 -q_0q_1q_2$$そこで、今回はこの３体問題を数学的に２体問題に分解します。 分解方法分解に際して新しい量子ビットを追加します。下記のように新しい量子ビットを加えて、表現します。$$q_1q_2 = q_3$$ただ、置き換えただけではなく、上記条件を満たすための新しい拘束条件を式の最後に付け加えます。$$E = q_0-q_0q_3+\delta(3q_3+q_1q_2-2q_1q_3-2q_2q_3)$$係数の$\delta$はその時々によって調整するハイパーパラメータです。ここでは$\delta$を0.5にしてみると下記のようになり、$$E = q_0-q_0q_3+1.5q_3+0.5q_1q_2-q_1q_3-q_2q_3$$これを計算にかけると、<jupyter_code>b = wq.opt()
b.qubo = [[1,0,0,-1],[0,0,0.5,-1],[0,0,0,-1],[0,0,0,1.5]]
b.sa()<jupyter_output><empty_output><jupyter_text>実際に、これは条件を満たしています。$$q_0*q_2=1*1=1=q_3$$全体のエネルギーの遷移は図で確認することができて下記のようになります。<jupyter_code>a.plot()<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.15859030837004406, 'fraction_numerical': 0.07312775330396476, 'mean_word_length': 17.62295081967213, 'pattern_counts': {'":': 0, '<': 13, '<?xml version=': 0, '>': 13, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '3', 'dir': 'jupyter-structured-clean-dedup', 'id': '191129', 'license': 'Apache-2.0', 'n_tokens_mistral': 986, 'n_tokens_neox': 898, 'n_words': 24, 'path': 'tutorial-ja/317_boolean_ja.ipynb', 'repo_name': 'KeiichiroHiga/Blueqat-tutorials', 'size': '1135'}