양자컴퓨팅 로또 번호 생성기

ClassBinu·2024년 4월 24일
0

양자 컴퓨팅

목록 보기
12/17

가상환경

// 가상환경 생성
python3 -m venv .venv

// 가상환경 실행
source .venv/bin/activate

라이브러리 설치

pip3 install qiskit==0.46 qiskit-aer   

코드

import streamlit as st
from qiskit import QuantumCircuit, Aer, execute


MAX_LOTTO_NUMBER = 45
LOTTO_NUMBERS_COUNT = 6


def run_quantum_circuit(num_qubits):
    qc = QuantumCircuit(num_qubits, num_qubits)
    qc.h(range(num_qubits))
    qc.measure(range(num_qubits), range(num_qubits))
    backend = Aer.get_backend("qasm_simulator")
    job = execute(qc, backend, shots=1)
    result = job.result()
    counts = result.get_counts()
    outcome = list(counts.keys())[0]
    return int(outcome, 2)


def quantum_random_number_generator(max_number):
    num_qubits = max_number.bit_length()
    while True:
        random_number = run_quantum_circuit(num_qubits)
        if 1 <= random_number <= max_number:
            return random_number


def generate_lotto_numbers():
    lotto_numbers = set()
    while len(lotto_numbers) < LOTTO_NUMBERS_COUNT:
        number = quantum_random_number_generator(MAX_LOTTO_NUMBER)
        lotto_numbers.add(number)
    return sorted(lotto_numbers)


def display_lotto_numbers(numbers):
    ball_style = (
        "display: inline-block; "
        "width: 80px; "
        "height: 80px; "
        "background-color: #4fc3f7; "
        "color: white; "
        "border-radius: 50%; "
        "text-align: center; "
        "line-height: 80px; "
        "font-size: 32px; "
        "margin: 5px;"
    )
    balls_html = "".join(
        f"<span style='{ball_style}'>{num}</span>" for _, num in enumerate(numbers)
    )

    div_style = "text-align: center; margin: 80px 0px;"

    st.markdown(
        f"<div style='{div_style}'>{balls_html}</div>",
        unsafe_allow_html=True,
    )


st.title("Quantum Lotto Number Generator")
st.write("This program generates lotto numbers quantum-mechanically.")


if st.button("Generate Lotto Numbers"):
    lotto_numbers = generate_lotto_numbers()
    display_lotto_numbers(lotto_numbers)

with st.expander("View Code"):
    code = """
    MAX_LOTTO_NUMBER = 45
    LOTTO_NUMBERS_COUNT = 6

    def run_quantum_circuit(num_qubits):
        qc = QuantumCircuit(num_qubits, num_qubits)
        qc.h(range(num_qubits))
        qc.measure(range(num_qubits), range(num_qubits))
        backend = Aer.get_backend("qasm_simulator")
        job = execute(qc, backend, shots=1)
        result = job.result()
        counts = result.get_counts()
        outcome = list(counts.keys())[0]
        return int(outcome, 2)


    def quantum_random_number_generator(max_number):
        num_qubits = max_number.bit_length()
        while True:
            random_number = run_quantum_circuit(num_qubits)
            if 1 <= random_number <= max_number:
                return random_number


    def generate_lotto_numbers():
        lotto_numbers = set()
        while len(lotto_numbers) < LOTTO_NUMBERS_COUNT:
            number = quantum_random_number_generator(MAX_LOTTO_NUMBER)
            lotto_numbers.add(number)
        return sorted(lotto_numbers)
    """
    st.code(code, language="python")

핵심 코드 설명

# 회로에 사용될 큐비트 수를 정의
def run_quantum_circuit(num_qubits):
	# 큐비트와 측정 결과를 저장할 클래식 비트 수를 지정
    qc = QuantumCircuit(num_qubits, num_qubits)
    
    # 모든 큐비트에 하다마드 게이트를 적용
    # 하다마드 게이트를 큐비트를 슈퍼 포지션으로 만듦
    # 0과 1의 확률이 각 50%
    qc.h(range(num_qubits))
    
    # 모든 큐비트 측정
    # 결과를 각 큐비트에 연결된 클래식 비트에 저장
    qc.measure(range(num_qubits), range(num_qubits))
    
    # qasm_simulator 시뮬레이터 선택
    # 양자 어셈블리 언어(QASM)으로 양자 회로 결과 모방
    backend = Aer.get_backend("qasm_simulator")
    
    # 설정된 양자 회로(qc)를 백엔드에서 실행
    # 회로는 한 번만 실행(단일 결과만 얻으면 되니까)
    job = execute(qc, backend, shots=1)
    
    # 실행된 작업에서 결과 객체를 추출
    result = job.result()
    
    # 회로 실행 경과 빈도 수 반환
    counts = result.get_counts()
    
    # 결과 중 가장 먼저 발견된 결과 반환
    outcome = list(counts.keys())[0]
    
    # 2진수 바이너리 문자열 'outcome'을 정수형으로 변환
    return int(outcome, 2)


def quantum_random_number_generator(max_number):
	# 해당 정수를 이진수로 표현할 때 필요한 비트 수 반환
    num_qubits = max_number.bit_length()
    while True:
        random_number = run_quantum_circuit(num_qubits)
        if 1 <= random_number <= max_number:
            return random_number

리팩토링: 함수 분리

def create_quantum_circuit(num_qubits):
    qc = QuantumCircuit(num_qubits, num_qubits)
    qc.h(range(num_qubits))
    qc.measure(range(num_qubits), range(num_qubits))
    return qc


def run_quantum_circuit(qc):
    backend = Aer.get_backend("qasm_simulator")
    job = execute(qc, backend, shots=1)
    result = job.result()
    counts = result.get_counts()
    outcome = list(counts.keys())[0]
    return int(outcome, 2)


def quantum_random_number_generator(max_number):
    num_qubits = max_number.bit_length()
    while True:
        qc = create_quantum_circuit(num_qubits)
        random_number = run_quantum_circuit(qc)
        if 1 <= random_number <= max_number:
            return random_number

결과

https://quantum-lotto.streamlit.app/

0개의 댓글

관련 채용 정보