펭찐이의 블로그

안녕하세요오오...

펭찐이의 블로그 자세히보기

찐따의 프로그래밍 독학/찐따의 파이썬 독학

찐따의 파이썬 독학 - 양자역학의 가설을 기반으로 구현한 흔한 찐따의 큐비트(Qubit) 수준 파이썬 양자역학 라이브러리

펭찐 2022. 7. 7. 17:44
반응형

 

양자역학의 가설을 기반으로 구현한 흔한 찐따의 큐비트(Qubit) 수준 파이썬 양자역학 라이브러리

 

안녕하세요, 고졸 찐따인 흔한 찐따입니다.

제가 작성한 에세이를 기반으로 구현한 큐비트 수준의 양자역학 라이브러리를 구현해보았습니다.

 

 

[찐따 에세이] 큐비트(Qubit) 수준 파이썬 양자역학 라이브러리 구현을 위한 양자역학의 가설

큐비트(Qubit) 수준 파이썬 양자역학 라이브러리 구현을 위한 양자역학의 가설 개요 <<본 문서는 고졸 찐따가 작성하였습니다.>> 해당 에세이는 파이썬을 활용하여 큐비트 수준의 양자역학 라이브

iamjjintta.tistory.com

 

만약 위의 에세이를 참고하지 않으셨다면 이해하는데 어려움이 있을 수 있습니다.

 

개요

제가 작성한 에세이에서 양자역학의 가설에 대하여 설명하였는데, 다음과 같습니다.

 

  • 양자 상태 (Quantum States)
  • 양자 연산 (Quantum Operation)
  • 양자 구성 (Quantum Composition)
  • 양자역학의 측정 (Measurement in Quantum Mechanics)

 

위의 가설들은 모두 큐비트 수준으로 표현하기 위해 알아둘 필요가 있는 개념들입니다.

이제 위의 개념들을 토대로 다음의 클래스들을 정의하여 1큐비트 표현을 할 수 있도록 합니다.

 

  • QuState : 양자 상태를 나타내는 클래스
  • QuOperation : 양자 상태를 연산하기 위한 클래스

 

그리고 이제껏 그래왔던 것처럼 다음과 같이 iamjjintta 라는 커스텀 라이브러리를 만들고 qulib 이라는 모듈을 생성하였습니다.

from iamjjintta.qulib import QuState
from iamjjintta.qulib import QuOperation

 

양자 상태 (Quantum States)

단위 길이의 복소 고유벡터로 QuState 를 호출하여 양자 상태를 생성합니다.

v = [1, 0] # up, down
state = QuState(v)

 

양자 연산 (Quantum Operation)

양자 연산은 유니터리 행렬로 QuOperation 을 호출하여 생성합니다.

from math import sqrt

M = [
    [1/sqrt(2), 1/sqrt(2)],
    [1/sqrt(2), -1/sqrt(2)]
]
operation = QuOperation(M)

새로운 상태를 얻기 위해 생성한 상태에 연산을 적용할 수 있습니다.

operation.apply 메서드를 통해 상태 벡터와 행렬곱을 합니다.

new_state = operation.apply(state)

 

양자역학의 측정 (Measure in Quantum Mechanics)

그다음 상태를 측정할 수 있습니다.

상태를 관측할 수 있는 상태 중 하나로 붕괴시켜(파동함수 붕괴) 상태 변형을 일으키고 측정 결과를 반환합니다.

measurement = new_state.measure()

 

양자 구성 (Quantum Composition)

더 큰 시스템을 형성하기 위해 독립 상태를 같이 구성할 수 있습니다.

state.compose 메서드를 통해 두 벡터를 크로네커 곱을 합니다.

state1 = QuState([1, 0]) # up, down
state2 = QuState([0, 1]) # up, down
combined_state = state1.compose(state2)
# up, up
# up, down
# down, up
# down, down

같은 방식으로 연산도 똑같이 적용시키면 됩니다.

위의 예시에서 더 큰 시스템의 두 시스템에 동일한 연산을 적용하는 것을 나타내기 위해 따로 연산을 구성합니다.

역시 operation.compose 메서드를 통해 두 행렬을 크로네커 곱을 합니다.

combined_operation = operation.compose(operation)

 

결론

이렇게 최종 코드가 완성되었습니다.

from iamjjintta.qulib import QuState
from iamjjintta.qulib import QuOperation

from math import sqrt


v = [1, 0]
state = QuState(v)
print(state)
# QuState: [1, 0]

M = [
    [1/sqrt(2), 1/sqrt(2)],
    [1/sqrt(2), -1/sqrt(2)]
]
operation = QuOperation(M)
print(operation)
# QuOperation: [[0.7071067811865475, 0.7071067811865475],
#               [0.7071067811865475, -0.7071067811865475]]

new_state = operation.apply(state)
print(new_state)
# QuState: [0.7071067811865475, 0.7071067811865475]

measurement = new_state.measure()
print(measurement)
# 0 -> 50% chance
# 1 -> 50% chance

print(new_state)
# QuState: [1.0, 0.0] -> 50% chance
# QuState: [0.0, 1.0] -> 50% chance

state1 = QuState([1, 0])
state2 = QuState([0, 1])
combined_state = state1.compose(state2)
print(combined_state)
# QuState: [0, 1, 0, 0]

combined_operation = operation.compose(operation)
print(combined_operation)
# QuOperation: [[ 0.5  0.5  0.5  0.5],
#               [ 0.5 -0.5  0.5 -0.5],
#               [ 0.5  0.5 -0.5 -0.5],
#               [ 0.5 -0.5 -0.5  0.5]]

 

코드를 실행한 결과를 확인해보면 위의 그림과 같이 큐비트의 원리로 작동하는 것을 확인할 수 있었습니다.

 

반응형