"""Class for the baseline implementation of Shor's algorithm."""
from dataclasses import dataclass
from typing import Optional
from qualtran import QUInt
from qualtran.bloqs.mod_arithmetic import CModMulK
from qualtran.surface_code import AlgorithmSummary
from quantumthreattracker.algorithms.quantum_algorithm import (
AlgParams,
CryptParams,
QuantumAlgorithm,
)
[docs]
@dataclass
class BaselineShorParams(AlgParams):
"""Dataclass describing the parameters for baseline Shor's algorithm.
Note: The basic implementation doesn't have configurable parameters,
but this class is provided for consistency with the interface.
"""
pass
[docs]
class BaselineShor(QuantumAlgorithm):
"""Class for the baseline implementation of Shor's algorithm."""
def __init__(
self, crypt_params: CryptParams, alg_params: Optional[BaselineShorParams] = None
):
"""Initialize the quantum algorithm.
Parameters
----------
crypt_params : CryptParams
Cryptographic parameters.
alg_params : Optional[BaselineShorParams], optional
Algorithmic parameters. For BaselineShor, these have no effect but are
included for consistency.
"""
super().__init__(crypt_params, alg_params)
[docs]
def get_algorithm_summary(
self, alg_params: Optional[AlgParams] = None
) -> AlgorithmSummary:
"""Compute logical resource estimates for the circuit.
Parameters
----------
alg_params : Optional[AlgParams], optional
Algorithm parameters (not used by BaselineShor)
Returns
-------
AlgorithmSummary
Logical resource estimates.
Raises
------
NameError
If the protocol is not "RSA".
"""
# Parameters check is unnecessary for Baseline Shor as it doesn't use parameters
# But we'll include it for consistency with the interface
if self._crypt_params.protocol != "RSA":
raise NameError(
'The protocol for this class must be "RSA". '
+ f'"{self._crypt_params.protocol}" was given.'
)
key_size = self._crypt_params.key_size
modulus = 2**key_size - 1
multiplicand = 2**key_size - 2
mod_mul = CModMulK(dtype=QUInt(key_size), k=multiplicand, mod=modulus)
alg_sum_controlled_mod_mul = AlgorithmSummary.from_bloq(mod_mul)
reps = int(1.5 * key_size)
alg_sum_mod_exp = AlgorithmSummary(
n_algo_qubits=alg_sum_controlled_mod_mul.n_algo_qubits,
n_logical_gates=alg_sum_controlled_mod_mul.n_logical_gates * reps,
)
return alg_sum_mod_exp
[docs]
@staticmethod
def generate_search_space() -> list[BaselineShorParams]:
"""Generate a search space for algorithm parameters.
Since BaselineShor doesn't have configurable parameters, this returns
a list with a single set of default parameters.
Returns
-------
list[BaselineShorParams]
Single-element list containing default parameters.
"""
return [BaselineShorParams()]