1/15(木)『Yokohama Innovation Showcase』(@みなとみらい) に出展します☆彡
量子ゲート

New!! 量子ゲートでピクセルアートを作る(②4×4サイズ編)

AI要約

3×3に続き、4×4のピクセルアートを量子回路で描く方法を解説。量子ビットの割り当てやゲート操作を通じて、より複雑な量子アートの表現に挑戦しています。

はじめに

いいものを買ってきた。ほ~れ~

出典:サザエさん「父さん発明の母」

if文で書いたほうが早いんじゃないか?

出典:サザエさん「父さん発明の母」

びゃあ゛ぁぁうまひぃいぃぃ゛ぃぃぃい!!!やっぱり量子コンピュータで生成したイラストは一味違いますよ~!!

出典:サザエさん「父さん発明の母」

  終
制作・著作
━━━━━
 ⓃⒽⓀ

ということで、前回は量子ゲート計算でライフゲームの「ブリンカー」を生成しました。

今回は少し拡張して4×4サイズのイラストを生成してみます。

4×4サイズの問題

またしてもライフゲームの振動子「ヒキガエル」です。いったいどこがヒキガエルなのか。

16マスあるのでちょっと大変そうですね。実際大変です。量子パートの出力は4ビットです。

「いい感じのゲートたち」の中身を詳しく見てみます。

おいおい、こんなのできるのか?正直しんどいです。量子コンピュータが確率分布を操作するマシンであることを改めて痛感します。入力が0なら [0101, 0110, 0111, 1000, 1001, 1010] の6通りだけが出力されるようにします。

また、塗るマスが6個なので乱数は3ビット必要です。

ヒキガエルの論理合成

乱数は8通りで、生成したい出力は6通り。

いろいろな振り分け方がありますが、心眼を使って効率が良さそうな割り当てを決めます。ズバリ以下の通り。

乱数ビットをA, B, Cとして、なんと1~3桁目まで「そのまんまやんけ!」です。4桁目はどうにもならないので論理式をひねり出します。

1桁目 = A

2桁目 = A'

3桁目 = B

4桁目 = A'B' + A'C + B'C

同様に、入力が1のときも考えます。

1桁目 = A

2桁目 = B

3桁目 = A'B' + A'C + B'C ※再利用

4桁目 = AB + AC + BC

3桁目はさっきの再利用です。

コード

コードで確認します。0番目の量子ビットにXゲートをかけるかどうかで入力を切り替えてください。

import numpy as np
import matplotlib.pyplot as plt
from qiskit import QuantumCircuit
from qiskit_aer import AerSimulator


def NOT(i, j):
    global qc
    """
    (NOT i) -> j
    """
    qc.cx(i, j)
    qc.x(j)

def AND(i, j, k):
    global qc
    """
    (i AND j) -> k
    """
    qc.ccx(i, j, k)

def XOR(i, j, k):
    global qc
    """
    (i XOR j) -> k
    """
    qc.cx(i, k)
    qc.cx(j, k)

def OR(i, j, k):
    global qc
    """
    (i OR j) -> k
    """
    qc.x(i)
    qc.x(j)
    qc.ccx(i, j, k)
    qc.x(i)
    qc.x(j)
    qc.x(k)


#初期化
qc = QuantumCircuit(28)

#入力の1ビット
# qc.x(0) # ここを切り替える

#入力のNOT
NOT(0, 1)

#3ビット(8通り)の乱数を作る
qc.h(2) # A
qc.h(3) # B
qc.h(4) # C

#便利のため、各NOTを用意
NOT(2, 5) # A'
NOT(3, 6) # B'
NOT(4, 7) # C'

#入力=0のときの出力の3ビット
qc.cx(2, 8) # A

qc.cx(5, 9) # A'

qc.cx(3, 10) # B

AND(5, 6, 11) # A'B'
AND(5, 4, 12) # A'C
AND(6, 4, 13) # B'C
OR(11, 12, 14) # A'B' + A'C
OR(14, 13, 15) # A'B' + A'C + B'C

#入力=1のときの出力の3ビット
qc.cx(2, 16) # A

qc.cx(3, 17) # B

qc.cx(15, 18) # A'B' + A'C + B'C

AND(2, 3, 19) # AB
AND(2, 4, 20) # AC
AND(3, 4, 21) # BC
OR(19, 20, 22) # AB + AC
OR(22, 21, 23) # AB + AC + BC

#入力に応じて出力を切り替える
qc.ccx(1, 8, 24) # 1桁目
qc.ccx(1, 9, 25) # 2桁目
qc.ccx(1, 10, 26) # 3桁目
qc.ccx(1, 15, 27) # 4桁目

qc.ccx(0, 16, 24) # 1桁目
qc.ccx(0, 17, 25) # 2桁目
qc.ccx(0, 18, 26) # 3桁目
qc.ccx(0, 23, 27) # 4桁目


