概要
量子コンパイラを作る。
elixirで論理回路アセンブラをコンパイルして、qiskitな2ビット乗算器を生成した。
投入したソース
make 12
in 0 3
and 0 2 4
and 1 2 5
and 1 3 11
and 0 3 6
xor 5 6 10
and 5 6 7
xor 4 7 9
and 4 7 8
out 9 11
生成したqiskit
from qiskit import QuantumCircuit
from qiskit.primitives import StatevectorSampler
def tow(s):
if (s == "00"):
return "0"
if (s == "01"):
return "1"
if (s == "10"):
return "2"
if (s == "11"):
return "3"
def fow(s):
if (s == "0000"):
return "0"
if (s == "0001"):
return "1"
if (s == "0010"):
return "2"
if (s == "0011"):
return "3"
if (s == "0100"):
return "4"
if (s == "0101"):
return "5"
if (s == "0110"):
return "6"
if (s == "0111"):
return "7"
if (s == "1000"):
return "8"
if (s == "1001"):
return "9"
if (s == "1010"):
return "10"
if (s == "1011"):
return "11"
if (s == "1100"):
return "12"
if (s == "1101"):
return "13"
if (s == "1110"):
return "14"
if (s == "1111"):
return "15"
qc = QuantumCircuit(12)
qc.h(0)
qc.h(1)
qc.h(2)
qc.h(3)
qc.ccx(0, 2, 4)
qc.ccx(1, 2, 5)
qc.ccx(1, 3, 11)
qc.ccx(0, 3, 6)
qc.cx(5, 10)
qc.cx(6, 10)
qc.ccx(5, 6, 7)
qc.cx(4, 9)
qc.cx(7, 9)
qc.ccx(4, 7, 8)
qc.measure_all()
print(qc)
sampler = StatevectorSampler()
job = sampler.run([qc], shots = 100)
result = job.result()
counts = result[0].data.meas.get_counts()
print(f" {counts}")
for ans, cnt in counts.items():
print(tow(ans[11] + ans[10]), " * ", tow(ans[9] + ans[8]), " = ", fow(ans[3] + ans[2] + ans[1] + ans[0]))
成果物
qiskit実行結果
$ python3 test22.py
┌───┐ ░ ┌─┐
q_0: ┤ H ├──■────────────────────────■───────────────────────░─┤M├─────────────────────────────────
├───┤ │ │ ░ └╥┘┌─┐
q_1: ┤ H ├──┼────■─────────■─────────┼───────────────────────░──╫─┤M├──────────────────────────────
├───┤ │ │ │ │ ░ ║ └╥┘┌─┐
q_2: ┤ H ├──■────■─────────┼─────────┼───────────────────────░──╫──╫─┤M├───────────────────────────
├───┤ │ │ │ │ ░ ║ ║ └╥┘┌─┐
q_3: ┤ H ├──┼────┼─────────■─────────■───────────────────────░──╫──╫──╫─┤M├────────────────────────
└───┘┌─┴─┐ │ │ │ ░ ║ ║ ║ └╥┘┌─┐
q_4: ─────┤ X ├──┼────■────┼─────────┼───────────────────■───░──╫──╫──╫──╫─┤M├─────────────────────
└───┘┌─┴─┐ │ │ │ │ ░ ║ ║ ║ ║ └╥┘┌─┐
q_5: ──────────┤ X ├──┼────┼────■────┼─────────■─────────┼───░──╫──╫──╫──╫──╫─┤M├──────────────────
└───┘ │ │ │ ┌─┴─┐ │ │ ░ ║ ║ ║ ║ ║ └╥┘┌─┐
q_6: ─────────────────┼────┼────┼──┤ X ├──■────■─────────┼───░──╫──╫──╫──╫──╫──╫─┤M├───────────────
│ │ │ └───┘ │ ┌─┴─┐ │ ░ ║ ║ ║ ║ ║ ║ └╥┘┌─┐
q_7: ─────────────────┼────┼────┼─────────┼──┤ X ├──■────■───░──╫──╫──╫──╫──╫──╫──╫─┤M├────────────
│ │ │ │ └───┘ │ ┌─┴─┐ ░ ║ ║ ║ ║ ║ ║ ║ └╥┘┌─┐
q_8: ─────────────────┼────┼────┼─────────┼─────────┼──┤ X ├─░──╫──╫──╫──╫──╫──╫──╫──╫─┤M├─────────
┌─┴─┐ │ │ │ ┌─┴─┐└───┘ ░ ║ ║ ║ ║ ║ ║ ║ ║ └╥┘┌─┐
q_9: ───────────────┤ X ├──┼────┼─────────┼───────┤ X ├──────░──╫──╫──╫──╫──╫──╫──╫──╫──╫─┤M├──────
└───┘ │ ┌─┴─┐ ┌─┴─┐ └───┘ ░ ║ ║ ║ ║ ║ ║ ║ ║ ║ └╥┘┌─┐
q_10: ──────────────────────┼──┤ X ├─────┤ X ├────────────────░──╫──╫──╫──╫──╫──╫──╫──╫──╫──╫─┤M├───
┌─┴─┐└───┘ └───┘ ░ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ └╥┘┌─┐
q_11: ────────────────────┤ X ├───────────────────────────────░──╫──╫──╫──╫──╫──╫──╫──╫──╫──╫──╫─┤M├
└───┘ ░ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ └╥┘
meas: 12/═══════════════════════════════════════════════════════════╩══╩══╩══╩══╩══╩══╩══╩══╩══╩══╩══╩═
0 1 2 3 4 5 6 7 8 9 10 11
{'011000110111': 7, '001000010101': 7, '000000000001': 9, '011001011101': 4, '010000100110': 12, '000000000100': 9, '000000000011': 4, '000000001100': 8, '100000001010': 7, '000000000010': 2, '000000000000': 6, '100111111111': 3, '110000101110': 6, '000000001000': 7, '110001001011': 5, '010001001001': 4}
3 * 2 = 6
2 * 2 = 4
2 * 0 = 0
2 * 3 = 6
1 * 2 = 2
0 * 2 = 0
3 * 0 = 0
0 * 3 = 0
1 * 1 = 1
1 * 0 = 0
0 * 0 = 0
3 * 3 = 9
1 * 3 = 3
0 * 1 = 0
3 * 1 = 3
2 * 1 = 2
以上。