Пример #1
0
    def test_for_success_multiple_combine(
            self, dict_for_test_pure_qubits_multiple_combine):
        """
        multiple_combineメソッドの正常系テスト
        """
        target_list = dict_for_test_pure_qubits_multiple_combine["target_list"]
        result = multiple_combine(target_list)

        expected_result = PureQubits(
            dict_for_test_pure_qubits_multiple_combine["result"])
        assert allclose(result.vector, expected_result.vector)
        assert result.qubit_count == expected_result.qubit_count
Пример #2
0
def specialize(qubits: Qubits) -> PureQubits:
    """
    純粋状態を表しているQubitsオブジェクトから、対応するPureQubitsオブジェクトを返す

    Args:
        qubits (Qubits): 特殊化対象の純粋状態

    Returns:
        PureQubits: 特殊化後の純粋状態
    """
    # Qubitsが純粋状態かチェックし、対応するインデックスを取り出す
    pure_index = -1
    eigen_values, eigen_states = np.linalg.eigh(qubits.matrix)
    for index in range(len(eigen_values)):
        if is_real_close(eigen_values[index], 1.0):
            pure_index = index

    if pure_index == -1:
        message = "[ERROR]: 対象のQubitsは純粋状態ではありません"
        raise NotPureError(message)

    del qubits
    return PureQubits(eigen_states[:, pure_index])
Пример #3
0
                    [0j, 0j, 0j, 1.0 + 0j],
                ]
            ),
        },
    ]
)
def test_for_success_operate(request):
    """operateメソッドに対する正常系テスト用fixture"""
    return request.param


@pytest.fixture(
    params=[
        {
            "onb_0": OrthogonalSystem(
                [PureQubits([1.0 + 0j, 0j]), PureQubits([0j, 1.0 + 0j])]
            ),
            "onb_1": OrthogonalSystem(
                [
                    PureQubits([sqrt(0.5) + 0j, sqrt(0.5) + 0j]),
                    PureQubits([sqrt(0.5) + 0j, -sqrt(0.5) + 0j]),
                ]
            ),
            "matrix": [
                [sqrt(0.5) + 0j, sqrt(0.5) + 0j],
                [sqrt(0.5) + 0j, -sqrt(0.5) + 0j],
            ],
        },
        {
            "onb_0": OrthogonalSystem(
                [PureQubits([0j, 1.0 + 0j]), PureQubits([1.0 + 0j, 0j])]
Пример #4
0
            0j,
            0j,
            0j,
            0j,
        ],
    },
])
def dict_for_test_pure_qubits_combine(request):
    """combineメソッドテスト用のfixture"""
    return request.param


@pytest.fixture(params=[
    {
        "target_list": [
            PureQubits([1.0 + 0j, 0j]),
            PureQubits([0j, 1.0 + 0j]),
            PureQubits([1.0 + 0j, 0j]),
        ],
        "result": [0j, 0j, 1.0 + 0j, 0j, 0j, 0j, 0j, 0j],
    },
])
def dict_for_test_pure_qubits_multiple_combine(request):
    """combineメソッドテスト用のfixture"""
    return request.param


@pytest.fixture(params=[
    # 1 : 2 Qubits同士
    {
        "target_0": PureQubits([1 + 0j, 0j]),
from quantum_simulator.base.qubits import generalize, multiple_reduction, specialize
from quantum_simulator.base.utils import around
from quantum_simulator.major.observable import IDENT_OBSERVABLE
from quantum_simulator.major.pure_qubits import BELL_BASIS
from quantum_simulator.major.time_evolution import (
    IDENT_EVOLUTION,
    PAULI_MATRIX_X,
    PAULI_MATRIX_Z,
)

# 初期状態の確率振幅
alpha = sqrt(0.7) + 0j
beta = sqrt(0.3) + 0j

# 転送したい初期状態を定義
input_qubit = PureQubits([alpha, beta])
print("##### 初期の入力状態 #####")
print()

print("### Dirac表記表示 ###")
input_qubit.dirac_notation()
print()

# 転送用Bell状態の表示
print("##### Qubit転送に利用するBell基底ベクトル #####")
BELL_BASIS.qubits_list[0].dirac_notation()
print()

# 合成系の構成と全系ベクトルのDirac表記
whole_qubits = pure_qubits.combine(input_qubit, BELL_BASIS.qubits_list[0])
print("##### 全系の状態ベクトル #####")
Пример #6
0
            [0j, 0j, 0j, 0j],
            [0.5 + 0j, 0j, 0j, 0.5 + 0j],
        ],
        "qubit_count":
        2,
    },
])
def dict_for_test_qubits_constructor(request):
    """__init__メソッドテスト用のfixture"""
    return request.param


@pytest.fixture(params=[
    # 単一Qubit
    {
        "target": PureQubits([1.0 + 0j, 0j]),
        "matrix": [[1.0 + 0j, 0j], [0j, 0j]],
        "qubit_count": 1,
    },
    {
        "target": PureQubits([sqrt(0.5) + 0j, -sqrt(0.5) + 0j]),
        "matrix": [[0.5 + 0j, -0.5 + 0j], [-0.5 + 0j, 0.5 + 0j]],
        "qubit_count": 1,
    },
    # 2粒子系
    {
        "target":
        PureQubits([sqrt(0.5) + 0j, 0j, 0j,
                    sqrt(0.5) + 0j]),
        "matrix": [
            [0.5 + 0j, 0j, 0j, 0.5 + 0j],
Пример #7
0
 def test_for_failure_constructor(self, invalid_pure_qubits_amp):
     """
     __init__メソッドの異常系テスト
     """
     with pytest.raises(InitializeError):
         PureQubits(invalid_pure_qubits_amp)
Пример #8
0
"""
quantum_simulator.base.pure_qubitsモジュール内クラスのよく知られたオブジェクト群
"""

from math import sqrt

from quantum_simulator.base.pure_qubits import OrthogonalSystem, PureQubits

ZERO = PureQubits([1.0 + 0j, 0j])
"""PureQubits: 0状態にあるQubit。|0>"""

ONE = PureQubits([0j, 1.0 + 0j])
"""PureQubits: 1状態にあるQubit。|1>"""

PLUS = PureQubits([sqrt(0.5) + 0j, sqrt(0.5) + 0j])
"""PureQubits: プラス状態にあるQubit。|+>"""

MINUS = PureQubits([sqrt(0.5) + 0j, -sqrt(0.5) + 0j])
"""PureQubits: マイナス状態にあるQubit。|->"""

BELL_BASIS = OrthogonalSystem(
    [
        PureQubits([sqrt(0.5) + 0j, 0j, 0j, sqrt(0.5) + 0j]),
        PureQubits([0j, sqrt(0.5) + 0j, sqrt(0.5) + 0j, 0j]),
        PureQubits([0j, sqrt(0.5) + 0j, -sqrt(0.5) + 0j, 0j]),
        PureQubits([sqrt(0.5) + 0j, 0j, 0j, -sqrt(0.5) + 0j]),
    ]
)
"""OrthogonalSystem: Bell基底"""