#サンプリング
qc.measure_all()
backend = AerSimulator(method='matrix_product_state')
result = backend.run(qc, shots=500).result().get_counts()

#解の統計
pos = (0, 2, 3, 4, 24, 25, 26, 27)
for i in range(2):
    for j in range(2):
        for k in range(2):
            for r in result:
                # print(r)
                sel = ''.join(r[::-1][p] for p in pos)
                if f'{i}{j}{k}' == sel[1:4]:
                    print(f'{sel[0]} | {sel[1:4]} | {sel[4:]} | {result[r]}/500')

入力=0のときの結果

0 | 000 | 0101 | 42/500
0 | 001 | 0101 | 56/500
0 | 010 | 0110 | 60/500
0 | 011 | 0111 | 62/500
0 | 100 | 1000 | 72/500
0 | 101 | 1001 | 79/500
0 | 110 | 1010 | 64/500
0 | 111 | 1010 | 65/500

入力=1のときの結果

1 | 000 | 0010 | 48/500
1 | 001 | 0010 | 73/500
1 | 010 | 0100 | 71/500
1 | 011 | 0111 | 52/500
1 | 100 | 1000 | 65/500
1 | 101 | 1011 | 80/500
1 | 110 | 1101 | 52/500
1 | 111 | 1101 | 59/500

結果は左から「入力」「乱数」「出力」「ヒット回数」です。多分合ってる!(ヤケクソになってきている)

量子譜はこちら。

イラスト生成

サンプリングしながらイラスト化します。

#サンプリングしながらピクセルを点灯
pos = (24, 25, 26, 27)
box = np.zeros(16, 'uint8')
for i in range(50):
    qc.measure_all()
    backend = AerSimulator(method='matrix_product_state')
    result = backend.run(qc, shots=1).result().get_counts()
    r = list(result)[0]
    sel = ''.join(r[::-1][p] for p in pos)
    
    #10進数ワンホットに戻す
    box = box // 1.1 # 過去の色を減衰させる
    idx = int(sel[0])*2**3 + int(sel[1])*2**2 + int(sel[2])*2**1 + int(sel[3])*2**0
    box[idx] = 255
    
    #表示
    img = box.reshape(4, 4)
    plt.imshow(img, vmin=0, vmax=255)
    plt.title(sel)
    plt.show()
    plt.close()

入力=0

入力=1

びゃあ゛ぁぁうまひぃいぃぃ゛ぃぃぃい!!!やっぱり量子コンピュータで(以下略

おわりに

今回使った量子ビットは28個。もう少し節約できます。オーバーヘッドで16マスよりも多く使っていますが、スケールアップしたときにきっとお得になると信じています (・ε・`)ホンマカイナ

次回、お待ちを

リアクションのお願い

「参考になった!」「刺激された!」と思ったらぜひリアクションをしましょう。エンジニアの世界はGive and Takeによって成り立っています。これからも無料で良質な情報にアクセスできるよう、Giveする人への感謝をリアクションで示しましょう!

この記事をシェアする

自身のブログ等で使用する場合は引用を忘れずに!

また、寄付も受け付けています。コーヒー1杯でとても喜びます(*˘︶˘*)

 Amazonでギフト券(アマギフ)を贈る

こちらのリンク から金額を指定してお贈りください。(デフォルトで10000円になっているのでご変更ください)

配送:Eメール
受取人:staffあっとvigne-cla.com
贈り主:あなたのお名前やニックネーム
メッセージ:◯◯の記事が参考になりました。など

のようにご入力ください。見返りはありませんのでご了承ください。

 Amazonで食事券(すかいらーく優待券)を贈る

500円 1000円 2000円 5000円 からお贈りください。

配送:Eメール
受取人:staffあっとvigne-cla.com
贈り主:あなたのお名前やニックネーム
メッセージ:◯◯の記事が参考になりました。など

のようにご入力ください。見返りはありませんのでご了承ください。

 その他、ギフト券やクーポン券をメールで贈る

デジタルのギフト券/クーポン券はメールアドレス(staffあっとvigne-cla.com)までお送りください。受領の返信をいたします。
紙のギフト券/クーポン券は 「郵便物はこちらへ」の住所 まで送付してください。名刺やメールアドレスを同封していただければ受領の連絡をいたします。
余った株主優待券等の処理におすすめです。
いずれも見返りはありませんのでご了承ください。

不明点はSNSでお気軽にご連絡ください

ビネクラのTwitter・Youtubeでコメントをください!


Slack・Discordの場合はこちらの公開グループに参加してShoya YasudaまでDMをください!


※当ブログに関することは何でもご相談・ご依頼可能です。

この記事を書いた人
Yasuda

博士(理学)。専門は免疫細胞、数理モデル、シミュレーション。米国、中国で研究に携わった。遺伝的アルゴリズム信者。物価上昇のため半額弁当とともに絶滅寸前。

タイトルとURLをコピーしました