\section{Generic and Algebraic Discrete-Logarithm Algorithms} \label{sec:dlog} This section states the algorithms we implemented (twice: a transparent Python reference and a Rust engine) with their exact cost models; Section~\ref{sec:results} compares the models with measurements. Throughout, $G$ has prime order $n$ and $Q=[d]G$. \subsection{Baby-step giant-step} Shanks' method \citep{shanks1971class} stores $m$ baby steps $\{[j]G: 0\le j3$ since $\lvert\Aut(E)\rvert\le 6$). The automated search of hypothesis~\Hname{H09} lives entirely in this model and therefore cannot find a shortcut; what it can find is a better constant, and we report that it does not. \subsection{Cost model and empirical complexity} For each run we record the number of group additions and doublings, the number of field inversions (one per affine operation in the reference; amortised in the engine), wall-clock time, CPU time summed over threads, table size and peak resident memory. The empirical model \begin{equation} T(n) = a\,n^{\alpha}(\log_2 n)^{\beta} \label{eq:empirical} \end{equation} is fitted by least squares on $\log T$ with $\beta$ either free or fixed to~0, and the speed-up of a candidate over a baseline at size $n$ is $S(n)=T_{\text{baseline}}(n)/T_{\text{candidate}}(n)$ with a bootstrap confidence interval over instances. For rho-type algorithms the number of iterations until collision has a Rayleigh-like distribution with coefficient of variation $\sqrt{(4-\pi)/\pi}\approx 0.52$, so at least 20 instances per size are needed for a $\pm 23\%$ standard error on the mean; we use 20--40.