가상 양자 컴퓨터에서 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.py
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()

실제로 양자 게이트를 설정하는 것은 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을 사용하고 싶다! 라는 생각으로 해 보았습니다.
그렇다고는 해도, 더하기 정도라고 양자 컴퓨터로 하는 의미는 전혀 없기 때문에, 다음은 좀 더 양자 컴퓨터다운 알고리즘에 도전해 보겠습니다.

좋은 웹페이지 즐겨찾기