가상 양자 컴퓨터에서 1+1
소개
최근에는 양자 컴퓨터를 부담없이 사용할 수 있게 되었습니다. IBM은 진짜 양자 컴퓨터를 클라우드로 공개 하고 있어, 양자 컴퓨터용 프로그래밍 언어 등도 나오고 있습니다.
이번에는 그 중에서도 Python의 라이브러리인 pyQuil을 사용하여 놀아 보았습니다.
pyQuil 정보
양자 컴퓨터를 개발하는 Rigetti라는 회사의 API에 액세스하여 가상 양자 컴퓨터에서 계산할 수 있습니다. 공식 문서 를 참고로 하고 있습니다.
환경
OS: macOs High Sierra
Python: Anaconda3-5.0.0
pyQuil 버전은 1.7.0
설치 방법
@ 유이치로 미나토 님의 기사에 정리되어 있으므로, 그쪽을 참고로 해 주세요.
양자 게이트 모델의 SDK, Rigetti Forest를 만져보세요
pip 한 번에 들어갈 것입니다만, 내 환경이라고 왠지 실패하기 때문에 소스로부터 인스톨 했습니다.
어딘가 적절한 디렉토리에서
git clone [email protected]:rigetticomputing/pyquil.git
cd pyquil
pip insall -e .
실행하면 사용할 수 있습니다.
전제 지식
이번에는 「원래 양자 컴퓨터란 무엇인가?」라든가 「양자 게이트는?」같은 곳은 접하지 않습니다.
그 근처에서 알고 싶은 사람을 위해, IBM이 좋은 느낌의 입문 기사를 공개해 주기 때문에 소개해 둡니다.
IBM Quantum Computing으로 계산해 봅시다.
1+1을 계산하는 양자 회로
양자 회로도는 이런 느낌이 되었습니다. CNOT 게이트와 CCNOT 게이트만으로 구성됩니다.
이번에는 파워포로 그렸습니다만, 양자 회로를 그리는데 보다 편리한 툴을 아는 사람은 코멘트해 주세요.
[0]과 [1]의 비트에 더하는 수(0 또는 1)로 [2]와 [3]이 계산 결과입니다. 자주 있는 1비트 가산기를 양자 회로로 바꾸었을 뿐이지요.
[2]에 하고 있는 처리가 고전적인 컴퓨터에서 말하는 XOR, [3]이 AND 연산에 해당합니다.
만든 프로그램
이런 프로그램이 되었습니다.
one_plus_one.pyfrom pyquil import api
from pyquil.quil import Program
from pyquil.gates import *
def add(num1, num2):
# 量子ビットの初期化(無くてもいいのかも)
calc = Program(I(0), I(1), I(2), I(3))
# 1が入力されてたら反転させる
if num1:
calc.inst(X(0))
if num2:
calc.inst(X(1))
# 残りの計算はどの場合も共通
calc.inst(CNOT(0, 2), CNOT(1, 2), CCNOT(0, 1, 3))
# 量子ビットの値を古典ビットに入れて観測する
calc.measure(0,0).measure(1,1).measure(2,2).measure(3,3)
return calc
# 初期状態の結果はビットの並びが逆順になっているから整形する
def formating_result(result):
left_hand = str(result[0][0]), str(result[0][1])
right_hand = str( int(str(result[0][3]) + str(result[0][2]), 2) )
answer = left_hand[0] + ' + ' + left_hand[1] + ' = ' + right_hand
return answer
def main():
qvm = api.QVMConnection()
calc = add(0, 0)
result = qvm.run(calc, [0, 1, 2, 3])
answer = formating_result(result)
print(answer)
if __name__ == '__main__':
main()
실제로 양자 게이트를 설정하는 것은 add()입니다.
좀 더 열심히 확장하면 다비트화할 수 있다고 생각한다.
add() 의 인수에 따라 계산해 줍니다. 현재 인수는 0과 1뿐입니다.
계산 결과
4 패턴 밖에 없기 때문에, 테스트도 편합니다. 실행하면 아래와 같은 출력을 합니다.
1 + 1:$ python one_plus_one.py
1 + 1 = 2
1 + 0:$ python one_plus_one.py
1 + 0 = 1
중첩
그건 그렇고, add ()를 조금 다시 써주세요.
calc = Program(
I(0), I(1), I(2), I(3),
H(0), H(1),
CNOT(0, 2), CNOT(1, 2),
CCNOT(0, 1, 3)
)
와 같이 하면 0과 1을 겹쳐서 동시에 입력할 수 있습니다.
이 중첩이 양자 컴퓨터의 가장 큰 무기이지만, 이번에는 단지 출력이 랜덤하게 될뿐입니다.
좀 더 복잡한 양자 알고리즘이 되면, 중첩을 풀 활용해 가게 됩니다.
결론
이번에는 pyQuil을 사용하고 싶다! 라는 생각으로 해 보았습니다.
그렇다고는 해도, 더하기 정도라고 양자 컴퓨터로 하는 의미는 전혀 없기 때문에, 다음은 좀 더 양자 컴퓨터다운 알고리즘에 도전해 보겠습니다.
Reference
이 문제에 관하여(가상 양자 컴퓨터에서 1+1), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/bond_kaneko/items/a0c273a4e181187126e5
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
git clone [email protected]:rigetticomputing/pyquil.git
cd pyquil
pip insall -e .
양자 회로도는 이런 느낌이 되었습니다. CNOT 게이트와 CCNOT 게이트만으로 구성됩니다.
이번에는 파워포로 그렸습니다만, 양자 회로를 그리는데 보다 편리한 툴을 아는 사람은 코멘트해 주세요.
[0]과 [1]의 비트에 더하는 수(0 또는 1)로 [2]와 [3]이 계산 결과입니다. 자주 있는 1비트 가산기를 양자 회로로 바꾸었을 뿐이지요.
[2]에 하고 있는 처리가 고전적인 컴퓨터에서 말하는 XOR, [3]이 AND 연산에 해당합니다.
만든 프로그램
이런 프로그램이 되었습니다.
one_plus_one.pyfrom pyquil import api
from pyquil.quil import Program
from pyquil.gates import *
def add(num1, num2):
# 量子ビットの初期化(無くてもいいのかも)
calc = Program(I(0), I(1), I(2), I(3))
# 1が入力されてたら反転させる
if num1:
calc.inst(X(0))
if num2:
calc.inst(X(1))
# 残りの計算はどの場合も共通
calc.inst(CNOT(0, 2), CNOT(1, 2), CCNOT(0, 1, 3))
# 量子ビットの値を古典ビットに入れて観測する
calc.measure(0,0).measure(1,1).measure(2,2).measure(3,3)
return calc
# 初期状態の結果はビットの並びが逆順になっているから整形する
def formating_result(result):
left_hand = str(result[0][0]), str(result[0][1])
right_hand = str( int(str(result[0][3]) + str(result[0][2]), 2) )
answer = left_hand[0] + ' + ' + left_hand[1] + ' = ' + right_hand
return answer
def main():
qvm = api.QVMConnection()
calc = add(0, 0)
result = qvm.run(calc, [0, 1, 2, 3])
answer = formating_result(result)
print(answer)
if __name__ == '__main__':
main()
실제로 양자 게이트를 설정하는 것은 add()입니다.
좀 더 열심히 확장하면 다비트화할 수 있다고 생각한다.
add() 의 인수에 따라 계산해 줍니다. 현재 인수는 0과 1뿐입니다.
계산 결과
4 패턴 밖에 없기 때문에, 테스트도 편합니다. 실행하면 아래와 같은 출력을 합니다.
1 + 1:$ python one_plus_one.py
1 + 1 = 2
1 + 0:$ python one_plus_one.py
1 + 0 = 1
중첩
그건 그렇고, add ()를 조금 다시 써주세요.
calc = Program(
I(0), I(1), I(2), I(3),
H(0), H(1),
CNOT(0, 2), CNOT(1, 2),
CCNOT(0, 1, 3)
)
와 같이 하면 0과 1을 겹쳐서 동시에 입력할 수 있습니다.
이 중첩이 양자 컴퓨터의 가장 큰 무기이지만, 이번에는 단지 출력이 랜덤하게 될뿐입니다.
좀 더 복잡한 양자 알고리즘이 되면, 중첩을 풀 활용해 가게 됩니다.
결론
이번에는 pyQuil을 사용하고 싶다! 라는 생각으로 해 보았습니다.
그렇다고는 해도, 더하기 정도라고 양자 컴퓨터로 하는 의미는 전혀 없기 때문에, 다음은 좀 더 양자 컴퓨터다운 알고리즘에 도전해 보겠습니다.
Reference
이 문제에 관하여(가상 양자 컴퓨터에서 1+1), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/bond_kaneko/items/a0c273a4e181187126e5
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
from pyquil import api
from pyquil.quil import Program
from pyquil.gates import *
def add(num1, num2):
# 量子ビットの初期化(無くてもいいのかも)
calc = Program(I(0), I(1), I(2), I(3))
# 1が入力されてたら反転させる
if num1:
calc.inst(X(0))
if num2:
calc.inst(X(1))
# 残りの計算はどの場合も共通
calc.inst(CNOT(0, 2), CNOT(1, 2), CCNOT(0, 1, 3))
# 量子ビットの値を古典ビットに入れて観測する
calc.measure(0,0).measure(1,1).measure(2,2).measure(3,3)
return calc
# 初期状態の結果はビットの並びが逆順になっているから整形する
def formating_result(result):
left_hand = str(result[0][0]), str(result[0][1])
right_hand = str( int(str(result[0][3]) + str(result[0][2]), 2) )
answer = left_hand[0] + ' + ' + left_hand[1] + ' = ' + right_hand
return answer
def main():
qvm = api.QVMConnection()
calc = add(0, 0)
result = qvm.run(calc, [0, 1, 2, 3])
answer = formating_result(result)
print(answer)
if __name__ == '__main__':
main()
4 패턴 밖에 없기 때문에, 테스트도 편합니다. 실행하면 아래와 같은 출력을 합니다.
1 + 1:
$ python one_plus_one.py
1 + 1 = 2
1 + 0:
$ python one_plus_one.py
1 + 0 = 1
중첩
그건 그렇고, add ()를 조금 다시 써주세요.
calc = Program(
I(0), I(1), I(2), I(3),
H(0), H(1),
CNOT(0, 2), CNOT(1, 2),
CCNOT(0, 1, 3)
)
와 같이 하면 0과 1을 겹쳐서 동시에 입력할 수 있습니다.
이 중첩이 양자 컴퓨터의 가장 큰 무기이지만, 이번에는 단지 출력이 랜덤하게 될뿐입니다.
좀 더 복잡한 양자 알고리즘이 되면, 중첩을 풀 활용해 가게 됩니다.
결론
이번에는 pyQuil을 사용하고 싶다! 라는 생각으로 해 보았습니다.
그렇다고는 해도, 더하기 정도라고 양자 컴퓨터로 하는 의미는 전혀 없기 때문에, 다음은 좀 더 양자 컴퓨터다운 알고리즘에 도전해 보겠습니다.
Reference
이 문제에 관하여(가상 양자 컴퓨터에서 1+1), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/bond_kaneko/items/a0c273a4e181187126e5
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
calc = Program(
I(0), I(1), I(2), I(3),
H(0), H(1),
CNOT(0, 2), CNOT(1, 2),
CCNOT(0, 1, 3)
)
이번에는 pyQuil을 사용하고 싶다! 라는 생각으로 해 보았습니다.
그렇다고는 해도, 더하기 정도라고 양자 컴퓨터로 하는 의미는 전혀 없기 때문에, 다음은 좀 더 양자 컴퓨터다운 알고리즘에 도전해 보겠습니다.
Reference
이 문제에 관하여(가상 양자 컴퓨터에서 1+1), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/bond_kaneko/items/a0c273a4e181187126e5텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)