概要
量子コンパイラを作る。
elixirで論理回路アセンブラをコンパイルして、qiskitな3ビット加算器を生成した。
投入したソース
make 18
in 0 5
wire 6 13
xor 0 3 14
and 0 3 6
xor 1 4 7
and 1 4 8
xor 6 7 15
and 6 7 9
or 8 9 10
xor 2 5 11
and 2 5 12
xor 10 11 16
and 10 11 13
or 12 13 17
out 14 17
生成した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 eow(s):
if (s == "000"):
return "0"
if (s == "001"):
return "1"
if (s == "010"):
return "2"
if (s == "011"):
return "3"
if (s == "100"):
return "4"
if (s == "101"):
return "5"
if (s == "110"):
return "6"
if (s == "111"):
return "7"
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(18)
qc.h(0)
qc.h(1)
qc.h(2)
qc.h(3)
qc.h(4)
qc.h(5)
qc.cx(0, 14)
qc.cx(3, 14)
qc.ccx(0, 3, 6)
qc.cx(1, 7)
qc.cx(4, 7)
qc.ccx(1, 4, 8)
qc.cx(6, 15)
qc.cx(7, 15)
qc.ccx(6, 7, 9)
qc.ccx(8, 9, 10)
qc.cx(8, 10)
qc.cx(9, 10)
qc.cx(2, 11)
qc.cx(5, 11)
qc.ccx(2, 5, 12)
qc.cx(10, 16)
qc.cx(11, 16)
qc.ccx(10, 11, 13)
qc.ccx(12, 13, 17)
qc.cx(12, 17)
qc.cx(13, 17)
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(eow(ans[15] + ans[16] + ans[17]), " + ", eow(ans[12] + ans[13] + ans[14]), " = ", fow(ans[0] + ans[1] + ans[2] + ans[3]))
成果物
qiskit実行結果
$ python3 test23.py
┌───┐ »
q_0: ┤ H ├──■─────────────────────────────■────────────────────────────────────────────────────────────────────────»
├───┤ │ │ »
q_1: ┤ H ├──┼────■────────────────────────┼────■───────────────────────────────────────────────────────────────────»
├───┤ │ │ │ │ »
q_2: ┤ H ├──┼────┼────■───────────────────┼────┼────■──────────────────────────────────────────────────────────────»
├───┤ │ │ │ │ │ │ »
q_3: ┤ H ├──┼────┼────┼────■──────────────■────┼────┼──────────────────────────────────────────────────────────────»
├───┤ │ │ │ │ │ │ │ »
q_4: ┤ H ├──┼────┼────┼────┼────■─────────┼────■────┼──────────────────────────────────────────────────────────────»
├───┤ │ │ │ │ │ │ │ │ »
q_5: ┤ H ├──┼────┼────┼────┼────┼────■────┼────┼────■──────────────────────────────────────────────────────────────»
└───┘ │ │ │ │ │ │ ┌─┴─┐ │ │ »
q_6: ───────┼────┼────┼────┼────┼────┼──┤ X ├──┼────┼────■─────────■───────────────────────────────────────────────»
│ ┌─┴─┐ │ │ ┌─┴─┐ │ └───┘ │ │ │ │ »
q_7: ───────┼──┤ X ├──┼────┼──┤ X ├──┼─────────┼────┼────┼────■────■───────────────────────────────────────────────»
│ └───┘ │ │ └───┘ │ ┌─┴─┐ │ │ │ │ »
q_8: ───────┼─────────┼────┼─────────┼───────┤ X ├──┼────┼────┼────┼────■────■─────────────────────────────────────»
│ │ │ │ └───┘ │ │ │ ┌─┴─┐ │ │ »
q_9: ───────┼─────────┼────┼─────────┼──────────────┼────┼────┼──┤ X ├──■────┼────■────────────────────────────────»
│ │ │ │ │ │ │ └───┘┌─┴─┐┌─┴─┐┌─┴─┐ »
q_10: ───────┼─────────┼────┼─────────┼──────────────┼────┼────┼───────┤ X ├┤ X ├┤ X ├──■─────────■─────────────────»
│ ┌─┴─┐ │ ┌─┴─┐ │ │ │ └───┘└───┘└───┘ │ │ »
q_11: ───────┼───────┤ X ├──┼───────┤ X ├────────────┼────┼────┼────────────────────────┼────■────■─────────────────»
│ └───┘ │ └───┘ ┌─┴─┐ │ │ │ │ │ »
q_12: ───────┼──────────────┼──────────────────────┤ X ├──┼────┼────────────────────────┼────┼────┼────■────■───────»
│ │ └───┘ │ │ │ │ ┌─┴─┐ │ │ »
q_13: ───────┼──────────────┼─────────────────────────────┼────┼────────────────────────┼────┼──┤ X ├──■────┼────■──»
┌─┴─┐ ┌─┴─┐ │ │ │ │ └───┘ │ │ │ »
q_14: ─────┤ X ├──────────┤ X ├───────────────────────────┼────┼────────────────────────┼────┼─────────┼────┼────┼──»
└───┘ └───┘ ┌─┴─┐┌─┴─┐ │ │ │ │ │ »
q_15: ──────────────────────────────────────────────────┤ X ├┤ X ├──────────────────────┼────┼─────────┼────┼────┼──»
└───┘└───┘ ┌─┴─┐┌─┴─┐ │ │ │ »
q_16: ────────────────────────────────────────────────────────────────────────────────┤ X ├┤ X ├───────┼────┼────┼──»
└───┘└───┘ ┌─┴─┐┌─┴─┐┌─┴─┐»
q_17: ───────────────────────────────────────────────────────────────────────────────────────────────┤ X ├┤ X ├┤ X ├»
└───┘└───┘└───┘»
meas: 18/══════════════════════════════════════════════════════════════════════════════════════════════════════════════»
»
« ░ ┌─┐
« q_0: ─░─┤M├───────────────────────────────────────────────────
« ░ └╥┘┌─┐
« q_1: ─░──╫─┤M├────────────────────────────────────────────────
« ░ ║ └╥┘┌─┐
« q_2: ─░──╫──╫─┤M├─────────────────────────────────────────────
« ░ ║ ║ └╥┘┌─┐
« q_3: ─░──╫──╫──╫─┤M├──────────────────────────────────────────
« ░ ║ ║ ║ └╥┘┌─┐
« q_4: ─░──╫──╫──╫──╫─┤M├───────────────────────────────────────
« ░ ║ ║ ║ ║ └╥┘┌─┐
« q_5: ─░──╫──╫──╫──╫──╫─┤M├────────────────────────────────────
« ░ ║ ║ ║ ║ ║ └╥┘┌─┐
« q_6: ─░──╫──╫──╫──╫──╫──╫─┤M├─────────────────────────────────
« ░ ║ ║ ║ ║ ║ ║ └╥┘┌─┐
« q_7: ─░──╫──╫──╫──╫──╫──╫──╫─┤M├──────────────────────────────
« ░ ║ ║ ║ ║ ║ ║ ║ └╥┘┌─┐
« q_8: ─░──╫──╫──╫──╫──╫──╫──╫──╫─┤M├───────────────────────────
« ░ ║ ║ ║ ║ ║ ║ ║ ║ └╥┘┌─┐
« q_9: ─░──╫──╫──╫──╫──╫──╫──╫──╫──╫─┤M├────────────────────────
« ░ ║ ║ ║ ║ ║ ║ ║ ║ ║ └╥┘┌─┐
« q_10: ─░──╫──╫──╫──╫──╫──╫──╫──╫──╫──╫─┤M├─────────────────────
« ░ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ └╥┘┌─┐
« q_11: ─░──╫──╫──╫──╫──╫──╫──╫──╫──╫──╫──╫─┤M├──────────────────
« ░ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ └╥┘┌─┐
« q_12: ─░──╫──╫──╫──╫──╫──╫──╫──╫──╫──╫──╫──╫─┤M├───────────────
« ░ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ └╥┘┌─┐
« q_13: ─░──╫──╫──╫──╫──╫──╫──╫──╫──╫──╫──╫──╫──╫─┤M├────────────
« ░ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ └╥┘┌─┐
« q_14: ─░──╫──╫──╫──╫──╫──╫──╫──╫──╫──╫──╫──╫──╫──╫─┤M├─────────
« ░ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ └╥┘┌─┐
« q_15: ─░──╫──╫──╫──╫──╫──╫──╫──╫──╫──╫──╫──╫──╫──╫──╫─┤M├──────
« ░ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ └╥┘┌─┐
« q_16: ─░──╫──╫──╫──╫──╫──╫──╫──╫──╫──╫──╫──╫──╫──╫──╫──╫─┤M├───
« ░ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ └╥┘┌─┐
« q_17: ─░──╫──╫──╫──╫──╫──╫──╫──╫──╫──╫──╫──╫──╫──╫──╫──╫──╫─┤M├
« ░ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ └╥┘
«meas: 18/════╩══╩══╩══╩══╩══╩══╩══╩══╩══╩══╩══╩══╩══╩══╩══╩══╩══╩═
« 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
{'011100100010011100': 2, '010100010100010011': 4, '011100100010010101': 2, '001000000001001001': 3, '001100000010001010': 4, '011000100010110000': 1, '001100000010011000': 1, '111001010101111111': 3, '011000100010010100': 2, '010100100000101000': 2, '101001000001101101': 1, '011100100010111000': 4, '101010110101111011': 4, '100110110100011110': 4, '011000010101011011': 1, '100110110100110011': 2, '101101000010111100': 3, '100010111011111001': 1, '101001000010100110': 3, '100010111011001111': 4, '100101000000100101': 3, '101101000010110101': 2, '001000000010010000': 1, '100110110100111010': 2, '001100000010000011': 2, '010000011011011001': 3, '010000100000100000': 2, '010100010100011010': 2, '101001000010110100': 4, '100010111011101011': 1, '011100100010001110': 1, '000000000000000000': 2, '001000000010000010': 1, '000100000000000001': 1, '100110110100010111': 1, '010000011011001011': 2, '100001000000100100': 2, '110101010100110111': 1, '001100000010010001': 3, '011000100001001101': 1, '011000100010000110': 1, '110001011011101111': 1, '011100100010101010': 2, '010100100000100001': 1, '011100100010000111': 2, '100010111011011101': 3, '010000010100010010': 1, '110001011011111101': 1}
4 + 3 = 7
3 + 2 = 5
5 + 2 = 7
1 + 1 = 2
2 + 1 = 3
0 + 6 = 6
0 + 3 = 3
7 + 7 = 14
4 + 2 = 6
0 + 5 = 5
5 + 5 = 10
0 + 7 = 7
3 + 7 = 10
6 + 3 = 9
3 + 3 = 6
3 + 6 = 9
4 + 7 = 11
1 + 7 = 8
6 + 4 = 10
7 + 1 = 8
5 + 4 = 9
5 + 6 = 11
0 + 2 = 2
2 + 7 = 9
3 + 0 = 3
1 + 3 = 4
0 + 4 = 4
2 + 3 = 5
4 + 6 = 10
3 + 5 = 8
6 + 1 = 7
0 + 0 = 0
2 + 0 = 2
1 + 0 = 1
7 + 2 = 9
3 + 1 = 4
4 + 4 = 8
7 + 6 = 13
1 + 2 = 3
5 + 1 = 6
6 + 0 = 6
7 + 5 = 12
2 + 5 = 7
1 + 4 = 5
7 + 0 = 7
5 + 3 = 8
2 + 2 = 4
5 + 7 = 12
以上。