"""Class for a basic implementation of ECC.
Logical resource estimates taken from [1], Table VI.
[1] https://doi.org/10.48550/arXiv.2409.04643
"""
from dataclasses import dataclass
from typing import Optional
from qualtran.resource_counting import GateCounts
from qualtran.surface_code import AlgorithmSummary
from quantumthreattracker.algorithms.quantum_algorithm import (
AlgParams,
CryptParams,
QuantumAlgorithm,
)
[docs]
@dataclass
class ECCBasicParams(AlgParams):
"""Parameters for the basic implementation of ECC.
This implementation doesn't have configurable parameters,
but this class is provided for consistency with the interface.
"""
pass
[docs]
class ECCBasic(QuantumAlgorithm):
"""Class for a basic implementation of ECC."""
def __init__(
self, crypt_params: CryptParams, alg_params: Optional[ECCBasicParams] = None
):
"""Initialize the quantum algorithm.
Parameters
----------
crypt_params : CryptParams
Cryptographic parameters.
alg_params : Optional[ECCBasicParams], optional
Algorithmic parameters. For ECCBasic, 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 ECCBasic)
Returns
-------
AlgorithmSummary
Logical resource estimates.
Raises
------
NameError
If the protocol is not "ECDH".
"""
# Parameters check is unnecessary for ECCBasic as it doesn't use parameters
# But we'll include it for consistency with the interface
# effective_alg_params = alg_params or self._alg_params
if self._crypt_params.protocol != "ECDH":
raise NameError(
'The protocol for this class must be "ECDH". '
+ f'"{self._crypt_params.protocol}" was given.'
)
key_size = self._crypt_params.key_size
qubit_count = 9 * key_size
toffoli_count = 43 * key_size**3
alg_sum = AlgorithmSummary(
n_algo_qubits=qubit_count, n_logical_gates=GateCounts(toffoli=toffoli_count)
)
return alg_sum
[docs]
@staticmethod
def generate_search_space() -> list[ECCBasicParams]:
"""Generate a search space for algorithm parameters.
Since ECCBasic doesn't have configurable parameters, this returns
a list with a single set of default parameters.
Returns
-------
list[ECCBasicParams]
Single-element list containing default parameters.
"""
return [ECCBasicParams()]