<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <title>Levi Neuwirth</title>
    <subtitle><![CDATA[Essays, notes, and creative work by Levi Neuwirth]]></subtitle>
    <link href="https://levineuwirth.org/feed.xml" rel="self" />
    <link href="https://levineuwirth.org" />
    <id>https://levineuwirth.org/feed.xml</id>
    <author>
        <name>Levi Neuwirth</name>
        
        <email>levi@levineuwirth.org</email>
        
    </author>
    <updated>2026-04-21T00:00:00Z</updated>
    <entry>
    <title>Weenix</title>
    <link href="https://levineuwirth.org/essays/weenix/index.html" />
    <id>https://levineuwirth.org/essays/weenix/index.html</id>
    <published>2026-04-21T00:00:00Z</published>
    <updated>2026-04-21T00:00:00Z</updated>
    <summary type="html"><![CDATA[<p>A fuller write-up follows. In the meantime, see the <a href="/cv/projects/" class="link-internal" data-link-icon="internal" data-link-icon-type="svg">projects index</a>.</p>]]></summary>
</entry>
<entry>
    <title>NeuroPose</title>
    <link href="https://levineuwirth.org/essays/neuropose/index.html" />
    <id>https://levineuwirth.org/essays/neuropose/index.html</id>
    <published>2026-04-21T00:00:00Z</published>
    <updated>2026-04-21T00:00:00Z</updated>
    <summary type="html"><![CDATA[<p>A fuller write-up follows with the clinical-implications manuscript. In the meantime, see the <a href="/cv/projects/" class="link-internal" data-link-icon="internal" data-link-icon-type="svg">projects index</a>.</p>]]></summary>
</entry>
<entry>
    <title>Networking Stack from Scratch</title>
    <link href="https://levineuwirth.org/essays/networking-stack/index.html" />
    <id>https://levineuwirth.org/essays/networking-stack/index.html</id>
    <published>2026-04-21T00:00:00Z</published>
    <updated>2026-04-21T00:00:00Z</updated>
    <summary type="html"><![CDATA[<p>A fuller write-up follows. In the meantime, see the <a href="/cv/projects/" class="link-internal" data-link-icon="internal" data-link-icon-type="svg">projects index</a>.</p>]]></summary>
</entry>
<entry>
    <title>Speculative Reluctance</title>
    <link href="https://levineuwirth.org/essays/scaling_outage.html" />
    <id>https://levineuwirth.org/essays/scaling_outage.html</id>
    <published>2026-04-15T00:00:00Z</published>
    <updated>2026-04-15T00:00:00Z</updated>
    <summary type="html"><![CDATA[<p>Running a lab that develops frontier LLMs is somewhat like playing a game that, by all measurable metrics external, you are bound to lose. The amount of compute required to train a frontier <abbr class="smallcaps">LLM</abbr> is unbelievably expensive. The expense of inference is even more astronomical. OpenAI claims at the time of this writing to have somewhere between 900 Million and 1 Billion active users, all of whom require some amount of inference cost, and some small subset of whom consume an enormous amount of compute - to use their words, this is <a href="https://openai.com/index/accelerating-the-next-phase-ai/" class="link-external" target="_blank" rel="noopener noreferrer" data-link-icon="openai" data-link-icon-type="svg">“commercial scale.”</a>. This isn’t to mention the immense amount of competition - there are many major players in the United States alone contributing models that push the boundaries. OpenAI may have been the first, but Anthropic, Google, Meta, xAI, and, yes, even Amazon and Bytedance are following right along.</p>
<p>Then there’s the news that the stock market doesn’t want to hear. Ask yourself: who is deliberately left off the above list? If you’re thinking of models like <abbr class="smallcaps">GLM</abbr>, Qwen, MiniMax, and the notorious Deepseek, then we’re on the same page. These models are rapidly approaching the capabilities of the frontier models that remain behind intrusive “competitive moats”<sup class="sidenote-ref" id="snref-a"><a href="#sn-a">a</a></sup><span class="sidenote" id="sn-a"><sup class="sidenote-num">a</sup> <span class="sidenote-para">This phrasing is adopted from Jared James Grogan’s 2026 paper <a
href="https://arxiv.org/abs/2604.06217" class="link-external"
target="_blank" rel="noopener noreferrer" data-link-icon="arxiv"
data-link-icon-type="svg">“The End of the Foundation Model Era</a></span></span> that do little more than violate the rights of their users. The advantages that such models provide are immense, and labs of the first list cannot ignore the likelihood of their precedence increasing in the weeks and months to come. In fact, I hypothesize that we are already seeing the reaction of frontier labs to these increasing capabilities, through the lense of juxtaposition: the jargon has remained constant, as if to negate any possibility of an “AI Bubble” bursting, but the quiet actions of the companies that aren’t notoriously announced and decreed have shifted.</p>
<h2 id="the-dilemma">The Dilemma</h2>
<h3 id="inference-is-the-name-of-the-game">Inference is the Name of the Game</h3>
<p>Very few users of an <abbr class="smallcaps">LLM</abbr> have ever attempted to train an <abbr class="smallcaps">LLM</abbr>. Even those users who are technical powerhouses - and there are many of these<sup class="sidenote-ref" id="snref-b"><a href="#sn-b">b</a></sup><span class="sidenote" id="sn-b"><sup class="sidenote-num">b</sup> <span class="sidenote-para">Per OpenAI’s account, Codex <a
href="https://openai.com/index/accelerating-the-next-phase-ai/"
class="link-external" target="_blank" rel="noopener noreferrer"
data-link-icon="openai" data-link-icon-type="svg">has reached</a>
2,000,000 active weekly users, and while I could not find any specific
numbers that Anthropic has released regarding Claude Code’s weekly user
count, I presume it is higher than that of Codex.</span></span> -
likely are not intricately familiar with the inner workings of transformers. Even those who, perhaps from coursework, perhaps from curiosity, perhaps from <a href="https://claude.ai/share/5282e1b8-24ce-4cf8-983e-55df95f5fbdc" class="link-external" target="_blank" rel="noopener noreferrer" data-link-icon="anthropic" data-link-icon-type="svg">a chat</a> with an <abbr class="smallcaps">LLM</abbr> of choice have enough technical prowess to in theory write code that could facilitate the training of a naive transformer are unlikely to be able to train any model of substance, due to computational constraints. Consider, for instance, that <a href="https://x.ai/news/grok-3" class="link-external" target="_blank" rel="noopener noreferrer" data-link-icon="external" data-link-icon-type="svg">over 200,000 GPUs</a> were used to train Grok 3, which is a model from early 2025; the <a href="https://www.spacex.com/updates#xai-joins-spacex" class="link-external" target="_blank" rel="noopener noreferrer" data-link-icon="twitter" data-link-icon-type="svg">aspirations of xAI</a> in particular with regards to expansion of compute (into outer space) have, more recently, been the source of much controversy. To be absolutely precise, the inherent computational cost of training a model does not provide companies that do train models any safeguards nor guarantees that users cannot find more open alternatives.</p>
<p>Inference is the primary concern for multiple reasons. Inference is what creates the opportunity for an AI lab to generate revenue. Training a model, in principle, enables the capability for inference to be provided as a service to paying users, but there is no inherent revenue that is generated as a direct consequence of the training pipeline. Inference is also the primary logistical and computational concern. We have neglected in our previous discussion of training that training clusters may be provisioned; powerful GPUs are available to rent by the hour, and though doing this at the scale of training a frontier <abbr class="smallcaps">LLM</abbr> is economically out of reach for the general population, for venture-capital backed startups, cash is abundantly available as a resource to burn. Inference, on the other hand, is not provisional; to provide inference at a scale that enables revenue, GPUs must be available to serve the requests of paying customers at all times. This is often not the case, as we will soon explore<sup class="sidenote-ref" id="snref-c"><a href="#sn-c">c</a></sup><span class="sidenote" id="sn-c"><sup class="sidenote-num">c</sup> <span class="sidenote-para">A detailed analysis of how even minute per-request inference costs scale
to unfathomable overall costs is provided in CMU’s <a
href="https://www.cmu.edu/cmist/tech-and-policy/agents-of-change/index.html"
class="link-external" target="_blank" rel="noopener noreferrer"
data-link-icon="external" data-link-icon-type="svg">“Agents of
Change.”</a></span></span>.</p>
<h2 id="a-deficit-of-compute">A deficit of compute</h2>
<p>We are already seeing the extensive effects of the fact that inference cannot truly be provisioned at scale. Inference can be provisioned at smaller scales - indeed, as a student at Brown University, I make extensive use of our own <a href="https://docs.ccv.brown.edu/ai-tools/services/librechat" class="link-external" target="_blank" rel="noopener noreferrer" data-link-icon="external" data-link-icon-type="svg">self-hosted interface</a>, which provides access to various frontier LLMs.</p>]]></summary>
</entry>
<entry>
    <title>Ozymandias: A Static Site Framework</title>
    <link href="https://levineuwirth.org/essays/ozymandias.html" />
    <id>https://levineuwirth.org/essays/ozymandias.html</id>
    <published>2026-04-12T00:00:00Z</published>
    <updated>2026-04-12T00:00:00Z</updated>
    <summary type="html"><![CDATA[<figure class="poem-excerpt">
<blockquote>
<p>
My name is Ozymandias, King of Kings;<br>
Look on my Works, ye Mighty, and despair!<br>
Nothing beside remains. Round the decay<br>
Of that colossal Wreck, boundless and bare<br>
The lone and level sands stretch far away.
</p>
</blockquote>
<figcaption>
<a href="/poetry/ozymandias.html">Ozymandias</a> — Percy Bysshe Shelley
</figcaption>
</figure>
<p>The name is a joke. Every framework is a monument that its author believes will outlast the work produced in it. The name is also a warning: the writing you put in a framework might actually outlast the framework itself, which is why the framework should be small, coherent, and legible — not a cathedral built to impress.</p>
<p>The core of this website has been extracted and released as <a href="https://git.levineuwirth.org/neuwirth/ozymandias" class="link-external" target="_blank" rel="noopener noreferrer" data-link-icon="forgejo" data-link-icon-type="svg">Ozymandias</a>, a static site framework under the <abbr class="smallcaps">MIT</abbr> license. It is the full pipeline: the Haskell build system, the Pandoc filter stack, all templates, all stylesheets, all client-side JavaScript — minus my personal content. If you want a website that works like this one and want to understand exactly how it works, Ozymandias is where to start.</p>
<p>This page describes what Ozymandias is, how it diverged from this site during extraction, and how to use it.</p>
<hr />
<h2 id="what-it-is">What It Is</h2>
<p>Ozymandias is a static site generator for long-form writing. It is built on two mature Haskell tools: <a href="https://jaspervdj.be/hakyll/" class="link-external" target="_blank" rel="noopener noreferrer" data-link-icon="external" data-link-icon-type="svg">Hakyll</a> for build orchestration and <a href="https://pandoc.org/" class="link-external" target="_blank" rel="noopener noreferrer" data-link-icon="external" data-link-icon-type="svg">Pandoc</a> for document processing. The framework handles routing, templating, and pagination through Hakyll, and applies a custom sequence of Pandoc <span class="smallcaps"><abbr class="smallcaps">AST</abbr></span> transforms during compilation. The output is a directory of plain <span class="smallcaps"><abbr class="smallcaps">HTML</abbr></span> files that can be served by any web server.</p>
<p>The short version of what comes with it:</p>
<ul>
<li><strong>Sidenotes</strong> — Pandoc footnotes render as margin notes on wide screens; on narrow screens they collapse to a numbered footnotes section at the bottom.</li>
<li><strong>Epistemic profiles</strong> — essays can declare confidence, evidence quality, importance, scope, novelty, and practicality; these appear as a structured footer before the reader commits to the full text.</li>
<li><strong>Backlinks</strong> — every page accumulates a list of other pages that link to it, with surrounding paragraph context, via a two-pass compilation strategy.</li>
<li><strong>Wikilinks</strong> — <code>[Page Title](/page-title.html)</code> and <code>[display text](/page-title.html)</code> syntax resolved at build time.</li>
<li><strong>Citations</strong> — Pandoc citeproc with Chicago Notes; footnote-style in-text markers with a bibliography section and a separate “further reading” block.</li>
<li><strong>Score reader</strong> — a swipeable <span class="smallcaps"><abbr class="smallcaps">SVG</abbr></span> viewer for music compositions with dark-mode-compatible notation.</li>
<li><strong>Typography</strong> — dropcaps, automatic smallcaps detection for abbreviations, Latin abbreviation tooltips, old-style figures via the <code>onum</code> OpenType feature.</li>
<li><strong>Mathematics</strong> — <span class="smallcaps">KaTeX</span> rendering at build time; no math rendering in the browser.</li>
<li><strong>Full-text search</strong> — Pagefind, client-side, no external service.</li>
<li><strong>Semantic search</strong> — an optional embedding pipeline using <code>sentence-transformers</code> and <span class="smallcaps"><abbr class="smallcaps">FAISS</abbr></span> for a “similar pages” section and semantic query matching.</li>
<li><strong>Hierarchical tags</strong> — <code>research/mathematics</code> expands to both <code>research</code> and <code>research/mathematics</code>; tag pages are generated and paginated automatically.</li>
<li><strong>Library portal</strong> — a configurable taxonomy page that groups all content by tag hierarchy.</li>
<li><strong>Dark mode, reading mode, settings</strong> — client-side, persisted in <code>localStorage</code>.</li>
<li><strong><abbr class="smallcaps">GPG</abbr> signing</strong> — optional per-page detached signatures, with pubkey linked from the footer.</li>
<li><strong>Atom feeds</strong> — site-wide and per-section (music gets its own feed by default).</li>
</ul>
<p>The prerequisite list is short: <span class="smallcaps"><abbr class="smallcaps">GHC</abbr></span> 9.6+, cabal-install, and Pagefind. Image conversion and the embedding pipeline are both optional and add their own dependencies (<code>cwebp</code> and Python with <code>uv</code>, respectively).</p>
<hr />
<h2 id="how-it-diverged-from-this-site">How It Diverged From This Site</h2>
<p>When I extracted Ozymandias, the primary engineering work was disentangling site-specific configuration from the framework machinery. In levineuwirth.org, several values — the site <span class="smallcaps"><abbr class="smallcaps">URL</abbr></span>, the author name, the navigation structure, the feed title — were compiled directly into the Haskell source. That is fine for a personal site and irritating for a reusable framework. The extraction introduced a <code>Config.hs</code> module and a <code>site.yaml</code> file that together hold all identity and navigation configuration. The rest of the build system reads from these at startup and never hardcodes a domain or author name.</p>
<p>The result is that you can fork the repository, edit one file, and have a working site with a completely different identity. The Haskell source does not need to be touched unless you want to extend or modify the framework itself.</p>
<p>Beyond configuration, the content in <code>content/</code> was replaced with a small set of demo pages that exercise the filter pipeline without constituting a personal corpus. The <code>data/bibliography.bib</code> file was emptied and replaced with a placeholder. Everything in <code>static/</code> — the fonts, stylesheets, scripts, and link icons — shipped intact. No features were removed during the extraction. Ozymandias has the full pipeline.</p>
<h3 id="what-remains-shared">What Remains Shared</h3>
<p>The two repositories share the same filter modules, the same templates (minus identity strings), and the same static assets. Changes to the filter pipeline in one are intended to be ported to the other. The practical result is that this site is an Ozymandias instance — it runs on the same engine, only with the configuration file pointing at <code>levineuwirth.org</code> rather than <code>example.com</code>. This page is compiled by the same code that compiles an Ozymandias site built from the framework.</p>
<h3 id="what-diverges-intentionally">What Diverges Intentionally</h3>
<p>Several features of this site are too specific to my personal corpus to include in the framework defaults. The similarity embedding index — which requires running a neural model over all page content — is present in Ozymandias as an optional pipeline but ships with an empty index. The music catalog, the commonplace book, and the statistics page are included in the framework because they are useful to authors in general, but they contain no data by default. The semantic search <span class="smallcaps"><abbr class="smallcaps">ONNX</abbr></span> model weights are downloaded by a separate <code>make download-model</code> target rather than committed to the repository.</p>
<hr />
<h2 id="the-filter-pipeline">The Filter Pipeline</h2>
<p>The filters are the heart of the framework. Pandoc compiles Markdown to an abstract syntax tree, and the filters walk and transform that tree before Pandoc serializes it to <span class="smallcaps"><abbr class="smallcaps">HTML</abbr></span>. They are applied in a fixed sequence; the order matters.</p>
<p><strong>Source-level preprocessors</strong> run before Pandoc sees the file. They transform raw Markdown strings:</p>
<ul>
<li><strong>Wikilinks</strong> — converts <code>[Page Name](/page-name.html)</code> and <code>[display text](/page-name.html)</code> to standard Markdown links using slugification: lowercase, spaces to hyphens, punctuation stripped. The destination path follows the same routing rules as the content item it targets.</li>
<li><strong>EmbedPdf</strong> — converts <code>{{pdf:/path/to/file.pdf}}</code> syntax (optionally with a page anchor) to an iframe pointed at the vendored PDF.js viewer, preserving the original path in a <code>data-pdf-src</code> attribute for the popup thumbnail system.</li>
<li><strong>Transclusion</strong> — converts <code>{{essay-slug}}</code> or <code>{{essay-slug#section}}</code> to placeholder divs that the client-side <code>transclude.js</code> script resolves at page load. This allows shared content to be authored once and embedded anywhere without duplicating the source.</li>
</ul>
<p><strong><span class="smallcaps"><abbr class="smallcaps">AST</abbr></span>-level filters</strong> run after parsing. They are pure functions over the Pandoc <span class="smallcaps"><abbr class="smallcaps">AST</abbr></span>:</p>
<ul>
<li><strong>Images</strong> — wraps each image in a <code>&lt;picture&gt;</code> element with a <span class="smallcaps">WebP</span> source if a <code>.webp</code> companion file exists alongside the original. Adds <code>loading="lazy"</code> to images below the fold and marks them for the lightbox system.</li>
<li><strong>Sidenotes</strong> — transforms Pandoc’s footnote syntax (<code>[^1]: note text</code>) into inline <code>&lt;span class="sidenote"&gt;</code> elements with alphabetic labels (a, b, c, … z, aa, ab, …). A <code>&lt;section class="footnotes"&gt;</code> fallback is preserved at document end for narrow screens where margin placement is impractical.</li>
<li><strong>Typography</strong> — matches exact Pandoc <code>Str</code> tokens against a table of Latin abbreviations and wraps them in <code>&lt;abbr title="…"&gt;</code> elements. The table covers <em><abbr title="exempli gratia">e.g.</abbr></em>, <em><abbr title="id est">i.e.</abbr></em>, <em><abbr title="confer">cf.</abbr></em>, <em><abbr title="videlicet">viz.</abbr></em>, <em><abbr title="nota bene">NB</abbr></em>, <em>et al.</em>, and the rest of the common scholarly shorthand.</li>
<li><strong>Links</strong> — classifies external links (any <code>http</code>/<code>https</code> <span class="smallcaps"><abbr class="smallcaps">URL</abbr></span> not on the site’s own domain) and adds <code>class="link-external"</code>, <code>target="_blank"</code>, <code>rel="noopener noreferrer"</code>, and a <code>data-link-icon</code> attribute that the <span class="smallcaps"><abbr class="smallcaps">CSS</abbr></span> uses to render a per-domain icon. A separate pass rewrites root-relative <span class="smallcaps"><abbr class="smallcaps">PDF</abbr></span> links to the viewer <span class="smallcaps"><abbr class="smallcaps">URL</abbr></span>. Domain classification is by exact hostname match, not substring, so lookalike domains are correctly identified as external.</li>
<li><strong>Smallcaps</strong> — detects runs of three or more uppercase letters and wraps them in <code>&lt;abbr class="smallcaps"&gt;</code>. Trailing punctuation is stripped before matching so <code>HTML,</code> and <code>API.</code> are caught correctly. Short all-caps tokens (<code>OK</code>, <code>I</code>) and mixed-case tokens (<code>JavaScript</code>) are not converted.</li>
<li><strong>Dropcaps</strong> — the filter itself is an identity transform; the real work is done by the <span class="smallcaps"><abbr class="smallcaps">CSS</abbr></span> <code>.dropcap</code> class applied via fenced div syntax (<code>::: dropcap</code>). The filter’s presence in the pipeline documents the intent.</li>
<li><strong>Math</strong> — another near-identity transform; inline and display math is passed through as-is for <span class="smallcaps">KaTeX</span> to process at render time.</li>
<li><strong>Code</strong> — prepends <code>language-</code> to code block class names so Prism.js can pick up the language for syntax highlighting without each author needing to write <code>language-haskell</code> instead of just <code>haskell</code>.</li>
<li><strong>Score</strong> (music-specific) — reads <span class="smallcaps"><abbr class="smallcaps">SVG</abbr></span> score fragment files from disk and inlines them into the document, replacing <code>#000000</code> and <code>black</code> fills and strokes with <code>currentColor</code> so notation renders correctly in both light and dark mode.</li>
<li><strong>Viz</strong> (visualization-specific) — executes Python scripts referenced in fenced code blocks and captures stdout. A Matplotlib script produces an <span class="smallcaps"><abbr class="smallcaps">SVG</abbr></span> that is inlined directly; a Vega-Lite script produces a <span class="smallcaps"><abbr class="smallcaps">JSON</abbr></span> spec that is embedded for Vega-Embed to render client-side.</li>
</ul>
<p>The IO-performing filters (Score, Viz, Images) run before the pure ones. This ordering ensures that downstream filters see a stable <span class="smallcaps"><abbr class="smallcaps">AST</abbr></span> without pending file reads.</p>
<hr />
<h2 id="epistemic-profiles">Epistemic Profiles</h2>
<p>The epistemic profile is a structured block that appears in the footer of any essay or post whose frontmatter includes a <code>status</code> field. It is the most distinctive feature of the framework philosophically, and the one most worth understanding before deploying it.</p>
<p>The fields:</p>
<ul>
<li><strong>Status</strong> — a controlled vocabulary: <em>Draft</em>, <em>Working model</em>, <em>Durable</em>, <em>Refined</em>, <em>Superseded</em>, <em>Deprecated</em>. The distinction between <em>Working model</em> and <em>Durable</em> matters: the former is a position I currently hold but would not stake much on; the latter is something I expect to hold up under scrutiny.</li>
<li><strong>Confidence</strong> — an integer from 0 to 100 representing credence in the central thesis. When a <code>confidence-history</code> list is present in the frontmatter, the framework derives a trend arrow (↑ ↓ →) from the last two entries automatically.</li>
<li><strong>Importance</strong> — a 1–5 dot scale for how much the work matters.</li>
<li><strong>Evidence</strong> — a 1–5 dot scale for how well-evidenced the claims are. An essay with high importance and low evidence is a speculative position and should be read accordingly.</li>
<li><strong>Trust score</strong> — derived automatically as (confidence × 0.6) + (rescaled evidence × 0.4). It is a narrow answer to “how much should you trust the central claim?” and deliberately does not incorporate importance, scope, novelty, or practicality, which are separate axes intentionally not blended into a composite.</li>
<li><strong>Scope, Novelty, Practicality</strong> — orientation fields, not ratings. <em>Scope</em> ranges from <em>personal</em> to <em>civilizational</em>; <em>novelty</em> from <em>conventional</em> to <em>innovative</em>; <em>practicality</em> from <em>abstract</em> to <em>exceptional</em>. They appear in the footer alongside the numeric fields.</li>
<li><strong>Stability</strong> — auto-computed from <code>git log --follow</code> at every build. The heuristic: a very new or barely-touched document is <em>volatile</em>; an actively-revised document is <em>revising</em>; older documents with more commits settle into <em>fairly stable</em>, <em>stable</em>, or <em>established</em>. This requires no manual maintenance.</li>
</ul>
<p>The version history block, just above the epistemic footer, uses a three-tier fallback: authored <code>history:</code> notes in the frontmatter, then the raw git log, then the <code>date:</code> field as a creation record.</p>
<p>The point is not precision — a 72% confidence rating is not false exactness. It is an attempt to make explicit what most writing leaves implicit: where the author actually stands, and whether that position is stable or still shifting.</p>
<hr />
<h2 id="backlinks">Backlinks</h2>
<p>Backlinks require a two-pass architecture, because a page cannot know which pages will link to it until all pages have been compiled.</p>
<p>Pass one compiles every content item in a special “links” version that extracts all internal links together with the surrounding paragraph <span class="smallcaps"><abbr class="smallcaps">HTML</abbr></span>. Pass two inverts this map — grouping sources by their targets — and produces <code>data/backlinks.json</code>. The final compilation pass loads this file as a dependency and injects the backlinks section into each page’s template context.</p>
<p>The practical consequence for authors is that internal links automatically generate backlink sections with source titles and context snippets, without any manual cross-referencing. The <code>[Wikilinks](/wikilinks.html)</code> syntax makes it natural to link between pages; the backlinks system makes those connections visible to readers moving in either direction.</p>
<hr />
<h2 id="semantic-search-and-similar-links">Semantic Search and Similar Links</h2>
<p>Both features are optional and require Python with <code>uv</code>:</p>
<pre class="language-sh"><code>uv sync            # install dependencies from pyproject.toml
make download-model  # fetch ONNX weights for client-side search</code></pre>
<p><strong>Full-text search</strong> uses Pagefind, which indexes the compiled <span class="smallcaps"><abbr class="smallcaps">HTML</abbr></span> and produces a static search index that runs entirely in the browser. No external service is involved.</p>
<p><strong>Semantic search</strong> runs a <code>sentence-transformers</code> model (<code>all-MiniLM-L6-v2</code>, 384 dimensions) over extracted page text, builds a <span class="smallcaps"><abbr class="smallcaps">FAISS</abbr></span> similarity index, and stores page-level neighbors in <code>data/similar-links.json</code>. At render time, this file is loaded as a Hakyll dependency and the top similar pages are injected into each essay’s template context as a “Related” section. The same model can be run client-side in the browser via <span class="smallcaps"><abbr class="smallcaps">ONNX</abbr></span> Runtime Web for semantic query matching — the weights are served from the same origin, which means no external <span class="smallcaps"><abbr class="smallcaps">API</abbr></span> calls.<sup class="sidenote-ref" id="snref-a"><a href="#sn-a">a</a></sup><span class="sidenote" id="sn-a"><sup class="sidenote-num">a</sup> <span class="sidenote-para">This is the design decision I care most about. Bolting semantic search
onto a static site usually means sending queries to a third-party
service. Serving the model weights from the same origin means the
feature works without any network request beyond what is needed to load
the page.</span></span></p>
<hr />
<h2 id="content-types">Content Types</h2>
<p>Ozymandias supports six content types, each with its own template and routing convention:</p>
<table>
<colgroup>
<col style="width: 20%" />
<col style="width: 20%" />
<col style="width: 24%" />
<col style="width: 34%" />
</colgroup>
<thead>
<tr>
<th style="text-align: left;">Type</th>
<th style="text-align: left;">Path</th>
<th style="text-align: left;">Route</th>
<th style="text-align: left;">Template</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left;">Essay</td>
<td style="text-align: left;"><code>content/essays/*.md</code></td>
<td style="text-align: left;"><code>/essays/{slug}.html</code></td>
<td style="text-align: left;"><code>essay.html</code></td>
</tr>
<tr>
<td style="text-align: left;">Blog post</td>
<td style="text-align: left;"><code>content/blog/*.md</code></td>
<td style="text-align: left;"><code>/blog/YYYY-MM-DD-{slug}.html</code></td>
<td style="text-align: left;"><code>blog-post.html</code></td>
</tr>
<tr>
<td style="text-align: left;">Poetry</td>
<td style="text-align: left;"><code>content/poetry/*.md</code></td>
<td style="text-align: left;"><code>/poetry/{slug}.html</code></td>
<td style="text-align: left;"><code>reading.html</code></td>
</tr>
<tr>
<td style="text-align: left;">Fiction</td>
<td style="text-align: left;"><code>content/fiction/*.md</code></td>
<td style="text-align: left;"><code>/fiction/{slug}.html</code></td>
<td style="text-align: left;"><code>reading.html</code></td>
</tr>
<tr>
<td style="text-align: left;">Composition</td>
<td style="text-align: left;"><code>content/music/{slug}/index.md</code></td>
<td style="text-align: left;"><code>/music/{slug}/index.html</code></td>
<td style="text-align: left;"><code>composition.html</code></td>
</tr>
<tr>
<td style="text-align: left;">Page</td>
<td style="text-align: left;"><code>content/*.md</code></td>
<td style="text-align: left;"><code>/{slug}.html</code></td>
<td style="text-align: left;"><code>page.html</code></td>
</tr>
</tbody>
</table>
<p>Essays and blog posts support the full feature set: <span class="smallcaps"><abbr class="smallcaps">TOC</abbr></span>, epistemic profiles, backlinks, similar links, citations, version history. Poetry and fiction use a <code>reading</code> <span class="smallcaps"><abbr class="smallcaps">CSS</abbr></span> class that adjusts line spacing and disables indentation, making stanza structure visible. Music compositions get a separate score-reader view at <code>/music/{slug}/score/</code> — a minimal interface with swipe navigation through <span class="smallcaps"><abbr class="smallcaps">SVG</abbr></span> score pages.</p>
<p>Several pages are generated automatically without source files: <code>/essays/index.html</code>, <code>/blog/index.html</code> (paginated, 20 per page), <code>/new.html</code> (all content sorted by creation date), <code>/library.html</code> (portal taxonomy), tag index pages at <code>/{tag}/index.html</code>, author pages at <code>/authors/{slug}/index.html</code>, and <code>/feed.xml</code>.</p>
<p>Drafts live in <code>content/drafts/essays/</code> and are only visible when the <code>SITE_ENV=dev</code> environment variable is set. Production builds exclude them entirely — they do not appear in feeds, tag pages, backlinks, or the library.</p>
<hr />
<h2 id="configuration">Configuration</h2>
<p>All site identity and navigation lives in <code>site.yaml</code>. The full schema:</p>
<pre class="language-yaml"><code>site-name:        &quot;My Site&quot;
site-url:         &quot;https://example.com&quot;
site-description: &quot;A personal site built with Ozymandias&quot;
site-language:    &quot;en&quot;

author-name:  &quot;Your Name&quot;
author-email: &quot;you@example.com&quot;

feed-title:       &quot;My Site&quot;
feed-description: &quot;Essays, notes, and creative work&quot;

license:    &quot;CC BY-SA 4.0&quot;
source-url: &quot;&quot;              # optional link to git repository

gpg-fingerprint: &quot;&quot;         # leave empty to omit sig links
gpg-pubkey-url:  &quot;/gpg/pubkey.asc&quot;

nav:
  - { href: &quot;/&quot;,             label: &quot;Home&quot;    }
  - { href: &quot;/library.html&quot;, label: &quot;Library&quot; }
  - { href: &quot;/new.html&quot;,     label: &quot;New&quot;     }
  - { href: &quot;/search.html&quot;,  label: &quot;Search&quot;  }

portals:
  - { slug: &quot;writing&quot;, name: &quot;Writing&quot; }
  - { slug: &quot;code&quot;,    name: &quot;Code&quot;    }
  - { slug: &quot;notes&quot;,   name: &quot;Notes&quot;   }</code></pre>
<p>Portals are the library taxonomy. Each portal collects all content whose tags include the portal’s slug or any tag with that slug as a prefix. Content tagged <code>writing/essays</code> and <code>writing/fiction</code> both appear under the <code>writing</code> portal.</p>
<hr />
<h2 id="getting-started">Getting Started</h2>
<pre class="language-sh"><code>git clone https://git.levineuwirth.org/neuwirth/ozymandias my-site
cd my-site
$EDITOR site.yaml    # set site-name, site-url, author-name, author-email
make dev             # build with drafts visible; serve on :8000</code></pre>
<p><code>make dev</code> builds with <code>SITE_ENV=dev</code> (so drafts are included) and starts a local server. <code>make build</code> produces the production output in <code>_site/</code>. <code>make watch</code> adds incremental rebuilds on file changes.</p>
<p>For deployment, the included <code>make deploy</code> target runs <code>make clean &amp;&amp; make build</code>, optionally signs each page with <span class="smallcaps"><abbr class="smallcaps">GPG</abbr></span>, rsyncs <code>_site/</code> to a <span class="smallcaps"><abbr class="smallcaps">VPS</abbr></span> configured via <code>.env</code>, and pushes to the git remote. Set <code>VPS_USER</code>, <code>VPS_HOST</code>, and <code>VPS_PATH</code> in <code>.env</code> to configure the destination.<sup class="sidenote-ref" id="snref-b"><a href="#sn-b">b</a></sup><span class="sidenote" id="sn-b"><sup class="sidenote-num">b</sup> <span class="sidenote-para">The <code>make deploy</code> target always begins with
<code>make clean</code> to avoid stale build artifacts. Incremental
Hakyll rebuilds are safe for development but can produce subtly
incorrect output — particularly for pages whose template context depends
on the full backlink graph — if the dependency graph is not fully
consistent. The clean ensures the graph is always recomputed from
scratch for production.</span></span></p>
<hr />
<h2 id="writing-content">Writing Content</h2>
<p>An essay with the full feature set looks like this:</p>
<pre class="language-yaml"><code>---
title: &quot;On the Virtues of Careful Writing&quot;
date: 2026-04-12
abstract: &gt;
  A brief description that appears on index pages and in the epistemic header.
tags: [writing, research/rhetoric]
authors: [&quot;Your Name&quot;, &quot;Collaborator | https://example.com&quot;]
affiliation: &quot;Institution | https://institution.edu&quot;

status: &quot;Working model&quot;
confidence: 65
importance: 4
evidence: 3
scope: average
novelty: moderate
practicality: high
confidence-history: [50, 65]

history:
  - date: &quot;2026-04-12&quot;
    note: Initial draft

bibliography: data/bibliography.bib
further-reading: [key1, key2]
---

::: dropcap
Opening paragraph here. Sidenotes use the standard Pandoc footnote syntax.^[Like this.]
:::

## First Section

Wikilinks to other pages: [About This Site](/about-this-site.html). External links work normally.
Citations use Pandoc&#39;s citeproc syntax: [@author2024].</code></pre>
<p>The <code>authors</code> field defaults to the <code>author-name</code> in <code>site.yaml</code> when absent. The <code>affiliation</code> field takes a <code>Name | URL</code> format. The <code>history:</code> block overrides git-derived version history when the git log alone would not convey what changed.</p>
<hr />
<h2 id="license">License</h2>
<p>The framework code — everything in <code>build/</code>, <code>templates/</code>, <code>static/</code>, <code>tools/</code>, and the configuration files — is <span class="smallcaps"><abbr class="smallcaps">MIT</abbr></span> licensed. The demo content under <code>content/</code> is public domain. Your content is yours; add whatever license you choose.</p>
<p>The <span class="smallcaps"><abbr class="smallcaps">MIT</abbr></span> license was chosen deliberately: it imposes no obligations, carries no viral clauses, and makes no claims on the writing produced with it. Frameworks should not take a stake in the work they compile.</p>
<hr />
<h2 id="the-relationship-between-ozymandias-and-this-site">The Relationship Between Ozymandias and This Site</h2>
<p>This site is Ozymandias with my configuration and my content. Changes flow in both directions, with the understanding that the framework is the more conservative of the two repositories: features that turn out to be site-specific stay in levineuwirth.org; features that generalize get ported to Ozymandias. The filter pipeline and the template system are intended to stay in sync.</p>
<p>The divergence is, in a sense, the point. A personal website is a <em>position</em>, as I elaborate upon in the <a href="/colophon.html" class="link-internal" data-link-icon="internal" data-link-icon-type="svg">Colophon</a>. Ozymandias is the mechanism; the position is what you put in it.</p>]]></summary>
</entry>
<entry>
    <title>Beyond Comorbidity Indices</title>
    <link href="https://levineuwirth.org/essays/beyond-comorbidity-indices/index.html" />
    <id>https://levineuwirth.org/essays/beyond-comorbidity-indices/index.html</id>
    <published>2026-04-09T00:00:00Z</published>
    <updated>2026-04-09T00:00:00Z</updated>
    <summary type="html"><![CDATA[<h2 id="introduction-background-and-significance">Introduction (Background and Significance)</h2>
<div class="dropcap">
<p>Accurate prediction and risk adjustment for short-term clinical outcomes, such as 30-day mortality and readmission, are critical for enhancing healthcare research quality, allowing fair assessment of healthcare outcomes and quality metrics <sup class="cite-marker" id="cite-back-1"><a href="#ref-cms_hrrp" class="cite-link" data-cite-keys="ref-cms_hrrp">[1]</a></sup>. Most claims-based risk adjustment continues to rely on comorbidity indices such as the Charlson Comorbidity Index (CCI) and Elixhauser Comorbidity Index (ECI), which map diagnosis codes to a limited set of conditions <sup class="cite-marker" id="cite-back-2"><a href="#ref-charlson1987" class="cite-link" data-cite-keys="ref-charlson1987 ref-elixhauser1998">[2,3]</a></sup>. While these indices are interpretable and widely deployed, they inevitably discard granularity and may miss clinically meaningful comorbidity patterns and interactions among diagnoses.</p>
</div>
<p>Recent machine-learning approaches increasingly use a set of ICD-10-CM diagnosis codes and have demonstrated improved prediction for a range of outcomes <sup class="cite-marker" id="cite-back-4"><a href="#ref-deschepper2020" class="cite-link" data-cite-keys="ref-deschepper2020 ref-lelay2022 ref-qiao2022">[4,5,6]</a></sup>. However, many approaches simplify or truncate <abbr class="smallcaps">ICD</abbr> codes, aggregate diagnosis lists in ways that depend on code order, or are trained and evaluated in settings where coding practices differ across sites—each of which can limit generalizability across settings. In addition, many claims-based studies focus on in-hospital mortality and do not evaluate postdischarge mortality among outcomes relevant at the time of discharge <sup class="cite-marker" id="cite-back-6"><a href="#ref-qiao2022" class="cite-link" data-cite-keys="ref-qiao2022 ref-davis2022 ref-harerimana2021 ref-matsui2022 ref-nguyen2017">[6,7,8,9,10]</a></sup>.</p>
<p>In this study, we developed and temporally validated a claims-based deep learning model using ICD-10-CM diagnosis codes to predict 30-day unplanned readmission and 30-day postdischarge mortality in the Nationwide Readmissions Database. We compared its performance with benchmark models based on the Charlson and Elixhauser comorbidity indices, which are widely used for claims-based risk adjustment but were not originally designed for these specific outcomes. We also evaluated the model with different architectural design and examined diagnosis-level contributions to model predictions.</p>
<h2 id="materials-and-methods">Materials and Methods</h2>
<h3 id="study-design-data-source-and-oversight">Study Design, Data Source, and Oversight</h3>
<p>We conducted a retrospective cohort study using the Healthcare Cost and Utilization Project (HCUP) Nationwide Readmissions Database (NRD), 2016–2022. Adult discharges from 2016 through 2020 were used for model development, and a later temporally separated cohort from 2021 through 2022 was reserved for temporal validation. Discharges in December of each year were excluded to allow complete 30-day follow-up within the same calendar year.</p>
<p>Use of the <abbr class="smallcaps">NRD</abbr> was governed by the <abbr class="smallcaps">HCUP</abbr> data use agreement. Because the <abbr class="smallcaps">NRD</abbr> contains deidentified data, the institutional review board determined the study was not human participants research and that informed consent was not required.</p>
<h3 id="cohort-definition">Cohort Definition</h3>
<p>We included hospitalizations for patients aged 18 years or older with a valid patient linkage identifier within each calendar year. For both the readmission and mortality analyses, index hospitalizations ending in in-hospital death were excluded because patients were not at risk for postdischarge outcomes. In-hospital death during the index hospitalization was examined in a prespecified secondary mortality analysis (eResults 1).</p>
<h3 id="outcomes">Outcomes</h3>
<p>The coprimary outcomes were (1) 30-day unplanned readmission and (2) 30-day postdischarge in-hospital mortality (hereafter, postdischarge mortality). Readmissions were classified as unplanned if they were coded as nonelective admissions in the <abbr class="smallcaps">HCUP</abbr> database. Postdischarge mortality was defined as inpatient death occurring during a subsequent hospitalization within 30 days after discharge. Deaths outside the hospital are not captured in the <abbr class="smallcaps">NRD</abbr>.</p>
<h3 id="predictors">Predictors</h3>
<p>For each index hospitalization, we used up to 40 ICD-10-CM diagnosis codes (principal and secondary) and patient-level covariates (age, sex, primary payer, and ZIP-code median income quartile). Age was standardized, and categorical variables were represented using one-hot encoding. Analyses were restricted to records with nonmissing outcome ascertainment and complete covariates.</p>
<h3 id="comparator-models">Comparator Models</h3>
<p>For benchmarking, we computed the Elixhauser Comorbidity Index (ECI) and Charlson Comorbidity Index (CCI) for each index hospitalization and treated each index as a continuous risk score <sup class="cite-marker" id="cite-back-2"><a href="#ref-charlson1987" class="cite-link" data-cite-keys="ref-charlson1987 ref-elixhauser1998">[2,3]</a></sup>. The <abbr class="smallcaps">ECI</abbr> identifies 30+ distinct conditions from administrative data, serving as a critical tool for risk adjustment in studies evaluating in-hospital mortality and short-term readmissions <sup class="cite-marker" id="cite-back-3"><a href="#ref-elixhauser1998" class="cite-link" data-cite-keys="ref-elixhauser1998 ref-ahrq_elixhauser ref-fernando2019 ref-quan2005">[3,11,12,13]</a></sup>. The <abbr class="smallcaps">CCI</abbr> consolidates up to 19 comorbid conditions into a weighted numeric score, including variants that adjust for age, primarily predicting long-term mortality and readmissions <sup class="cite-marker" id="cite-back-2"><a href="#ref-charlson1987" class="cite-link" data-cite-keys="ref-charlson1987 ref-fernando2019 ref-quan2005 ref-deyo1992 ref-quan2011">[2,12,13,14,15]</a></sup>. The <abbr class="smallcaps">ECI</abbr> was computed using an ICD-10-CM–adapted <abbr class="smallcaps">AHRQ</abbr> approach that identifies chronic comorbidities primarily from secondary diagnoses <sup class="cite-marker" id="cite-back-13"><a href="#ref-quan2005" class="cite-link" data-cite-keys="ref-quan2005">[13]</a></sup>. The <abbr class="smallcaps">CCI</abbr> was computed using ICD-10-CM mappings to 17 comorbidity categories; both raw <abbr class="smallcaps">CCI</abbr> and age-adjusted <abbr class="smallcaps">CCI</abbr> were evaluated <sup class="cite-marker" id="cite-back-16"><a href="#ref-stagg2006" class="cite-link" data-cite-keys="ref-stagg2006">[16]</a></sup>. These benchmark models used the index score alone as the predictor; age, sex, primary payer, and ZIP-code income quartile were not added separately. Discrimination and threshold-dependent classification metrics were derived directly from the score distributions, with operating thresholds selected on the validation set and then applied unchanged to the temporal test evaluation subsample.</p>
<h3 id="model-architecture">Model Architecture</h3>
<p>We developed a deep learning framework that embeds each patient’s diagnosis list along with demographic and socioeconomic information to predict the outcome. Each ICD-10-CM code was mapped into a dense vector representation through a learned numerical transformation. To obtain a single representation for each patient while avoiding reliance on diagnosis ordering, we used an aggregation approach that does not depend on code order:</p>
<p><span class="math display">f(x) = \rho\!\left(\sum_{x \in X} \phi(x)\right)</span></p>
<p>where <span class="math inline">X</span> denotes the set of embedded diagnosis vectors. Functions <span class="math inline">\phi</span> and <span class="math inline">\rho</span> were implemented as multilayer perceptrons with ReLU activations <sup class="cite-marker" id="cite-back-17"><a href="#ref-zaheer2017" class="cite-link" data-cite-keys="ref-zaheer2017">[17]</a></sup>.</p>
<p>Demographic and socioeconomic variables were processed via a separate 2-layer multilayer perceptron. The resulting vector was concatenated with the aggregated diagnosis representation and passed through fully connected layers with ReLU activations and dropout regularization. A sigmoid output layer finally produced a predicted probability for each outcome.</p>
<h3 id="model-development-and-temporal-validation">Model Development and Temporal Validation</h3>
<p>Data from 2016–2020 were split into training (90%) and validation (10%) sets. For each outcome, models were trained to minimize binary cross-entropy loss. To address class imbalance, majority-class downsampling was applied during training (see Supplementary eMethods 1). Because majority-class downsampling altered the effective outcome prevalence in the training data, predicted probabilities were corrected using the original training-set prevalence before reporting calibration, temporal-test probabilities, and web-calculator outputs <sup class="cite-marker" id="cite-back-18"><a href="#ref-pozzolo2015" class="cite-link" data-cite-keys="ref-pozzolo2015">[18]</a></sup>. This deterministic correction affects probability scaling but not rank-based discrimination. Hyperparameters (embedding dimension, Deep Sets depth/width, demographic tower width, predictor multilayer perceptron configuration, and dropout rate) were tuned using random search; the configuration with best validation <abbr class="smallcaps">AUROC</abbr> (with recall-weighted metrics used as secondary criteria) was selected (see Supplementary eTable 1).</p>
<p>Temporal validation was based on eligible 2021–2022 discharges. To support computational feasibility while preserve outcome prevalence, primary performance evaluation was conducted in a prespecified stratified random subsample of the eligible 2021–2022 temporal test cohort, with 10% of outcome-positive and 10% of outcome-negative discharges sampled for each outcome (Supplementary eMethods 2). Models were implemented in Python using TensorFlow <sup class="cite-marker" id="cite-back-19"><a href="#ref-abadi2016" class="cite-link" data-cite-keys="ref-abadi2016">[19]</a></sup>.</p>
<h3 id="performance-metrics">Performance Metrics</h3>
<p>For threshold-dependent metrics, binary classification thresholds were selected on the validation set by maximizing the Youden index (sensitivity + specificity − 1) and then applied unchanged to the temporal test evaluation subsample for each model <sup class="cite-marker" id="cite-back-20"><a href="#ref-youden1950" class="cite-link" data-cite-keys="ref-youden1950">[20]</a></sup>.</p>
<p>Because outcomes were imbalanced, we emphasized discrimination and precision–recall performance. Primary metrics included <abbr class="smallcaps">AUROC</abbr> with 95% confidence intervals (CIs), average precision, precision, recall, <span class="math inline">F_1</span> score, and <span class="math inline">F_2</span> score (placing greater weight on recall).</p>
<h3 id="statistical-analysis">Statistical Analysis</h3>
<p>AUROCs and their 95% CIs were estimated using DeLong’s nonparametric method <sup class="cite-marker" id="cite-back-21"><a href="#ref-delong1988" class="cite-link" data-cite-keys="ref-delong1988">[21]</a></sup>. Pairwise comparisons in <abbr class="smallcaps">AUROC</abbr> between the embedding model and each comorbidity-index comparator were performed using DeLong tests for correlated <abbr class="smallcaps">ROC</abbr> curves <sup class="cite-marker" id="cite-back-21"><a href="#ref-delong1988" class="cite-link" data-cite-keys="ref-delong1988">[21]</a></sup>. Resulting <span class="math inline">P</span> values are unadjusted and interpreted alongside effect sizes and 95% CIs.</p>
<p>We conducted prespecified ablation analyses to estimate the incremental contribution of key model components, including addition of transformer blocks, replacement of the order-invariant Deep Sets aggregator with a permutation-variant flattening comparator, and removal of demographic and socioeconomic inputs; details are provided in Supplementary eMethods 4.</p>
<h3 id="model-interpretation">Model Interpretation</h3>
<p>We used Integrated Gradients (IG) to estimate code-level contributions to model predictions for each outcome <sup class="cite-marker" id="cite-back-22"><a href="#ref-sundararajan2017" class="cite-link" data-cite-keys="ref-sundararajan2017 ref-placido2023">[22,23]</a></sup>. Attribution values were summarized at the ICD-10-CM code level, with positive values indicating higher predicted risk and negative values indicating lower predicted risk. To reduce instability from rare codes, ranked summaries were restricted to codes with at least 50 occurrences in the temporal test evaluation subsample. Additional implementation details are provided in Supplementary eMethods 3.</p>
<h3 id="web-application">Web Application</h3>
<p>A public, read-only web calculator accepts discharge diagnosis lists and returns risk estimates with code-level explanations; inputs are not stored. The tool is intended for research and demonstration purposes rather than clinical decision-making. The calculator is available at: <a href="https://levineuwirth.github.io/icd_embeddings/" class="uri link-external" target="_blank" rel="noopener noreferrer" data-link-icon="external" data-link-icon-type="svg">https://levineuwirth.github.io/icd_embeddings/</a>. Implementation details are provided in Supplementary eFigure 4.</p>
<h2 id="results">Results</h2>
<h3 id="cohort-size-and-event-prevalence">Cohort size and event prevalence</h3>
<p>The <abbr class="smallcaps">NRD</abbr> included 80,217,696 discharges in 2016–2020 for model development and 33,322,761 discharges in 2021–2022 for temporal testing (Figure 1). After application of outcome-specific eligibility criteria, the validation cohort included 7,828,015 discharges. Primary performance evaluation was conducted in a prespecified stratified random subsample of 3,226,831 discharges from the eligible 2021–2022 temporal test cohort, and this evaluation subsample was not downsampled. For model training, majority-class downsampling was applied to address class imbalance, yielding analytic training samples of 17,200,994 discharges for the readmission analysis and 544,138 discharges for the postdischarge mortality analysis. In the temporal test evaluation subsample, 30-day unplanned readmission occurred in 362,696 discharges (11.2%), and 30-day postdischarge in-hospital mortality occurred in 13,071 discharges (0.4%).</p>
<h3 id="model-performance">Model Performance</h3>
<p>Detailed performance metrics for the ICD-10-CM–based model and benchmark comorbidity-index models are shown in Table 1. In the temporal test evaluation subsample, the ICD-10-CM–based model showed higher discrimination than comparator models for both 30-day unplanned readmission and 30-day postdischarge mortality (Figure 2). For readmission, the <abbr class="smallcaps">AUROC</abbr> was 0.750 (95% CI, 0.749–0.750) for the ICD-10-CM–based model, compared with 0.655 (95% CI, 0.654–0.656) for the <abbr class="smallcaps">CCI</abbr> model, 0.644 (95% CI, 0.644–0.645) for the age-adjusted <abbr class="smallcaps">CCI</abbr> model, and 0.636 (95% CI, 0.635–0.637) for the <abbr class="smallcaps">ECI</abbr> model. For postdischarge mortality, the <abbr class="smallcaps">AUROC</abbr> was 0.856 (95% CI, 0.853–0.858) for the ICD-10-CM–based model, compared with 0.784 (95% CI, 0.781–0.787) for the best-performing comparator, the age-adjusted <abbr class="smallcaps">CCI</abbr> model; the <abbr class="smallcaps">AUROC</abbr> for the <abbr class="smallcaps">ECI</abbr> model was 0.641 (95% CI, 0.636–0.647). DeLong tests comparing the ICD-10-CM–based model with each comorbidity-index comparator were significant for all pairwise comparisons (<span class="math inline">P &lt; .001</span>). Calibration curves showed overall agreement between predicted and observed risk for both outcomes, with greater deviation at higher predicted-risk ranges; this deviation was less pronounced for postdischarge mortality than for readmission (Figure 3).</p>
<p>At the prespecified threshold selected on the validation set, the ICD-10-CM–based model showed higher recall-weighted performance than comparator models, with <span class="math inline">F_2</span> scores of 0.485 vs 0.407 for 30-day readmission and 0.053 vs 0.048 for postdischarge mortality. Threshold-dependent metrics, including precision, recall, and specificity, are shown in Table 1. Because the classification threshold was selected using the Youden index, these metrics reflect a balance of sensitivity and specificity rather than optimization for a specific clinical use case. For readmission, these gains were accompanied by only modest precision, consistent with the difficulty of predicting this heterogeneous outcome.</p>
<p>In the prespecified secondary analysis expanding mortality to include in-hospital death during the index hospitalization, the ICD-10-CM–based model achieved an <abbr class="smallcaps">AUROC</abbr> of 0.965 (95% CI, 0.965–0.966), exceeding that of the best-performing comparator model (age-adjusted <abbr class="smallcaps">CCI</abbr>: <abbr class="smallcaps">AUROC</abbr>, 0.750 [95% CI, 0.749–0.751]) (eTable 2).</p>
<h3 id="ablation-studies">Ablation Studies</h3>
<p>We evaluated a set of prespecified model variants that removed or augmented architectural components (eg, ICD-only inputs and insertion of transformer blocks) to estimate the incremental contribution of each element. We also compared the order-invariant aggregation approach with an order-dependent flattening-based aggregator to quantify any performance tradeoff attributable to enforcing invariance. In covariate ablation, removing demographic and socioeconomic inputs (age, sex, payer, and ZIP-income quartile) caused modest attenuation in performance (readmission <abbr class="smallcaps">AUROC</abbr>, 0.750 vs 0.748; postdischarge mortality <abbr class="smallcaps">AUROC</abbr>, 0.856 vs 0.848; similar <span class="math inline">F_2</span> scores), suggesting that diagnosis patterns captured most, but not all, of the predictive signal. Implementation details are provided in Supplementary eMethods 4; results are summarized in eTable 3.</p>
<h3 id="feature-importance">Feature Importance</h3>
<p>ICD-10-CM codes with the 10 highest positive and negative contributions to both prediction outcomes are shown in Figure 4. For 30-day readmission, acute myeloblastic leukemia, in relapse (C9202), had the greatest positive contribution, whereas encounter for care and examination of mother immediately after delivery (Z390) had the greatest negative contribution. For 30-day postdischarge mortality, C9202 also had the greatest positive contribution, whereas assault by unspecified sharp object, initial encounter (X999XXA) had the greatest negative contribution. The most influential diagnosis codes for 30-day mortality prediction including inpatient death are shown in Supplementary eFigure 2.</p>
<h2 id="discussion">Discussion</h2>
<p>In this national claims-based cohort study, a deep learning model using the full set of discharge diagnosis codes showed better discrimination than benchmark models based on Charlson and Elixhauser comorbidity indices for both 30-day unplanned readmission and 30-day postdischarge in-hospital mortality. The performance gain was larger for postdischarge mortality than for readmission. Performance remained favorable in a later, temporally separated <abbr class="smallcaps">NRD</abbr> cohort, supporting robustness across subsequent years of the same database <sup class="cite-marker" id="cite-back-24"><a href="#ref-davis2020" class="cite-link" data-cite-keys="ref-davis2020 ref-collins2024">[24,25]</a></sup>. At the same time, these comparisons should be interpreted as benchmarking against widely used summary comorbidity approaches rather than as head-to-head comparisons with models purpose-built for these exact outcomes.</p>
<h3 id="comparison-with-prior-work">Comparison with prior work</h3>
<p>This pattern is consistent with the structure of the compared methods. Charlson and Elixhauser indices compress diagnosis information into a limited set of predefined conditions and were designed primarily for broad case-mix adjustment rather than high-resolution outcome prediction <sup class="cite-marker" id="cite-back-2"><a href="#ref-charlson1987" class="cite-link" data-cite-keys="ref-charlson1987 ref-elixhauser1998">[2,3]</a></sup>. By contrast, the present model learns from the full diagnosis-code set and can represent co-occurrence patterns that are not captured by summary indices <sup class="cite-marker" id="cite-back-26"><a href="#ref-morgan2019" class="cite-link" data-cite-keys="ref-morgan2019 ref-beam2018">[26,27]</a></sup>. Unlike many prior deep-learning approaches that depend on richer electronic health record inputs and site-specific preprocessing, this framework was designed for portability within claims-based settings by using routinely available diagnosis, demographic, and payer-related variables <sup class="cite-marker" id="cite-back-28"><a href="#ref-rajkomar2018" class="cite-link" data-cite-keys="ref-rajkomar2018">[28]</a></sup>. This design also preserves the broader diagnostic context of each hospitalization rather than reducing diagnoses to fixed summary weights as <abbr class="smallcaps">ECI</abbr> and <abbr class="smallcaps">CCI</abbr>.</p>
<h3 id="interpretability">Interpretability</h3>
<p>Interpretability in this setting should not be viewed as an afterthought to an otherwise opaque model. Using Integrated Gradients, the model provided code-level attributions that were generally clinically plausible and helped explain why predicted risk increased or decreased for a given patient. For example, diagnoses associated with high treatment burden or advanced systemic illness, such as relapsed acute myeloid leukemia and alcoholic cirrhosis with ascites, tended to increase predicted risk, whereas postpartum encounters and some assault-related injuries tended to decrease it. These findings suggest that learning-based models can yield clinically meaningful information rather than functioning only as “black boxes,” even when they are more flexible than traditional summary indices <sup class="cite-marker" id="cite-back-22"><a href="#ref-sundararajan2017" class="cite-link" data-cite-keys="ref-sundararajan2017 ref-placido2023 ref-rudin2019">[22,23,29]</a></sup>.</p>
<p>One plausible explanation for the performance gap between the present model and the Charlson and Elixhauser indices is that the prognostic contribution of a diagnosis is not fixed across patients. Summary comorbidity indices assign prespecified, static weights to diagnosis groups, effectively assuming that a given condition contributes similarly regardless of the broader diagnostic context. By contrast, in the present model, the contribution of a diagnosis could vary according to the full set of co-occurring diagnoses, which is more consistent with how risk is often understood clinically. We did not directly test this mechanism, so it should be interpreted as a hypothesis supported by the attribution patterns rather than as a proven explanation for the observed performance differences. Nevertheless, this dynamic view of diagnosis contribution may help explain why retaining the full diagnosis-code context improved prediction beyond summary comorbidity scores. As with other attribution methods, these explanations improve transparency but do not establish causality.</p>
<h3 id="clinical-and-policy-implications">Clinical and policy implications</h3>
<p>These findings have two potential implications. First, in discharge-facing workflows, a claims-compatible model could be evaluated in read-only settings to identify patients who may warrant closer follow-up, medication reconciliation, or transitional-care outreach <sup class="cite-marker" id="cite-back-30"><a href="#ref-hansen2011" class="cite-link" data-cite-keys="ref-hansen2011 ref-coleman2006">[30,31]</a></sup>. Second, in research and quality measurement, more granular use of diagnosis data may improve outcome prediction when summary comorbidity indices underrepresent diagnostic complexity <sup class="cite-marker" id="cite-back-32"><a href="#ref-joynt2013" class="cite-link" data-cite-keys="ref-joynt2013 ref-desai2016 ref-zuckerman2017">[32,33,34]</a></sup>. This tool is intended for clinical prioritization and equitable quality measurement, not for coverage denial or utilization gatekeeping <sup class="cite-marker" id="cite-back-35"><a href="#ref-obermeyer2019" class="cite-link" data-cite-keys="ref-obermeyer2019">[35]</a></sup>.</p>
<p>Because demographic and socioeconomic factors are known to influence postdischarge outcomes, we assessed their incremental contribution beyond diagnosis patterns using ablation <sup class="cite-marker" id="cite-back-36"><a href="#ref-kind2014" class="cite-link" data-cite-keys="ref-kind2014 ref-joynt2011">[36,37]</a></sup>. Removing age, sex, payer, and neighborhood income produced minimal changes in performance, suggesting that much of the predictive signal available to this model was already captured by diagnosis patterns. This finding should not be interpreted to mean that demographic or socioeconomic factors are unimportant. Rather, within this claims-based framework, coded diagnoses may already capture part of the risk signal associated with demographic and socioeconomic differences, whether through differences in disease burden, comorbidity clustering, or patterns of healthcare use.</p>
<p>The public read-only calculator is intended for research and demonstration rather than clinical deployment. Future work should focus on external validation, prospective evaluation in read-only workflows, monitoring for coding and case-mix drift, and recalibration when needed <sup class="cite-marker" id="cite-back-24"><a href="#ref-davis2020" class="cite-link" data-cite-keys="ref-davis2020 ref-collins2024 ref-collins2015">[24,25,38]</a></sup>.</p>
<h3 id="limitations">Limitations</h3>
<p>This study has several limitations. First, the <abbr class="smallcaps">NRD</abbr> captures deaths only during inpatient encounters; therefore, the mortality outcome reflects postdischarge in-hospital mortality rather than all-cause 30-day mortality. Second, claims data are subject to coding error and variation and do not directly capture functional status, physiologic severity, or many social risk factors. Third, although temporal validation in later <abbr class="smallcaps">NRD</abbr> years reduces optimism, it is not a substitute for external validation, and performance may differ in other health systems or data sources with different coding practices, case mix, and discharge workflows. Fourth, this study evaluated predictive performance rather than downstream improvement in confounding control, hospital profiling, or other risk-adjustment applications; thus, better discrimination does not by itself establish superior risk adjustment, and because the model was trained specifically for 30-day unplanned readmission and postdischarge in-hospital mortality, performance may not generalize to other outcomes without separate validation. Fifth, Charlson and Elixhauser indices were included as benchmark comparators because of their widespread use in claims-based analyses, but they were not originally developed for these specific outcomes; accordingly, these comparisons should be interpreted as benchmarking rather than definitive head-to-head testing. Finally, attribution methods may improve transparency but do not establish causality <sup class="cite-marker" id="cite-back-29"><a href="#ref-rudin2019" class="cite-link" data-cite-keys="ref-rudin2019">[29]</a></sup>.</p>
<h2 id="conclusions">Conclusions</h2>
<p>A deep learning model using ICD-10-CM diagnosis codes improved prediction of 30-day unplanned readmission and 30-day postdischarge mortality compared with Charlson and Elixhauser comorbidity-index models in the Nationwide Readmissions Database. Prospective validation, drift monitoring, and attention to intended use will be essential before implementation for clinical decision support or policy applications.</p>
<h2 id="data-sharing-statement">Data Sharing Statement</h2>
<p>The study used de-identified data from the Healthcare Cost and Utilization Project (HCUP) Nationwide Readmissions Database under a data-use agreement. Data are available from <abbr class="smallcaps">HCUP</abbr> to qualified researchers.</p>
<h2 id="code-availability">Code Availability</h2>
<p>The analytic code (including the non-elective readmission implementation, model training, and evaluation) will be made publicly available at publication in a GitHub repository (<a href="https://github.com/Rice-wxl/icd-10-embedding" class="uri link-external" target="_blank" rel="noopener noreferrer" data-link-icon="github" data-link-icon-type="svg">https://github.com/Rice-wxl/icd-10-embedding</a>), with a versioned release tag/commit to support reproducibility. <abbr class="smallcaps">HCUP</abbr> <abbr class="smallcaps">NRD</abbr> data cannot be shared by the authors under the data-use agreement.</p>
<h2 id="conflict-of-interest-disclosures">Conflict of Interest Disclosures</h2>
<p>The authors report no conflicts of interest related to this work.</p>
<div class="aftermatter-divider" aria-hidden="true"><a href="/new.html" class="aftermatter-logo" aria-label="New"></a></div>
<div class="aftermatter">
<h2 id="tables">Tables</h2>
<h3 id="table-1">Table 1: Performance metrics for the <abbr class="smallcaps">ICD</abbr> model vs. CCI and <abbr class="smallcaps">ECI</abbr></h3>
<p>Performance metrics for the <abbr class="smallcaps">ICD</abbr> model vs. CCI and <abbr class="smallcaps">ECI</abbr> for 30-day readmission (a) and 30-day postdischarge mortality (b) in the temporal test evaluation subsample.</p>
<p><strong>(a) 30-day readmission</strong></p>
<table style="width:100%;">
<colgroup>
<col style="width: 26%" />
<col style="width: 25%" />
<col style="width: 8%" />
<col style="width: 10%" />
<col style="width: 10%" />
<col style="width: 10%" />
<col style="width: 10%" />
</colgroup>
<thead>
<tr>
<th style="text-align: left;">Methods</th>
<th style="text-align: left;"><abbr class="smallcaps">AUC-ROC</abbr></th>
<th style="text-align: right;">Accuracy</th>
<th style="text-align: right;">Precision</th>
<th style="text-align: right;">Recall</th>
<th style="text-align: right;"><span class="math inline">F_1</span></th>
<th style="text-align: right;"><span class="math inline">F_2</span></th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left;"><abbr class="smallcaps">ICD</abbr> Model (Threshold: 0.5022)</td>
<td style="text-align: left;"><strong>0.7496</strong> [0.7488, 0.7504]</td>
<td style="text-align: right;">0.5892</td>
<td style="text-align: right;"><strong>0.1881</strong></td>
<td style="text-align: right;"><strong>0.8006</strong></td>
<td style="text-align: right;"><strong>0.3046</strong></td>
<td style="text-align: right;"><strong>0.4848</strong></td>
</tr>
<tr>
<td style="text-align: left;"><abbr class="smallcaps">CCI</abbr></td>
<td style="text-align: left;">0.6553 [0.6544, 0.6562]</td>
<td style="text-align: right;"><strong>0.6962</strong></td>
<td style="text-align: right;">0.1844</td>
<td style="text-align: right;">0.4973</td>
<td style="text-align: right;">0.2690</td>
<td style="text-align: right;">0.3713</td>
</tr>
<tr>
<td style="text-align: left;"><abbr class="smallcaps">CCI</abbr> Age-Adjusted</td>
<td style="text-align: left;">0.6444 [0.6435, 0.6453]</td>
<td style="text-align: right;">0.6479</td>
<td style="text-align: right;">0.1673</td>
<td style="text-align: right;">0.5360</td>
<td style="text-align: right;">0.2550</td>
<td style="text-align: right;">0.3720</td>
</tr>
<tr>
<td style="text-align: left;"><abbr class="smallcaps">ECI</abbr></td>
<td style="text-align: left;">0.6363 [0.6353, 0.6372]</td>
<td style="text-align: right;">0.5708</td>
<td style="text-align: right;">0.1598</td>
<td style="text-align: right;">0.6622</td>
<td style="text-align: right;">0.2575</td>
<td style="text-align: right;">0.4066</td>
</tr>
</tbody>
</table>
<p><strong>(b) 30-day postdischarge mortality</strong></p>
<table>
<colgroup>
<col style="width: 26%" />
<col style="width: 24%" />
<col style="width: 9%" />
<col style="width: 9%" />
<col style="width: 9%" />
<col style="width: 9%" />
<col style="width: 9%" />
</colgroup>
<thead>
<tr>
<th style="text-align: left;">Methods</th>
<th style="text-align: left;"><abbr class="smallcaps">AUC-ROC</abbr></th>
<th style="text-align: right;">Accuracy</th>
<th style="text-align: right;">Precision</th>
<th style="text-align: right;">Recall</th>
<th style="text-align: right;"><span class="math inline">F_1</span></th>
<th style="text-align: right;"><span class="math inline">F_2</span></th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left;"><abbr class="smallcaps">ICD</abbr> Model (Threshold: 0.4644)</td>
<td style="text-align: left;"><strong>0.8557</strong> [0.8532, 0.8581]</td>
<td style="text-align: right;">0.6848</td>
<td style="text-align: right;"><strong>0.0111</strong></td>
<td style="text-align: right;"><strong>0.8756</strong></td>
<td style="text-align: right;"><strong>0.0220</strong></td>
<td style="text-align: right;"><strong>0.0530</strong></td>
</tr>
<tr>
<td style="text-align: left;"><abbr class="smallcaps">CCI</abbr></td>
<td style="text-align: left;">0.7621 [0.7585, 0.7657]</td>
<td style="text-align: right;">0.6987</td>
<td style="text-align: right;">0.0093</td>
<td style="text-align: right;">0.6963</td>
<td style="text-align: right;">0.0184</td>
<td style="text-align: right;">0.0442</td>
</tr>
<tr>
<td style="text-align: left;"><abbr class="smallcaps">CCI</abbr> Age-Adjusted</td>
<td style="text-align: left;">0.7844 [0.7813, 0.7874]</td>
<td style="text-align: right;">0.7352</td>
<td style="text-align: right;">0.0102</td>
<td style="text-align: right;">0.6700</td>
<td style="text-align: right;">0.0201</td>
<td style="text-align: right;">0.0480</td>
</tr>
<tr>
<td style="text-align: left;"><abbr class="smallcaps">ECI</abbr></td>
<td style="text-align: left;">0.6414 [0.6358, 0.6469]</td>
<td style="text-align: right;"><strong>0.7763</strong></td>
<td style="text-align: right;">0.0089</td>
<td style="text-align: right;">0.4915</td>
<td style="text-align: right;">0.0175</td>
<td style="text-align: right;">0.0415</td>
</tr>
</tbody>
</table>
<p><em>Primary performance evaluation used a prespecified stratified random subsample of eligible 2021–2022 discharges. Classification thresholds were selected on the validation set by maximizing the Youden index and then applied unchanged to the temporal test evaluation subsample.</em></p>
<h2 id="figures">Figures</h2>
<div class="annotation annotation--static">
<p><strong>Figure 1 — [placeholder]</strong> Flow chart of discharge records in <abbr class="smallcaps">NRD</abbr> for training, validation, and testing cohorts. Primary performance evaluation used a prespecified stratified random subsample of eligible 2021–2022 discharges. This temporal-test evaluation subsample was not downsampled. Classification thresholds were selected on the validation set by maximizing the Youden index and then applied unchanged to the temporal test subsample.</p>
</div>
<p><strong>Figure 2.</strong> Receiver operating characteristic (ROC) curves and area under the curve (AUC) for 30-day readmission and postdischarge mortality in the temporal test evaluation subsample. Each curve depicts the trade-off between sensitivity and specificity across different thresholds.</p>
<figure>
<img src="figures/fig2a-roc-readmission.png" data-lightbox="true" loading="lazy" alt="(a) 30-day readmission" />
<figcaption aria-hidden="true">(a) 30-day readmission</figcaption>
</figure>
<figure>
<img src="figures/fig2b-roc-mortality.png" data-lightbox="true" loading="lazy" alt="(b) 30-day postdischarge mortality" />
<figcaption aria-hidden="true">(b) 30-day postdischarge mortality</figcaption>
</figure>
<p><strong>Figure 3.</strong> Calibration curves on temporal test evaluation subsample for 30-day readmission and postdischarge mortality.</p>
<figure>
<img src="figures/fig3a-calibration-readmission.png" data-lightbox="true" loading="lazy" alt="(a) 30-day readmission" />
<figcaption aria-hidden="true">(a) 30-day readmission</figcaption>
</figure>
<figure>
<img src="figures/fig3b-calibration-mortality.png" data-lightbox="true" loading="lazy" alt="(b) 30-day postdischarge mortality" />
<figcaption aria-hidden="true">(b) 30-day postdischarge mortality</figcaption>
</figure>
<p><strong>Figure 4.</strong> Top influential <abbr class="smallcaps">ICD</abbr> codes for model prediction. Mean Integrated Gradients attribution per occurrence (positive values indicate higher predicted risk; negative values indicate lower predicted risk).</p>
<figure>
<img src="figures/fig4a-ig-readmission.png" data-lightbox="true" loading="lazy" alt="(a) 30-day readmission" />
<figcaption aria-hidden="true">(a) 30-day readmission</figcaption>
</figure>
<figure>
<img src="figures/fig4b-ig-mortality.png" data-lightbox="true" loading="lazy" alt="(b) 30-day postdischarge mortality" />
<figcaption aria-hidden="true">(b) 30-day postdischarge mortality</figcaption>
</figure>
<h2 id="supplement">Supplement</h2>
<h3 id="emethods">eMethods</h3>
<ol type="1">
<li><strong>Training and Hyperparameter Tuning</strong></li>
<li><strong>Temporal Test Set Construction and Threshold Selection</strong></li>
<li><strong>Integrated Gradients for Code-Level Attribution</strong></li>
<li><strong>Ablation Analyses</strong>
<ol type="1">
<li>Transformer Blocks</li>
<li>Deep Sets vs Permutation-Variant Flattening Comparator</li>
<li>Demographic and Socioeconomic Inputs</li>
</ol></li>
</ol>
<h3 id="etables">eTables</h3>
<ol type="1">
<li><strong>Hyperparameter Configurations Used in Models</strong></li>
<li><strong>Performance Comparison for 30-Day Mortality Including Index-Hospital Death</strong></li>
<li><strong>Ablation Study Results</strong>
<ul>
<li><ol type="A">
<li>Addition of Transformer Blocks</li>
</ol></li>
<li><ol start="2" type="A">
<li>Replacement of Deep Sets With Flattening Comparator</li>
</ol></li>
<li><ol start="3" type="A">
<li>Removal of Demographic and Socioeconomic Inputs (ICD-Only)</li>
</ol></li>
</ul></li>
</ol>
<h3 id="efigures">eFigures</h3>
<ol type="1">
<li><strong>Permutation-invariant <abbr class="smallcaps">ICD</abbr> Embedding Model</strong></li>
<li><strong>Top ICD-10-CM Codes by Integrated Gradients for 30-Day Mortality Including Index-Hospital Death</strong></li>
<li><strong>Calibration Reliability Plots for Temporal Test Set Predictions</strong>
<ul>
<li>30-Day Readmission</li>
<li>30-Day Postdischarge Mortality</li>
</ul></li>
<li><strong>Web Calculator Interface Examples</strong></li>
</ol>
<h3 id="emethods-1.-training-and-hyperparameter-tuning">eMethods 1. Training and Hyperparameter Tuning</h3>
<p>Models were trained using batch size 128 for 10 epochs with the Adam optimizer at a learning rate of 2e-5. Early stopping was applied with patience of 2 epochs, retaining the checkpoint with the best validation performance. To address outcome imbalance, we randomly downsampled majority-class encounters in the training set to achieve a target case-control ratio of 1:1 (validation data and temporal test evaluation subsample were not downsampled). Because majority-class downsampling changes the effective outcome prevalence and can bias predicted probabilities, we performed adjustment with the original downsampling ratio of the training set and use the readjusted model outputs in all metrics/plots and for the web calculator. Random seeds for the train/validation split, downsampling, and model initialization were set to ensure reproducibility.</p>
<p>Hyperparameters were tuned via random search (32 trials per outcome). eTable 1 reports the selected configurations. Hyperparameter definitions: <span class="math inline">d_{\text{embed}}</span> (ICD embedding dimension); <span class="math inline">d_{\text{hidden}}</span> (Deep Sets hidden dimension); <span class="math inline">r_{\text{deepset}} \times d_{\text{hidden}}</span> (Deep Sets output dimension); <span class="math inline">n_{\text{encode}}</span> and <span class="math inline">n_{\text{decode}}</span> (numbers of Deep Sets encoding/decoding layers); <span class="math inline">d_{\text{demo}}</span> (first-layer width of the demographic/socioeconomic <abbr class="smallcaps">MLP</abbr>; second layer set to <span class="math inline">d_{\text{demo}}/2</span>); <span class="math inline">d_{\text{mlp}}</span> (first-layer width of the predictor <abbr class="smallcaps">MLP</abbr>, halving each layer to a minimum of 32 over 4 layers); <span class="math inline">r_{\text{dropout}}</span> (dropout rate). Model selection prioritized validation <abbr class="smallcaps">AUROC</abbr>; recall-weighted metrics (including <span class="math inline">F_2</span>) were used as secondary criteria.</p>
<h3 id="emethods-2.-temporal-test-set-construction-and-threshold-selection">eMethods 2. Temporal Test Set Construction and Threshold Selection</h3>
<p>Temporal testing used eligible 2021–2022 data. To enable computationally feasible evaluation while preserving outcome prevalence, we created the temporal test evaluation subsample by stratified random sampling of the combined eligible 2021–2022 cohort, sampling 10% of outcome-positive and 10% of outcome-negative discharges for each outcome. This yielded approximately 3.2 million discharges for primary performance evaluation. Interpretability analyses used the same temporal test evaluation subsample.</p>
<p>Binary classification thresholds for each model were selected on the validation set by maximizing the Youden index (sensitivity + specificity − 1) and then applied unchanged to the temporal test evaluation subsample.</p>
<h3 id="emethods-3.-integrated-gradients-for-code-level-attribution">eMethods 3. Integrated Gradients for Code-Level Attribution</h3>
<p>Integrated Gradients (IG) was used to quantify code-level influence on model predictions. The baseline input was defined as a neutral input corresponding to an empty diagnosis list (ie, no diagnosis codes). The straight-line interpolation path from baseline to the observed input was discretized into 32 steps. At each step, gradients of the model logit were computed with respect to diagnosis embeddings; gradients were accumulated across steps and summed across embedding dimensions to yield a scalar attribution per code occurrence. Attribution values retained sign, with positive values indicating higher predicted risk and negative values indicating lower predicted risk. To reduce instability from rare codes, ICD-10-CM codes with fewer than 50 total occurrences in the temporal test evaluation subsample were excluded from ranked summaries. For each outcome, we reported the 10 codes with the largest mean positive attributions and the 10 codes with the largest mean negative attributions.</p>
<h3 id="emethods-4.-ablation-analyses">eMethods 4. Ablation Analyses</h3>
<h4 id="emethods-4.1-transformer-blocks">eMethods 4.1 Transformer blocks</h4>
<p>To evaluate whether attention-based contextualization improves performance, we added three multi-head transformer blocks operating over individual <abbr class="smallcaps">ICD</abbr> embeddings. Each block followed a standard transformer design with multi-head attention, residual connections, normalization, and feed-forward sublayers. We used 3 attention heads, dropout 0.3, embedding dimension <span class="math inline">d_{\text{embed}}</span>, and feed-forward dimension <span class="math inline">4 \times d_{\text{embed}}</span>.</p>
<p>Comparative results are shown in eTable 3, Panel A. Across both outcomes, transformer blocks did not materially improve <abbr class="smallcaps">AUROC</abbr> and <span class="math inline">F_2</span> score relative to the base model. Reported <span class="math inline">P</span> values for <abbr class="smallcaps">AUROC</abbr> differences were <span class="math inline">P &lt; .001</span> for readmission and <span class="math inline">P = 0.57</span> for postdischarge mortality.</p>
<h4 id="emethods-4.2-deep-sets-vs-permutation-variant-flattening-comparator">eMethods 4.2 Deep Sets vs permutation-variant flattening comparator</h4>
<p>To test whether permutation invariance via Deep Sets reduced predictive performance, we compared the base model with a permutation-variant alternative: a flattening layer that converts the 2-dimensional <abbr class="smallcaps">ICD</abbr> embedding matrix into a 1-dimensional vector, followed by two <abbr class="smallcaps">MLP</abbr> layers with <span class="math inline">d_{\text{hidden}}</span> and <span class="math inline">r_{\text{deepset}} \times d_{\text{hidden}}</span> units to mirror the Deep Sets hidden/output sizes.</p>
<p>Results are shown in eTable 3, Panel B. The base Deep Sets models outperformed the flattening comparators on <abbr class="smallcaps">AUROC</abbr> and <span class="math inline">F_2</span> score. Reported <span class="math inline">P</span> values for <abbr class="smallcaps">AUROC</abbr> differences were <span class="math inline">P &lt; .001</span> for readmission and <span class="math inline">P = 0.014</span> for postdischarge mortality.</p>
<h4 id="emethods-4.3-demographic-and-socioeconomic-inputs">eMethods 4.3 Demographic and socioeconomic inputs</h4>
<p>To evaluate the incremental value of non-diagnosis covariates, we removed the 2-layer demographic/socioeconomic <abbr class="smallcaps">MLP</abbr> and trained ICD-only variants.</p>
<p>Results are shown in eTable 3, Panel C. ICD-only variants had slightly worse <abbr class="smallcaps">AUROC</abbr> and <span class="math inline">F_2</span> score. Reported <span class="math inline">P</span> values for <abbr class="smallcaps">AUROC</abbr> differences were <span class="math inline">P = 0.020</span> for readmission and <span class="math inline">P &lt; .001</span> for postdischarge mortality.</p>
<h3 id="etable-1-hyperparameter-configurations-used-in-models">eTable 1: Hyperparameter configurations used in models</h3>
<table>
<colgroup>
<col style="width: 58%" />
<col style="width: 4%" />
<col style="width: 5%" />
<col style="width: 5%" />
<col style="width: 4%" />
<col style="width: 4%" />
<col style="width: 4%" />
<col style="width: 5%" />
<col style="width: 5%" />
</colgroup>
<thead>
<tr>
<th style="text-align: left;">Outcome</th>
<th style="text-align: right;"><span class="math inline">d_{\text{embed}}</span></th>
<th style="text-align: right;"><span class="math inline">d_{\text{hidden}}</span></th>
<th style="text-align: right;"><span class="math inline">r_{\text{deepset}}</span></th>
<th style="text-align: right;"><span class="math inline">n_{\text{encode}}</span></th>
<th style="text-align: right;"><span class="math inline">n_{\text{decode}}</span></th>
<th style="text-align: right;"><span class="math inline">d_{\text{demo}}</span></th>
<th style="text-align: right;"><span class="math inline">d_{\text{mlp}}</span></th>
<th style="text-align: right;"><span class="math inline">r_{\text{dropout}}</span></th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left;">30-day readmission</td>
<td style="text-align: right;">32</td>
<td style="text-align: right;">416</td>
<td style="text-align: right;">0.5</td>
<td style="text-align: right;">1</td>
<td style="text-align: right;">3</td>
<td style="text-align: right;">64</td>
<td style="text-align: right;">480</td>
<td style="text-align: right;">0.1</td>
</tr>
<tr>
<td style="text-align: left;">30-day postdischarge mortality</td>
<td style="text-align: right;">64</td>
<td style="text-align: right;">320</td>
<td style="text-align: right;">0.6</td>
<td style="text-align: right;">2</td>
<td style="text-align: right;">1</td>
<td style="text-align: right;">64</td>
<td style="text-align: right;">384</td>
<td style="text-align: right;">0.1</td>
</tr>
<tr>
<td style="text-align: left;">30-day mortality including index-hospital death</td>
<td style="text-align: right;">64</td>
<td style="text-align: right;">416</td>
<td style="text-align: right;">0.8</td>
<td style="text-align: right;">3</td>
<td style="text-align: right;">3</td>
<td style="text-align: right;">64</td>
<td style="text-align: right;">448</td>
<td style="text-align: right;">0.4</td>
</tr>
</tbody>
</table>
<p><em>The model configurations are determined through hyperparameter tuning for each outcome variable, respectively. All models share the same batch size and learning rate.</em></p>
<h3 id="etable-2.-performance-comparison-for-30-day-mortality-including-index-hospital-death">eTable 2. Performance comparison for 30-day mortality including index-hospital death</h3>
<table style="width:100%;">
<colgroup>
<col style="width: 22%" />
<col style="width: 32%" />
<col style="width: 13%" />
<col style="width: 10%" />
<col style="width: 10%" />
<col style="width: 10%" />
</colgroup>
<thead>
<tr>
<th style="text-align: left;">Methods</th>
<th style="text-align: left;"><abbr class="smallcaps">AUC-ROC</abbr></th>
<th style="text-align: right;">Precision</th>
<th style="text-align: right;">Recall</th>
<th style="text-align: right;"><span class="math inline">F_1</span></th>
<th style="text-align: right;"><span class="math inline">F_2</span></th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left;"><abbr class="smallcaps">ICD</abbr> Model</td>
<td style="text-align: left;">0.9651 [0.9647, 0.9656]</td>
<td style="text-align: right;">0.2107</td>
<td style="text-align: right;">0.9165</td>
<td style="text-align: right;">0.3427</td>
<td style="text-align: right;">0.5489</td>
</tr>
<tr>
<td style="text-align: left;"><abbr class="smallcaps">CCI</abbr></td>
<td style="text-align: left;">0.7217 [0.7203, 0.7231]</td>
<td style="text-align: right;">0.0663</td>
<td style="text-align: right;">0.6270</td>
<td style="text-align: right;">0.1200</td>
<td style="text-align: right;">0.2331</td>
</tr>
<tr>
<td style="text-align: left;"><abbr class="smallcaps">CCI</abbr> Age-Adjusted</td>
<td style="text-align: left;">0.7501 [0.7489, 0.7513]</td>
<td style="text-align: right;">0.0724</td>
<td style="text-align: right;">0.6043</td>
<td style="text-align: right;">0.1294</td>
<td style="text-align: right;">0.2448</td>
</tr>
<tr>
<td style="text-align: left;"><abbr class="smallcaps">ECI</abbr></td>
<td style="text-align: left;">0.6158 [0.6139, 0.6177]</td>
<td style="text-align: right;">0.0637</td>
<td style="text-align: right;">0.4427</td>
<td style="text-align: right;">0.1114</td>
<td style="text-align: right;">0.2022</td>
</tr>
</tbody>
</table>
<h3 id="etable-3.-ablation-study-results">eTable 3. Ablation study results</h3>
<p><strong>(A) Addition of transformer blocks</strong></p>
<table>
<colgroup>
<col style="width: 27%" />
<col style="width: 18%" />
<col style="width: 7%" />
<col style="width: 15%" />
<col style="width: 9%" />
<col style="width: 6%" />
<col style="width: 6%" />
<col style="width: 6%" />
</colgroup>
<thead>
<tr>
<th style="text-align: left;">Outcome Variable</th>
<th style="text-align: left;">Model Variant</th>
<th style="text-align: right;"><abbr class="smallcaps">AUC-ROC</abbr></th>
<th style="text-align: left;"><abbr class="smallcaps">AUC-ROC</abbr> CI</th>
<th style="text-align: right;">Precision</th>
<th style="text-align: right;">Recall</th>
<th style="text-align: right;"><span class="math inline">F_1</span></th>
<th style="text-align: right;"><span class="math inline">F_2</span></th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left;">30-day readmission</td>
<td style="text-align: left;">Full Model</td>
<td style="text-align: right;">0.7496</td>
<td style="text-align: left;">[0.7488, 0.7504]</td>
<td style="text-align: right;">0.1881</td>
<td style="text-align: right;">0.8006</td>
<td style="text-align: right;">0.3046</td>
<td style="text-align: right;">0.4848</td>
</tr>
<tr>
<td style="text-align: left;"></td>
<td style="text-align: left;">3 Transformer Blocks</td>
<td style="text-align: right;">0.7472</td>
<td style="text-align: left;">[0.7464, 0.7479]</td>
<td style="text-align: right;">0.1974</td>
<td style="text-align: right;">0.7565</td>
<td style="text-align: right;">0.3131</td>
<td style="text-align: right;">0.4829</td>
</tr>
<tr>
<td style="text-align: left;">30-day postdischarge mortality</td>
<td style="text-align: left;">Full Model</td>
<td style="text-align: right;">0.8557</td>
<td style="text-align: left;">[0.8532, 0.8581]</td>
<td style="text-align: right;">0.0111</td>
<td style="text-align: right;">0.8756</td>
<td style="text-align: right;">0.0220</td>
<td style="text-align: right;">0.0530</td>
</tr>
<tr>
<td style="text-align: left;"></td>
<td style="text-align: left;">3 Transformer Blocks</td>
<td style="text-align: right;">0.8547</td>
<td style="text-align: left;">[0.8523, 0.8572]</td>
<td style="text-align: right;">0.0114</td>
<td style="text-align: right;">0.8662</td>
<td style="text-align: right;">0.0225</td>
<td style="text-align: right;">0.0542</td>
</tr>
</tbody>
</table>
<p><strong>(B) Replacement of Deep Sets with flattening comparator</strong></p>
<table>
<colgroup>
<col style="width: 28%" />
<col style="width: 15%" />
<col style="width: 8%" />
<col style="width: 16%" />
<col style="width: 9%" />
<col style="width: 7%" />
<col style="width: 7%" />
<col style="width: 7%" />
</colgroup>
<thead>
<tr>
<th style="text-align: left;">Outcome Variable</th>
<th style="text-align: left;">Model Variant</th>
<th style="text-align: right;"><abbr class="smallcaps">AUC-ROC</abbr></th>
<th style="text-align: left;"><abbr class="smallcaps">AUC-ROC</abbr> CI</th>
<th style="text-align: right;">Precision</th>
<th style="text-align: right;">Recall</th>
<th style="text-align: right;"><span class="math inline">F_1</span></th>
<th style="text-align: right;"><span class="math inline">F_2</span></th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left;">30-day readmission</td>
<td style="text-align: left;">Full Model</td>
<td style="text-align: right;">0.7496</td>
<td style="text-align: left;">[0.7488, 0.7504]</td>
<td style="text-align: right;">0.1881</td>
<td style="text-align: right;">0.8006</td>
<td style="text-align: right;">0.3046</td>
<td style="text-align: right;">0.4848</td>
</tr>
<tr>
<td style="text-align: left;"></td>
<td style="text-align: left;">Without DeepSet</td>
<td style="text-align: right;">0.7474</td>
<td style="text-align: left;">[0.7466, 0.7482]</td>
<td style="text-align: right;">0.1933</td>
<td style="text-align: right;">0.7724</td>
<td style="text-align: right;">0.3092</td>
<td style="text-align: right;">0.4829</td>
</tr>
<tr>
<td style="text-align: left;">30-day postdischarge mortality</td>
<td style="text-align: left;">Full Model</td>
<td style="text-align: right;">0.8557</td>
<td style="text-align: left;">[0.8532, 0.8581]</td>
<td style="text-align: right;">0.0111</td>
<td style="text-align: right;">0.8756</td>
<td style="text-align: right;">0.0220</td>
<td style="text-align: right;">0.0530</td>
</tr>
<tr>
<td style="text-align: left;"></td>
<td style="text-align: left;">Without DeepSet</td>
<td style="text-align: right;">0.8513</td>
<td style="text-align: left;">[0.8488, 0.8538]</td>
<td style="text-align: right;">0.0108</td>
<td style="text-align: right;">0.8777</td>
<td style="text-align: right;">0.0214</td>
<td style="text-align: right;">0.0515</td>
</tr>
</tbody>
</table>
<p><strong>(C) Removal of demographic and socioeconomic inputs (ICD-only)</strong></p>
<table>
<colgroup>
<col style="width: 28%" />
<col style="width: 15%" />
<col style="width: 8%" />
<col style="width: 16%" />
<col style="width: 9%" />
<col style="width: 7%" />
<col style="width: 7%" />
<col style="width: 7%" />
</colgroup>
<thead>
<tr>
<th style="text-align: left;">Outcome Variable</th>
<th style="text-align: left;">Model Variant</th>
<th style="text-align: right;"><abbr class="smallcaps">AUC-ROC</abbr></th>
<th style="text-align: left;"><abbr class="smallcaps">AUC-ROC</abbr> CI</th>
<th style="text-align: right;">Precision</th>
<th style="text-align: right;">Recall</th>
<th style="text-align: right;"><span class="math inline">F_1</span></th>
<th style="text-align: right;"><span class="math inline">F_2</span></th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left;">30-day readmission</td>
<td style="text-align: left;">Full Model</td>
<td style="text-align: right;">0.7496</td>
<td style="text-align: left;">[0.7488, 0.7504]</td>
<td style="text-align: right;">0.1881</td>
<td style="text-align: right;">0.8006</td>
<td style="text-align: right;">0.3046</td>
<td style="text-align: right;">0.4848</td>
</tr>
<tr>
<td style="text-align: left;"></td>
<td style="text-align: left;"><abbr class="smallcaps">ICD</abbr> Inputs Only</td>
<td style="text-align: right;">0.7483</td>
<td style="text-align: left;">[0.7475, 0.7490]</td>
<td style="text-align: right;">0.1907</td>
<td style="text-align: right;">0.7868</td>
<td style="text-align: right;">0.3070</td>
<td style="text-align: right;">0.4842</td>
</tr>
<tr>
<td style="text-align: left;">30-day postdischarge mortality</td>
<td style="text-align: left;">Full Model</td>
<td style="text-align: right;">0.8557</td>
<td style="text-align: left;">[0.8532, 0.8581]</td>
<td style="text-align: right;">0.0111</td>
<td style="text-align: right;">0.8756</td>
<td style="text-align: right;">0.0220</td>
<td style="text-align: right;">0.0530</td>
</tr>
<tr>
<td style="text-align: left;"></td>
<td style="text-align: left;"><abbr class="smallcaps">ICD</abbr> Inputs Only</td>
<td style="text-align: right;">0.8483</td>
<td style="text-align: left;">[0.8457, 0.8509]</td>
<td style="text-align: right;">0.0110</td>
<td style="text-align: right;">0.8627</td>
<td style="text-align: right;">0.0218</td>
<td style="text-align: right;">0.0525</td>
</tr>
</tbody>
</table>
<h3 id="efigure-1-permutation-invariant-icd-embedding-model">eFigure 1: Permutation-invariant <abbr class="smallcaps">ICD</abbr> Embedding Model</h3>
<figure>
<img src="figures/efig1-model-architecture.png" data-lightbox="true" loading="lazy" alt="Given a patient’s ICD-10-CM diagnosis codes together with demographic and socioeconomic features, the model estimates risk of 30-day readmission and 30-day postdischarge mortality. Diagnosis codes are embedded and aggregated with a Deep Sets module, then combined with other inputs to generate the final prediction." />
<figcaption aria-hidden="true">Given a patient’s ICD-10-CM diagnosis codes together with demographic and socioeconomic features, the model estimates risk of 30-day readmission and 30-day postdischarge mortality. Diagnosis codes are embedded and aggregated with a Deep Sets module, then combined with other inputs to generate the final prediction.</figcaption>
</figure>
<h3 id="efigure-2-top-icd-10-cm-codes-by-integrated-gradients-for-30-day-mortality-including-index-hospital-death">eFigure 2: Top ICD-10-CM codes by Integrated Gradients for 30-day mortality including index-hospital death</h3>
<figure>
<img src="figures/efig2-ig-mortality-with-inhospital.png" data-lightbox="true" loading="lazy" alt="Top ICD-10-CM codes by Integrated Gradients for 30-day mortality including index-hospital death." />
<figcaption aria-hidden="true">Top ICD-10-CM codes by Integrated Gradients for 30-day mortality including index-hospital death.</figcaption>
</figure>
<h3 id="efigure-3.-calibration-reliability-plots-for-temporal-test-evaluation-subsample-predictions">eFigure 3. Calibration reliability plots for temporal test evaluation subsample predictions</h3>
<p><em>(A) 30-day unplanned readmission and (B) 30-day postdischarge mortality.</em></p>
<div class="annotation annotation--static">
<p><strong>eFigure 3 — [placeholder]</strong> Calibration reliability plots for temporal test evaluation subsample predictions.</p>
</div>
<h3 id="efigure-4.-web-calculator-interface-examples">eFigure 4. Web Calculator Interface Examples</h3>
<p><em>(A) With demographics and (B) Without demographics.</em></p>
<p><strong>(A)</strong></p>
<figure>
<img src="figures/efig4a-calculator-with-demographics.png" data-lightbox="true" loading="lazy" alt="Web calculator interface with demographics." />
<figcaption aria-hidden="true">Web calculator interface with demographics.</figcaption>
</figure>
<p><strong>(B)</strong></p>
<figure>
<img src="figures/efig4b-calculator-without-demographics.png" data-lightbox="true" loading="lazy" alt="Web calculator interface without demographics." />
<figcaption aria-hidden="true">Web calculator interface without demographics.</figcaption>
</figure>
</div>]]></summary>
</entry>
<entry>
    <title>Where Does SIMD Help Post-Quantum Cryptography? A Micro-Architectural Study of ML-KEM on x86 AVX2</title>
    <link href="https://levineuwirth.org/essays/where-does-simd-help-post-quantum-cryptography/index.html" />
    <id>https://levineuwirth.org/essays/where-does-simd-help-post-quantum-cryptography/index.html</id>
    <published>2026-04-04T00:00:00Z</published>
    <updated>2026-04-04T00:00:00Z</updated>
    <summary type="html"><![CDATA[<h2 id="introduction">Introduction</h2>
<p>The 2024 <abbr class="smallcaps">NIST</abbr> post-quantum cryptography standards<sup class="cite-marker" id="cite-back-1"><a href="#ref-fips203" class="cite-link" data-cite-keys="ref-fips203 ref-fips204 ref-fips205">[1,2,3]</a></sup> mark a turning point in deployed cryptography. <abbr class="smallcaps">ML-KEM</abbr> (Module-Lattice Key Encapsulation Mechanism, <abbr class="smallcaps">FIPS</abbr> 203) is already being integrated into <abbr class="smallcaps">TLS</abbr> 1.3 by major browser vendors<sup class="cite-marker" id="cite-back-4"><a href="#ref-bettini2024" class="cite-link" data-cite-keys="ref-bettini2024">[4]</a></sup> and is planned for inclusion in OpenSSH. A server handling thousands of <abbr class="smallcaps">TLS</abbr> handshakes per second experiences a non-trivial computational overhead from replacing elliptic-curve key exchange with a lattice-based <abbr class="smallcaps">KEM</abbr>. These performance concerns propagate to the countless users that use tools like OpenSSH on a daily basis.</p>
<p>Reference implementations of <abbr class="smallcaps">ML-KEM</abbr> ship with hand-optimized AVX2 assembly for the dominant operations<sup class="cite-marker" id="cite-back-5"><a href="#ref-kyber-avx2" class="cite-link" data-cite-keys="ref-kyber-avx2">[5]</a></sup>. Benchmarks routinely report that the AVX2 path is “<span class="math inline">5</span>–<span class="math inline">7\times</span> faster” than the portable C reference. However, such top-level numbers conflate several distinct phenomena: compiler optimization, compiler auto-vectorization, and hand-written <abbr class="smallcaps">SIMD</abbr>. They also say nothing about <em>which</em> operations drive the speedup or <em>why</em> the assembly is faster than what a compiler can produce automatically.</p>
<h3 id="contributions">Contributions</h3>
<p>We make the following contributions:</p>
<ol type="1">
<li><strong>Three-way speedup decomposition.</strong> We isolate compiler optimization, auto-vectorization, and hand-written <abbr class="smallcaps">SIMD</abbr> as separate factors using four compilation variants (the corresponding section).</li>
<li><strong>Statistically rigorous benchmarking.</strong> All comparisons are backed by Mann-Whitney U tests and Cliff’s <span class="math inline">\delta</span> effect-size analysis over <span class="math inline">n \ge 2{,}000</span> independent observations, with bootstrapped 95% confidence intervals on speedup ratios (the corresponding section).</li>
<li><strong>Mechanistic analysis without hardware counters.</strong> We explain the quantitative speedup pattern analytically from the structure of the <abbr class="smallcaps">NTT</abbr> butterfly, Montgomery multiplication, and the SHAKE-128 permutation (the corresponding section).</li>
<li><strong>Open reproducible artifact.</strong> The full pipeline from raw <abbr class="smallcaps">SLURM</abbr> outputs to publication figures is released publicly.</li>
</ol>
<h3 id="scope-and-roadmap">Scope and roadmap</h3>
<p>This report covers Phase 1 of a broader study: <abbr class="smallcaps">ML-KEM</abbr> on Intel x86-64 with AVX2. Planned extensions include hardware performance counter profiles (PAPI), energy measurement (Intel <abbr class="smallcaps">RAPL</abbr>), extension to <abbr class="smallcaps">ML-DSA</abbr> (Dilithium), and cross-ISA comparison with <abbr class="smallcaps">ARM</abbr> NEON/SVE and <abbr class="smallcaps">RISC-V</abbr> V. Those results will be incorporated in subsequent revisions.</p>
<h2 id="background">Background</h2>
<h3 id="ml-kem-and-the-number-theoretic-transform">ML-KEM and the Number Theoretic Transform</h3>
<p><abbr class="smallcaps">ML-KEM</abbr><sup class="cite-marker" id="cite-back-1"><a href="#ref-fips203" class="cite-link" data-cite-keys="ref-fips203">[1]</a></sup> is a key encapsulation mechanism built on the Module-Learning-With-Errors (Module-LWE) problem. Its security parameter <span class="math inline">k \in \{2, 3, 4\}</span> controls the module dimension, yielding the three instantiations ML-KEM-512, ML-KEM-768, and ML-KEM-1024. The scheme operates on polynomials in <span class="math inline">\mathbb{Z}_q[x]/(x^{256}+1)</span> with <span class="math inline">q = 3329</span>.</p>
<p>The computational core is polynomial multiplication, which <abbr class="smallcaps">ML-KEM</abbr> evaluates using the Number Theoretic Transform (NTT)<sup class="cite-marker" id="cite-back-6"><a href="#ref-ntt-survey" class="cite-link" data-cite-keys="ref-ntt-survey">[6]</a></sup>. The <abbr class="smallcaps">NTT</abbr> is a modular analog of the Fast Fourier Transform that reduces schoolbook <span class="math inline">O(n^2)</span> polynomial multiplication to <span class="math inline">O(n \log n)</span> pointwise operations. For <span class="math inline">n = 256</span> coefficients and <span class="math inline">q = 3329</span>, the <abbr class="smallcaps">NTT</abbr> can be computed using a specialized radix-2 Cooley-Tukey butterfly operating over 128 size-2 NTTs in the <abbr class="smallcaps">NTT</abbr> domain.</p>
<p>The primitive operations benchmarked in this paper are:</p>
<ul>
<li><code>NTT</code> / <code>INVNTT</code>: forward and inverse <abbr class="smallcaps">NTT</abbr> over a single polynomial (<span class="math inline">n = 256</span>).</li>
<li><code>basemul</code>: pointwise multiplication in the <abbr class="smallcaps">NTT</abbr> domain (base multiplication of two NTT-domain polynomials).</li>
<li><code>poly_frommsg</code>: encodes a 32-byte message into a polynomial.</li>
<li><code>gen_a</code>: generates the public matrix <span class="math inline">\mathbf{A}</span> by expanding a seed with SHAKE-128.</li>
<li><code>poly_getnoise_eta{1,2}</code>: samples a centered binomial distribution (CBD) noise polynomial using SHAKE-256 output.</li>
<li><code>indcpa_{keypair, enc, dec}</code>: full <abbr class="smallcaps">IND-CPA</abbr> key generation, encryption, and decryption.</li>
</ul>
<h3 id="avx2-simd-on-x86-64">AVX2 SIMD on x86-64</h3>
<p><a href="https://en.wikipedia.org/wiki/Advanced_Vector_Extensions#Advanced_Vector_Extensions_2" class="link-external" target="_blank" rel="noopener noreferrer" data-link-icon="wikipedia" data-link-icon-type="svg">Intel’s Advanced Vector Extensions 2</a> (AVX2) extends the <abbr class="smallcaps">YMM</abbr> register file to 256-bit width, accommodating sixteen 16-bit integers simultaneously. The <abbr class="smallcaps">ML-KEM</abbr> AVX2 implementation<sup class="cite-marker" id="cite-back-5"><a href="#ref-kyber-avx2" class="cite-link" data-cite-keys="ref-kyber-avx2">[5]</a></sup> by Schwabe and Seiler uses hand-written assembly intrinsics rather than compiler-generated vectorized code.</p>
<p>The key instruction patterns exploited are:</p>
<ul>
<li><code>vpaddw</code> / <code>vpsubw</code>: packed 16-bit addition/subtraction, operating on 16 coefficients per instruction.</li>
<li><code>vpmullw</code> / <code>vpmulhw</code>: packed 16-bit low/high multiply, used to implement 16-wide Montgomery reduction.</li>
<li><code>vpunpcklwd</code> / <code>vpunpckhwd</code>: interleave operations for the <abbr class="smallcaps">NTT</abbr> butterfly shuffle pattern.</li>
</ul>
<p>Because <abbr class="smallcaps">ML-KEM</abbr> coefficients are 16-bit integers and the <abbr class="smallcaps">NTT</abbr> butterfly operates independently on 16 coefficient pairs per round, AVX2 offers a theoretical <span class="math inline">16\times</span> instruction-count reduction for arithmetic steps. As the corresponding section shows, observed speedups <em>exceed</em> <span class="math inline">16\times</span> for <code>INVNTT</code> and <code>basemul</code> due to additional instruction-level parallelism (ILP) in the unrolled hand-written loops.</p>
<h3 id="compilation-variants">Compilation Variants</h3>
<p>To isolate distinct sources of speedup, we define four compilation variants (detailed in the corresponding section):</p>
<ul>
<li><strong><code>refo0</code></strong> Compiled at <code>-O0</code>: the baseline with no compiler optimization.</li>
<li><strong><code>refnv</code></strong> Compiled at <code>-O3 -fno-tree-vectorize</code>: full compiler optimization but with auto-vectorization disabled. Isolates the contribution of general compiler optimizations (eg. loop unrolling) from <abbr class="smallcaps">SIMD</abbr>.</li>
<li><strong><code>ref</code></strong> Compiled at <code>-O3</code>: full optimization including GCC’s auto-vectorizer, similar to typical production environments.</li>
<li><strong><code>avx2</code></strong> Hand-written AVX2 assembly.</li>
</ul>
<h3 id="hardware-performance-counters-and-energy">Hardware Performance Counters and Energy</h3>
<div class="annotation annotation--static">
<p><strong>Phase 2:</strong> Expand with <abbr class="smallcaps">PAPI</abbr> and <abbr class="smallcaps">RAPL</abbr> background once data is collected.</p>
</div>
<p>Hardware performance counters (accessed via <abbr class="smallcaps">PAPI</abbr><sup class="cite-marker" id="cite-back-7"><a href="#ref-papi" class="cite-link" data-cite-keys="ref-papi">[7]</a></sup> or Linux <code>perf_event</code>) allow measuring <abbr class="smallcaps">IPC</abbr>, cache miss rates, and branch mispredictions at the instruction level. Intel <abbr class="smallcaps">RAPL</abbr><sup class="cite-marker" id="cite-back-8"><a href="#ref-rapl" class="cite-link" data-cite-keys="ref-rapl">[8]</a></sup> provides package- and DRAM-domain energy readings. These will be incorporated in Phase 2 to provide a mechanistic hardware-level explanation complementing the cycle-count analysis presented here.</p>
<h2 id="methodology">Methodology</h2>
<h3 id="implementation-source">Implementation Source</h3>
<p>We use the <abbr class="smallcaps">ML-KEM</abbr> reference implementation from the <code>pq-crystals/kyber</code> repository<sup class="cite-marker" id="cite-back-5"><a href="#ref-kyber-avx2" class="cite-link" data-cite-keys="ref-kyber-avx2">[5]</a></sup>, which provides both a portable C reference (<code>ref</code> / <code>refnv</code>) and hand-written AVX2 assembly (<code>avx2</code>). The implementation targets the CRYSTALS-Kyber specification, functionally identical to <abbr class="smallcaps">FIPS</abbr> 203.</p>
<h3 id="compilation-variants-1">Compilation Variants</h3>
<p>We compile the same C source under four variant configurations using <abbr class="smallcaps">GCC</abbr> 13.3.0 on the same machine:</p>
<ul>
<li><strong><code>refo0</code></strong> <code>-O0</code>: unoptimized. Every operation is loaded/stored through memory; no inlining, no register allocation. Establishes a reproducible performance floor.</li>
<li><strong><code>refnv</code></strong> <code>-O3 -fno-tree-vectorize</code>: aggressive scalar optimization but with the tree-vectorizer disabled. Isolates the auto-vectorization contribution from general O3 optimizations.</li>
<li><strong><code>ref</code></strong> <code>-O3</code>: full optimization with <abbr class="smallcaps">GCC</abbr> auto-vectorization enabled. Represents realistic scalar-C performance.</li>
<li><strong><code>avx2</code></strong> <code>-O3</code> with hand-written AVX2 assembly linked in: the production optimized path.</li>
</ul>
<p>All four variants are built with position-independent code and identical linker flags. The AVX2 assembly sources use the same <code>KYBER_NAMESPACE</code> macro as the C sources to prevent symbol collisions.</p>
<h3 id="benchmark-harness">Benchmark Harness</h3>
<p>Each binary runs a <em>spin loop</em>: <span class="math inline">N = 1{,}000</span> outer iterations (spins), each performing 20 repetitions of the target operation followed by a median and mean cycle count report via <code>RDTSC</code>. Using the median of 20 repetitions per spin suppresses within-spin outliers; collecting 1{,}000 spins produces a distribution of 1{,}000 median observations per binary invocation.</p>
<p>Two independent job submissions per (algorithm, variant) pair yield <span class="math inline">n \ge 2{,}000</span> independent observations per group (3{,}000 for <code>ref</code> and <code>avx2</code>, which had a third clean run). All runs used <code>taskset</code> to pin to a single logical core, preventing OS scheduling interference.</p>
<h3 id="hardware-platform">Hardware Platform</h3>
<p>All benchmarks were conducted on Brown University’s <a href="https://docs.ccv.brown.edu/oscar" class="link-external" target="_blank" rel="noopener noreferrer" data-link-icon="external" data-link-icon-type="svg"><abbr class="smallcaps">OSCAR</abbr> <abbr class="smallcaps">HPC</abbr> cluster</a>, node <code>node2334</code>, pinned via SLURM’s <code>--nodelist</code> directive to ensure all variants measured on identical hardware. The node specifications are:</p>
<table>
<thead>
<tr>
<th>Characteristic</th>
<th>Detail</th>
</tr>
</thead>
<tbody>
<tr>
<td><abbr class="smallcaps">CPU</abbr> model</td>
<td>Intel Xeon Platinum 8268 (Cascade Lake)</td>
</tr>
<tr>
<td>Clock speed</td>
<td>2.90 GHz base</td>
</tr>
<tr>
<td><abbr class="smallcaps">ISA</abbr> extensions</td>
<td>SSE4.2, <abbr class="smallcaps">AVX</abbr>, AVX2, AVX-512F</td>
</tr>
<tr>
<td>L1D cache</td>
<td>32 KB (per core)</td>
</tr>
<tr>
<td>L2 cache</td>
<td>1 MB (per core)</td>
</tr>
<tr>
<td>L3 cache</td>
<td>35.75 MB (shared)</td>
</tr>
<tr>
<td>OS</td>
<td>Linux (kernel 3.10)</td>
</tr>
<tr>
<td>Compiler</td>
<td><abbr class="smallcaps">GCC</abbr> 13.3.0</td>
</tr>
</tbody>
</table>
<p><strong>Reproducibility note:</strong> The <code>perf_event_paranoid</code> setting on <abbr class="smallcaps">OSCAR</abbr> nodes is 2, which prevents unprivileged access to hardware performance counters. Hardware counter data (IPC, cache miss rates) will be collected in Phase 2 via alternative means.
::: {.annotation .annotation–static}
<strong>Phase 2:</strong> Hardware counter collection via <abbr class="smallcaps">PAPI</abbr>.
:::</p>
<h3 id="statistical-methodology">Statistical Methodology</h3>
<p>Cycle count distributions are right-skewed with occasional outliers from OS interrupts and cache-cold starts (the figure). We therefore use nonparametric statistics throughout:</p>
<ul>
<li><strong>Speedup</strong>: ratio of group medians, <span class="math inline">\hat{s} = \text{median}(X_\text{baseline}) / \text{median}(X_\text{variant})</span>.</li>
<li><strong>Confidence interval</strong>: 95% bootstrap CI on <span class="math inline">\hat{s}</span>, computed by resampling both groups independently <span class="math inline">B = 5{,}000</span> times with replacement.</li>
<li><strong>Mann-Whitney U test</strong>: one-sided test for the hypothesis that the variant distribution is stochastically smaller than the baseline (<span class="math inline">H_1: P(X_\text{variant} &lt; X_\text{baseline}) &gt; 0.5</span>).</li>
<li><strong>Cliff’s <span class="math inline">\delta</span></strong>: effect size defined as <span class="math inline">\delta = [P(X_\text{variant} &lt; X_\text{baseline}) - P(X_\text{variant} &gt; X_\text{baseline})]</span>, derived from the Mann-Whitney U statistic. <span class="math inline">\delta = +1</span> indicates that <em>every</em> variant observation is faster than <em>every</em> baseline observation.</li>
</ul>
<h3 id="energy-measurement">Energy Measurement</h3>
<div class="annotation annotation--static">
<p><strong>Phase 2:</strong> Intel <abbr class="smallcaps">RAPL</abbr> (pkg + <abbr class="smallcaps">DRAM</abbr> domains), <abbr class="smallcaps">EDP</abbr> computation, per-operation joules.</p>
</div>
<p>Energy measurements via Intel <abbr class="smallcaps">RAPL</abbr> will be incorporated in Phase 2. The harness already includes conditional <abbr class="smallcaps">RAPL</abbr> support (<code>-DWITH_RAPL=ON</code>) pending appropriate system permissions.</p>
<h2 id="results">Results</h2>
<h3 id="cycle-count-distributions">Cycle Count Distributions</h3>
<p>The figure shows the cycle count distributions for three representative operations in ML-KEM-512, comparing <code>ref</code> and <code>avx2</code>. All distributions are right-skewed with a long tail from OS interrupts and cache-cold executions. The median (dashed lines) is robust to these outliers, justifying the nonparametric approach of the corresponding section.</p>
<p>The separation between <code>ref</code> and <code>avx2</code> is qualitatively different across operation types: for <code>INVNTT</code> the distributions do not overlap at all (disjoint spikes separated by two orders of magnitude on the log scale); for <code>gen_a</code> there is partial overlap; for noise sampling the distributions are nearly coincident.</p>
<figure>
<embed src="figures/distributions.pdf" data-lightbox="true" loading="lazy" />
<figcaption aria-hidden="true">Cycle count distributions for three representative ML-KEM-512 operations. Log <span class="math inline">x</span>-axis. Dashed lines mark medians. Right-skew and outlier structure motivate nonparametric statistics.</figcaption>
</figure>
<h3 id="speedup-decomposition">Speedup Decomposition</h3>
<p>The figure shows the cumulative speedup at each optimization stage for all three <abbr class="smallcaps">ML-KEM</abbr> parameter sets. Each group of bars represents one operation; the three bars within a group show the total speedup achieved after applying (i) O3 without auto-vec (<code>refnv</code>), (ii) O3 with auto-vec (<code>ref</code>), and (iii) hand-written AVX2 (<code>avx2</code>)—all normalized to the unoptimized <code>refo0</code> baseline. The log scale makes the three orders of magnitude of variation legible.</p>
<p>Several structural features are immediately apparent:</p>
<ul>
<li>The <code>refnv</code> and <code>ref</code> bars are nearly indistinguishable for arithmetic operations (NTT, <abbr class="smallcaps">INVNTT</abbr>, basemul, frommsg), confirming that GCC’s auto-vectorizer contributes negligibly to these operations.</li>
<li>The <code>avx2</code> bars are 1–2 orders of magnitude taller than the <code>ref</code> bars for arithmetic operations, indicating that hand-written <abbr class="smallcaps">SIMD</abbr> dominates the speedup.</li>
<li>For SHAKE-heavy operations (gen_a, noise), all three bars are much closer together, reflecting the memory-bandwidth bottleneck that limits <abbr class="smallcaps">SIMD</abbr> benefit.</li>
</ul>
<figure class="viz-figure"><?xml version="1.0" encoding="utf-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
  "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg xmlns:xlink="http://www.w3.org/1999/xlink" width="855.456426pt" height="280.940261pt" viewBox="0 0 855.456426 280.940261" xmlns="http://www.w3.org/2000/svg" version="1.1">
 <metadata>
  <rdf:RDF xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
   <cc:Work>
    <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
    <dc:date>2026-04-26T19:42:51.997696</dc:date>
    <dc:format>image/svg+xml</dc:format>
    <dc:creator>
     <cc:Agent>
      <dc:title>Matplotlib v3.10.9, https://matplotlib.org/</dc:title>
     </cc:Agent>
    </dc:creator>
   </cc:Work>
  </rdf:RDF>
 </metadata>
 <defs>
  <style type="text/css">*{stroke-linejoin: round; stroke-linecap: butt}</style>
 </defs>
 <g id="figure_1">
  <g id="patch_1">
   <path d="M 0 280.940261 
L 855.456426 280.940261 
L 855.456426 0 
L 0 0 
L 0 280.940261 
z
" style="fill: none"/>
  </g>
  <g id="axes_1">
   <g id="patch_2">
    <path d="M 59.3 228.385242 
L 304.022161 228.385242 
L 304.022161 26.318125 
L 59.3 26.318125 
L 59.3 228.385242 
z
" style="fill: none"/>
   </g>
   <g id="patch_3">
    <path d="M 70.423735 75096.618905 
L 76.780154 75096.618905 
L 76.780154 182.646067 
L 70.423735 182.646067 
z
" clip-path="url(#p7ad6d2ef96)" style="fill: #333333"/>
   </g>
   <g id="patch_4">
    <path d="M 95.849414 75096.618905 
L 102.205833 75096.618905 
L 102.205833 189.791475 
L 95.849414 189.791475 
z
" clip-path="url(#p7ad6d2ef96)" style="fill: #333333"/>
   </g>
   <g id="patch_5">
    <path d="M 121.275093 75096.618905 
L 127.631512 75096.618905 
L 127.631512 192.545503 
L 121.275093 192.545503 
z
" clip-path="url(#p7ad6d2ef96)" style="fill: #333333"/>
   </g>
   <g id="patch_6">
    <path d="M 146.700772 75096.618905 
L 153.057191 75096.618905 
L 153.057191 185.962279 
L 146.700772 185.962279 
z
" clip-path="url(#p7ad6d2ef96)" style="fill: #333333"/>
   </g>
   <g id="patch_7">
    <path d="M 172.126451 75096.618905 
L 178.48287 75096.618905 
L 178.48287 185.472761 
L 172.126451 185.472761 
z
" clip-path="url(#p7ad6d2ef96)" style="fill: #333333"/>
   </g>
   <g id="patch_8">
    <path d="M 197.55213 75096.618905 
L 203.90855 75096.618905 
L 203.90855 188.183375 
L 197.55213 188.183375 
z
" clip-path="url(#p7ad6d2ef96)" style="fill: #333333"/>
   </g>
   <g id="patch_9">
    <path d="M 222.977809 75096.618905 
L 229.334229 75096.618905 
L 229.334229 190.81946 
L 222.977809 190.81946 
z
" clip-path="url(#p7ad6d2ef96)" style="fill: #333333"/>
   </g>
   <g id="patch_10">
    <path d="M 248.403488 75096.618905 
L 254.759908 75096.618905 
L 254.759908 195.887171 
L 248.403488 195.887171 
z
" clip-path="url(#p7ad6d2ef96)" style="fill: #333333"/>
   </g>
   <g id="patch_11">
    <path d="M 273.829167 75096.618905 
L 280.185587 75096.618905 
L 280.185587 191.21571 
L 273.829167 191.21571 
z
" clip-path="url(#p7ad6d2ef96)" style="fill: #333333"/>
   </g>
   <g id="patch_12">
    <path d="M 76.780154 75096.618905 
L 83.136574 75096.618905 
L 83.136574 185.438702 
L 76.780154 185.438702 
z
" clip-path="url(#p7ad6d2ef96)" style="fill: #777777"/>
   </g>
   <g id="patch_13">
    <path d="M 102.205833 75096.618905 
L 108.562253 75096.618905 
L 108.562253 188.597831 
L 102.205833 188.597831 
z
" clip-path="url(#p7ad6d2ef96)" style="fill: #777777"/>
   </g>
   <g id="patch_14">
    <path d="M 127.631512 75096.618905 
L 133.987932 75096.618905 
L 133.987932 192.545503 
L 127.631512 192.545503 
z
" clip-path="url(#p7ad6d2ef96)" style="fill: #777777"/>
   </g>
   <g id="patch_15">
    <path d="M 153.057191 75096.618905 
L 159.413611 75096.618905 
L 159.413611 185.579183 
L 153.057191 185.579183 
z
" clip-path="url(#p7ad6d2ef96)" style="fill: #777777"/>
   </g>
   <g id="patch_16">
    <path d="M 178.48287 75096.618905 
L 184.83929 75096.618905 
L 184.83929 185.011286 
L 178.48287 185.011286 
z
" clip-path="url(#p7ad6d2ef96)" style="fill: #777777"/>
   </g>
   <g id="patch_17">
    <path d="M 203.90855 75096.618905 
L 210.264969 75096.618905 
L 210.264969 187.373312 
L 203.90855 187.373312 
z
" clip-path="url(#p7ad6d2ef96)" style="fill: #777777"/>
   </g>
   <g id="patch_18">
    <path d="M 229.334229 75096.618905 
L 235.690648 75096.618905 
L 235.690648 189.065962 
L 229.334229 189.065962 
z
" clip-path="url(#p7ad6d2ef96)" style="fill: #777777"/>
   </g>
   <g id="patch_19">
    <path d="M 254.759908 75096.618905 
L 261.116327 75096.618905 
L 261.116327 195.573229 
L 254.759908 195.573229 
z
" clip-path="url(#p7ad6d2ef96)" style="fill: #777777"/>
   </g>
   <g id="patch_20">
    <path d="M 280.185587 75096.618905 
L 286.542006 75096.618905 
L 286.542006 188.279899 
L 280.185587 188.279899 
z
" clip-path="url(#p7ad6d2ef96)" style="fill: #777777"/>
   </g>
   <g id="patch_21">
    <path d="M 83.136574 75096.618905 
L 89.492994 75096.618905 
L 89.492994 54.403837 
L 83.136574 54.403837 
z
" clip-path="url(#p7ad6d2ef96)" style="fill: #bbbbbb"/>
   </g>
   <g id="patch_22">
    <path d="M 108.562253 75096.618905 
L 114.918673 75096.618905 
L 114.918673 60.098352 
L 108.562253 60.098352 
z
" clip-path="url(#p7ad6d2ef96)" style="fill: #bbbbbb"/>
   </g>
   <g id="patch_23">
    <path d="M 133.987932 75096.618905 
L 140.344352 75096.618905 
L 140.344352 68.311191 
L 133.987932 68.311191 
z
" clip-path="url(#p7ad6d2ef96)" style="fill: #bbbbbb"/>
   </g>
   <g id="patch_24">
    <path d="M 159.413611 75096.618905 
L 165.770031 75096.618905 
L 165.770031 69.492231 
L 159.413611 69.492231 
z
" clip-path="url(#p7ad6d2ef96)" style="fill: #bbbbbb"/>
   </g>
   <g id="patch_25">
    <path d="M 184.83929 75096.618905 
L 191.19571 75096.618905 
L 191.19571 69.362943 
L 184.83929 69.362943 
z
" clip-path="url(#p7ad6d2ef96)" style="fill: #bbbbbb"/>
   </g>
   <g id="patch_26">
    <path d="M 210.264969 75096.618905 
L 216.621389 75096.618905 
L 216.621389 112.589158 
L 210.264969 112.589158 
z
" clip-path="url(#p7ad6d2ef96)" style="fill: #bbbbbb"/>
   </g>
   <g id="patch_27">
    <path d="M 235.690648 75096.618905 
L 242.047068 75096.618905 
L 242.047068 120.220971 
L 235.690648 120.220971 
z
" clip-path="url(#p7ad6d2ef96)" style="fill: #bbbbbb"/>
   </g>
   <g id="patch_28">
    <path d="M 261.116327 75096.618905 
L 267.472747 75096.618905 
L 267.472747 145.536817 
L 261.116327 145.536817 
z
" clip-path="url(#p7ad6d2ef96)" style="fill: #bbbbbb"/>
   </g>
   <g id="patch_29">
    <path d="M 286.542006 75096.618905 
L 292.898426 75096.618905 
L 292.898426 177.611067 
L 286.542006 177.611067 
z
" clip-path="url(#p7ad6d2ef96)" style="fill: #bbbbbb"/>
   </g>
   <g id="matplotlib.axis_1">
    <g id="xtick_1">
     <g id="line2d_1">
      <defs>
       <path id="m05b77d1b6f" d="M 0 0 
L 0 3.5 
" style="stroke: #000000; stroke-width: 0.8"/>
      </defs>
      <g>
       <use xlink:href="#m05b77d1b6f" x="79.958364" y="228.385242" style="stroke: #000000; stroke-width: 0.8"/>
      </g>
     </g>
     <g id="text_1">
      <!-- INVNTT -->
      <g transform="translate(52.470693 266.775259) rotate(-45) scale(0.1 -0.1)">
       <defs>
        <path id="DejaVuSans-49" d="M 628 4666 
L 1259 4666 
L 1259 0 
L 628 0 
L 628 4666 
z
" transform="scale(0.015625)"/>
        <path id="DejaVuSans-4e" d="M 628 4666 
L 1478 4666 
L 3547 763 
L 3547 4666 
L 4159 4666 
L 4159 0 
L 3309 0 
L 1241 3903 
L 1241 0 
L 628 0 
L 628 4666 
z
" transform="scale(0.015625)"/>
        <path id="DejaVuSans-56" d="M 1831 0 
L 50 4666 
L 709 4666 
L 2188 738 
L 3669 4666 
L 4325 4666 
L 2547 0 
L 1831 0 
z
" transform="scale(0.015625)"/>
        <path id="DejaVuSans-54" d="M -19 4666 
L 3928 4666 
L 3928 4134 
L 2272 4134 
L 2272 0 
L 1638 0 
L 1638 4134 
L -19 4134 
L -19 4666 
z
" transform="scale(0.015625)"/>
       </defs>
       <use xlink:href="#DejaVuSans-49"/>
       <use xlink:href="#DejaVuSans-4e" transform="translate(29.492188 0)"/>
       <use xlink:href="#DejaVuSans-56" transform="translate(104.296875 0)"/>
       <use xlink:href="#DejaVuSans-4e" transform="translate(172.705078 0)"/>
       <use xlink:href="#DejaVuSans-54" transform="translate(247.509766 0)"/>
       <use xlink:href="#DejaVuSans-54" transform="translate(306.84375 0)"/>
      </g>
     </g>
    </g>
    <g id="xtick_2">
     <g id="line2d_2">
      <g>
       <use xlink:href="#m05b77d1b6f" x="105.384043" y="228.385242" style="stroke: #000000; stroke-width: 0.8"/>
      </g>
     </g>
     <g id="text_2">
      <!-- basemul -->
      <g transform="translate(73.723337 270.948294) rotate(-45) scale(0.1 -0.1)">
       <defs>
        <path id="DejaVuSans-62" d="M 3116 1747 
Q 3116 2381 2855 2742 
Q 2594 3103 2138 3103 
Q 1681 3103 1420 2742 
Q 1159 2381 1159 1747 
Q 1159 1113 1420 752 
Q 1681 391 2138 391 
Q 2594 391 2855 752 
Q 3116 1113 3116 1747 
z
M 1159 2969 
Q 1341 3281 1617 3432 
Q 1894 3584 2278 3584 
Q 2916 3584 3314 3078 
Q 3713 2572 3713 1747 
Q 3713 922 3314 415 
Q 2916 -91 2278 -91 
Q 1894 -91 1617 61 
Q 1341 213 1159 525 
L 1159 0 
L 581 0 
L 581 4863 
L 1159 4863 
L 1159 2969 
z
" transform="scale(0.015625)"/>
        <path id="DejaVuSans-61" d="M 2194 1759 
Q 1497 1759 1228 1600 
Q 959 1441 959 1056 
Q 959 750 1161 570 
Q 1363 391 1709 391 
Q 2188 391 2477 730 
Q 2766 1069 2766 1631 
L 2766 1759 
L 2194 1759 
z
M 3341 1997 
L 3341 0 
L 2766 0 
L 2766 531 
Q 2569 213 2275 61 
Q 1981 -91 1556 -91 
Q 1019 -91 701 211 
Q 384 513 384 1019 
Q 384 1609 779 1909 
Q 1175 2209 1959 2209 
L 2766 2209 
L 2766 2266 
Q 2766 2663 2505 2880 
Q 2244 3097 1772 3097 
Q 1472 3097 1187 3025 
Q 903 2953 641 2809 
L 641 3341 
Q 956 3463 1253 3523 
Q 1550 3584 1831 3584 
Q 2591 3584 2966 3190 
Q 3341 2797 3341 1997 
z
" transform="scale(0.015625)"/>
        <path id="DejaVuSans-73" d="M 2834 3397 
L 2834 2853 
Q 2591 2978 2328 3040 
Q 2066 3103 1784 3103 
Q 1356 3103 1142 2972 
Q 928 2841 928 2578 
Q 928 2378 1081 2264 
Q 1234 2150 1697 2047 
L 1894 2003 
Q 2506 1872 2764 1633 
Q 3022 1394 3022 966 
Q 3022 478 2636 193 
Q 2250 -91 1575 -91 
Q 1294 -91 989 -36 
Q 684 19 347 128 
L 347 722 
Q 666 556 975 473 
Q 1284 391 1588 391 
Q 1994 391 2212 530 
Q 2431 669 2431 922 
Q 2431 1156 2273 1281 
Q 2116 1406 1581 1522 
L 1381 1569 
Q 847 1681 609 1914 
Q 372 2147 372 2553 
Q 372 3047 722 3315 
Q 1072 3584 1716 3584 
Q 2034 3584 2315 3537 
Q 2597 3491 2834 3397 
z
" transform="scale(0.015625)"/>
        <path id="DejaVuSans-65" d="M 3597 1894 
L 3597 1613 
L 953 1613 
Q 991 1019 1311 708 
Q 1631 397 2203 397 
Q 2534 397 2845 478 
Q 3156 559 3463 722 
L 3463 178 
Q 3153 47 2828 -22 
Q 2503 -91 2169 -91 
Q 1331 -91 842 396 
Q 353 884 353 1716 
Q 353 2575 817 3079 
Q 1281 3584 2069 3584 
Q 2775 3584 3186 3129 
Q 3597 2675 3597 1894 
z
M 3022 2063 
Q 3016 2534 2758 2815 
Q 2500 3097 2075 3097 
Q 1594 3097 1305 2825 
Q 1016 2553 972 2059 
L 3022 2063 
z
" transform="scale(0.015625)"/>
        <path id="DejaVuSans-6d" d="M 3328 2828 
Q 3544 3216 3844 3400 
Q 4144 3584 4550 3584 
Q 5097 3584 5394 3201 
Q 5691 2819 5691 2113 
L 5691 0 
L 5113 0 
L 5113 2094 
Q 5113 2597 4934 2840 
Q 4756 3084 4391 3084 
Q 3944 3084 3684 2787 
Q 3425 2491 3425 1978 
L 3425 0 
L 2847 0 
L 2847 2094 
Q 2847 2600 2669 2842 
Q 2491 3084 2119 3084 
Q 1678 3084 1418 2786 
Q 1159 2488 1159 1978 
L 1159 0 
L 581 0 
L 581 3500 
L 1159 3500 
L 1159 2956 
Q 1356 3278 1631 3431 
Q 1906 3584 2284 3584 
Q 2666 3584 2933 3390 
Q 3200 3197 3328 2828 
z
" transform="scale(0.015625)"/>
        <path id="DejaVuSans-75" d="M 544 1381 
L 544 3500 
L 1119 3500 
L 1119 1403 
Q 1119 906 1312 657 
Q 1506 409 1894 409 
Q 2359 409 2629 706 
Q 2900 1003 2900 1516 
L 2900 3500 
L 3475 3500 
L 3475 0 
L 2900 0 
L 2900 538 
Q 2691 219 2414 64 
Q 2138 -91 1772 -91 
Q 1169 -91 856 284 
Q 544 659 544 1381 
z
M 1991 3584 
L 1991 3584 
z
" transform="scale(0.015625)"/>
        <path id="DejaVuSans-6c" d="M 603 4863 
L 1178 4863 
L 1178 0 
L 603 0 
L 603 4863 
z
" transform="scale(0.015625)"/>
       </defs>
       <use xlink:href="#DejaVuSans-62"/>
       <use xlink:href="#DejaVuSans-61" transform="translate(63.476562 0)"/>
       <use xlink:href="#DejaVuSans-73" transform="translate(124.755859 0)"/>
       <use xlink:href="#DejaVuSans-65" transform="translate(176.855469 0)"/>
       <use xlink:href="#DejaVuSans-6d" transform="translate(238.378906 0)"/>
       <use xlink:href="#DejaVuSans-75" transform="translate(335.791016 0)"/>
       <use xlink:href="#DejaVuSans-6c" transform="translate(399.169922 0)"/>
      </g>
     </g>
    </g>
    <g id="xtick_3">
     <g id="line2d_3">
      <g>
       <use xlink:href="#m05b77d1b6f" x="130.809722" y="228.385242" style="stroke: #000000; stroke-width: 0.8"/>
      </g>
     </g>
     <g id="text_3">
      <!-- frommsg -->
      <g transform="translate(97.82761 272.269699) rotate(-45) scale(0.1 -0.1)">
       <defs>
        <path id="DejaVuSans-66" d="M 2375 4863 
L 2375 4384 
L 1825 4384 
Q 1516 4384 1395 4259 
Q 1275 4134 1275 3809 
L 1275 3500 
L 2222 3500 
L 2222 3053 
L 1275 3053 
L 1275 0 
L 697 0 
L 697 3053 
L 147 3053 
L 147 3500 
L 697 3500 
L 697 3744 
Q 697 4328 969 4595 
Q 1241 4863 1831 4863 
L 2375 4863 
z
" transform="scale(0.015625)"/>
        <path id="DejaVuSans-72" d="M 2631 2963 
Q 2534 3019 2420 3045 
Q 2306 3072 2169 3072 
Q 1681 3072 1420 2755 
Q 1159 2438 1159 1844 
L 1159 0 
L 581 0 
L 581 3500 
L 1159 3500 
L 1159 2956 
Q 1341 3275 1631 3429 
Q 1922 3584 2338 3584 
Q 2397 3584 2469 3576 
Q 2541 3569 2628 3553 
L 2631 2963 
z
" transform="scale(0.015625)"/>
        <path id="DejaVuSans-6f" d="M 1959 3097 
Q 1497 3097 1228 2736 
Q 959 2375 959 1747 
Q 959 1119 1226 758 
Q 1494 397 1959 397 
Q 2419 397 2687 759 
Q 2956 1122 2956 1747 
Q 2956 2369 2687 2733 
Q 2419 3097 1959 3097 
z
M 1959 3584 
Q 2709 3584 3137 3096 
Q 3566 2609 3566 1747 
Q 3566 888 3137 398 
Q 2709 -91 1959 -91 
Q 1206 -91 779 398 
Q 353 888 353 1747 
Q 353 2609 779 3096 
Q 1206 3584 1959 3584 
z
" transform="scale(0.015625)"/>
        <path id="DejaVuSans-67" d="M 2906 1791 
Q 2906 2416 2648 2759 
Q 2391 3103 1925 3103 
Q 1463 3103 1205 2759 
Q 947 2416 947 1791 
Q 947 1169 1205 825 
Q 1463 481 1925 481 
Q 2391 481 2648 825 
Q 2906 1169 2906 1791 
z
M 3481 434 
Q 3481 -459 3084 -895 
Q 2688 -1331 1869 -1331 
Q 1566 -1331 1297 -1286 
Q 1028 -1241 775 -1147 
L 775 -588 
Q 1028 -725 1275 -790 
Q 1522 -856 1778 -856 
Q 2344 -856 2625 -561 
Q 2906 -266 2906 331 
L 2906 616 
Q 2728 306 2450 153 
Q 2172 0 1784 0 
Q 1141 0 747 490 
Q 353 981 353 1791 
Q 353 2603 747 3093 
Q 1141 3584 1784 3584 
Q 2172 3584 2450 3431 
Q 2728 3278 2906 2969 
L 2906 3500 
L 3481 3500 
L 3481 434 
z
" transform="scale(0.015625)"/>
       </defs>
       <use xlink:href="#DejaVuSans-66"/>
       <use xlink:href="#DejaVuSans-72" transform="translate(35.205078 0)"/>
       <use xlink:href="#DejaVuSans-6f" transform="translate(74.068359 0)"/>
       <use xlink:href="#DejaVuSans-6d" transform="translate(135.25 0)"/>
       <use xlink:href="#DejaVuSans-6d" transform="translate(232.662109 0)"/>
       <use xlink:href="#DejaVuSans-73" transform="translate(330.074219 0)"/>
       <use xlink:href="#DejaVuSans-67" transform="translate(382.173828 0)"/>
      </g>
     </g>
    </g>
    <g id="xtick_4">
     <g id="line2d_4">
      <g>
       <use xlink:href="#m05b77d1b6f" x="156.235401" y="228.385242" style="stroke: #000000; stroke-width: 0.8"/>
      </g>
     </g>
     <g id="text_4">
      <!-- NTT -->
      <g transform="translate(140.96079 254.562199) rotate(-45) scale(0.1 -0.1)">
       <use xlink:href="#DejaVuSans-4e"/>
       <use xlink:href="#DejaVuSans-54" transform="translate(74.804688 0)"/>
       <use xlink:href="#DejaVuSans-54" transform="translate(134.138672 0)"/>
      </g>
     </g>
    </g>
    <g id="xtick_5">
     <g id="line2d_5">
      <g>
       <use xlink:href="#m05b77d1b6f" x="181.66108" y="228.385242" style="stroke: #000000; stroke-width: 0.8"/>
      </g>
     </g>
     <g id="text_5">
      <!-- iDec -->
      <g transform="translate(164.542467 256.406201) rotate(-45) scale(0.1 -0.1)">
       <defs>
        <path id="DejaVuSans-69" d="M 603 3500 
L 1178 3500 
L 1178 0 
L 603 0 
L 603 3500 
z
M 603 4863 
L 1178 4863 
L 1178 4134 
L 603 4134 
L 603 4863 
z
" transform="scale(0.015625)"/>
        <path id="DejaVuSans-44" d="M 1259 4147 
L 1259 519 
L 2022 519 
Q 2988 519 3436 956 
Q 3884 1394 3884 2338 
Q 3884 3275 3436 3711 
Q 2988 4147 2022 4147 
L 1259 4147 
z
M 628 4666 
L 1925 4666 
Q 3281 4666 3915 4102 
Q 4550 3538 4550 2338 
Q 4550 1131 3912 565 
Q 3275 0 1925 0 
L 628 0 
L 628 4666 
z
" transform="scale(0.015625)"/>
        <path id="DejaVuSans-63" d="M 3122 3366 
L 3122 2828 
Q 2878 2963 2633 3030 
Q 2388 3097 2138 3097 
Q 1578 3097 1268 2742 
Q 959 2388 959 1747 
Q 959 1106 1268 751 
Q 1578 397 2138 397 
Q 2388 397 2633 464 
Q 2878 531 3122 666 
L 3122 134 
Q 2881 22 2623 -34 
Q 2366 -91 2075 -91 
Q 1284 -91 818 406 
Q 353 903 353 1747 
Q 353 2603 823 3093 
Q 1294 3584 2113 3584 
Q 2378 3584 2631 3529 
Q 2884 3475 3122 3366 
z
" transform="scale(0.015625)"/>
       </defs>
       <use xlink:href="#DejaVuSans-69"/>
       <use xlink:href="#DejaVuSans-44" transform="translate(27.783203 0)"/>
       <use xlink:href="#DejaVuSans-65" transform="translate(104.785156 0)"/>
       <use xlink:href="#DejaVuSans-63" transform="translate(166.308594 0)"/>
      </g>
     </g>
    </g>
    <g id="xtick_6">
     <g id="line2d_6">
      <g>
       <use xlink:href="#m05b77d1b6f" x="207.086759" y="228.385242" style="stroke: #000000; stroke-width: 0.8"/>
      </g>
     </g>
     <g id="text_6">
      <!-- iEnc -->
      <g transform="translate(190.814465 255.559882) rotate(-45) scale(0.1 -0.1)">
       <defs>
        <path id="DejaVuSans-45" d="M 628 4666 
L 3578 4666 
L 3578 4134 
L 1259 4134 
L 1259 2753 
L 3481 2753 
L 3481 2222 
L 1259 2222 
L 1259 531 
L 3634 531 
L 3634 0 
L 628 0 
L 628 4666 
z
" transform="scale(0.015625)"/>
        <path id="DejaVuSans-6e" d="M 3513 2113 
L 3513 0 
L 2938 0 
L 2938 2094 
Q 2938 2591 2744 2837 
Q 2550 3084 2163 3084 
Q 1697 3084 1428 2787 
Q 1159 2491 1159 1978 
L 1159 0 
L 581 0 
L 581 3500 
L 1159 3500 
L 1159 2956 
Q 1366 3272 1645 3428 
Q 1925 3584 2291 3584 
Q 2894 3584 3203 3211 
Q 3513 2838 3513 2113 
z
" transform="scale(0.015625)"/>
       </defs>
       <use xlink:href="#DejaVuSans-69"/>
       <use xlink:href="#DejaVuSans-45" transform="translate(27.783203 0)"/>
       <use xlink:href="#DejaVuSans-6e" transform="translate(90.966797 0)"/>
       <use xlink:href="#DejaVuSans-63" transform="translate(154.345703 0)"/>
      </g>
     </g>
    </g>
    <g id="xtick_7">
     <g id="line2d_7">
      <g>
       <use xlink:href="#m05b77d1b6f" x="232.512438" y="228.385242" style="stroke: #000000; stroke-width: 0.8"/>
      </g>
     </g>
     <g id="text_7">
      <!-- iKeypair -->
      <g transform="translate(202.564257 269.235769) rotate(-45) scale(0.1 -0.1)">
       <defs>
        <path id="DejaVuSans-4b" d="M 628 4666 
L 1259 4666 
L 1259 2694 
L 3353 4666 
L 4166 4666 
L 1850 2491 
L 4331 0 
L 3500 0 
L 1259 2247 
L 1259 0 
L 628 0 
L 628 4666 
z
" transform="scale(0.015625)"/>
        <path id="DejaVuSans-79" d="M 2059 -325 
Q 1816 -950 1584 -1140 
Q 1353 -1331 966 -1331 
L 506 -1331 
L 506 -850 
L 844 -850 
Q 1081 -850 1212 -737 
Q 1344 -625 1503 -206 
L 1606 56 
L 191 3500 
L 800 3500 
L 1894 763 
L 2988 3500 
L 3597 3500 
L 2059 -325 
z
" transform="scale(0.015625)"/>
        <path id="DejaVuSans-70" d="M 1159 525 
L 1159 -1331 
L 581 -1331 
L 581 3500 
L 1159 3500 
L 1159 2969 
Q 1341 3281 1617 3432 
Q 1894 3584 2278 3584 
Q 2916 3584 3314 3078 
Q 3713 2572 3713 1747 
Q 3713 922 3314 415 
Q 2916 -91 2278 -91 
Q 1894 -91 1617 61 
Q 1341 213 1159 525 
z
M 3116 1747 
Q 3116 2381 2855 2742 
Q 2594 3103 2138 3103 
Q 1681 3103 1420 2742 
Q 1159 2381 1159 1747 
Q 1159 1113 1420 752 
Q 1681 391 2138 391 
Q 2594 391 2855 752 
Q 3116 1113 3116 1747 
z
" transform="scale(0.015625)"/>
       </defs>
       <use xlink:href="#DejaVuSans-69"/>
       <use xlink:href="#DejaVuSans-4b" transform="translate(27.783203 0)"/>
       <use xlink:href="#DejaVuSans-65" transform="translate(88.359375 0)"/>
       <use xlink:href="#DejaVuSans-79" transform="translate(149.882812 0)"/>
       <use xlink:href="#DejaVuSans-70" transform="translate(209.0625 0)"/>
       <use xlink:href="#DejaVuSans-61" transform="translate(272.539062 0)"/>
       <use xlink:href="#DejaVuSans-69" transform="translate(333.818359 0)"/>
       <use xlink:href="#DejaVuSans-72" transform="translate(361.601562 0)"/>
      </g>
     </g>
    </g>
    <g id="xtick_8">
     <g id="line2d_8">
      <g>
       <use xlink:href="#m05b77d1b6f" x="257.938117" y="228.385242" style="stroke: #000000; stroke-width: 0.8"/>
      </g>
     </g>
     <g id="text_8">
      <!-- gen_a -->
      <g transform="translate(235.080891 261.751486) rotate(-45) scale(0.1 -0.1)">
       <defs>
        <path id="DejaVuSans-5f" d="M 3263 -1063 
L 3263 -1509 
L -63 -1509 
L -63 -1063 
L 3263 -1063 
z
" transform="scale(0.015625)"/>
       </defs>
       <use xlink:href="#DejaVuSans-67"/>
       <use xlink:href="#DejaVuSans-65" transform="translate(63.476562 0)"/>
       <use xlink:href="#DejaVuSans-6e" transform="translate(125 0)"/>
       <use xlink:href="#DejaVuSans-5f" transform="translate(188.378906 0)"/>
       <use xlink:href="#DejaVuSans-61" transform="translate(238.378906 0)"/>
      </g>
     </g>
    </g>
    <g id="xtick_9">
     <g id="line2d_9">
      <g>
       <use xlink:href="#m05b77d1b6f" x="283.363796" y="228.385242" style="stroke: #000000; stroke-width: 0.8"/>
      </g>
     </g>
     <g id="text_9">
      <!-- noise -->
      <g transform="translate(263.086405 259.564979) rotate(-45) scale(0.1 -0.1)">
       <use xlink:href="#DejaVuSans-6e"/>
       <use xlink:href="#DejaVuSans-6f" transform="translate(63.378906 0)"/>
       <use xlink:href="#DejaVuSans-69" transform="translate(124.560547 0)"/>
       <use xlink:href="#DejaVuSans-73" transform="translate(152.34375 0)"/>
       <use xlink:href="#DejaVuSans-65" transform="translate(204.443359 0)"/>
      </g>
     </g>
    </g>
   </g>
   <g id="matplotlib.axis_2">
    <g id="ytick_1">
     <g id="line2d_10">
      <defs>
       <path id="mcfee22dec2" d="M 0 0 
L -3.5 0 
" style="stroke: #000000; stroke-width: 0.8"/>
      </defs>
      <g>
       <use xlink:href="#mcfee22dec2" x="59.3" y="228.385242" style="stroke: #000000; stroke-width: 0.8"/>
      </g>
     </g>
     <g id="text_10">
      <!-- $1\times$ -->
      <g transform="translate(33.6 232.184461) scale(0.1 -0.1)">
       <defs>
        <path id="DejaVuSans-31" d="M 794 531 
L 1825 531 
L 1825 4091 
L 703 3866 
L 703 4441 
L 1819 4666 
L 2450 4666 
L 2450 531 
L 3481 531 
L 3481 0 
L 794 0 
L 794 531 
z
" transform="scale(0.015625)"/>
        <path id="DejaVuSans-d7" d="M 4488 3438 
L 3059 2003 
L 4488 575 
L 4116 197 
L 2681 1631 
L 1247 197 
L 878 575 
L 2303 2003 
L 878 3438 
L 1247 3816 
L 2681 2381 
L 4116 3816 
L 4488 3438 
z
" transform="scale(0.015625)"/>
       </defs>
       <use xlink:href="#DejaVuSans-31" transform="translate(0 0.09375)"/>
       <use xlink:href="#DejaVuSans-d7" transform="translate(83.105469 0.09375)"/>
      </g>
     </g>
    </g>
    <g id="ytick_2">
     <g id="line2d_11">
      <g>
       <use xlink:href="#mcfee22dec2" x="59.3" y="153.517008" style="stroke: #000000; stroke-width: 0.8"/>
      </g>
     </g>
     <g id="text_11">
      <!-- $10\times$ -->
      <g transform="translate(27.3 157.316227) scale(0.1 -0.1)">
       <defs>
        <path id="DejaVuSans-30" d="M 2034 4250 
Q 1547 4250 1301 3770 
Q 1056 3291 1056 2328 
Q 1056 1369 1301 889 
Q 1547 409 2034 409 
Q 2525 409 2770 889 
Q 3016 1369 3016 2328 
Q 3016 3291 2770 3770 
Q 2525 4250 2034 4250 
z
M 2034 4750 
Q 2819 4750 3233 4129 
Q 3647 3509 3647 2328 
Q 3647 1150 3233 529 
Q 2819 -91 2034 -91 
Q 1250 -91 836 529 
Q 422 1150 422 2328 
Q 422 3509 836 4129 
Q 1250 4750 2034 4750 
z
" transform="scale(0.015625)"/>
       </defs>
       <use xlink:href="#DejaVuSans-31" transform="translate(0 0.78125)"/>
       <use xlink:href="#DejaVuSans-30" transform="translate(63.623047 0.78125)"/>
       <use xlink:href="#DejaVuSans-d7" transform="translate(146.728516 0.78125)"/>
      </g>
     </g>
    </g>
    <g id="ytick_3">
     <g id="line2d_12">
      <g>
       <use xlink:href="#mcfee22dec2" x="59.3" y="78.648775" style="stroke: #000000; stroke-width: 0.8"/>
      </g>
     </g>
     <g id="text_12">
      <!-- $100\times$ -->
      <g transform="translate(20.9 82.447993) scale(0.1 -0.1)">
       <use xlink:href="#DejaVuSans-31" transform="translate(0 0.78125)"/>
       <use xlink:href="#DejaVuSans-30" transform="translate(63.623047 0.78125)"/>
       <use xlink:href="#DejaVuSans-30" transform="translate(127.246094 0.78125)"/>
       <use xlink:href="#DejaVuSans-d7" transform="translate(210.351562 0.78125)"/>
      </g>
     </g>
    </g>
    <g id="ytick_4">
     <g id="line2d_13">
      <defs>
       <path id="m6583d819d2" d="M 0 0 
L -2 0 
" style="stroke: #000000; stroke-width: 0.6"/>
      </defs>
      <g>
       <use xlink:href="#m6583d819d2" x="59.3" y="205.847658" style="stroke: #000000; stroke-width: 0.6"/>
      </g>
     </g>
    </g>
    <g id="ytick_5">
     <g id="line2d_14">
      <g>
       <use xlink:href="#m6583d819d2" x="59.3" y="192.664016" style="stroke: #000000; stroke-width: 0.6"/>
      </g>
     </g>
    </g>
    <g id="ytick_6">
     <g id="line2d_15">
      <g>
       <use xlink:href="#m6583d819d2" x="59.3" y="183.310074" style="stroke: #000000; stroke-width: 0.6"/>
      </g>
     </g>
    </g>
    <g id="ytick_7">
     <g id="line2d_16">
      <g>
       <use xlink:href="#m6583d819d2" x="59.3" y="176.054592" style="stroke: #000000; stroke-width: 0.6"/>
      </g>
     </g>
    </g>
    <g id="ytick_8">
     <g id="line2d_17">
      <g>
       <use xlink:href="#m6583d819d2" x="59.3" y="170.126432" style="stroke: #000000; stroke-width: 0.6"/>
      </g>
     </g>
    </g>
    <g id="ytick_9">
     <g id="line2d_18">
      <g>
       <use xlink:href="#m6583d819d2" x="59.3" y="165.114244" style="stroke: #000000; stroke-width: 0.6"/>
      </g>
     </g>
    </g>
    <g id="ytick_10">
     <g id="line2d_19">
      <g>
       <use xlink:href="#m6583d819d2" x="59.3" y="160.77249" style="stroke: #000000; stroke-width: 0.6"/>
      </g>
     </g>
    </g>
    <g id="ytick_11">
     <g id="line2d_20">
      <g>
       <use xlink:href="#m6583d819d2" x="59.3" y="156.942791" style="stroke: #000000; stroke-width: 0.6"/>
      </g>
     </g>
    </g>
    <g id="ytick_12">
     <g id="line2d_21">
      <g>
       <use xlink:href="#m6583d819d2" x="59.3" y="130.979424" style="stroke: #000000; stroke-width: 0.6"/>
      </g>
     </g>
    </g>
    <g id="ytick_13">
     <g id="line2d_22">
      <g>
       <use xlink:href="#m6583d819d2" x="59.3" y="117.795783" style="stroke: #000000; stroke-width: 0.6"/>
      </g>
     </g>
    </g>
    <g id="ytick_14">
     <g id="line2d_23">
      <g>
       <use xlink:href="#m6583d819d2" x="59.3" y="108.44184" style="stroke: #000000; stroke-width: 0.6"/>
      </g>
     </g>
    </g>
    <g id="ytick_15">
     <g id="line2d_24">
      <g>
       <use xlink:href="#m6583d819d2" x="59.3" y="101.186359" style="stroke: #000000; stroke-width: 0.6"/>
      </g>
     </g>
    </g>
    <g id="ytick_16">
     <g id="line2d_25">
      <g>
       <use xlink:href="#m6583d819d2" x="59.3" y="95.258199" style="stroke: #000000; stroke-width: 0.6"/>
      </g>
     </g>
    </g>
    <g id="ytick_17">
     <g id="line2d_26">
      <g>
       <use xlink:href="#m6583d819d2" x="59.3" y="90.246011" style="stroke: #000000; stroke-width: 0.6"/>
      </g>
     </g>
    </g>
    <g id="ytick_18">
     <g id="line2d_27">
      <g>
       <use xlink:href="#m6583d819d2" x="59.3" y="85.904256" style="stroke: #000000; stroke-width: 0.6"/>
      </g>
     </g>
    </g>
    <g id="ytick_19">
     <g id="line2d_28">
      <g>
       <use xlink:href="#m6583d819d2" x="59.3" y="82.074557" style="stroke: #000000; stroke-width: 0.6"/>
      </g>
     </g>
    </g>
    <g id="ytick_20">
     <g id="line2d_29">
      <g>
       <use xlink:href="#m6583d819d2" x="59.3" y="56.111191" style="stroke: #000000; stroke-width: 0.6"/>
      </g>
     </g>
    </g>
    <g id="ytick_21">
     <g id="line2d_30">
      <g>
       <use xlink:href="#m6583d819d2" x="59.3" y="42.927549" style="stroke: #000000; stroke-width: 0.6"/>
      </g>
     </g>
    </g>
    <g id="ytick_22">
     <g id="line2d_31">
      <g>
       <use xlink:href="#m6583d819d2" x="59.3" y="33.573606" style="stroke: #000000; stroke-width: 0.6"/>
      </g>
     </g>
    </g>
    <g id="ytick_23">
     <g id="line2d_32">
      <g>
       <use xlink:href="#m6583d819d2" x="59.3" y="26.318125" style="stroke: #000000; stroke-width: 0.6"/>
      </g>
     </g>
    </g>
    <g id="text_13">
     <!-- Speedup over -O0 ($	imes$) -->
     <g transform="translate(14.8 190.051683) rotate(-90) scale(0.1 -0.1)">
      <defs>
       <path id="DejaVuSans-53" d="M 3425 4513 
L 3425 3897 
Q 3066 4069 2747 4153 
Q 2428 4238 2131 4238 
Q 1616 4238 1336 4038 
Q 1056 3838 1056 3469 
Q 1056 3159 1242 3001 
Q 1428 2844 1947 2747 
L 2328 2669 
Q 3034 2534 3370 2195 
Q 3706 1856 3706 1288 
Q 3706 609 3251 259 
Q 2797 -91 1919 -91 
Q 1588 -91 1214 -16 
Q 841 59 441 206 
L 441 856 
Q 825 641 1194 531 
Q 1563 422 1919 422 
Q 2459 422 2753 634 
Q 3047 847 3047 1241 
Q 3047 1584 2836 1778 
Q 2625 1972 2144 2069 
L 1759 2144 
Q 1053 2284 737 2584 
Q 422 2884 422 3419 
Q 422 4038 858 4394 
Q 1294 4750 2059 4750 
Q 2388 4750 2728 4690 
Q 3069 4631 3425 4513 
z
" transform="scale(0.015625)"/>
       <path id="DejaVuSans-64" d="M 2906 2969 
L 2906 4863 
L 3481 4863 
L 3481 0 
L 2906 0 
L 2906 525 
Q 2725 213 2448 61 
Q 2172 -91 1784 -91 
Q 1150 -91 751 415 
Q 353 922 353 1747 
Q 353 2572 751 3078 
Q 1150 3584 1784 3584 
Q 2172 3584 2448 3432 
Q 2725 3281 2906 2969 
z
M 947 1747 
Q 947 1113 1208 752 
Q 1469 391 1925 391 
Q 2381 391 2643 752 
Q 2906 1113 2906 1747 
Q 2906 2381 2643 2742 
Q 2381 3103 1925 3103 
Q 1469 3103 1208 2742 
Q 947 2381 947 1747 
z
" transform="scale(0.015625)"/>
       <path id="DejaVuSans-20" transform="scale(0.015625)"/>
       <path id="DejaVuSans-76" d="M 191 3500 
L 800 3500 
L 1894 563 
L 2988 3500 
L 3597 3500 
L 2284 0 
L 1503 0 
L 191 3500 
z
" transform="scale(0.015625)"/>
       <path id="DejaVuSans-2d" d="M 313 2009 
L 1997 2009 
L 1997 1497 
L 313 1497 
L 313 2009 
z
" transform="scale(0.015625)"/>
       <path id="DejaVuSans-4f" d="M 2522 4238 
Q 1834 4238 1429 3725 
Q 1025 3213 1025 2328 
Q 1025 1447 1429 934 
Q 1834 422 2522 422 
Q 3209 422 3611 934 
Q 4013 1447 4013 2328 
Q 4013 3213 3611 3725 
Q 3209 4238 2522 4238 
z
M 2522 4750 
Q 3503 4750 4090 4092 
Q 4678 3434 4678 2328 
Q 4678 1225 4090 567 
Q 3503 -91 2522 -91 
Q 1538 -91 948 565 
Q 359 1222 359 2328 
Q 359 3434 948 4092 
Q 1538 4750 2522 4750 
z
" transform="scale(0.015625)"/>
       <path id="DejaVuSans-28" d="M 1984 4856 
Q 1566 4138 1362 3434 
Q 1159 2731 1159 2009 
Q 1159 1288 1364 580 
Q 1569 -128 1984 -844 
L 1484 -844 
Q 1016 -109 783 600 
Q 550 1309 550 2009 
Q 550 2706 781 3412 
Q 1013 4119 1484 4856 
L 1984 4856 
z
" transform="scale(0.015625)"/>
       <path id="DejaVuSans-Oblique-69" d="M 1172 4863 
L 1747 4863 
L 1606 4134 
L 1031 4134 
L 1172 4863 
z
M 909 3500 
L 1484 3500 
L 800 0 
L 225 0 
L 909 3500 
z
" transform="scale(0.015625)"/>
       <path id="DejaVuSans-Oblique-6d" d="M 5747 2113 
L 5338 0 
L 4763 0 
L 5166 2094 
Q 5191 2228 5203 2325 
Q 5216 2422 5216 2491 
Q 5216 2772 5059 2928 
Q 4903 3084 4622 3084 
Q 4203 3084 3875 2770 
Q 3547 2456 3450 1953 
L 3066 0 
L 2491 0 
L 2900 2094 
Q 2925 2209 2937 2307 
Q 2950 2406 2950 2484 
Q 2950 2769 2794 2926 
Q 2638 3084 2363 3084 
Q 1938 3084 1609 2770 
Q 1281 2456 1184 1953 
L 800 0 
L 225 0 
L 909 3500 
L 1484 3500 
L 1375 2956 
Q 1609 3263 1923 3423 
Q 2238 3584 2597 3584 
Q 2978 3584 3223 3384 
Q 3469 3184 3519 2828 
Q 3781 3197 4126 3390 
Q 4472 3584 4856 3584 
Q 5306 3584 5551 3325 
Q 5797 3066 5797 2591 
Q 5797 2488 5784 2364 
Q 5772 2241 5747 2113 
z
" transform="scale(0.015625)"/>
       <path id="DejaVuSans-Oblique-65" d="M 3078 2063 
Q 3088 2113 3092 2166 
Q 3097 2219 3097 2272 
Q 3097 2653 2873 2875 
Q 2650 3097 2266 3097 
Q 1838 3097 1509 2826 
Q 1181 2556 1013 2059 
L 3078 2063 
z
M 3578 1613 
L 903 1613 
Q 884 1494 878 1425 
Q 872 1356 872 1306 
Q 872 872 1139 634 
Q 1406 397 1894 397 
Q 2269 397 2603 481 
Q 2938 566 3225 728 
L 3116 159 
Q 2806 34 2476 -28 
Q 2147 -91 1806 -91 
Q 1078 -91 686 257 
Q 294 606 294 1247 
Q 294 1794 489 2264 
Q 684 2734 1063 3103 
Q 1306 3334 1642 3459 
Q 1978 3584 2356 3584 
Q 2950 3584 3301 3228 
Q 3653 2872 3653 2272 
Q 3653 2128 3634 1964 
Q 3616 1800 3578 1613 
z
" transform="scale(0.015625)"/>
       <path id="DejaVuSans-Oblique-73" d="M 3200 3397 
L 3091 2853 
Q 2863 2978 2609 3040 
Q 2356 3103 2088 3103 
Q 1634 3103 1373 2948 
Q 1113 2794 1113 2528 
Q 1113 2219 1719 2053 
Q 1766 2041 1788 2034 
L 1972 1978 
Q 2547 1819 2739 1644 
Q 2931 1469 2931 1166 
Q 2931 609 2489 259 
Q 2047 -91 1331 -91 
Q 1053 -91 747 -37 
Q 441 16 72 128 
L 184 722 
Q 500 559 806 475 
Q 1113 391 1394 391 
Q 1816 391 2080 572 
Q 2344 753 2344 1031 
Q 2344 1331 1650 1516 
L 1591 1531 
L 1394 1581 
Q 956 1697 753 1886 
Q 550 2075 550 2369 
Q 550 2928 970 3256 
Q 1391 3584 2113 3584 
Q 2397 3584 2667 3537 
Q 2938 3491 3200 3397 
z
" transform="scale(0.015625)"/>
       <path id="DejaVuSans-29" d="M 513 4856 
L 1013 4856 
Q 1481 4119 1714 3412 
Q 1947 2706 1947 2009 
Q 1947 1309 1714 600 
Q 1481 -109 1013 -844 
L 513 -844 
Q 928 -128 1133 580 
Q 1338 1288 1338 2009 
Q 1338 2731 1133 3434 
Q 928 4138 513 4856 
z
" transform="scale(0.015625)"/>
      </defs>
      <use xlink:href="#DejaVuSans-53" transform="translate(0 0.015625)"/>
      <use xlink:href="#DejaVuSans-70" transform="translate(63.476562 0.015625)"/>
      <use xlink:href="#DejaVuSans-65" transform="translate(126.953125 0.015625)"/>
      <use xlink:href="#DejaVuSans-65" transform="translate(188.476562 0.015625)"/>
      <use xlink:href="#DejaVuSans-64" transform="translate(250 0.015625)"/>
      <use xlink:href="#DejaVuSans-75" transform="translate(313.476562 0.015625)"/>
      <use xlink:href="#DejaVuSans-70" transform="translate(376.855469 0.015625)"/>
      <use xlink:href="#DejaVuSans-20" transform="translate(440.332031 0.015625)"/>
      <use xlink:href="#DejaVuSans-6f" transform="translate(472.119141 0.015625)"/>
      <use xlink:href="#DejaVuSans-76" transform="translate(533.300781 0.015625)"/>
      <use xlink:href="#DejaVuSans-65" transform="translate(592.480469 0.015625)"/>
      <use xlink:href="#DejaVuSans-72" transform="translate(654.003906 0.015625)"/>
      <use xlink:href="#DejaVuSans-20" transform="translate(695.117188 0.015625)"/>
      <use xlink:href="#DejaVuSans-2d" transform="translate(726.904297 0.015625)"/>
      <use xlink:href="#DejaVuSans-4f" transform="translate(762.988281 0.015625)"/>
      <use xlink:href="#DejaVuSans-30" transform="translate(841.699219 0.015625)"/>
      <use xlink:href="#DejaVuSans-20" transform="translate(905.322266 0.015625)"/>
      <use xlink:href="#DejaVuSans-28" transform="translate(937.109375 0.015625)"/>
      <use xlink:href="#DejaVuSans-Oblique-69" transform="translate(976.123047 0.015625)"/>
      <use xlink:href="#DejaVuSans-Oblique-6d" transform="translate(1003.90625 0.015625)"/>
      <use xlink:href="#DejaVuSans-Oblique-65" transform="translate(1101.318359 0.015625)"/>
      <use xlink:href="#DejaVuSans-Oblique-73" transform="translate(1162.841797 0.015625)"/>
      <use xlink:href="#DejaVuSans-29" transform="translate(1214.941406 0.015625)"/>
     </g>
    </g>
   </g>
   <g id="LineCollection_1">
    <path d="M 73.601944 182.646067 
L 73.601944 182.644391 
" clip-path="url(#p7ad6d2ef96)" style="fill: none; stroke: #000000; stroke-width: 1.5"/>
    <path d="M 99.027623 189.807749 
L 99.027623 189.767049 
" clip-path="url(#p7ad6d2ef96)" style="fill: none; stroke: #000000; stroke-width: 1.5"/>
    <path d="M 124.453303 192.545503 
L 124.453303 192.545503 
" clip-path="url(#p7ad6d2ef96)" style="fill: none; stroke: #000000; stroke-width: 1.5"/>
    <path d="M 149.878982 185.981316 
L 149.878982 185.952756 
" clip-path="url(#p7ad6d2ef96)" style="fill: none; stroke: #000000; stroke-width: 1.5"/>
    <path d="M 175.304661 185.478281 
L 175.304661 185.46908 
" clip-path="url(#p7ad6d2ef96)" style="fill: none; stroke: #000000; stroke-width: 1.5"/>
    <path d="M 200.73034 188.185741 
L 200.73034 188.180518 
" clip-path="url(#p7ad6d2ef96)" style="fill: none; stroke: #000000; stroke-width: 1.5"/>
    <path d="M 226.156019 190.820476 
L 226.156019 190.817235 
" clip-path="url(#p7ad6d2ef96)" style="fill: none; stroke: #000000; stroke-width: 1.5"/>
    <path d="M 251.581698 195.894973 
L 251.581698 195.882525 
" clip-path="url(#p7ad6d2ef96)" style="fill: none; stroke: #000000; stroke-width: 1.5"/>
    <path d="M 277.007377 191.234295 
L 277.007377 191.21571 
" clip-path="url(#p7ad6d2ef96)" style="fill: none; stroke: #000000; stroke-width: 1.5"/>
   </g>
   <g id="LineCollection_2">
    <path d="M 79.958364 185.438702 
L 79.958364 185.437025 
" clip-path="url(#p7ad6d2ef96)" style="fill: none; stroke: #000000; stroke-width: 1.5"/>
    <path d="M 105.384043 188.597831 
L 105.384043 188.597831 
" clip-path="url(#p7ad6d2ef96)" style="fill: none; stroke: #000000; stroke-width: 1.5"/>
    <path d="M 130.809722 192.545503 
L 130.809722 192.545503 
" clip-path="url(#p7ad6d2ef96)" style="fill: none; stroke: #000000; stroke-width: 1.5"/>
    <path d="M 156.235401 185.579183 
L 156.235401 185.569548 
" clip-path="url(#p7ad6d2ef96)" style="fill: none; stroke: #000000; stroke-width: 1.5"/>
    <path d="M 181.66108 185.013644 
L 181.66108 185.008928 
" clip-path="url(#p7ad6d2ef96)" style="fill: none; stroke: #000000; stroke-width: 1.5"/>
    <path d="M 207.086759 187.37692 
L 207.086759 187.370305 
" clip-path="url(#p7ad6d2ef96)" style="fill: none; stroke: #000000; stroke-width: 1.5"/>
    <path d="M 232.512438 189.069092 
L 232.512438 189.062913 
" clip-path="url(#p7ad6d2ef96)" style="fill: none; stroke: #000000; stroke-width: 1.5"/>
    <path d="M 257.938117 195.576714 
L 257.938117 195.56772 
" clip-path="url(#p7ad6d2ef96)" style="fill: none; stroke: #000000; stroke-width: 1.5"/>
    <path d="M 283.363796 188.279899 
L 283.363796 188.273973 
" clip-path="url(#p7ad6d2ef96)" style="fill: none; stroke: #000000; stroke-width: 1.5"/>
   </g>
   <g id="LineCollection_3">
    <path d="M 86.314784 54.403837 
L 86.314784 54.40216 
" clip-path="url(#p7ad6d2ef96)" style="fill: none; stroke: #000000; stroke-width: 1.5"/>
    <path d="M 111.740463 60.098352 
L 111.740463 59.655966 
" clip-path="url(#p7ad6d2ef96)" style="fill: none; stroke: #000000; stroke-width: 1.5"/>
    <path d="M 137.166142 68.311191 
L 137.166142 68.311191 
" clip-path="url(#p7ad6d2ef96)" style="fill: none; stroke: #000000; stroke-width: 1.5"/>
    <path d="M 162.591821 69.492231 
L 162.591821 67.370944 
" clip-path="url(#p7ad6d2ef96)" style="fill: none; stroke: #000000; stroke-width: 1.5"/>
    <path d="M 188.0175 69.363434 
L 188.0175 69.362451 
" clip-path="url(#p7ad6d2ef96)" style="fill: none; stroke: #000000; stroke-width: 1.5"/>
    <path d="M 213.443179 112.594985 
L 213.443179 112.588136 
" clip-path="url(#p7ad6d2ef96)" style="fill: none; stroke: #000000; stroke-width: 1.5"/>
    <path d="M 238.868858 120.227706 
L 238.868858 120.214233 
" clip-path="url(#p7ad6d2ef96)" style="fill: none; stroke: #000000; stroke-width: 1.5"/>
    <path d="M 264.294537 145.540302 
L 264.294537 145.533333 
" clip-path="url(#p7ad6d2ef96)" style="fill: none; stroke: #000000; stroke-width: 1.5"/>
    <path d="M 289.720216 177.611067 
L 289.720216 177.582806 
" clip-path="url(#p7ad6d2ef96)" style="fill: none; stroke: #000000; stroke-width: 1.5"/>
   </g>
   <g id="patch_30">
    <path d="M 59.3 228.385242 
L 59.3 26.318125 
" style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/>
   </g>
   <g id="patch_31">
    <path d="M 304.022161 228.385242 
L 304.022161 26.318125 
" style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/>
   </g>
   <g id="patch_32">
    <path d="M 59.3 228.385242 
L 304.022161 228.385242 
" style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/>
   </g>
   <g id="patch_33">
    <path d="M 59.3 26.318125 
L 304.022161 26.318125 
" style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/>
   </g>
   <g id="text_14">
    <!-- ML-KEM-512 -->
    <g transform="translate(144.561393 16.318125) scale(0.12 -0.12)">
     <defs>
      <path id="DejaVuSans-4d" d="M 628 4666 
L 1569 4666 
L 2759 1491 
L 3956 4666 
L 4897 4666 
L 4897 0 
L 4281 0 
L 4281 4097 
L 3078 897 
L 2444 897 
L 1241 4097 
L 1241 0 
L 628 0 
L 628 4666 
z
" transform="scale(0.015625)"/>
      <path id="DejaVuSans-4c" d="M 628 4666 
L 1259 4666 
L 1259 531 
L 3531 531 
L 3531 0 
L 628 0 
L 628 4666 
z
" transform="scale(0.015625)"/>
      <path id="DejaVuSans-35" d="M 691 4666 
L 3169 4666 
L 3169 4134 
L 1269 4134 
L 1269 2991 
Q 1406 3038 1543 3061 
Q 1681 3084 1819 3084 
Q 2600 3084 3056 2656 
Q 3513 2228 3513 1497 
Q 3513 744 3044 326 
Q 2575 -91 1722 -91 
Q 1428 -91 1123 -41 
Q 819 9 494 109 
L 494 744 
Q 775 591 1075 516 
Q 1375 441 1709 441 
Q 2250 441 2565 725 
Q 2881 1009 2881 1497 
Q 2881 1984 2565 2268 
Q 2250 2553 1709 2553 
Q 1456 2553 1204 2497 
Q 953 2441 691 2322 
L 691 4666 
z
" transform="scale(0.015625)"/>
      <path id="DejaVuSans-32" d="M 1228 531 
L 3431 531 
L 3431 0 
L 469 0 
L 469 531 
Q 828 903 1448 1529 
Q 2069 2156 2228 2338 
Q 2531 2678 2651 2914 
Q 2772 3150 2772 3378 
Q 2772 3750 2511 3984 
Q 2250 4219 1831 4219 
Q 1534 4219 1204 4116 
Q 875 4013 500 3803 
L 500 4441 
Q 881 4594 1212 4672 
Q 1544 4750 1819 4750 
Q 2544 4750 2975 4387 
Q 3406 4025 3406 3419 
Q 3406 3131 3298 2873 
Q 3191 2616 2906 2266 
Q 2828 2175 2409 1742 
Q 1991 1309 1228 531 
z
" transform="scale(0.015625)"/>
     </defs>
     <use xlink:href="#DejaVuSans-4d"/>
     <use xlink:href="#DejaVuSans-4c" transform="translate(86.279297 0)"/>
     <use xlink:href="#DejaVuSans-2d" transform="translate(140.242188 0)"/>
     <use xlink:href="#DejaVuSans-4b" transform="translate(176.326172 0)"/>
     <use xlink:href="#DejaVuSans-45" transform="translate(241.902344 0)"/>
     <use xlink:href="#DejaVuSans-4d" transform="translate(305.085938 0)"/>
     <use xlink:href="#DejaVuSans-2d" transform="translate(391.365234 0)"/>
     <use xlink:href="#DejaVuSans-35" transform="translate(427.449219 0)"/>
     <use xlink:href="#DejaVuSans-31" transform="translate(491.072266 0)"/>
     <use xlink:href="#DejaVuSans-32" transform="translate(554.695312 0)"/>
    </g>
   </g>
  </g>
  <g id="axes_2">
   <g id="patch_34">
    <path d="M 331.417133 228.385242 
L 576.139293 228.385242 
L 576.139293 26.318125 
L 331.417133 26.318125 
L 331.417133 228.385242 
z
" style="fill: none"/>
   </g>
   <g id="patch_35">
    <path d="M 342.540867 75096.618905 
L 348.897287 75096.618905 
L 348.897287 183.812839 
L 342.540867 183.812839 
z
" clip-path="url(#pd6588226ed)" style="fill: #333333"/>
   </g>
   <g id="patch_36">
    <path d="M 367.966546 75096.618905 
L 374.322966 75096.618905 
L 374.322966 189.50414 
L 367.966546 189.50414 
z
" clip-path="url(#pd6588226ed)" style="fill: #333333"/>
   </g>
   <g id="patch_37">
    <path d="M 393.392225 75096.618905 
L 399.748645 75096.618905 
L 399.748645 196.442951 
L 393.392225 196.442951 
z
" clip-path="url(#pd6588226ed)" style="fill: #333333"/>
   </g>
   <g id="patch_38">
    <path d="M 418.817904 75096.618905 
L 425.174324 75096.618905 
L 425.174324 185.854516 
L 418.817904 185.854516 
z
" clip-path="url(#pd6588226ed)" style="fill: #333333"/>
   </g>
   <g id="patch_39">
    <path d="M 444.243583 75096.618905 
L 450.600003 75096.618905 
L 450.600003 186.343407 
L 444.243583 186.343407 
z
" clip-path="url(#pd6588226ed)" style="fill: #333333"/>
   </g>
   <g id="patch_40">
    <path d="M 469.669263 75096.618905 
L 476.025682 75096.618905 
L 476.025682 189.508927 
L 469.669263 189.508927 
z
" clip-path="url(#pd6588226ed)" style="fill: #333333"/>
   </g>
   <g id="patch_41">
    <path d="M 495.094942 75096.618905 
L 501.451361 75096.618905 
L 501.451361 191.497587 
L 495.094942 191.497587 
z
" clip-path="url(#pd6588226ed)" style="fill: #333333"/>
   </g>
   <g id="patch_42">
    <path d="M 520.520621 75096.618905 
L 526.87704 75096.618905 
L 526.87704 195.983961 
L 520.520621 195.983961 
z
" clip-path="url(#pd6588226ed)" style="fill: #333333"/>
   </g>
   <g id="patch_43">
    <path d="M 545.9463 75096.618905 
L 552.302719 75096.618905 
L 552.302719 191.717099 
L 545.9463 191.717099 
z
" clip-path="url(#pd6588226ed)" style="fill: #333333"/>
   </g>
   <g id="patch_44">
    <path d="M 348.897287 75096.618905 
L 355.253707 75096.618905 
L 355.253707 183.255984 
L 348.897287 183.255984 
z
" clip-path="url(#pd6588226ed)" style="fill: #777777"/>
   </g>
   <g id="patch_45">
    <path d="M 374.322966 75096.618905 
L 380.679386 75096.618905 
L 380.679386 187.234542 
L 374.322966 187.234542 
z
" clip-path="url(#pd6588226ed)" style="fill: #777777"/>
   </g>
   <g id="patch_46">
    <path d="M 399.748645 75096.618905 
L 406.105065 75096.618905 
L 406.105065 192.562407 
L 399.748645 192.562407 
z
" clip-path="url(#pd6588226ed)" style="fill: #777777"/>
   </g>
   <g id="patch_47">
    <path d="M 425.174324 75096.618905 
L 431.530744 75096.618905 
L 431.530744 186.006677 
L 425.174324 186.006677 
z
" clip-path="url(#pd6588226ed)" style="fill: #777777"/>
   </g>
   <g id="patch_48">
    <path d="M 450.600003 75096.618905 
L 456.956423 75096.618905 
L 456.956423 184.976674 
L 450.600003 184.976674 
z
" clip-path="url(#pd6588226ed)" style="fill: #777777"/>
   </g>
   <g id="patch_49">
    <path d="M 476.025682 75096.618905 
L 482.382102 75096.618905 
L 482.382102 187.825733 
L 476.025682 187.825733 
z
" clip-path="url(#pd6588226ed)" style="fill: #777777"/>
   </g>
   <g id="patch_50">
    <path d="M 501.451361 75096.618905 
L 507.807781 75096.618905 
L 507.807781 190.03631 
L 501.451361 190.03631 
z
" clip-path="url(#pd6588226ed)" style="fill: #777777"/>
   </g>
   <g id="patch_51">
    <path d="M 526.87704 75096.618905 
L 533.23346 75096.618905 
L 533.23346 196.190934 
L 526.87704 196.190934 
z
" clip-path="url(#pd6588226ed)" style="fill: #777777"/>
   </g>
   <g id="patch_52">
    <path d="M 552.302719 75096.618905 
L 558.659139 75096.618905 
L 558.659139 188.444688 
L 552.302719 188.444688 
z
" clip-path="url(#pd6588226ed)" style="fill: #777777"/>
   </g>
   <g id="patch_53">
    <path d="M 355.253707 75096.618905 
L 361.610127 75096.618905 
L 361.610127 54.639429 
L 355.253707 54.639429 
z
" clip-path="url(#pd6588226ed)" style="fill: #bbbbbb"/>
   </g>
   <g id="patch_54">
    <path d="M 380.679386 75096.618905 
L 387.035806 75096.618905 
L 387.035806 61.650387 
L 380.679386 61.650387 
z
" clip-path="url(#pd6588226ed)" style="fill: #bbbbbb"/>
   </g>
   <g id="patch_55">
    <path d="M 406.105065 75096.618905 
L 412.461485 75096.618905 
L 412.461485 65.918485 
L 406.105065 65.918485 
z
" clip-path="url(#pd6588226ed)" style="fill: #bbbbbb"/>
   </g>
   <g id="patch_56">
    <path d="M 431.530744 75096.618905 
L 437.887164 75096.618905 
L 437.887164 66.562283 
L 431.530744 66.562283 
z
" clip-path="url(#pd6588226ed)" style="fill: #bbbbbb"/>
   </g>
   <g id="patch_57">
    <path d="M 456.956423 75096.618905 
L 463.312843 75096.618905 
L 463.312843 69.3807 
L 456.956423 69.3807 
z
" clip-path="url(#pd6588226ed)" style="fill: #bbbbbb"/>
   </g>
   <g id="patch_58">
    <path d="M 482.382102 75096.618905 
L 488.738522 75096.618905 
L 488.738522 114.879533 
L 482.382102 114.879533 
z
" clip-path="url(#pd6588226ed)" style="fill: #bbbbbb"/>
   </g>
   <g id="patch_59">
    <path d="M 507.807781 75096.618905 
L 514.164201 75096.618905 
L 514.164201 124.157895 
L 507.807781 124.157895 
z
" clip-path="url(#pd6588226ed)" style="fill: #bbbbbb"/>
   </g>
   <g id="patch_60">
    <path d="M 533.23346 75096.618905 
L 539.58988 75096.618905 
L 539.58988 152.437216 
L 533.23346 152.437216 
z
" clip-path="url(#pd6588226ed)" style="fill: #bbbbbb"/>
   </g>
   <g id="patch_61">
    <path d="M 558.659139 75096.618905 
L 565.015559 75096.618905 
L 565.015559 178.49019 
L 558.659139 178.49019 
z
" clip-path="url(#pd6588226ed)" style="fill: #bbbbbb"/>
   </g>
   <g id="matplotlib.axis_3">
    <g id="xtick_10">
     <g id="line2d_33">
      <g>
       <use xlink:href="#m05b77d1b6f" x="352.075497" y="228.385242" style="stroke: #000000; stroke-width: 0.8"/>
      </g>
     </g>
     <g id="text_15">
      <!-- INVNTT -->
      <g transform="translate(324.587826 266.775259) rotate(-45) scale(0.1 -0.1)">
       <use xlink:href="#DejaVuSans-49"/>
       <use xlink:href="#DejaVuSans-4e" transform="translate(29.492188 0)"/>
       <use xlink:href="#DejaVuSans-56" transform="translate(104.296875 0)"/>
       <use xlink:href="#DejaVuSans-4e" transform="translate(172.705078 0)"/>
       <use xlink:href="#DejaVuSans-54" transform="translate(247.509766 0)"/>
       <use xlink:href="#DejaVuSans-54" transform="translate(306.84375 0)"/>
      </g>
     </g>
    </g>
    <g id="xtick_11">
     <g id="line2d_34">
      <g>
       <use xlink:href="#m05b77d1b6f" x="377.501176" y="228.385242" style="stroke: #000000; stroke-width: 0.8"/>
      </g>
     </g>
     <g id="text_16">
      <!-- basemul -->
      <g transform="translate(345.84047 270.948294) rotate(-45) scale(0.1 -0.1)">
       <use xlink:href="#DejaVuSans-62"/>
       <use xlink:href="#DejaVuSans-61" transform="translate(63.476562 0)"/>
       <use xlink:href="#DejaVuSans-73" transform="translate(124.755859 0)"/>
       <use xlink:href="#DejaVuSans-65" transform="translate(176.855469 0)"/>
       <use xlink:href="#DejaVuSans-6d" transform="translate(238.378906 0)"/>
       <use xlink:href="#DejaVuSans-75" transform="translate(335.791016 0)"/>
       <use xlink:href="#DejaVuSans-6c" transform="translate(399.169922 0)"/>
      </g>
     </g>
    </g>
    <g id="xtick_12">
     <g id="line2d_35">
      <g>
       <use xlink:href="#m05b77d1b6f" x="402.926855" y="228.385242" style="stroke: #000000; stroke-width: 0.8"/>
      </g>
     </g>
     <g id="text_17">
      <!-- frommsg -->
      <g transform="translate(369.944743 272.269699) rotate(-45) scale(0.1 -0.1)">
       <use xlink:href="#DejaVuSans-66"/>
       <use xlink:href="#DejaVuSans-72" transform="translate(35.205078 0)"/>
       <use xlink:href="#DejaVuSans-6f" transform="translate(74.068359 0)"/>
       <use xlink:href="#DejaVuSans-6d" transform="translate(135.25 0)"/>
       <use xlink:href="#DejaVuSans-6d" transform="translate(232.662109 0)"/>
       <use xlink:href="#DejaVuSans-73" transform="translate(330.074219 0)"/>
       <use xlink:href="#DejaVuSans-67" transform="translate(382.173828 0)"/>
      </g>
     </g>
    </g>
    <g id="xtick_13">
     <g id="line2d_36">
      <g>
       <use xlink:href="#m05b77d1b6f" x="428.352534" y="228.385242" style="stroke: #000000; stroke-width: 0.8"/>
      </g>
     </g>
     <g id="text_18">
      <!-- NTT -->
      <g transform="translate(413.077923 254.562199) rotate(-45) scale(0.1 -0.1)">
       <use xlink:href="#DejaVuSans-4e"/>
       <use xlink:href="#DejaVuSans-54" transform="translate(74.804688 0)"/>
       <use xlink:href="#DejaVuSans-54" transform="translate(134.138672 0)"/>
      </g>
     </g>
    </g>
    <g id="xtick_14">
     <g id="line2d_37">
      <g>
       <use xlink:href="#m05b77d1b6f" x="453.778213" y="228.385242" style="stroke: #000000; stroke-width: 0.8"/>
      </g>
     </g>
     <g id="text_19">
      <!-- iDec -->
      <g transform="translate(436.6596 256.406201) rotate(-45) scale(0.1 -0.1)">
       <use xlink:href="#DejaVuSans-69"/>
       <use xlink:href="#DejaVuSans-44" transform="translate(27.783203 0)"/>
       <use xlink:href="#DejaVuSans-65" transform="translate(104.785156 0)"/>
       <use xlink:href="#DejaVuSans-63" transform="translate(166.308594 0)"/>
      </g>
     </g>
    </g>
    <g id="xtick_15">
     <g id="line2d_38">
      <g>
       <use xlink:href="#m05b77d1b6f" x="479.203892" y="228.385242" style="stroke: #000000; stroke-width: 0.8"/>
      </g>
     </g>
     <g id="text_20">
      <!-- iEnc -->
      <g transform="translate(462.931597 255.559882) rotate(-45) scale(0.1 -0.1)">
       <use xlink:href="#DejaVuSans-69"/>
       <use xlink:href="#DejaVuSans-45" transform="translate(27.783203 0)"/>
       <use xlink:href="#DejaVuSans-6e" transform="translate(90.966797 0)"/>
       <use xlink:href="#DejaVuSans-63" transform="translate(154.345703 0)"/>
      </g>
     </g>
    </g>
    <g id="xtick_16">
     <g id="line2d_39">
      <g>
       <use xlink:href="#m05b77d1b6f" x="504.629571" y="228.385242" style="stroke: #000000; stroke-width: 0.8"/>
      </g>
     </g>
     <g id="text_21">
      <!-- iKeypair -->
      <g transform="translate(474.681389 269.235769) rotate(-45) scale(0.1 -0.1)">
       <use xlink:href="#DejaVuSans-69"/>
       <use xlink:href="#DejaVuSans-4b" transform="translate(27.783203 0)"/>
       <use xlink:href="#DejaVuSans-65" transform="translate(88.359375 0)"/>
       <use xlink:href="#DejaVuSans-79" transform="translate(149.882812 0)"/>
       <use xlink:href="#DejaVuSans-70" transform="translate(209.0625 0)"/>
       <use xlink:href="#DejaVuSans-61" transform="translate(272.539062 0)"/>
       <use xlink:href="#DejaVuSans-69" transform="translate(333.818359 0)"/>
       <use xlink:href="#DejaVuSans-72" transform="translate(361.601562 0)"/>
      </g>
     </g>
    </g>
    <g id="xtick_17">
     <g id="line2d_40">
      <g>
       <use xlink:href="#m05b77d1b6f" x="530.05525" y="228.385242" style="stroke: #000000; stroke-width: 0.8"/>
      </g>
     </g>
     <g id="text_22">
      <!-- gen_a -->
      <g transform="translate(507.198024 261.751486) rotate(-45) scale(0.1 -0.1)">
       <use xlink:href="#DejaVuSans-67"/>
       <use xlink:href="#DejaVuSans-65" transform="translate(63.476562 0)"/>
       <use xlink:href="#DejaVuSans-6e" transform="translate(125 0)"/>
       <use xlink:href="#DejaVuSans-5f" transform="translate(188.378906 0)"/>
       <use xlink:href="#DejaVuSans-61" transform="translate(238.378906 0)"/>
      </g>
     </g>
    </g>
    <g id="xtick_18">
     <g id="line2d_41">
      <g>
       <use xlink:href="#m05b77d1b6f" x="555.480929" y="228.385242" style="stroke: #000000; stroke-width: 0.8"/>
      </g>
     </g>
     <g id="text_23">
      <!-- noise -->
      <g transform="translate(535.203537 259.564979) rotate(-45) scale(0.1 -0.1)">
       <use xlink:href="#DejaVuSans-6e"/>
       <use xlink:href="#DejaVuSans-6f" transform="translate(63.378906 0)"/>
       <use xlink:href="#DejaVuSans-69" transform="translate(124.560547 0)"/>
       <use xlink:href="#DejaVuSans-73" transform="translate(152.34375 0)"/>
       <use xlink:href="#DejaVuSans-65" transform="translate(204.443359 0)"/>
      </g>
     </g>
    </g>
   </g>
   <g id="matplotlib.axis_4">
    <g id="ytick_24">
     <g id="line2d_42">
      <g>
       <use xlink:href="#mcfee22dec2" x="331.417133" y="228.385242" style="stroke: #000000; stroke-width: 0.8"/>
      </g>
     </g>
    </g>
    <g id="ytick_25">
     <g id="line2d_43">
      <g>
       <use xlink:href="#mcfee22dec2" x="331.417133" y="153.517008" style="stroke: #000000; stroke-width: 0.8"/>
      </g>
     </g>
    </g>
    <g id="ytick_26">
     <g id="line2d_44">
      <g>
       <use xlink:href="#mcfee22dec2" x="331.417133" y="78.648775" style="stroke: #000000; stroke-width: 0.8"/>
      </g>
     </g>
    </g>
    <g id="ytick_27">
     <g id="line2d_45">
      <g>
       <use xlink:href="#m6583d819d2" x="331.417133" y="205.847658" style="stroke: #000000; stroke-width: 0.6"/>
      </g>
     </g>
    </g>
    <g id="ytick_28">
     <g id="line2d_46">
      <g>
       <use xlink:href="#m6583d819d2" x="331.417133" y="192.664016" style="stroke: #000000; stroke-width: 0.6"/>
      </g>
     </g>
    </g>
    <g id="ytick_29">
     <g id="line2d_47">
      <g>
       <use xlink:href="#m6583d819d2" x="331.417133" y="183.310074" style="stroke: #000000; stroke-width: 0.6"/>
      </g>
     </g>
    </g>
    <g id="ytick_30">
     <g id="line2d_48">
      <g>
       <use xlink:href="#m6583d819d2" x="331.417133" y="176.054592" style="stroke: #000000; stroke-width: 0.6"/>
      </g>
     </g>
    </g>
    <g id="ytick_31">
     <g id="line2d_49">
      <g>
       <use xlink:href="#m6583d819d2" x="331.417133" y="170.126432" style="stroke: #000000; stroke-width: 0.6"/>
      </g>
     </g>
    </g>
    <g id="ytick_32">
     <g id="line2d_50">
      <g>
       <use xlink:href="#m6583d819d2" x="331.417133" y="165.114244" style="stroke: #000000; stroke-width: 0.6"/>
      </g>
     </g>
    </g>
    <g id="ytick_33">
     <g id="line2d_51">
      <g>
       <use xlink:href="#m6583d819d2" x="331.417133" y="160.77249" style="stroke: #000000; stroke-width: 0.6"/>
      </g>
     </g>
    </g>
    <g id="ytick_34">
     <g id="line2d_52">
      <g>
       <use xlink:href="#m6583d819d2" x="331.417133" y="156.942791" style="stroke: #000000; stroke-width: 0.6"/>
      </g>
     </g>
    </g>
    <g id="ytick_35">
     <g id="line2d_53">
      <g>
       <use xlink:href="#m6583d819d2" x="331.417133" y="130.979424" style="stroke: #000000; stroke-width: 0.6"/>
      </g>
     </g>
    </g>
    <g id="ytick_36">
     <g id="line2d_54">
      <g>
       <use xlink:href="#m6583d819d2" x="331.417133" y="117.795783" style="stroke: #000000; stroke-width: 0.6"/>
      </g>
     </g>
    </g>
    <g id="ytick_37">
     <g id="line2d_55">
      <g>
       <use xlink:href="#m6583d819d2" x="331.417133" y="108.44184" style="stroke: #000000; stroke-width: 0.6"/>
      </g>
     </g>
    </g>
    <g id="ytick_38">
     <g id="line2d_56">
      <g>
       <use xlink:href="#m6583d819d2" x="331.417133" y="101.186359" style="stroke: #000000; stroke-width: 0.6"/>
      </g>
     </g>
    </g>
    <g id="ytick_39">
     <g id="line2d_57">
      <g>
       <use xlink:href="#m6583d819d2" x="331.417133" y="95.258199" style="stroke: #000000; stroke-width: 0.6"/>
      </g>
     </g>
    </g>
    <g id="ytick_40">
     <g id="line2d_58">
      <g>
       <use xlink:href="#m6583d819d2" x="331.417133" y="90.246011" style="stroke: #000000; stroke-width: 0.6"/>
      </g>
     </g>
    </g>
    <g id="ytick_41">
     <g id="line2d_59">
      <g>
       <use xlink:href="#m6583d819d2" x="331.417133" y="85.904256" style="stroke: #000000; stroke-width: 0.6"/>
      </g>
     </g>
    </g>
    <g id="ytick_42">
     <g id="line2d_60">
      <g>
       <use xlink:href="#m6583d819d2" x="331.417133" y="82.074557" style="stroke: #000000; stroke-width: 0.6"/>
      </g>
     </g>
    </g>
    <g id="ytick_43">
     <g id="line2d_61">
      <g>
       <use xlink:href="#m6583d819d2" x="331.417133" y="56.111191" style="stroke: #000000; stroke-width: 0.6"/>
      </g>
     </g>
    </g>
    <g id="ytick_44">
     <g id="line2d_62">
      <g>
       <use xlink:href="#m6583d819d2" x="331.417133" y="42.927549" style="stroke: #000000; stroke-width: 0.6"/>
      </g>
     </g>
    </g>
    <g id="ytick_45">
     <g id="line2d_63">
      <g>
       <use xlink:href="#m6583d819d2" x="331.417133" y="33.573606" style="stroke: #000000; stroke-width: 0.6"/>
      </g>
     </g>
    </g>
    <g id="ytick_46">
     <g id="line2d_64">
      <g>
       <use xlink:href="#m6583d819d2" x="331.417133" y="26.318125" style="stroke: #000000; stroke-width: 0.6"/>
      </g>
     </g>
    </g>
   </g>
   <g id="LineCollection_4">
    <path d="M 345.719077 183.814528 
L 345.719077 183.81115 
" clip-path="url(#pd6588226ed)" style="fill: none; stroke: #000000; stroke-width: 1.5"/>
    <path d="M 371.144756 189.761349 
L 371.144756 189.476657 
" clip-path="url(#pd6588226ed)" style="fill: none; stroke: #000000; stroke-width: 1.5"/>
    <path d="M 396.570435 196.442951 
L 396.570435 196.442951 
" clip-path="url(#pd6588226ed)" style="fill: none; stroke: #000000; stroke-width: 1.5"/>
    <path d="M 421.996114 185.864047 
L 421.996114 185.854516 
" clip-path="url(#pd6588226ed)" style="fill: none; stroke: #000000; stroke-width: 1.5"/>
    <path d="M 447.421793 186.345141 
L 447.421793 186.340313 
" clip-path="url(#pd6588226ed)" style="fill: none; stroke: #000000; stroke-width: 1.5"/>
    <path d="M 472.847472 189.510622 
L 472.847472 189.507318 
" clip-path="url(#pd6588226ed)" style="fill: none; stroke: #000000; stroke-width: 1.5"/>
    <path d="M 498.273151 191.499761 
L 498.273151 191.494955 
" clip-path="url(#pd6588226ed)" style="fill: none; stroke: #000000; stroke-width: 1.5"/>
    <path d="M 523.69883 195.992428 
L 523.69883 195.976842 
" clip-path="url(#pd6588226ed)" style="fill: none; stroke: #000000; stroke-width: 1.5"/>
    <path d="M 549.12451 191.717099 
L 549.12451 191.707767 
" clip-path="url(#pd6588226ed)" style="fill: none; stroke: #000000; stroke-width: 1.5"/>
   </g>
   <g id="LineCollection_5">
    <path d="M 352.075497 183.26275 
L 352.075497 183.254295 
" clip-path="url(#pd6588226ed)" style="fill: none; stroke: #000000; stroke-width: 1.5"/>
    <path d="M 377.501176 187.234542 
L 377.501176 187.234542 
" clip-path="url(#pd6588226ed)" style="fill: none; stroke: #000000; stroke-width: 1.5"/>
    <path d="M 402.926855 192.562407 
L 402.926855 192.562407 
" clip-path="url(#pd6588226ed)" style="fill: none; stroke: #000000; stroke-width: 1.5"/>
    <path d="M 428.352534 186.006677 
L 428.352534 186.006677 
" clip-path="url(#pd6588226ed)" style="fill: none; stroke: #000000; stroke-width: 1.5"/>
    <path d="M 453.778213 184.979511 
L 453.778213 184.975255 
" clip-path="url(#pd6588226ed)" style="fill: none; stroke: #000000; stroke-width: 1.5"/>
    <path d="M 479.203892 187.827854 
L 479.203892 187.823769 
" clip-path="url(#pd6588226ed)" style="fill: none; stroke: #000000; stroke-width: 1.5"/>
    <path d="M 504.629571 190.038526 
L 504.629571 190.033442 
" clip-path="url(#pd6588226ed)" style="fill: none; stroke: #000000; stroke-width: 1.5"/>
    <path d="M 530.05525 196.197721 
L 530.05525 196.184821 
" clip-path="url(#pd6588226ed)" style="fill: none; stroke: #000000; stroke-width: 1.5"/>
    <path d="M 555.480929 188.444688 
L 555.480929 188.435357 
" clip-path="url(#pd6588226ed)" style="fill: none; stroke: #000000; stroke-width: 1.5"/>
   </g>
   <g id="LineCollection_6">
    <path d="M 358.431917 54.641118 
L 358.431917 54.63774 
" clip-path="url(#pd6588226ed)" style="fill: none; stroke: #000000; stroke-width: 1.5"/>
    <path d="M 383.857596 61.650387 
L 383.857596 61.650387 
" clip-path="url(#pd6588226ed)" style="fill: none; stroke: #000000; stroke-width: 1.5"/>
    <path d="M 409.283275 65.918485 
L 409.283275 65.918485 
" clip-path="url(#pd6588226ed)" style="fill: none; stroke: #000000; stroke-width: 1.5"/>
    <path d="M 434.708954 66.933885 
L 434.708954 66.562283 
" clip-path="url(#pd6588226ed)" style="fill: none; stroke: #000000; stroke-width: 1.5"/>
    <path d="M 460.134633 69.381074 
L 460.134633 69.379954 
" clip-path="url(#pd6588226ed)" style="fill: none; stroke: #000000; stroke-width: 1.5"/>
    <path d="M 485.560312 114.88356 
L 485.560312 114.878894 
" clip-path="url(#pd6588226ed)" style="fill: none; stroke: #000000; stroke-width: 1.5"/>
    <path d="M 510.985991 124.162039 
L 510.985991 124.156933 
" clip-path="url(#pd6588226ed)" style="fill: none; stroke: #000000; stroke-width: 1.5"/>
    <path d="M 536.41167 152.446392 
L 536.41167 152.432844 
" clip-path="url(#pd6588226ed)" style="fill: none; stroke: #000000; stroke-width: 1.5"/>
    <path d="M 561.837349 178.49019 
L 561.837349 178.480859 
" clip-path="url(#pd6588226ed)" style="fill: none; stroke: #000000; stroke-width: 1.5"/>
   </g>
   <g id="patch_62">
    <path d="M 331.417133 228.385242 
L 331.417133 26.318125 
" style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/>
   </g>
   <g id="patch_63">
    <path d="M 576.139293 228.385242 
L 576.139293 26.318125 
" style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/>
   </g>
   <g id="patch_64">
    <path d="M 331.417133 228.385242 
L 576.139293 228.385242 
" style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/>
   </g>
   <g id="patch_65">
    <path d="M 331.417133 26.318125 
L 576.139293 26.318125 
" style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/>
   </g>
   <g id="text_24">
    <!-- ML-KEM-768 -->
    <g transform="translate(416.678526 16.318125) scale(0.12 -0.12)">
     <defs>
      <path id="DejaVuSans-37" d="M 525 4666 
L 3525 4666 
L 3525 4397 
L 1831 0 
L 1172 0 
L 2766 4134 
L 525 4134 
L 525 4666 
z
" transform="scale(0.015625)"/>
      <path id="DejaVuSans-36" d="M 2113 2584 
Q 1688 2584 1439 2293 
Q 1191 2003 1191 1497 
Q 1191 994 1439 701 
Q 1688 409 2113 409 
Q 2538 409 2786 701 
Q 3034 994 3034 1497 
Q 3034 2003 2786 2293 
Q 2538 2584 2113 2584 
z
M 3366 4563 
L 3366 3988 
Q 3128 4100 2886 4159 
Q 2644 4219 2406 4219 
Q 1781 4219 1451 3797 
Q 1122 3375 1075 2522 
Q 1259 2794 1537 2939 
Q 1816 3084 2150 3084 
Q 2853 3084 3261 2657 
Q 3669 2231 3669 1497 
Q 3669 778 3244 343 
Q 2819 -91 2113 -91 
Q 1303 -91 875 529 
Q 447 1150 447 2328 
Q 447 3434 972 4092 
Q 1497 4750 2381 4750 
Q 2619 4750 2861 4703 
Q 3103 4656 3366 4563 
z
" transform="scale(0.015625)"/>
      <path id="DejaVuSans-38" d="M 2034 2216 
Q 1584 2216 1326 1975 
Q 1069 1734 1069 1313 
Q 1069 891 1326 650 
Q 1584 409 2034 409 
Q 2484 409 2743 651 
Q 3003 894 3003 1313 
Q 3003 1734 2745 1975 
Q 2488 2216 2034 2216 
z
M 1403 2484 
Q 997 2584 770 2862 
Q 544 3141 544 3541 
Q 544 4100 942 4425 
Q 1341 4750 2034 4750 
Q 2731 4750 3128 4425 
Q 3525 4100 3525 3541 
Q 3525 3141 3298 2862 
Q 3072 2584 2669 2484 
Q 3125 2378 3379 2068 
Q 3634 1759 3634 1313 
Q 3634 634 3220 271 
Q 2806 -91 2034 -91 
Q 1263 -91 848 271 
Q 434 634 434 1313 
Q 434 1759 690 2068 
Q 947 2378 1403 2484 
z
M 1172 3481 
Q 1172 3119 1398 2916 
Q 1625 2713 2034 2713 
Q 2441 2713 2670 2916 
Q 2900 3119 2900 3481 
Q 2900 3844 2670 4047 
Q 2441 4250 2034 4250 
Q 1625 4250 1398 4047 
Q 1172 3844 1172 3481 
z
" transform="scale(0.015625)"/>
     </defs>
     <use xlink:href="#DejaVuSans-4d"/>
     <use xlink:href="#DejaVuSans-4c" transform="translate(86.279297 0)"/>
     <use xlink:href="#DejaVuSans-2d" transform="translate(140.242188 0)"/>
     <use xlink:href="#DejaVuSans-4b" transform="translate(176.326172 0)"/>
     <use xlink:href="#DejaVuSans-45" transform="translate(241.902344 0)"/>
     <use xlink:href="#DejaVuSans-4d" transform="translate(305.085938 0)"/>
     <use xlink:href="#DejaVuSans-2d" transform="translate(391.365234 0)"/>
     <use xlink:href="#DejaVuSans-37" transform="translate(427.449219 0)"/>
     <use xlink:href="#DejaVuSans-36" transform="translate(491.072266 0)"/>
     <use xlink:href="#DejaVuSans-38" transform="translate(554.695312 0)"/>
    </g>
   </g>
  </g>
  <g id="axes_3">
   <g id="patch_66">
    <path d="M 603.534266 228.385242 
L 848.256426 228.385242 
L 848.256426 26.318125 
L 603.534266 26.318125 
L 603.534266 228.385242 
z
" style="fill: none"/>
   </g>
   <g id="patch_67">
    <path d="M 614.658 75096.618905 
L 621.01442 75096.618905 
L 621.01442 185.899625 
L 614.658 185.899625 
z
" clip-path="url(#p55451decf0)" style="fill: #333333"/>
   </g>
   <g id="patch_68">
    <path d="M 640.083679 75096.618905 
L 646.440099 75096.618905 
L 646.440099 190.47407 
L 640.083679 190.47407 
z
" clip-path="url(#p55451decf0)" style="fill: #333333"/>
   </g>
   <g id="patch_69">
    <path d="M 665.509358 75096.618905 
L 671.865778 75096.618905 
L 671.865778 192.494844 
L 665.509358 192.494844 
z
" clip-path="url(#p55451decf0)" style="fill: #333333"/>
   </g>
   <g id="patch_70">
    <path d="M 690.935037 75096.618905 
L 697.291457 75096.618905 
L 697.291457 185.917628 
L 690.935037 185.917628 
z
" clip-path="url(#p55451decf0)" style="fill: #333333"/>
   </g>
   <g id="patch_71">
    <path d="M 716.360716 75096.618905 
L 722.717136 75096.618905 
L 722.717136 186.996099 
L 716.360716 186.996099 
z
" clip-path="url(#p55451decf0)" style="fill: #333333"/>
   </g>
   <g id="patch_72">
    <path d="M 741.786395 75096.618905 
L 748.142815 75096.618905 
L 748.142815 191.757013 
L 741.786395 191.757013 
z
" clip-path="url(#p55451decf0)" style="fill: #333333"/>
   </g>
   <g id="patch_73">
    <path d="M 767.212074 75096.618905 
L 773.568494 75096.618905 
L 773.568494 192.12667 
L 767.212074 192.12667 
z
" clip-path="url(#p55451decf0)" style="fill: #333333"/>
   </g>
   <g id="patch_74">
    <path d="M 792.637753 75096.618905 
L 798.994173 75096.618905 
L 798.994173 196.131311 
L 792.637753 196.131311 
z
" clip-path="url(#p55451decf0)" style="fill: #333333"/>
   </g>
   <g id="patch_75">
    <path d="M 818.063432 75096.618905 
L 824.419852 75096.618905 
L 824.419852 192.905764 
L 818.063432 192.905764 
z
" clip-path="url(#p55451decf0)" style="fill: #333333"/>
   </g>
   <g id="patch_76">
    <path d="M 621.01442 75096.618905 
L 627.37084 75096.618905 
L 627.37084 185.91213 
L 621.01442 185.91213 
z
" clip-path="url(#p55451decf0)" style="fill: #777777"/>
   </g>
   <g id="patch_77">
    <path d="M 646.440099 75096.618905 
L 652.796519 75096.618905 
L 652.796519 188.138924 
L 646.440099 188.138924 
z
" clip-path="url(#p55451decf0)" style="fill: #777777"/>
   </g>
   <g id="patch_78">
    <path d="M 671.865778 75096.618905 
L 678.222198 75096.618905 
L 678.222198 196.375387 
L 671.865778 196.375387 
z
" clip-path="url(#p55451decf0)" style="fill: #777777"/>
   </g>
   <g id="patch_79">
    <path d="M 697.291457 75096.618905 
L 703.647877 75096.618905 
L 703.647877 186.117662 
L 697.291457 186.117662 
z
" clip-path="url(#p55451decf0)" style="fill: #777777"/>
   </g>
   <g id="patch_80">
    <path d="M 722.717136 75096.618905 
L 729.073556 75096.618905 
L 729.073556 185.931552 
L 722.717136 185.931552 
z
" clip-path="url(#p55451decf0)" style="fill: #777777"/>
   </g>
   <g id="patch_81">
    <path d="M 748.142815 75096.618905 
L 754.499235 75096.618905 
L 754.499235 190.440487 
L 748.142815 190.440487 
z
" clip-path="url(#p55451decf0)" style="fill: #777777"/>
   </g>
   <g id="patch_82">
    <path d="M 773.568494 75096.618905 
L 779.924914 75096.618905 
L 779.924914 190.493832 
L 773.568494 190.493832 
z
" clip-path="url(#p55451decf0)" style="fill: #777777"/>
   </g>
   <g id="patch_83">
    <path d="M 798.994173 75096.618905 
L 805.350593 75096.618905 
L 805.350593 195.894719 
L 798.994173 195.894719 
z
" clip-path="url(#p55451decf0)" style="fill: #777777"/>
   </g>
   <g id="patch_84">
    <path d="M 824.419852 75096.618905 
L 830.776272 75096.618905 
L 830.776272 188.412795 
L 824.419852 188.412795 
z
" clip-path="url(#p55451decf0)" style="fill: #777777"/>
   </g>
   <g id="patch_85">
    <path d="M 627.37084 75096.618905 
L 633.727259 75096.618905 
L 633.727259 58.392839 
L 627.37084 58.392839 
z
" clip-path="url(#p55451decf0)" style="fill: #bbbbbb"/>
   </g>
   <g id="patch_86">
    <path d="M 652.796519 75096.618905 
L 659.152938 75096.618905 
L 659.152938 66.894223 
L 652.796519 66.894223 
z
" clip-path="url(#p55451decf0)" style="fill: #bbbbbb"/>
   </g>
   <g id="patch_87">
    <path d="M 678.222198 75096.618905 
L 684.578617 75096.618905 
L 684.578617 65.850921 
L 678.222198 65.850921 
z
" clip-path="url(#p55451decf0)" style="fill: #bbbbbb"/>
   </g>
   <g id="patch_88">
    <path d="M 703.647877 75096.618905 
L 710.004297 75096.618905 
L 710.004297 70.903045 
L 703.647877 70.903045 
z
" clip-path="url(#p55451decf0)" style="fill: #bbbbbb"/>
   </g>
   <g id="patch_89">
    <path d="M 729.073556 75096.618905 
L 735.429976 75096.618905 
L 735.429976 74.173769 
L 729.073556 74.173769 
z
" clip-path="url(#p55451decf0)" style="fill: #bbbbbb"/>
   </g>
   <g id="patch_90">
    <path d="M 754.499235 75096.618905 
L 760.855655 75096.618905 
L 760.855655 117.625095 
L 754.499235 117.625095 
z
" clip-path="url(#p55451decf0)" style="fill: #bbbbbb"/>
   </g>
   <g id="patch_91">
    <path d="M 779.924914 75096.618905 
L 786.281334 75096.618905 
L 786.281334 122.423244 
L 779.924914 122.423244 
z
" clip-path="url(#p55451decf0)" style="fill: #bbbbbb"/>
   </g>
   <g id="patch_92">
    <path d="M 805.350593 75096.618905 
L 811.707013 75096.618905 
L 811.707013 145.048736 
L 805.350593 145.048736 
z
" clip-path="url(#p55451decf0)" style="fill: #bbbbbb"/>
   </g>
   <g id="patch_93">
    <path d="M 830.776272 75096.618905 
L 837.132692 75096.618905 
L 837.132692 182.745239 
L 830.776272 182.745239 
z
" clip-path="url(#p55451decf0)" style="fill: #bbbbbb"/>
   </g>
   <g id="matplotlib.axis_5">
    <g id="xtick_19">
     <g id="line2d_65">
      <g>
       <use xlink:href="#m05b77d1b6f" x="624.19263" y="228.385242" style="stroke: #000000; stroke-width: 0.8"/>
      </g>
     </g>
     <g id="text_25">
      <!-- INVNTT -->
      <g transform="translate(596.704959 266.775259) rotate(-45) scale(0.1 -0.1)">
       <use xlink:href="#DejaVuSans-49"/>
       <use xlink:href="#DejaVuSans-4e" transform="translate(29.492188 0)"/>
       <use xlink:href="#DejaVuSans-56" transform="translate(104.296875 0)"/>
       <use xlink:href="#DejaVuSans-4e" transform="translate(172.705078 0)"/>
       <use xlink:href="#DejaVuSans-54" transform="translate(247.509766 0)"/>
       <use xlink:href="#DejaVuSans-54" transform="translate(306.84375 0)"/>
      </g>
     </g>
    </g>
    <g id="xtick_20">
     <g id="line2d_66">
      <g>
       <use xlink:href="#m05b77d1b6f" x="649.618309" y="228.385242" style="stroke: #000000; stroke-width: 0.8"/>
      </g>
     </g>
     <g id="text_26">
      <!-- basemul -->
      <g transform="translate(617.957603 270.948294) rotate(-45) scale(0.1 -0.1)">
       <use xlink:href="#DejaVuSans-62"/>
       <use xlink:href="#DejaVuSans-61" transform="translate(63.476562 0)"/>
       <use xlink:href="#DejaVuSans-73" transform="translate(124.755859 0)"/>
       <use xlink:href="#DejaVuSans-65" transform="translate(176.855469 0)"/>
       <use xlink:href="#DejaVuSans-6d" transform="translate(238.378906 0)"/>
       <use xlink:href="#DejaVuSans-75" transform="translate(335.791016 0)"/>
       <use xlink:href="#DejaVuSans-6c" transform="translate(399.169922 0)"/>
      </g>
     </g>
    </g>
    <g id="xtick_21">
     <g id="line2d_67">
      <g>
       <use xlink:href="#m05b77d1b6f" x="675.043988" y="228.385242" style="stroke: #000000; stroke-width: 0.8"/>
      </g>
     </g>
     <g id="text_27">
      <!-- frommsg -->
      <g transform="translate(642.061876 272.269699) rotate(-45) scale(0.1 -0.1)">
       <use xlink:href="#DejaVuSans-66"/>
       <use xlink:href="#DejaVuSans-72" transform="translate(35.205078 0)"/>
       <use xlink:href="#DejaVuSans-6f" transform="translate(74.068359 0)"/>
       <use xlink:href="#DejaVuSans-6d" transform="translate(135.25 0)"/>
       <use xlink:href="#DejaVuSans-6d" transform="translate(232.662109 0)"/>
       <use xlink:href="#DejaVuSans-73" transform="translate(330.074219 0)"/>
       <use xlink:href="#DejaVuSans-67" transform="translate(382.173828 0)"/>
      </g>
     </g>
    </g>
    <g id="xtick_22">
     <g id="line2d_68">
      <g>
       <use xlink:href="#m05b77d1b6f" x="700.469667" y="228.385242" style="stroke: #000000; stroke-width: 0.8"/>
      </g>
     </g>
     <g id="text_28">
      <!-- NTT -->
      <g transform="translate(685.195056 254.562199) rotate(-45) scale(0.1 -0.1)">
       <use xlink:href="#DejaVuSans-4e"/>
       <use xlink:href="#DejaVuSans-54" transform="translate(74.804688 0)"/>
       <use xlink:href="#DejaVuSans-54" transform="translate(134.138672 0)"/>
      </g>
     </g>
    </g>
    <g id="xtick_23">
     <g id="line2d_69">
      <g>
       <use xlink:href="#m05b77d1b6f" x="725.895346" y="228.385242" style="stroke: #000000; stroke-width: 0.8"/>
      </g>
     </g>
     <g id="text_29">
      <!-- iDec -->
      <g transform="translate(708.776733 256.406201) rotate(-45) scale(0.1 -0.1)">
       <use xlink:href="#DejaVuSans-69"/>
       <use xlink:href="#DejaVuSans-44" transform="translate(27.783203 0)"/>
       <use xlink:href="#DejaVuSans-65" transform="translate(104.785156 0)"/>
       <use xlink:href="#DejaVuSans-63" transform="translate(166.308594 0)"/>
      </g>
     </g>
    </g>
    <g id="xtick_24">
     <g id="line2d_70">
      <g>
       <use xlink:href="#m05b77d1b6f" x="751.321025" y="228.385242" style="stroke: #000000; stroke-width: 0.8"/>
      </g>
     </g>
     <g id="text_30">
      <!-- iEnc -->
      <g transform="translate(735.04873 255.559882) rotate(-45) scale(0.1 -0.1)">
       <use xlink:href="#DejaVuSans-69"/>
       <use xlink:href="#DejaVuSans-45" transform="translate(27.783203 0)"/>
       <use xlink:href="#DejaVuSans-6e" transform="translate(90.966797 0)"/>
       <use xlink:href="#DejaVuSans-63" transform="translate(154.345703 0)"/>
      </g>
     </g>
    </g>
    <g id="xtick_25">
     <g id="line2d_71">
      <g>
       <use xlink:href="#m05b77d1b6f" x="776.746704" y="228.385242" style="stroke: #000000; stroke-width: 0.8"/>
      </g>
     </g>
     <g id="text_31">
      <!-- iKeypair -->
      <g transform="translate(746.798522 269.235769) rotate(-45) scale(0.1 -0.1)">
       <use xlink:href="#DejaVuSans-69"/>
       <use xlink:href="#DejaVuSans-4b" transform="translate(27.783203 0)"/>
       <use xlink:href="#DejaVuSans-65" transform="translate(88.359375 0)"/>
       <use xlink:href="#DejaVuSans-79" transform="translate(149.882812 0)"/>
       <use xlink:href="#DejaVuSans-70" transform="translate(209.0625 0)"/>
       <use xlink:href="#DejaVuSans-61" transform="translate(272.539062 0)"/>
       <use xlink:href="#DejaVuSans-69" transform="translate(333.818359 0)"/>
       <use xlink:href="#DejaVuSans-72" transform="translate(361.601562 0)"/>
      </g>
     </g>
    </g>
    <g id="xtick_26">
     <g id="line2d_72">
      <g>
       <use xlink:href="#m05b77d1b6f" x="802.172383" y="228.385242" style="stroke: #000000; stroke-width: 0.8"/>
      </g>
     </g>
     <g id="text_32">
      <!-- gen_a -->
      <g transform="translate(779.315156 261.751486) rotate(-45) scale(0.1 -0.1)">
       <use xlink:href="#DejaVuSans-67"/>
       <use xlink:href="#DejaVuSans-65" transform="translate(63.476562 0)"/>
       <use xlink:href="#DejaVuSans-6e" transform="translate(125 0)"/>
       <use xlink:href="#DejaVuSans-5f" transform="translate(188.378906 0)"/>
       <use xlink:href="#DejaVuSans-61" transform="translate(238.378906 0)"/>
      </g>
     </g>
    </g>
    <g id="xtick_27">
     <g id="line2d_73">
      <g>
       <use xlink:href="#m05b77d1b6f" x="827.598062" y="228.385242" style="stroke: #000000; stroke-width: 0.8"/>
      </g>
     </g>
     <g id="text_33">
      <!-- noise -->
      <g transform="translate(807.32067 259.564979) rotate(-45) scale(0.1 -0.1)">
       <use xlink:href="#DejaVuSans-6e"/>
       <use xlink:href="#DejaVuSans-6f" transform="translate(63.378906 0)"/>
       <use xlink:href="#DejaVuSans-69" transform="translate(124.560547 0)"/>
       <use xlink:href="#DejaVuSans-73" transform="translate(152.34375 0)"/>
       <use xlink:href="#DejaVuSans-65" transform="translate(204.443359 0)"/>
      </g>
     </g>
    </g>
   </g>
   <g id="matplotlib.axis_6">
    <g id="ytick_47">
     <g id="line2d_74">
      <g>
       <use xlink:href="#mcfee22dec2" x="603.534266" y="228.385242" style="stroke: #000000; stroke-width: 0.8"/>
      </g>
     </g>
    </g>
    <g id="ytick_48">
     <g id="line2d_75">
      <g>
       <use xlink:href="#mcfee22dec2" x="603.534266" y="153.517008" style="stroke: #000000; stroke-width: 0.8"/>
      </g>
     </g>
    </g>
    <g id="ytick_49">
     <g id="line2d_76">
      <g>
       <use xlink:href="#mcfee22dec2" x="603.534266" y="78.648775" style="stroke: #000000; stroke-width: 0.8"/>
      </g>
     </g>
    </g>
    <g id="ytick_50">
     <g id="line2d_77">
      <g>
       <use xlink:href="#m6583d819d2" x="603.534266" y="205.847658" style="stroke: #000000; stroke-width: 0.6"/>
      </g>
     </g>
    </g>
    <g id="ytick_51">
     <g id="line2d_78">
      <g>
       <use xlink:href="#m6583d819d2" x="603.534266" y="192.664016" style="stroke: #000000; stroke-width: 0.6"/>
      </g>
     </g>
    </g>
    <g id="ytick_52">
     <g id="line2d_79">
      <g>
       <use xlink:href="#m6583d819d2" x="603.534266" y="183.310074" style="stroke: #000000; stroke-width: 0.6"/>
      </g>
     </g>
    </g>
    <g id="ytick_53">
     <g id="line2d_80">
      <g>
       <use xlink:href="#m6583d819d2" x="603.534266" y="176.054592" style="stroke: #000000; stroke-width: 0.6"/>
      </g>
     </g>
    </g>
    <g id="ytick_54">
     <g id="line2d_81">
      <g>
       <use xlink:href="#m6583d819d2" x="603.534266" y="170.126432" style="stroke: #000000; stroke-width: 0.6"/>
      </g>
     </g>
    </g>
    <g id="ytick_55">
     <g id="line2d_82">
      <g>
       <use xlink:href="#m6583d819d2" x="603.534266" y="165.114244" style="stroke: #000000; stroke-width: 0.6"/>
      </g>
     </g>
    </g>
    <g id="ytick_56">
     <g id="line2d_83">
      <g>
       <use xlink:href="#m6583d819d2" x="603.534266" y="160.77249" style="stroke: #000000; stroke-width: 0.6"/>
      </g>
     </g>
    </g>
    <g id="ytick_57">
     <g id="line2d_84">
      <g>
       <use xlink:href="#m6583d819d2" x="603.534266" y="156.942791" style="stroke: #000000; stroke-width: 0.6"/>
      </g>
     </g>
    </g>
    <g id="ytick_58">
     <g id="line2d_85">
      <g>
       <use xlink:href="#m6583d819d2" x="603.534266" y="130.979424" style="stroke: #000000; stroke-width: 0.6"/>
      </g>
     </g>
    </g>
    <g id="ytick_59">
     <g id="line2d_86">
      <g>
       <use xlink:href="#m6583d819d2" x="603.534266" y="117.795783" style="stroke: #000000; stroke-width: 0.6"/>
      </g>
     </g>
    </g>
    <g id="ytick_60">
     <g id="line2d_87">
      <g>
       <use xlink:href="#m6583d819d2" x="603.534266" y="108.44184" style="stroke: #000000; stroke-width: 0.6"/>
      </g>
     </g>
    </g>
    <g id="ytick_61">
     <g id="line2d_88">
      <g>
       <use xlink:href="#m6583d819d2" x="603.534266" y="101.186359" style="stroke: #000000; stroke-width: 0.6"/>
      </g>
     </g>
    </g>
    <g id="ytick_62">
     <g id="line2d_89">
      <g>
       <use xlink:href="#m6583d819d2" x="603.534266" y="95.258199" style="stroke: #000000; stroke-width: 0.6"/>
      </g>
     </g>
    </g>
    <g id="ytick_63">
     <g id="line2d_90">
      <g>
       <use xlink:href="#m6583d819d2" x="603.534266" y="90.246011" style="stroke: #000000; stroke-width: 0.6"/>
      </g>
     </g>
    </g>
    <g id="ytick_64">
     <g id="line2d_91">
      <g>
       <use xlink:href="#m6583d819d2" x="603.534266" y="85.904256" style="stroke: #000000; stroke-width: 0.6"/>
      </g>
     </g>
    </g>
    <g id="ytick_65">
     <g id="line2d_92">
      <g>
       <use xlink:href="#m6583d819d2" x="603.534266" y="82.074557" style="stroke: #000000; stroke-width: 0.6"/>
      </g>
     </g>
    </g>
    <g id="ytick_66">
     <g id="line2d_93">
      <g>
       <use xlink:href="#m6583d819d2" x="603.534266" y="56.111191" style="stroke: #000000; stroke-width: 0.6"/>
      </g>
     </g>
    </g>
    <g id="ytick_67">
     <g id="line2d_94">
      <g>
       <use xlink:href="#m6583d819d2" x="603.534266" y="42.927549" style="stroke: #000000; stroke-width: 0.6"/>
      </g>
     </g>
    </g>
    <g id="ytick_68">
     <g id="line2d_95">
      <g>
       <use xlink:href="#m6583d819d2" x="603.534266" y="33.573606" style="stroke: #000000; stroke-width: 0.6"/>
      </g>
     </g>
    </g>
    <g id="ytick_69">
     <g id="line2d_96">
      <g>
       <use xlink:href="#m6583d819d2" x="603.534266" y="26.318125" style="stroke: #000000; stroke-width: 0.6"/>
      </g>
     </g>
    </g>
   </g>
   <g id="LineCollection_7">
    <path d="M 617.83621 185.899625 
L 617.83621 185.897932 
" clip-path="url(#p55451decf0)" style="fill: none; stroke: #000000; stroke-width: 1.5"/>
    <path d="M 643.261889 190.474699 
L 643.261889 190.472811 
" clip-path="url(#p55451decf0)" style="fill: none; stroke: #000000; stroke-width: 1.5"/>
    <path d="M 668.687568 192.494844 
L 668.687568 192.494844 
" clip-path="url(#p55451decf0)" style="fill: none; stroke: #000000; stroke-width: 1.5"/>
    <path d="M 694.113247 185.927181 
L 694.113247 185.91504 
" clip-path="url(#p55451decf0)" style="fill: none; stroke: #000000; stroke-width: 1.5"/>
    <path d="M 719.538926 186.998245 
L 719.538926 186.994726 
" clip-path="url(#p55451decf0)" style="fill: none; stroke: #000000; stroke-width: 1.5"/>
    <path d="M 744.964605 191.758892 
L 744.964605 191.755291 
" clip-path="url(#p55451decf0)" style="fill: none; stroke: #000000; stroke-width: 1.5"/>
    <path d="M 770.390284 192.12905 
L 770.390284 192.12456 
" clip-path="url(#p55451decf0)" style="fill: none; stroke: #000000; stroke-width: 1.5"/>
    <path d="M 795.815963 196.137152 
L 795.815963 196.125496 
" clip-path="url(#p55451decf0)" style="fill: none; stroke: #000000; stroke-width: 1.5"/>
    <path d="M 821.241642 192.905764 
L 821.241642 192.905764 
" clip-path="url(#p55451decf0)" style="fill: none; stroke: #000000; stroke-width: 1.5"/>
   </g>
   <g id="LineCollection_8">
    <path d="M 624.19263 185.91213 
L 624.19263 185.905032 
" clip-path="url(#p55451decf0)" style="fill: none; stroke: #000000; stroke-width: 1.5"/>
    <path d="M 649.618309 188.140182 
L 649.618309 188.137665 
" clip-path="url(#p55451decf0)" style="fill: none; stroke: #000000; stroke-width: 1.5"/>
    <path d="M 675.043988 196.375387 
L 675.043988 196.375387 
" clip-path="url(#p55451decf0)" style="fill: none; stroke: #000000; stroke-width: 1.5"/>
    <path d="M 700.469667 186.127156 
L 700.469667 186.108164 
" clip-path="url(#p55451decf0)" style="fill: none; stroke: #000000; stroke-width: 1.5"/>
    <path d="M 725.895346 185.935987 
L 725.895346 185.927417 
" clip-path="url(#p55451decf0)" style="fill: none; stroke: #000000; stroke-width: 1.5"/>
    <path d="M 751.321025 190.444066 
L 751.321025 190.437592 
" clip-path="url(#p55451decf0)" style="fill: none; stroke: #000000; stroke-width: 1.5"/>
    <path d="M 776.746704 190.500436 
L 776.746704 190.488698 
" clip-path="url(#p55451decf0)" style="fill: none; stroke: #000000; stroke-width: 1.5"/>
    <path d="M 802.172383 195.90287 
L 802.172383 195.886093 
" clip-path="url(#p55451decf0)" style="fill: none; stroke: #000000; stroke-width: 1.5"/>
    <path d="M 827.598062 188.412795 
L 827.598062 188.380871 
" clip-path="url(#p55451decf0)" style="fill: none; stroke: #000000; stroke-width: 1.5"/>
   </g>
   <g id="LineCollection_9">
    <path d="M 630.54905 58.392839 
L 630.54905 58.391146 
" clip-path="url(#p55451decf0)" style="fill: none; stroke: #000000; stroke-width: 1.5"/>
    <path d="M 655.974729 66.895481 
L 655.974729 66.892964 
" clip-path="url(#p55451decf0)" style="fill: none; stroke: #000000; stroke-width: 1.5"/>
    <path d="M 681.400408 65.850921 
L 681.400408 65.850921 
" clip-path="url(#p55451decf0)" style="fill: none; stroke: #000000; stroke-width: 1.5"/>
    <path d="M 706.826087 70.903045 
L 706.826087 70.570354 
" clip-path="url(#p55451decf0)" style="fill: none; stroke: #000000; stroke-width: 1.5"/>
    <path d="M 732.251766 74.174069 
L 732.251766 74.173468 
" clip-path="url(#p55451decf0)" style="fill: none; stroke: #000000; stroke-width: 1.5"/>
    <path d="M 757.677445 117.628301 
L 757.677445 117.623205 
" clip-path="url(#p55451decf0)" style="fill: none; stroke: #000000; stroke-width: 1.5"/>
    <path d="M 783.103124 122.426386 
L 783.103124 122.421873 
" clip-path="url(#p55451decf0)" style="fill: none; stroke: #000000; stroke-width: 1.5"/>
    <path d="M 808.528803 145.056537 
L 808.528803 145.0405 
" clip-path="url(#p55451decf0)" style="fill: none; stroke: #000000; stroke-width: 1.5"/>
    <path d="M 833.954482 182.745239 
L 833.954482 182.745239 
" clip-path="url(#p55451decf0)" style="fill: none; stroke: #000000; stroke-width: 1.5"/>
   </g>
   <g id="patch_94">
    <path d="M 603.534266 228.385242 
L 603.534266 26.318125 
" style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/>
   </g>
   <g id="patch_95">
    <path d="M 848.256426 228.385242 
L 848.256426 26.318125 
" style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/>
   </g>
   <g id="patch_96">
    <path d="M 603.534266 228.385242 
L 848.256426 228.385242 
" style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/>
   </g>
   <g id="patch_97">
    <path d="M 603.534266 26.318125 
L 848.256426 26.318125 
" style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/>
   </g>
   <g id="text_34">
    <!-- ML-KEM-1024 -->
    <g transform="translate(684.978158 16.318125) scale(0.12 -0.12)">
     <defs>
      <path id="DejaVuSans-34" d="M 2419 4116 
L 825 1625 
L 2419 1625 
L 2419 4116 
z
M 2253 4666 
L 3047 4666 
L 3047 1625 
L 3713 1625 
L 3713 1100 
L 3047 1100 
L 3047 0 
L 2419 0 
L 2419 1100 
L 313 1100 
L 313 1709 
L 2253 4666 
z
" transform="scale(0.015625)"/>
     </defs>
     <use xlink:href="#DejaVuSans-4d"/>
     <use xlink:href="#DejaVuSans-4c" transform="translate(86.279297 0)"/>
     <use xlink:href="#DejaVuSans-2d" transform="translate(140.242188 0)"/>
     <use xlink:href="#DejaVuSans-4b" transform="translate(176.326172 0)"/>
     <use xlink:href="#DejaVuSans-45" transform="translate(241.902344 0)"/>
     <use xlink:href="#DejaVuSans-4d" transform="translate(305.085938 0)"/>
     <use xlink:href="#DejaVuSans-2d" transform="translate(391.365234 0)"/>
     <use xlink:href="#DejaVuSans-31" transform="translate(427.449219 0)"/>
     <use xlink:href="#DejaVuSans-30" transform="translate(491.072266 0)"/>
     <use xlink:href="#DejaVuSans-32" transform="translate(554.695312 0)"/>
     <use xlink:href="#DejaVuSans-34" transform="translate(618.318359 0)"/>
    </g>
   </g>
   <g id="legend_1">
    <g id="patch_98">
     <path d="M 747.082068 40.144623 
L 763.742068 40.144623 
L 763.742068 34.313623 
L 747.082068 34.313623 
z
" style="fill: #333333"/>
    </g>
    <g id="text_35">
     <!-- O3 (no auto-vec) -->
     <g transform="translate(770.406068 40.144623) scale(0.0833 -0.0833)">
      <defs>
       <path id="DejaVuSans-33" d="M 2597 2516 
Q 3050 2419 3304 2112 
Q 3559 1806 3559 1356 
Q 3559 666 3084 287 
Q 2609 -91 1734 -91 
Q 1441 -91 1130 -33 
Q 819 25 488 141 
L 488 750 
Q 750 597 1062 519 
Q 1375 441 1716 441 
Q 2309 441 2620 675 
Q 2931 909 2931 1356 
Q 2931 1769 2642 2001 
Q 2353 2234 1838 2234 
L 1294 2234 
L 1294 2753 
L 1863 2753 
Q 2328 2753 2575 2939 
Q 2822 3125 2822 3475 
Q 2822 3834 2567 4026 
Q 2313 4219 1838 4219 
Q 1578 4219 1281 4162 
Q 984 4106 628 3988 
L 628 4550 
Q 988 4650 1302 4700 
Q 1616 4750 1894 4750 
Q 2613 4750 3031 4423 
Q 3450 4097 3450 3541 
Q 3450 3153 3228 2886 
Q 3006 2619 2597 2516 
z
" transform="scale(0.015625)"/>
       <path id="DejaVuSans-74" d="M 1172 4494 
L 1172 3500 
L 2356 3500 
L 2356 3053 
L 1172 3053 
L 1172 1153 
Q 1172 725 1289 603 
Q 1406 481 1766 481 
L 2356 481 
L 2356 0 
L 1766 0 
Q 1100 0 847 248 
Q 594 497 594 1153 
L 594 3053 
L 172 3053 
L 172 3500 
L 594 3500 
L 594 4494 
L 1172 4494 
z
" transform="scale(0.015625)"/>
      </defs>
      <use xlink:href="#DejaVuSans-4f"/>
      <use xlink:href="#DejaVuSans-33" transform="translate(78.710938 0)"/>
      <use xlink:href="#DejaVuSans-20" transform="translate(142.333984 0)"/>
      <use xlink:href="#DejaVuSans-28" transform="translate(174.121094 0)"/>
      <use xlink:href="#DejaVuSans-6e" transform="translate(213.134766 0)"/>
      <use xlink:href="#DejaVuSans-6f" transform="translate(276.513672 0)"/>
      <use xlink:href="#DejaVuSans-20" transform="translate(337.695312 0)"/>
      <use xlink:href="#DejaVuSans-61" transform="translate(369.482422 0)"/>
      <use xlink:href="#DejaVuSans-75" transform="translate(430.761719 0)"/>
      <use xlink:href="#DejaVuSans-74" transform="translate(494.140625 0)"/>
      <use xlink:href="#DejaVuSans-6f" transform="translate(533.349609 0)"/>
      <use xlink:href="#DejaVuSans-2d" transform="translate(596.40625 0)"/>
      <use xlink:href="#DejaVuSans-76" transform="translate(629.865234 0)"/>
      <use xlink:href="#DejaVuSans-65" transform="translate(689.044922 0)"/>
      <use xlink:href="#DejaVuSans-63" transform="translate(750.568359 0)"/>
      <use xlink:href="#DejaVuSans-29" transform="translate(805.548828 0)"/>
     </g>
    </g>
    <g id="patch_99">
     <path d="M 747.082068 52.371502 
L 763.742068 52.371502 
L 763.742068 46.540502 
L 747.082068 46.540502 
z
" style="fill: #777777"/>
    </g>
    <g id="text_36">
     <!-- O3 + auto-vec -->
     <g transform="translate(770.406068 52.371502) scale(0.0833 -0.0833)">
      <defs>
       <path id="DejaVuSans-2b" d="M 2944 4013 
L 2944 2272 
L 4684 2272 
L 4684 1741 
L 2944 1741 
L 2944 0 
L 2419 0 
L 2419 1741 
L 678 1741 
L 678 2272 
L 2419 2272 
L 2419 4013 
L 2944 4013 
z
" transform="scale(0.015625)"/>
      </defs>
      <use xlink:href="#DejaVuSans-4f"/>
      <use xlink:href="#DejaVuSans-33" transform="translate(78.710938 0)"/>
      <use xlink:href="#DejaVuSans-20" transform="translate(142.333984 0)"/>
      <use xlink:href="#DejaVuSans-2b" transform="translate(174.121094 0)"/>
      <use xlink:href="#DejaVuSans-20" transform="translate(257.910156 0)"/>
      <use xlink:href="#DejaVuSans-61" transform="translate(289.697266 0)"/>
      <use xlink:href="#DejaVuSans-75" transform="translate(350.976562 0)"/>
      <use xlink:href="#DejaVuSans-74" transform="translate(414.355469 0)"/>
      <use xlink:href="#DejaVuSans-6f" transform="translate(453.564453 0)"/>
      <use xlink:href="#DejaVuSans-2d" transform="translate(516.621094 0)"/>
      <use xlink:href="#DejaVuSans-76" transform="translate(550.080078 0)"/>
      <use xlink:href="#DejaVuSans-65" transform="translate(609.259766 0)"/>
      <use xlink:href="#DejaVuSans-63" transform="translate(670.783203 0)"/>
     </g>
    </g>
    <g id="patch_100">
     <path d="M 747.082068 64.59838 
L 763.742068 64.59838 
L 763.742068 58.76738 
L 747.082068 58.76738 
z
" style="fill: #bbbbbb"/>
    </g>
    <g id="text_37">
     <!-- O3 + hand SIMD -->
     <g transform="translate(770.406068 64.59838) scale(0.0833 -0.0833)">
      <defs>
       <path id="DejaVuSans-68" d="M 3513 2113 
L 3513 0 
L 2938 0 
L 2938 2094 
Q 2938 2591 2744 2837 
Q 2550 3084 2163 3084 
Q 1697 3084 1428 2787 
Q 1159 2491 1159 1978 
L 1159 0 
L 581 0 
L 581 4863 
L 1159 4863 
L 1159 2956 
Q 1366 3272 1645 3428 
Q 1925 3584 2291 3584 
Q 2894 3584 3203 3211 
Q 3513 2838 3513 2113 
z
" transform="scale(0.015625)"/>
      </defs>
      <use xlink:href="#DejaVuSans-4f"/>
      <use xlink:href="#DejaVuSans-33" transform="translate(78.710938 0)"/>
      <use xlink:href="#DejaVuSans-20" transform="translate(142.333984 0)"/>
      <use xlink:href="#DejaVuSans-2b" transform="translate(174.121094 0)"/>
      <use xlink:href="#DejaVuSans-20" transform="translate(257.910156 0)"/>
      <use xlink:href="#DejaVuSans-68" transform="translate(289.697266 0)"/>
      <use xlink:href="#DejaVuSans-61" transform="translate(353.076172 0)"/>
      <use xlink:href="#DejaVuSans-6e" transform="translate(414.355469 0)"/>
      <use xlink:href="#DejaVuSans-64" transform="translate(477.734375 0)"/>
      <use xlink:href="#DejaVuSans-20" transform="translate(541.210938 0)"/>
      <use xlink:href="#DejaVuSans-53" transform="translate(572.998047 0)"/>
      <use xlink:href="#DejaVuSans-49" transform="translate(636.474609 0)"/>
      <use xlink:href="#DejaVuSans-4d" transform="translate(665.966797 0)"/>
      <use xlink:href="#DejaVuSans-44" transform="translate(752.246094 0)"/>
     </g>
    </g>
   </g>
  </g>
 </g>
 <defs>
  <clipPath id="p7ad6d2ef96">
   <rect x="59.3" y="26.318125" width="244.722161" height="202.067117"/>
  </clipPath>
  <clipPath id="pd6588226ed">
   <rect x="331.417133" y="26.318125" width="244.722161" height="202.067117"/>
  </clipPath>
  <clipPath id="p55451decf0">
   <rect x="603.534266" y="26.318125" width="244.722161" height="202.067117"/>
  </clipPath>
 </defs>
</svg>
<figcaption class="viz-caption">Cumulative speedup at each optimization stage, normalized to `refo0` (1×). Three bars per operation: O3 no auto-vec, O3 + auto-vec, O3 + hand SIMD (AVX2). Log $y$-axis; 95% bootstrap CI shown on `avx2` bars. Sorted by `avx2` speedup.</figcaption></figure>
<h3 id="hand-written-simd-speedup">Hand-Written SIMD Speedup</h3>
<p>The figure isolates the hand-written <abbr class="smallcaps">SIMD</abbr> speedup (<code>ref</code> <span class="math inline">\to</span> <code>avx2</code>) across all three <abbr class="smallcaps">ML-KEM</abbr> parameter sets. The table summarizes the numerical values.</p>
<p>Key observations:</p>
<ul>
<li><strong>Arithmetic operations</strong> achieve the largest speedups: <span class="math inline">56.3\times</span> for <code>INVNTT</code> at ML-KEM-512, <span class="math inline">52.0\times</span> for <code>basemul</code>, and <span class="math inline">45.6\times</span> for <code>frommsg</code>. The 95% bootstrap CIs on these ratios are extremely tight (often <span class="math inline">[\hat{s}, \hat{s}]</span> to two decimal places), reflecting near-perfect measurement stability.</li>
<li><strong>gen_a</strong> achieves <span class="math inline">3.8\times</span>–<span class="math inline">4.7\times</span>: substantially smaller than arithmetic operations because SHAKE-128 generation is memory-bandwidth limited.</li>
<li><strong>Noise sampling</strong> achieves only <span class="math inline">1.2\times</span>–<span class="math inline">1.4\times</span>, the smallest <abbr class="smallcaps">SIMD</abbr> benefit. The centered binomial distribution (CBD) sampler is bit-manipulation-heavy with sequential bitstream reads that do not parallelise well.</li>
<li>Speedups are broadly consistent across parameter sets for per-polynomial operations, as expected (the corresponding section).</li>
</ul>
<figure class="viz-figure"><?xml version="1.0" encoding="utf-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
  "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg xmlns:xlink="http://www.w3.org/1999/xlink" width="711.456426pt" height="280.301354pt" viewBox="0 0 711.456426 280.301354" xmlns="http://www.w3.org/2000/svg" version="1.1">
 <metadata>
  <rdf:RDF xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
   <cc:Work>
    <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
    <dc:date>2026-04-26T19:42:52.750279</dc:date>
    <dc:format>image/svg+xml</dc:format>
    <dc:creator>
     <cc:Agent>
      <dc:title>Matplotlib v3.10.9, https://matplotlib.org/</dc:title>
     </cc:Agent>
    </dc:creator>
   </cc:Work>
  </rdf:RDF>
 </metadata>
 <defs>
  <style type="text/css">*{stroke-linejoin: round; stroke-linecap: butt}</style>
 </defs>
 <g id="figure_1">
  <g id="patch_1">
   <path d="M 0 280.301354 
L 711.456426 280.301354 
L 711.456426 0 
L 0 0 
L 0 280.301354 
z
" style="fill: none"/>
  </g>
  <g id="axes_1">
   <g id="patch_2">
    <path d="M 59.3 227.746336 
L 704.256426 227.746336 
L 704.256426 10.999219 
L 59.3 10.999219 
L 59.3 227.746336 
z
" style="fill: none"/>
   </g>
   <g id="patch_3">
    <path d="M 88.616201 108601.304802 
L 105.368316 108601.304802 
L 105.368316 38.070236 
L 88.616201 38.070236 
z
" clip-path="url(#p1ed493ed7d)" style="fill: #333333"/>
   </g>
   <g id="patch_4">
    <path d="M 155.624661 108601.304802 
L 172.376776 108601.304802 
L 172.376776 41.740267 
L 155.624661 41.740267 
z
" clip-path="url(#p1ed493ed7d)" style="fill: #333333"/>
   </g>
   <g id="patch_5">
    <path d="M 222.633121 108601.304802 
L 239.385236 108601.304802 
L 239.385236 47.914198 
L 222.633121 47.914198 
z
" clip-path="url(#p1ed493ed7d)" style="fill: #333333"/>
   </g>
   <g id="patch_6">
    <path d="M 289.641581 108601.304802 
L 306.393696 108601.304802 
L 306.393696 59.707696 
L 289.641581 59.707696 
z
" clip-path="url(#p1ed493ed7d)" style="fill: #333333"/>
   </g>
   <g id="patch_7">
    <path d="M 356.650041 108601.304802 
L 373.402156 108601.304802 
L 373.402156 60.342593 
L 356.650041 60.342593 
z
" clip-path="url(#p1ed493ed7d)" style="fill: #333333"/>
   </g>
   <g id="patch_8">
    <path d="M 423.658501 108601.304802 
L 440.410616 108601.304802 
L 440.410616 119.494485 
L 423.658501 119.494485 
z
" clip-path="url(#p1ed493ed7d)" style="fill: #333333"/>
   </g>
   <g id="patch_9">
    <path d="M 490.66696 108601.304802 
L 507.419075 108601.304802 
L 507.419075 128.091564 
L 490.66696 128.091564 
z
" clip-path="url(#p1ed493ed7d)" style="fill: #333333"/>
   </g>
   <g id="patch_10">
    <path d="M 557.67542 108601.304802 
L 574.427535 108601.304802 
L 574.427535 155.317433 
L 557.67542 155.317433 
z
" clip-path="url(#p1ed493ed7d)" style="fill: #333333"/>
   </g>
   <g id="patch_11">
    <path d="M 624.68388 108601.304802 
L 641.435995 108601.304802 
L 641.435995 212.302946 
L 624.68388 212.302946 
z
" clip-path="url(#p1ed493ed7d)" style="fill: #333333"/>
   </g>
   <g id="patch_12">
    <path d="M 105.368316 108601.304802 
L 122.120431 108601.304802 
L 122.120431 41.570797 
L 105.368316 41.570797 
z
" clip-path="url(#p1ed493ed7d)" style="fill: #777777"/>
   </g>
   <g id="patch_13">
    <path d="M 172.376776 108601.304802 
L 189.128891 108601.304802 
L 189.128891 45.960268 
L 172.376776 45.960268 
z
" clip-path="url(#p1ed493ed7d)" style="fill: #777777"/>
   </g>
   <g id="patch_14">
    <path d="M 239.385236 108601.304802 
L 256.137351 108601.304802 
L 256.137351 44.426229 
L 239.385236 44.426229 
z
" clip-path="url(#p1ed493ed7d)" style="fill: #777777"/>
   </g>
   <g id="patch_15">
    <path d="M 306.393696 108601.304802 
L 323.145811 108601.304802 
L 323.145811 54.847718 
L 306.393696 54.847718 
z
" clip-path="url(#p1ed493ed7d)" style="fill: #777777"/>
   </g>
   <g id="patch_16">
    <path d="M 373.402156 108601.304802 
L 390.154271 108601.304802 
L 390.154271 60.4184 
L 373.402156 60.4184 
z
" clip-path="url(#p1ed493ed7d)" style="fill: #777777"/>
   </g>
   <g id="patch_17">
    <path d="M 440.410616 108601.304802 
L 457.16273 108601.304802 
L 457.16273 122.154967 
L 440.410616 122.154967 
z
" clip-path="url(#p1ed493ed7d)" style="fill: #777777"/>
   </g>
   <g id="patch_18">
    <path d="M 507.419075 108601.304802 
L 524.17119 108601.304802 
L 524.17119 132.385754 
L 507.419075 132.385754 
z
" clip-path="url(#p1ed493ed7d)" style="fill: #777777"/>
   </g>
   <g id="patch_19">
    <path d="M 574.427535 108601.304802 
L 591.17965 108601.304802 
L 591.17965 164.411782 
L 574.427535 164.411782 
z
" clip-path="url(#p1ed493ed7d)" style="fill: #777777"/>
   </g>
   <g id="patch_20">
    <path d="M 641.435995 108601.304802 
L 658.18811 108601.304802 
L 658.18811 213.336962 
L 641.435995 213.336962 
z
" clip-path="url(#p1ed493ed7d)" style="fill: #777777"/>
   </g>
   <g id="patch_21">
    <path d="M 122.120431 108601.304802 
L 138.872546 108601.304802 
L 138.872546 43.159112 
L 122.120431 43.159112 
z
" clip-path="url(#p1ed493ed7d)" style="fill: #bbbbbb"/>
   </g>
   <g id="patch_22">
    <path d="M 189.128891 108601.304802 
L 205.881006 108601.304802 
L 205.881006 52.241732 
L 189.128891 52.241732 
z
" clip-path="url(#p1ed493ed7d)" style="fill: #bbbbbb"/>
   </g>
   <g id="patch_23">
    <path d="M 256.137351 108601.304802 
L 272.889466 108601.304802 
L 272.889466 38.80905 
L 256.137351 38.80905 
z
" clip-path="url(#p1ed493ed7d)" style="fill: #bbbbbb"/>
   </g>
   <g id="patch_24">
    <path d="M 323.145811 108601.304802 
L 339.897926 108601.304802 
L 339.897926 60.970422 
L 323.145811 60.970422 
z
" clip-path="url(#p1ed493ed7d)" style="fill: #bbbbbb"/>
   </g>
   <g id="patch_25">
    <path d="M 390.154271 108601.304802 
L 406.906386 108601.304802 
L 406.906386 65.974272 
L 390.154271 65.974272 
z
" clip-path="url(#p1ed493ed7d)" style="fill: #bbbbbb"/>
   </g>
   <g id="patch_26">
    <path d="M 457.16273 108601.304802 
L 473.914845 108601.304802 
L 473.914845 122.344315 
L 457.16273 122.344315 
z
" clip-path="url(#p1ed493ed7d)" style="fill: #bbbbbb"/>
   </g>
   <g id="patch_27">
    <path d="M 524.17119 108601.304802 
L 540.923305 108601.304802 
L 540.923305 129.212532 
L 524.17119 129.212532 
z
" clip-path="url(#p1ed493ed7d)" style="fill: #bbbbbb"/>
   </g>
   <g id="patch_28">
    <path d="M 591.17965 108601.304802 
L 607.931765 108601.304802 
L 607.931765 154.14556 
L 591.17965 154.14556 
z
" clip-path="url(#p1ed493ed7d)" style="fill: #bbbbbb"/>
   </g>
   <g id="patch_29">
    <path d="M 658.18811 108601.304802 
L 674.940225 108601.304802 
L 674.940225 219.542412 
L 658.18811 219.542412 
z
" clip-path="url(#p1ed493ed7d)" style="fill: #bbbbbb"/>
   </g>
   <g id="matplotlib.axis_1">
    <g id="xtick_1">
     <g id="line2d_1">
      <defs>
       <path id="m56425b7b0e" d="M 0 0 
L 0 3.5 
" style="stroke: #000000; stroke-width: 0.8"/>
      </defs>
      <g>
       <use xlink:href="#m56425b7b0e" x="113.744374" y="227.746336" style="stroke: #000000; stroke-width: 0.8"/>
      </g>
     </g>
     <g id="text_1">
      <!-- INVNTT -->
      <g transform="translate(86.256702 266.136352) rotate(-45) scale(0.1 -0.1)">
       <defs>
        <path id="DejaVuSans-49" d="M 628 4666 
L 1259 4666 
L 1259 0 
L 628 0 
L 628 4666 
z
" transform="scale(0.015625)"/>
        <path id="DejaVuSans-4e" d="M 628 4666 
L 1478 4666 
L 3547 763 
L 3547 4666 
L 4159 4666 
L 4159 0 
L 3309 0 
L 1241 3903 
L 1241 0 
L 628 0 
L 628 4666 
z
" transform="scale(0.015625)"/>
        <path id="DejaVuSans-56" d="M 1831 0 
L 50 4666 
L 709 4666 
L 2188 738 
L 3669 4666 
L 4325 4666 
L 2547 0 
L 1831 0 
z
" transform="scale(0.015625)"/>
        <path id="DejaVuSans-54" d="M -19 4666 
L 3928 4666 
L 3928 4134 
L 2272 4134 
L 2272 0 
L 1638 0 
L 1638 4134 
L -19 4134 
L -19 4666 
z
" transform="scale(0.015625)"/>
       </defs>
       <use xlink:href="#DejaVuSans-49"/>
       <use xlink:href="#DejaVuSans-4e" transform="translate(29.492188 0)"/>
       <use xlink:href="#DejaVuSans-56" transform="translate(104.296875 0)"/>
       <use xlink:href="#DejaVuSans-4e" transform="translate(172.705078 0)"/>
       <use xlink:href="#DejaVuSans-54" transform="translate(247.509766 0)"/>
       <use xlink:href="#DejaVuSans-54" transform="translate(306.84375 0)"/>
      </g>
     </g>
    </g>
    <g id="xtick_2">
     <g id="line2d_2">
      <g>
       <use xlink:href="#m56425b7b0e" x="180.752834" y="227.746336" style="stroke: #000000; stroke-width: 0.8"/>
      </g>
     </g>
     <g id="text_2">
      <!-- basemul -->
      <g transform="translate(149.092127 270.309387) rotate(-45) scale(0.1 -0.1)">
       <defs>
        <path id="DejaVuSans-62" d="M 3116 1747 
Q 3116 2381 2855 2742 
Q 2594 3103 2138 3103 
Q 1681 3103 1420 2742 
Q 1159 2381 1159 1747 
Q 1159 1113 1420 752 
Q 1681 391 2138 391 
Q 2594 391 2855 752 
Q 3116 1113 3116 1747 
z
M 1159 2969 
Q 1341 3281 1617 3432 
Q 1894 3584 2278 3584 
Q 2916 3584 3314 3078 
Q 3713 2572 3713 1747 
Q 3713 922 3314 415 
Q 2916 -91 2278 -91 
Q 1894 -91 1617 61 
Q 1341 213 1159 525 
L 1159 0 
L 581 0 
L 581 4863 
L 1159 4863 
L 1159 2969 
z
" transform="scale(0.015625)"/>
        <path id="DejaVuSans-61" d="M 2194 1759 
Q 1497 1759 1228 1600 
Q 959 1441 959 1056 
Q 959 750 1161 570 
Q 1363 391 1709 391 
Q 2188 391 2477 730 
Q 2766 1069 2766 1631 
L 2766 1759 
L 2194 1759 
z
M 3341 1997 
L 3341 0 
L 2766 0 
L 2766 531 
Q 2569 213 2275 61 
Q 1981 -91 1556 -91 
Q 1019 -91 701 211 
Q 384 513 384 1019 
Q 384 1609 779 1909 
Q 1175 2209 1959 2209 
L 2766 2209 
L 2766 2266 
Q 2766 2663 2505 2880 
Q 2244 3097 1772 3097 
Q 1472 3097 1187 3025 
Q 903 2953 641 2809 
L 641 3341 
Q 956 3463 1253 3523 
Q 1550 3584 1831 3584 
Q 2591 3584 2966 3190 
Q 3341 2797 3341 1997 
z
" transform="scale(0.015625)"/>
        <path id="DejaVuSans-73" d="M 2834 3397 
L 2834 2853 
Q 2591 2978 2328 3040 
Q 2066 3103 1784 3103 
Q 1356 3103 1142 2972 
Q 928 2841 928 2578 
Q 928 2378 1081 2264 
Q 1234 2150 1697 2047 
L 1894 2003 
Q 2506 1872 2764 1633 
Q 3022 1394 3022 966 
Q 3022 478 2636 193 
Q 2250 -91 1575 -91 
Q 1294 -91 989 -36 
Q 684 19 347 128 
L 347 722 
Q 666 556 975 473 
Q 1284 391 1588 391 
Q 1994 391 2212 530 
Q 2431 669 2431 922 
Q 2431 1156 2273 1281 
Q 2116 1406 1581 1522 
L 1381 1569 
Q 847 1681 609 1914 
Q 372 2147 372 2553 
Q 372 3047 722 3315 
Q 1072 3584 1716 3584 
Q 2034 3584 2315 3537 
Q 2597 3491 2834 3397 
z
" transform="scale(0.015625)"/>
        <path id="DejaVuSans-65" d="M 3597 1894 
L 3597 1613 
L 953 1613 
Q 991 1019 1311 708 
Q 1631 397 2203 397 
Q 2534 397 2845 478 
Q 3156 559 3463 722 
L 3463 178 
Q 3153 47 2828 -22 
Q 2503 -91 2169 -91 
Q 1331 -91 842 396 
Q 353 884 353 1716 
Q 353 2575 817 3079 
Q 1281 3584 2069 3584 
Q 2775 3584 3186 3129 
Q 3597 2675 3597 1894 
z
M 3022 2063 
Q 3016 2534 2758 2815 
Q 2500 3097 2075 3097 
Q 1594 3097 1305 2825 
Q 1016 2553 972 2059 
L 3022 2063 
z
" transform="scale(0.015625)"/>
        <path id="DejaVuSans-6d" d="M 3328 2828 
Q 3544 3216 3844 3400 
Q 4144 3584 4550 3584 
Q 5097 3584 5394 3201 
Q 5691 2819 5691 2113 
L 5691 0 
L 5113 0 
L 5113 2094 
Q 5113 2597 4934 2840 
Q 4756 3084 4391 3084 
Q 3944 3084 3684 2787 
Q 3425 2491 3425 1978 
L 3425 0 
L 2847 0 
L 2847 2094 
Q 2847 2600 2669 2842 
Q 2491 3084 2119 3084 
Q 1678 3084 1418 2786 
Q 1159 2488 1159 1978 
L 1159 0 
L 581 0 
L 581 3500 
L 1159 3500 
L 1159 2956 
Q 1356 3278 1631 3431 
Q 1906 3584 2284 3584 
Q 2666 3584 2933 3390 
Q 3200 3197 3328 2828 
z
" transform="scale(0.015625)"/>
        <path id="DejaVuSans-75" d="M 544 1381 
L 544 3500 
L 1119 3500 
L 1119 1403 
Q 1119 906 1312 657 
Q 1506 409 1894 409 
Q 2359 409 2629 706 
Q 2900 1003 2900 1516 
L 2900 3500 
L 3475 3500 
L 3475 0 
L 2900 0 
L 2900 538 
Q 2691 219 2414 64 
Q 2138 -91 1772 -91 
Q 1169 -91 856 284 
Q 544 659 544 1381 
z
M 1991 3584 
L 1991 3584 
z
" transform="scale(0.015625)"/>
        <path id="DejaVuSans-6c" d="M 603 4863 
L 1178 4863 
L 1178 0 
L 603 0 
L 603 4863 
z
" transform="scale(0.015625)"/>
       </defs>
       <use xlink:href="#DejaVuSans-62"/>
       <use xlink:href="#DejaVuSans-61" transform="translate(63.476562 0)"/>
       <use xlink:href="#DejaVuSans-73" transform="translate(124.755859 0)"/>
       <use xlink:href="#DejaVuSans-65" transform="translate(176.855469 0)"/>
       <use xlink:href="#DejaVuSans-6d" transform="translate(238.378906 0)"/>
       <use xlink:href="#DejaVuSans-75" transform="translate(335.791016 0)"/>
       <use xlink:href="#DejaVuSans-6c" transform="translate(399.169922 0)"/>
      </g>
     </g>
    </g>
    <g id="xtick_3">
     <g id="line2d_3">
      <g>
       <use xlink:href="#m56425b7b0e" x="247.761293" y="227.746336" style="stroke: #000000; stroke-width: 0.8"/>
      </g>
     </g>
     <g id="text_3">
      <!-- frommsg -->
      <g transform="translate(214.779181 271.630793) rotate(-45) scale(0.1 -0.1)">
       <defs>
        <path id="DejaVuSans-66" d="M 2375 4863 
L 2375 4384 
L 1825 4384 
Q 1516 4384 1395 4259 
Q 1275 4134 1275 3809 
L 1275 3500 
L 2222 3500 
L 2222 3053 
L 1275 3053 
L 1275 0 
L 697 0 
L 697 3053 
L 147 3053 
L 147 3500 
L 697 3500 
L 697 3744 
Q 697 4328 969 4595 
Q 1241 4863 1831 4863 
L 2375 4863 
z
" transform="scale(0.015625)"/>
        <path id="DejaVuSans-72" d="M 2631 2963 
Q 2534 3019 2420 3045 
Q 2306 3072 2169 3072 
Q 1681 3072 1420 2755 
Q 1159 2438 1159 1844 
L 1159 0 
L 581 0 
L 581 3500 
L 1159 3500 
L 1159 2956 
Q 1341 3275 1631 3429 
Q 1922 3584 2338 3584 
Q 2397 3584 2469 3576 
Q 2541 3569 2628 3553 
L 2631 2963 
z
" transform="scale(0.015625)"/>
        <path id="DejaVuSans-6f" d="M 1959 3097 
Q 1497 3097 1228 2736 
Q 959 2375 959 1747 
Q 959 1119 1226 758 
Q 1494 397 1959 397 
Q 2419 397 2687 759 
Q 2956 1122 2956 1747 
Q 2956 2369 2687 2733 
Q 2419 3097 1959 3097 
z
M 1959 3584 
Q 2709 3584 3137 3096 
Q 3566 2609 3566 1747 
Q 3566 888 3137 398 
Q 2709 -91 1959 -91 
Q 1206 -91 779 398 
Q 353 888 353 1747 
Q 353 2609 779 3096 
Q 1206 3584 1959 3584 
z
" transform="scale(0.015625)"/>
        <path id="DejaVuSans-67" d="M 2906 1791 
Q 2906 2416 2648 2759 
Q 2391 3103 1925 3103 
Q 1463 3103 1205 2759 
Q 947 2416 947 1791 
Q 947 1169 1205 825 
Q 1463 481 1925 481 
Q 2391 481 2648 825 
Q 2906 1169 2906 1791 
z
M 3481 434 
Q 3481 -459 3084 -895 
Q 2688 -1331 1869 -1331 
Q 1566 -1331 1297 -1286 
Q 1028 -1241 775 -1147 
L 775 -588 
Q 1028 -725 1275 -790 
Q 1522 -856 1778 -856 
Q 2344 -856 2625 -561 
Q 2906 -266 2906 331 
L 2906 616 
Q 2728 306 2450 153 
Q 2172 0 1784 0 
Q 1141 0 747 490 
Q 353 981 353 1791 
Q 353 2603 747 3093 
Q 1141 3584 1784 3584 
Q 2172 3584 2450 3431 
Q 2728 3278 2906 2969 
L 2906 3500 
L 3481 3500 
L 3481 434 
z
" transform="scale(0.015625)"/>
       </defs>
       <use xlink:href="#DejaVuSans-66"/>
       <use xlink:href="#DejaVuSans-72" transform="translate(35.205078 0)"/>
       <use xlink:href="#DejaVuSans-6f" transform="translate(74.068359 0)"/>
       <use xlink:href="#DejaVuSans-6d" transform="translate(135.25 0)"/>
       <use xlink:href="#DejaVuSans-6d" transform="translate(232.662109 0)"/>
       <use xlink:href="#DejaVuSans-73" transform="translate(330.074219 0)"/>
       <use xlink:href="#DejaVuSans-67" transform="translate(382.173828 0)"/>
      </g>
     </g>
    </g>
    <g id="xtick_4">
     <g id="line2d_4">
      <g>
       <use xlink:href="#m56425b7b0e" x="314.769753" y="227.746336" style="stroke: #000000; stroke-width: 0.8"/>
      </g>
     </g>
     <g id="text_4">
      <!-- NTT -->
      <g transform="translate(299.495142 253.923293) rotate(-45) scale(0.1 -0.1)">
       <use xlink:href="#DejaVuSans-4e"/>
       <use xlink:href="#DejaVuSans-54" transform="translate(74.804688 0)"/>
       <use xlink:href="#DejaVuSans-54" transform="translate(134.138672 0)"/>
      </g>
     </g>
    </g>
    <g id="xtick_5">
     <g id="line2d_5">
      <g>
       <use xlink:href="#m56425b7b0e" x="381.778213" y="227.746336" style="stroke: #000000; stroke-width: 0.8"/>
      </g>
     </g>
     <g id="text_5">
      <!-- iDec -->
      <g transform="translate(364.6596 255.767294) rotate(-45) scale(0.1 -0.1)">
       <defs>
        <path id="DejaVuSans-69" d="M 603 3500 
L 1178 3500 
L 1178 0 
L 603 0 
L 603 3500 
z
M 603 4863 
L 1178 4863 
L 1178 4134 
L 603 4134 
L 603 4863 
z
" transform="scale(0.015625)"/>
        <path id="DejaVuSans-44" d="M 1259 4147 
L 1259 519 
L 2022 519 
Q 2988 519 3436 956 
Q 3884 1394 3884 2338 
Q 3884 3275 3436 3711 
Q 2988 4147 2022 4147 
L 1259 4147 
z
M 628 4666 
L 1925 4666 
Q 3281 4666 3915 4102 
Q 4550 3538 4550 2338 
Q 4550 1131 3912 565 
Q 3275 0 1925 0 
L 628 0 
L 628 4666 
z
" transform="scale(0.015625)"/>
        <path id="DejaVuSans-63" d="M 3122 3366 
L 3122 2828 
Q 2878 2963 2633 3030 
Q 2388 3097 2138 3097 
Q 1578 3097 1268 2742 
Q 959 2388 959 1747 
Q 959 1106 1268 751 
Q 1578 397 2138 397 
Q 2388 397 2633 464 
Q 2878 531 3122 666 
L 3122 134 
Q 2881 22 2623 -34 
Q 2366 -91 2075 -91 
Q 1284 -91 818 406 
Q 353 903 353 1747 
Q 353 2603 823 3093 
Q 1294 3584 2113 3584 
Q 2378 3584 2631 3529 
Q 2884 3475 3122 3366 
z
" transform="scale(0.015625)"/>
       </defs>
       <use xlink:href="#DejaVuSans-69"/>
       <use xlink:href="#DejaVuSans-44" transform="translate(27.783203 0)"/>
       <use xlink:href="#DejaVuSans-65" transform="translate(104.785156 0)"/>
       <use xlink:href="#DejaVuSans-63" transform="translate(166.308594 0)"/>
      </g>
     </g>
    </g>
    <g id="xtick_6">
     <g id="line2d_6">
      <g>
       <use xlink:href="#m56425b7b0e" x="448.786673" y="227.746336" style="stroke: #000000; stroke-width: 0.8"/>
      </g>
     </g>
     <g id="text_6">
      <!-- iEnc -->
      <g transform="translate(432.514378 254.920976) rotate(-45) scale(0.1 -0.1)">
       <defs>
        <path id="DejaVuSans-45" d="M 628 4666 
L 3578 4666 
L 3578 4134 
L 1259 4134 
L 1259 2753 
L 3481 2753 
L 3481 2222 
L 1259 2222 
L 1259 531 
L 3634 531 
L 3634 0 
L 628 0 
L 628 4666 
z
" transform="scale(0.015625)"/>
        <path id="DejaVuSans-6e" d="M 3513 2113 
L 3513 0 
L 2938 0 
L 2938 2094 
Q 2938 2591 2744 2837 
Q 2550 3084 2163 3084 
Q 1697 3084 1428 2787 
Q 1159 2491 1159 1978 
L 1159 0 
L 581 0 
L 581 3500 
L 1159 3500 
L 1159 2956 
Q 1366 3272 1645 3428 
Q 1925 3584 2291 3584 
Q 2894 3584 3203 3211 
Q 3513 2838 3513 2113 
z
" transform="scale(0.015625)"/>
       </defs>
       <use xlink:href="#DejaVuSans-69"/>
       <use xlink:href="#DejaVuSans-45" transform="translate(27.783203 0)"/>
       <use xlink:href="#DejaVuSans-6e" transform="translate(90.966797 0)"/>
       <use xlink:href="#DejaVuSans-63" transform="translate(154.345703 0)"/>
      </g>
     </g>
    </g>
    <g id="xtick_7">
     <g id="line2d_7">
      <g>
       <use xlink:href="#m56425b7b0e" x="515.795133" y="227.746336" style="stroke: #000000; stroke-width: 0.8"/>
      </g>
     </g>
     <g id="text_7">
      <!-- iKeypair -->
      <g transform="translate(485.846951 268.596863) rotate(-45) scale(0.1 -0.1)">
       <defs>
        <path id="DejaVuSans-4b" d="M 628 4666 
L 1259 4666 
L 1259 2694 
L 3353 4666 
L 4166 4666 
L 1850 2491 
L 4331 0 
L 3500 0 
L 1259 2247 
L 1259 0 
L 628 0 
L 628 4666 
z
" transform="scale(0.015625)"/>
        <path id="DejaVuSans-79" d="M 2059 -325 
Q 1816 -950 1584 -1140 
Q 1353 -1331 966 -1331 
L 506 -1331 
L 506 -850 
L 844 -850 
Q 1081 -850 1212 -737 
Q 1344 -625 1503 -206 
L 1606 56 
L 191 3500 
L 800 3500 
L 1894 763 
L 2988 3500 
L 3597 3500 
L 2059 -325 
z
" transform="scale(0.015625)"/>
        <path id="DejaVuSans-70" d="M 1159 525 
L 1159 -1331 
L 581 -1331 
L 581 3500 
L 1159 3500 
L 1159 2969 
Q 1341 3281 1617 3432 
Q 1894 3584 2278 3584 
Q 2916 3584 3314 3078 
Q 3713 2572 3713 1747 
Q 3713 922 3314 415 
Q 2916 -91 2278 -91 
Q 1894 -91 1617 61 
Q 1341 213 1159 525 
z
M 3116 1747 
Q 3116 2381 2855 2742 
Q 2594 3103 2138 3103 
Q 1681 3103 1420 2742 
Q 1159 2381 1159 1747 
Q 1159 1113 1420 752 
Q 1681 391 2138 391 
Q 2594 391 2855 752 
Q 3116 1113 3116 1747 
z
" transform="scale(0.015625)"/>
       </defs>
       <use xlink:href="#DejaVuSans-69"/>
       <use xlink:href="#DejaVuSans-4b" transform="translate(27.783203 0)"/>
       <use xlink:href="#DejaVuSans-65" transform="translate(88.359375 0)"/>
       <use xlink:href="#DejaVuSans-79" transform="translate(149.882812 0)"/>
       <use xlink:href="#DejaVuSans-70" transform="translate(209.0625 0)"/>
       <use xlink:href="#DejaVuSans-61" transform="translate(272.539062 0)"/>
       <use xlink:href="#DejaVuSans-69" transform="translate(333.818359 0)"/>
       <use xlink:href="#DejaVuSans-72" transform="translate(361.601562 0)"/>
      </g>
     </g>
    </g>
    <g id="xtick_8">
     <g id="line2d_8">
      <g>
       <use xlink:href="#m56425b7b0e" x="582.803593" y="227.746336" style="stroke: #000000; stroke-width: 0.8"/>
      </g>
     </g>
     <g id="text_8">
      <!-- gen_a -->
      <g transform="translate(559.946366 261.11258) rotate(-45) scale(0.1 -0.1)">
       <defs>
        <path id="DejaVuSans-5f" d="M 3263 -1063 
L 3263 -1509 
L -63 -1509 
L -63 -1063 
L 3263 -1063 
z
" transform="scale(0.015625)"/>
       </defs>
       <use xlink:href="#DejaVuSans-67"/>
       <use xlink:href="#DejaVuSans-65" transform="translate(63.476562 0)"/>
       <use xlink:href="#DejaVuSans-6e" transform="translate(125 0)"/>
       <use xlink:href="#DejaVuSans-5f" transform="translate(188.378906 0)"/>
       <use xlink:href="#DejaVuSans-61" transform="translate(238.378906 0)"/>
      </g>
     </g>
    </g>
    <g id="xtick_9">
     <g id="line2d_9">
      <g>
       <use xlink:href="#m56425b7b0e" x="649.812053" y="227.746336" style="stroke: #000000; stroke-width: 0.8"/>
      </g>
     </g>
     <g id="text_9">
      <!-- noise -->
      <g transform="translate(629.534661 258.926073) rotate(-45) scale(0.1 -0.1)">
       <use xlink:href="#DejaVuSans-6e"/>
       <use xlink:href="#DejaVuSans-6f" transform="translate(63.378906 0)"/>
       <use xlink:href="#DejaVuSans-69" transform="translate(124.560547 0)"/>
       <use xlink:href="#DejaVuSans-73" transform="translate(152.34375 0)"/>
       <use xlink:href="#DejaVuSans-65" transform="translate(204.443359 0)"/>
      </g>
     </g>
    </g>
   </g>
   <g id="matplotlib.axis_2">
    <g id="ytick_1">
     <g id="line2d_10">
      <defs>
       <path id="meadbc31b7d" d="M 0 0 
L -3.5 0 
" style="stroke: #000000; stroke-width: 0.8"/>
      </defs>
      <g>
       <use xlink:href="#meadbc31b7d" x="59.3" y="227.746336" style="stroke: #000000; stroke-width: 0.8"/>
      </g>
     </g>
     <g id="text_10">
      <!-- $1\times$ -->
      <g transform="translate(33.6 231.545554) scale(0.1 -0.1)">
       <defs>
        <path id="DejaVuSans-31" d="M 794 531 
L 1825 531 
L 1825 4091 
L 703 3866 
L 703 4441 
L 1819 4666 
L 2450 4666 
L 2450 531 
L 3481 531 
L 3481 0 
L 794 0 
L 794 531 
z
" transform="scale(0.015625)"/>
        <path id="DejaVuSans-d7" d="M 4488 3438 
L 3059 2003 
L 4488 575 
L 4116 197 
L 2681 1631 
L 1247 197 
L 878 575 
L 2303 2003 
L 878 3438 
L 1247 3816 
L 2681 2381 
L 4116 3816 
L 4488 3438 
z
" transform="scale(0.015625)"/>
       </defs>
       <use xlink:href="#DejaVuSans-31" transform="translate(0 0.09375)"/>
       <use xlink:href="#DejaVuSans-d7" transform="translate(83.105469 0.09375)"/>
      </g>
     </g>
    </g>
    <g id="ytick_2">
     <g id="line2d_11">
      <g>
       <use xlink:href="#meadbc31b7d" x="59.3" y="119.372777" style="stroke: #000000; stroke-width: 0.8"/>
      </g>
     </g>
     <g id="text_11">
      <!-- $10\times$ -->
      <g transform="translate(27.3 123.171996) scale(0.1 -0.1)">
       <defs>
        <path id="DejaVuSans-30" d="M 2034 4250 
Q 1547 4250 1301 3770 
Q 1056 3291 1056 2328 
Q 1056 1369 1301 889 
Q 1547 409 2034 409 
Q 2525 409 2770 889 
Q 3016 1369 3016 2328 
Q 3016 3291 2770 3770 
Q 2525 4250 2034 4250 
z
M 2034 4750 
Q 2819 4750 3233 4129 
Q 3647 3509 3647 2328 
Q 3647 1150 3233 529 
Q 2819 -91 2034 -91 
Q 1250 -91 836 529 
Q 422 1150 422 2328 
Q 422 3509 836 4129 
Q 1250 4750 2034 4750 
z
" transform="scale(0.015625)"/>
       </defs>
       <use xlink:href="#DejaVuSans-31" transform="translate(0 0.78125)"/>
       <use xlink:href="#DejaVuSans-30" transform="translate(63.623047 0.78125)"/>
       <use xlink:href="#DejaVuSans-d7" transform="translate(146.728516 0.78125)"/>
      </g>
     </g>
    </g>
    <g id="ytick_3">
     <g id="line2d_12">
      <g>
       <use xlink:href="#meadbc31b7d" x="59.3" y="10.999219" style="stroke: #000000; stroke-width: 0.8"/>
      </g>
     </g>
     <g id="text_12">
      <!-- $100\times$ -->
      <g transform="translate(20.9 14.798438) scale(0.1 -0.1)">
       <use xlink:href="#DejaVuSans-31" transform="translate(0 0.78125)"/>
       <use xlink:href="#DejaVuSans-30" transform="translate(63.623047 0.78125)"/>
       <use xlink:href="#DejaVuSans-30" transform="translate(127.246094 0.78125)"/>
       <use xlink:href="#DejaVuSans-d7" transform="translate(210.351562 0.78125)"/>
      </g>
     </g>
    </g>
    <g id="ytick_4">
     <g id="line2d_13">
      <defs>
       <path id="m1023bf43f8" d="M 0 0 
L -2 0 
" style="stroke: #000000; stroke-width: 0.6"/>
      </defs>
      <g>
       <use xlink:href="#m1023bf43f8" x="59.3" y="195.122644" style="stroke: #000000; stroke-width: 0.6"/>
      </g>
     </g>
    </g>
    <g id="ytick_5">
     <g id="line2d_14">
      <g>
       <use xlink:href="#m1023bf43f8" x="59.3" y="176.039007" style="stroke: #000000; stroke-width: 0.6"/>
      </g>
     </g>
    </g>
    <g id="ytick_6">
     <g id="line2d_15">
      <g>
       <use xlink:href="#m1023bf43f8" x="59.3" y="162.498952" style="stroke: #000000; stroke-width: 0.6"/>
      </g>
     </g>
    </g>
    <g id="ytick_7">
     <g id="line2d_16">
      <g>
       <use xlink:href="#m1023bf43f8" x="59.3" y="151.996469" style="stroke: #000000; stroke-width: 0.6"/>
      </g>
     </g>
    </g>
    <g id="ytick_8">
     <g id="line2d_17">
      <g>
       <use xlink:href="#m1023bf43f8" x="59.3" y="143.415316" style="stroke: #000000; stroke-width: 0.6"/>
      </g>
     </g>
    </g>
    <g id="ytick_9">
     <g id="line2d_18">
      <g>
       <use xlink:href="#m1023bf43f8" x="59.3" y="136.160054" style="stroke: #000000; stroke-width: 0.6"/>
      </g>
     </g>
    </g>
    <g id="ytick_10">
     <g id="line2d_19">
      <g>
       <use xlink:href="#m1023bf43f8" x="59.3" y="129.87526" style="stroke: #000000; stroke-width: 0.6"/>
      </g>
     </g>
    </g>
    <g id="ytick_11">
     <g id="line2d_20">
      <g>
       <use xlink:href="#m1023bf43f8" x="59.3" y="124.331679" style="stroke: #000000; stroke-width: 0.6"/>
      </g>
     </g>
    </g>
    <g id="ytick_12">
     <g id="line2d_21">
      <g>
       <use xlink:href="#m1023bf43f8" x="59.3" y="86.749085" style="stroke: #000000; stroke-width: 0.6"/>
      </g>
     </g>
    </g>
    <g id="ytick_13">
     <g id="line2d_22">
      <g>
       <use xlink:href="#m1023bf43f8" x="59.3" y="67.665449" style="stroke: #000000; stroke-width: 0.6"/>
      </g>
     </g>
    </g>
    <g id="ytick_14">
     <g id="line2d_23">
      <g>
       <use xlink:href="#m1023bf43f8" x="59.3" y="54.125394" style="stroke: #000000; stroke-width: 0.6"/>
      </g>
     </g>
    </g>
    <g id="ytick_15">
     <g id="line2d_24">
      <g>
       <use xlink:href="#m1023bf43f8" x="59.3" y="43.622911" style="stroke: #000000; stroke-width: 0.6"/>
      </g>
     </g>
    </g>
    <g id="ytick_16">
     <g id="line2d_25">
      <g>
       <use xlink:href="#m1023bf43f8" x="59.3" y="35.041757" style="stroke: #000000; stroke-width: 0.6"/>
      </g>
     </g>
    </g>
    <g id="ytick_17">
     <g id="line2d_26">
      <g>
       <use xlink:href="#m1023bf43f8" x="59.3" y="27.786495" style="stroke: #000000; stroke-width: 0.6"/>
      </g>
     </g>
    </g>
    <g id="ytick_18">
     <g id="line2d_27">
      <g>
       <use xlink:href="#m1023bf43f8" x="59.3" y="21.501702" style="stroke: #000000; stroke-width: 0.6"/>
      </g>
     </g>
    </g>
    <g id="ytick_19">
     <g id="line2d_28">
      <g>
       <use xlink:href="#m1023bf43f8" x="59.3" y="15.958121" style="stroke: #000000; stroke-width: 0.6"/>
      </g>
     </g>
    </g>
    <g id="text_13">
     <!-- Speedup ref $\to$ avx2 ($\times$) -->
     <g transform="translate(14.8 181.072777) rotate(-90) scale(0.1 -0.1)">
      <defs>
       <path id="DejaVuSans-53" d="M 3425 4513 
L 3425 3897 
Q 3066 4069 2747 4153 
Q 2428 4238 2131 4238 
Q 1616 4238 1336 4038 
Q 1056 3838 1056 3469 
Q 1056 3159 1242 3001 
Q 1428 2844 1947 2747 
L 2328 2669 
Q 3034 2534 3370 2195 
Q 3706 1856 3706 1288 
Q 3706 609 3251 259 
Q 2797 -91 1919 -91 
Q 1588 -91 1214 -16 
Q 841 59 441 206 
L 441 856 
Q 825 641 1194 531 
Q 1563 422 1919 422 
Q 2459 422 2753 634 
Q 3047 847 3047 1241 
Q 3047 1584 2836 1778 
Q 2625 1972 2144 2069 
L 1759 2144 
Q 1053 2284 737 2584 
Q 422 2884 422 3419 
Q 422 4038 858 4394 
Q 1294 4750 2059 4750 
Q 2388 4750 2728 4690 
Q 3069 4631 3425 4513 
z
" transform="scale(0.015625)"/>
       <path id="DejaVuSans-64" d="M 2906 2969 
L 2906 4863 
L 3481 4863 
L 3481 0 
L 2906 0 
L 2906 525 
Q 2725 213 2448 61 
Q 2172 -91 1784 -91 
Q 1150 -91 751 415 
Q 353 922 353 1747 
Q 353 2572 751 3078 
Q 1150 3584 1784 3584 
Q 2172 3584 2448 3432 
Q 2725 3281 2906 2969 
z
M 947 1747 
Q 947 1113 1208 752 
Q 1469 391 1925 391 
Q 2381 391 2643 752 
Q 2906 1113 2906 1747 
Q 2906 2381 2643 2742 
Q 2381 3103 1925 3103 
Q 1469 3103 1208 2742 
Q 947 2381 947 1747 
z
" transform="scale(0.015625)"/>
       <path id="DejaVuSans-20" transform="scale(0.015625)"/>
       <path id="DejaVuSans-2192" d="M 5050 2147 
L 5050 1866 
L 3822 638 
L 3447 1013 
L 4175 1741 
L 366 1741 
L 366 2272 
L 4175 2272 
L 3447 3000 
L 3822 3375 
L 5050 2147 
z
" transform="scale(0.015625)"/>
       <path id="DejaVuSans-76" d="M 191 3500 
L 800 3500 
L 1894 563 
L 2988 3500 
L 3597 3500 
L 2284 0 
L 1503 0 
L 191 3500 
z
" transform="scale(0.015625)"/>
       <path id="DejaVuSans-78" d="M 3513 3500 
L 2247 1797 
L 3578 0 
L 2900 0 
L 1881 1375 
L 863 0 
L 184 0 
L 1544 1831 
L 300 3500 
L 978 3500 
L 1906 2253 
L 2834 3500 
L 3513 3500 
z
" transform="scale(0.015625)"/>
       <path id="DejaVuSans-32" d="M 1228 531 
L 3431 531 
L 3431 0 
L 469 0 
L 469 531 
Q 828 903 1448 1529 
Q 2069 2156 2228 2338 
Q 2531 2678 2651 2914 
Q 2772 3150 2772 3378 
Q 2772 3750 2511 3984 
Q 2250 4219 1831 4219 
Q 1534 4219 1204 4116 
Q 875 4013 500 3803 
L 500 4441 
Q 881 4594 1212 4672 
Q 1544 4750 1819 4750 
Q 2544 4750 2975 4387 
Q 3406 4025 3406 3419 
Q 3406 3131 3298 2873 
Q 3191 2616 2906 2266 
Q 2828 2175 2409 1742 
Q 1991 1309 1228 531 
z
" transform="scale(0.015625)"/>
       <path id="DejaVuSans-28" d="M 1984 4856 
Q 1566 4138 1362 3434 
Q 1159 2731 1159 2009 
Q 1159 1288 1364 580 
Q 1569 -128 1984 -844 
L 1484 -844 
Q 1016 -109 783 600 
Q 550 1309 550 2009 
Q 550 2706 781 3412 
Q 1013 4119 1484 4856 
L 1984 4856 
z
" transform="scale(0.015625)"/>
       <path id="DejaVuSans-29" d="M 513 4856 
L 1013 4856 
Q 1481 4119 1714 3412 
Q 1947 2706 1947 2009 
Q 1947 1309 1714 600 
Q 1481 -109 1013 -844 
L 513 -844 
Q 928 -128 1133 580 
Q 1338 1288 1338 2009 
Q 1338 2731 1133 3434 
Q 928 4138 513 4856 
z
" transform="scale(0.015625)"/>
      </defs>
      <use xlink:href="#DejaVuSans-53" transform="translate(0 0.015625)"/>
      <use xlink:href="#DejaVuSans-70" transform="translate(63.476562 0.015625)"/>
      <use xlink:href="#DejaVuSans-65" transform="translate(126.953125 0.015625)"/>
      <use xlink:href="#DejaVuSans-65" transform="translate(188.476562 0.015625)"/>
      <use xlink:href="#DejaVuSans-64" transform="translate(250 0.015625)"/>
      <use xlink:href="#DejaVuSans-75" transform="translate(313.476562 0.015625)"/>
      <use xlink:href="#DejaVuSans-70" transform="translate(376.855469 0.015625)"/>
      <use xlink:href="#DejaVuSans-20" transform="translate(440.332031 0.015625)"/>
      <use xlink:href="#DejaVuSans-72" transform="translate(472.119141 0.015625)"/>
      <use xlink:href="#DejaVuSans-65" transform="translate(513.232422 0.015625)"/>
      <use xlink:href="#DejaVuSans-66" transform="translate(574.755859 0.015625)"/>
      <use xlink:href="#DejaVuSans-20" transform="translate(609.960938 0.015625)"/>
      <use xlink:href="#DejaVuSans-2192" transform="translate(661.230469 0.015625)"/>
      <use xlink:href="#DejaVuSans-20" transform="translate(764.501953 0.015625)"/>
      <use xlink:href="#DejaVuSans-61" transform="translate(796.289062 0.015625)"/>
      <use xlink:href="#DejaVuSans-76" transform="translate(857.568359 0.015625)"/>
      <use xlink:href="#DejaVuSans-78" transform="translate(916.748047 0.015625)"/>
      <use xlink:href="#DejaVuSans-32" transform="translate(975.927734 0.015625)"/>
      <use xlink:href="#DejaVuSans-20" transform="translate(1039.550781 0.015625)"/>
      <use xlink:href="#DejaVuSans-28" transform="translate(1071.337891 0.015625)"/>
      <use xlink:href="#DejaVuSans-d7" transform="translate(1110.351562 0.015625)"/>
      <use xlink:href="#DejaVuSans-29" transform="translate(1194.140625 0.015625)"/>
     </g>
    </g>
   </g>
   <g id="LineCollection_1">
    <path d="M 96.992259 38.070236 
L 96.992259 38.070236 
" clip-path="url(#p1ed493ed7d)" style="fill: none; stroke: #000000; stroke-width: 1.5"/>
    <path d="M 164.000719 41.740267 
L 164.000719 41.099903 
" clip-path="url(#p1ed493ed7d)" style="fill: none; stroke: #000000; stroke-width: 1.5"/>
    <path d="M 231.009178 47.914198 
L 231.009178 47.914198 
" clip-path="url(#p1ed493ed7d)" style="fill: none; stroke: #000000; stroke-width: 1.5"/>
    <path d="M 298.017638 59.721644 
L 298.017638 56.637083 
" clip-path="url(#p1ed493ed7d)" style="fill: none; stroke: #000000; stroke-width: 1.5"/>
    <path d="M 365.026098 60.345295 
L 365.026098 60.339891 
" clip-path="url(#p1ed493ed7d)" style="fill: none; stroke: #000000; stroke-width: 1.5"/>
    <path d="M 432.034558 119.501425 
L 432.034558 119.489262 
" clip-path="url(#p1ed493ed7d)" style="fill: none; stroke: #000000; stroke-width: 1.5"/>
    <path d="M 499.043018 128.103243 
L 499.043018 128.081017 
" clip-path="url(#p1ed493ed7d)" style="fill: none; stroke: #000000; stroke-width: 1.5"/>
    <path d="M 566.051478 155.322045 
L 566.051478 155.31282 
" clip-path="url(#p1ed493ed7d)" style="fill: none; stroke: #000000; stroke-width: 1.5"/>
    <path d="M 633.059938 212.302946 
L 633.059938 212.262037 
" clip-path="url(#p1ed493ed7d)" style="fill: none; stroke: #000000; stroke-width: 1.5"/>
   </g>
   <g id="LineCollection_2">
    <path d="M 113.744374 41.570797 
L 113.744374 41.561002 
" clip-path="url(#p1ed493ed7d)" style="fill: none; stroke: #000000; stroke-width: 1.5"/>
    <path d="M 180.752834 45.960268 
L 180.752834 45.960268 
" clip-path="url(#p1ed493ed7d)" style="fill: none; stroke: #000000; stroke-width: 1.5"/>
    <path d="M 247.761293 44.426229 
L 247.761293 44.426229 
" clip-path="url(#p1ed493ed7d)" style="fill: none; stroke: #000000; stroke-width: 1.5"/>
    <path d="M 314.769753 55.385622 
L 314.769753 54.847718 
" clip-path="url(#p1ed493ed7d)" style="fill: none; stroke: #000000; stroke-width: 1.5"/>
    <path d="M 381.778213 60.420454 
L 381.778213 60.414293 
" clip-path="url(#p1ed493ed7d)" style="fill: none; stroke: #000000; stroke-width: 1.5"/>
    <path d="M 448.786673 122.161903 
L 448.786673 122.152284 
" clip-path="url(#p1ed493ed7d)" style="fill: none; stroke: #000000; stroke-width: 1.5"/>
    <path d="M 515.795133 132.393569 
L 515.795133 132.383491 
" clip-path="url(#p1ed493ed7d)" style="fill: none; stroke: #000000; stroke-width: 1.5"/>
    <path d="M 582.803593 164.423489 
L 582.803593 164.40577 
" clip-path="url(#p1ed493ed7d)" style="fill: none; stroke: #000000; stroke-width: 1.5"/>
    <path d="M 649.812053 213.336962 
L 649.812053 213.336962 
" clip-path="url(#p1ed493ed7d)" style="fill: none; stroke: #000000; stroke-width: 1.5"/>
   </g>
   <g id="LineCollection_3">
    <path d="M 130.496489 43.168163 
L 130.496489 43.159112 
" clip-path="url(#p1ed493ed7d)" style="fill: none; stroke: #000000; stroke-width: 1.5"/>
    <path d="M 197.504948 52.241732 
L 197.504948 52.241732 
" clip-path="url(#p1ed493ed7d)" style="fill: none; stroke: #000000; stroke-width: 1.5"/>
    <path d="M 264.513408 38.80905 
L 264.513408 38.80905 
" clip-path="url(#p1ed493ed7d)" style="fill: none; stroke: #000000; stroke-width: 1.5"/>
    <path d="M 331.521868 60.98417 
L 331.521868 60.478847 
" clip-path="url(#p1ed493ed7d)" style="fill: none; stroke: #000000; stroke-width: 1.5"/>
    <path d="M 398.530328 65.979889 
L 398.530328 65.967852 
" clip-path="url(#p1ed493ed7d)" style="fill: none; stroke: #000000; stroke-width: 1.5"/>
    <path d="M 465.538788 122.349941 
L 465.538788 122.338184 
" clip-path="url(#p1ed493ed7d)" style="fill: none; stroke: #000000; stroke-width: 1.5"/>
    <path d="M 532.547248 129.221614 
L 532.547248 129.203909 
" clip-path="url(#p1ed493ed7d)" style="fill: none; stroke: #000000; stroke-width: 1.5"/>
    <path d="M 599.555708 154.159847 
L 599.555708 154.130133 
" clip-path="url(#p1ed493ed7d)" style="fill: none; stroke: #000000; stroke-width: 1.5"/>
    <path d="M 666.564168 219.588623 
L 666.564168 219.542412 
" clip-path="url(#p1ed493ed7d)" style="fill: none; stroke: #000000; stroke-width: 1.5"/>
   </g>
   <g id="patch_30">
    <path d="M 59.3 227.746336 
L 59.3 10.999219 
" style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/>
   </g>
   <g id="patch_31">
    <path d="M 704.256426 227.746336 
L 704.256426 10.999219 
" style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/>
   </g>
   <g id="patch_32">
    <path d="M 59.3 227.746336 
L 704.256426 227.746336 
" style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/>
   </g>
   <g id="patch_33">
    <path d="M 59.3 10.999219 
L 704.256426 10.999219 
" style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/>
   </g>
   <g id="legend_1">
    <g id="patch_34">
     <path d="M 66.797 24.825717 
L 83.457 24.825717 
L 83.457 18.994717 
L 66.797 18.994717 
z
" style="fill: #333333"/>
    </g>
    <g id="text_14">
     <!-- ML-KEM-512 -->
     <g transform="translate(90.121 24.825717) scale(0.0833 -0.0833)">
      <defs>
       <path id="DejaVuSans-4d" d="M 628 4666 
L 1569 4666 
L 2759 1491 
L 3956 4666 
L 4897 4666 
L 4897 0 
L 4281 0 
L 4281 4097 
L 3078 897 
L 2444 897 
L 1241 4097 
L 1241 0 
L 628 0 
L 628 4666 
z
" transform="scale(0.015625)"/>
       <path id="DejaVuSans-4c" d="M 628 4666 
L 1259 4666 
L 1259 531 
L 3531 531 
L 3531 0 
L 628 0 
L 628 4666 
z
" transform="scale(0.015625)"/>
       <path id="DejaVuSans-2d" d="M 313 2009 
L 1997 2009 
L 1997 1497 
L 313 1497 
L 313 2009 
z
" transform="scale(0.015625)"/>
       <path id="DejaVuSans-35" d="M 691 4666 
L 3169 4666 
L 3169 4134 
L 1269 4134 
L 1269 2991 
Q 1406 3038 1543 3061 
Q 1681 3084 1819 3084 
Q 2600 3084 3056 2656 
Q 3513 2228 3513 1497 
Q 3513 744 3044 326 
Q 2575 -91 1722 -91 
Q 1428 -91 1123 -41 
Q 819 9 494 109 
L 494 744 
Q 775 591 1075 516 
Q 1375 441 1709 441 
Q 2250 441 2565 725 
Q 2881 1009 2881 1497 
Q 2881 1984 2565 2268 
Q 2250 2553 1709 2553 
Q 1456 2553 1204 2497 
Q 953 2441 691 2322 
L 691 4666 
z
" transform="scale(0.015625)"/>
      </defs>
      <use xlink:href="#DejaVuSans-4d"/>
      <use xlink:href="#DejaVuSans-4c" transform="translate(86.279297 0)"/>
      <use xlink:href="#DejaVuSans-2d" transform="translate(140.242188 0)"/>
      <use xlink:href="#DejaVuSans-4b" transform="translate(176.326172 0)"/>
      <use xlink:href="#DejaVuSans-45" transform="translate(241.902344 0)"/>
      <use xlink:href="#DejaVuSans-4d" transform="translate(305.085938 0)"/>
      <use xlink:href="#DejaVuSans-2d" transform="translate(391.365234 0)"/>
      <use xlink:href="#DejaVuSans-35" transform="translate(427.449219 0)"/>
      <use xlink:href="#DejaVuSans-31" transform="translate(491.072266 0)"/>
      <use xlink:href="#DejaVuSans-32" transform="translate(554.695312 0)"/>
     </g>
    </g>
    <g id="patch_35">
     <path d="M 66.797 37.052595 
L 83.457 37.052595 
L 83.457 31.221595 
L 66.797 31.221595 
z
" style="fill: #777777"/>
    </g>
    <g id="text_15">
     <!-- ML-KEM-768 -->
     <g transform="translate(90.121 37.052595) scale(0.0833 -0.0833)">
      <defs>
       <path id="DejaVuSans-37" d="M 525 4666 
L 3525 4666 
L 3525 4397 
L 1831 0 
L 1172 0 
L 2766 4134 
L 525 4134 
L 525 4666 
z
" transform="scale(0.015625)"/>
       <path id="DejaVuSans-36" d="M 2113 2584 
Q 1688 2584 1439 2293 
Q 1191 2003 1191 1497 
Q 1191 994 1439 701 
Q 1688 409 2113 409 
Q 2538 409 2786 701 
Q 3034 994 3034 1497 
Q 3034 2003 2786 2293 
Q 2538 2584 2113 2584 
z
M 3366 4563 
L 3366 3988 
Q 3128 4100 2886 4159 
Q 2644 4219 2406 4219 
Q 1781 4219 1451 3797 
Q 1122 3375 1075 2522 
Q 1259 2794 1537 2939 
Q 1816 3084 2150 3084 
Q 2853 3084 3261 2657 
Q 3669 2231 3669 1497 
Q 3669 778 3244 343 
Q 2819 -91 2113 -91 
Q 1303 -91 875 529 
Q 447 1150 447 2328 
Q 447 3434 972 4092 
Q 1497 4750 2381 4750 
Q 2619 4750 2861 4703 
Q 3103 4656 3366 4563 
z
" transform="scale(0.015625)"/>
       <path id="DejaVuSans-38" d="M 2034 2216 
Q 1584 2216 1326 1975 
Q 1069 1734 1069 1313 
Q 1069 891 1326 650 
Q 1584 409 2034 409 
Q 2484 409 2743 651 
Q 3003 894 3003 1313 
Q 3003 1734 2745 1975 
Q 2488 2216 2034 2216 
z
M 1403 2484 
Q 997 2584 770 2862 
Q 544 3141 544 3541 
Q 544 4100 942 4425 
Q 1341 4750 2034 4750 
Q 2731 4750 3128 4425 
Q 3525 4100 3525 3541 
Q 3525 3141 3298 2862 
Q 3072 2584 2669 2484 
Q 3125 2378 3379 2068 
Q 3634 1759 3634 1313 
Q 3634 634 3220 271 
Q 2806 -91 2034 -91 
Q 1263 -91 848 271 
Q 434 634 434 1313 
Q 434 1759 690 2068 
Q 947 2378 1403 2484 
z
M 1172 3481 
Q 1172 3119 1398 2916 
Q 1625 2713 2034 2713 
Q 2441 2713 2670 2916 
Q 2900 3119 2900 3481 
Q 2900 3844 2670 4047 
Q 2441 4250 2034 4250 
Q 1625 4250 1398 4047 
Q 1172 3844 1172 3481 
z
" transform="scale(0.015625)"/>
      </defs>
      <use xlink:href="#DejaVuSans-4d"/>
      <use xlink:href="#DejaVuSans-4c" transform="translate(86.279297 0)"/>
      <use xlink:href="#DejaVuSans-2d" transform="translate(140.242188 0)"/>
      <use xlink:href="#DejaVuSans-4b" transform="translate(176.326172 0)"/>
      <use xlink:href="#DejaVuSans-45" transform="translate(241.902344 0)"/>
      <use xlink:href="#DejaVuSans-4d" transform="translate(305.085938 0)"/>
      <use xlink:href="#DejaVuSans-2d" transform="translate(391.365234 0)"/>
      <use xlink:href="#DejaVuSans-37" transform="translate(427.449219 0)"/>
      <use xlink:href="#DejaVuSans-36" transform="translate(491.072266 0)"/>
      <use xlink:href="#DejaVuSans-38" transform="translate(554.695312 0)"/>
     </g>
    </g>
    <g id="patch_36">
     <path d="M 66.797 49.279473 
L 83.457 49.279473 
L 83.457 43.448473 
L 66.797 43.448473 
z
" style="fill: #bbbbbb"/>
    </g>
    <g id="text_16">
     <!-- ML-KEM-1024 -->
     <g transform="translate(90.121 49.279473) scale(0.0833 -0.0833)">
      <defs>
       <path id="DejaVuSans-34" d="M 2419 4116 
L 825 1625 
L 2419 1625 
L 2419 4116 
z
M 2253 4666 
L 3047 4666 
L 3047 1625 
L 3713 1625 
L 3713 1100 
L 3047 1100 
L 3047 0 
L 2419 0 
L 2419 1100 
L 313 1100 
L 313 1709 
L 2253 4666 
z
" transform="scale(0.015625)"/>
      </defs>
      <use xlink:href="#DejaVuSans-4d"/>
      <use xlink:href="#DejaVuSans-4c" transform="translate(86.279297 0)"/>
      <use xlink:href="#DejaVuSans-2d" transform="translate(140.242188 0)"/>
      <use xlink:href="#DejaVuSans-4b" transform="translate(176.326172 0)"/>
      <use xlink:href="#DejaVuSans-45" transform="translate(241.902344 0)"/>
      <use xlink:href="#DejaVuSans-4d" transform="translate(305.085938 0)"/>
      <use xlink:href="#DejaVuSans-2d" transform="translate(391.365234 0)"/>
      <use xlink:href="#DejaVuSans-31" transform="translate(427.449219 0)"/>
      <use xlink:href="#DejaVuSans-30" transform="translate(491.072266 0)"/>
      <use xlink:href="#DejaVuSans-32" transform="translate(554.695312 0)"/>
      <use xlink:href="#DejaVuSans-34" transform="translate(618.318359 0)"/>
     </g>
    </g>
   </g>
  </g>
 </g>
 <defs>
  <clipPath id="p1ed493ed7d">
   <rect x="59.3" y="10.999219" width="644.956426" height="216.747117"/>
  </clipPath>
 </defs>
</svg>
<figcaption class="viz-caption">Hand-written SIMD speedup (`ref` $\to$ `avx2`) per operation, across all three ML-KEM parameter sets. Log $y$-axis. 95% bootstrap CI error bars (often sub-pixel). Sorted by ML-KEM-512 speedup.</figcaption></figure>
<table>
<thead>
<tr>
<th>Operation</th>
<th>ML-KEM-512</th>
<th>ML-KEM-768</th>
<th>ML-KEM-1024</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>INVNTT</code></td>
<td><span class="math inline">56.3\times</span></td>
<td><span class="math inline">52.2\times</span></td>
<td><span class="math inline">50.5\times</span></td>
</tr>
<tr>
<td><code>basemul</code></td>
<td><span class="math inline">52.0\times</span></td>
<td><span class="math inline">47.6\times</span></td>
<td><span class="math inline">41.6\times</span></td>
</tr>
<tr>
<td><code>frommsg</code></td>
<td><span class="math inline">45.6\times</span></td>
<td><span class="math inline">49.2\times</span></td>
<td><span class="math inline">55.4\times</span></td>
</tr>
<tr>
<td><code>NTT</code></td>
<td><span class="math inline">35.5\times</span></td>
<td><span class="math inline">39.4\times</span></td>
<td><span class="math inline">34.6\times</span></td>
</tr>
<tr>
<td><code>iDec</code></td>
<td><span class="math inline">35.1\times</span></td>
<td><span class="math inline">35.0\times</span></td>
<td><span class="math inline">31.1\times</span></td>
</tr>
<tr>
<td><code>iEnc</code></td>
<td><span class="math inline">10.0\times</span></td>
<td><span class="math inline">9.4\times</span></td>
<td><span class="math inline">9.4\times</span></td>
</tr>
<tr>
<td><code>iKeypair</code></td>
<td><span class="math inline">8.3\times</span></td>
<td><span class="math inline">7.6\times</span></td>
<td><span class="math inline">8.1\times</span></td>
</tr>
<tr>
<td><code>gen_a</code></td>
<td><span class="math inline">4.7\times</span></td>
<td><span class="math inline">3.8\times</span></td>
<td><span class="math inline">4.8\times</span></td>
</tr>
<tr>
<td><code>noise</code></td>
<td><span class="math inline">1.4\times</span></td>
<td><span class="math inline">1.4\times</span></td>
<td><span class="math inline">1.2\times</span></td>
</tr>
</tbody>
</table>
<p><em>Table 1: Hand-written <abbr class="smallcaps">SIMD</abbr> speedup (<code>ref</code> <span class="math inline">\to</span> <code>avx2</code>), median ratio with 95% bootstrap CI. All Cliff’s <span class="math inline">\delta = +1.000</span>, <span class="math inline">p &lt; 10^{-300}</span>.</em></p>
<h3 id="statistical-significance">Statistical Significance</h3>
<p>All <code>ref</code> vs. <code>avx2</code> comparisons pass the Mann-Whitney U test at <span class="math inline">p &lt; 10^{-300}</span>. Cliff’s <span class="math inline">\delta = +1.000</span> for all operations except <code>NTT</code> at ML-KEM-512 and ML-KEM-1024 (<span class="math inline">\delta = +0.999</span>), meaning AVX2 achieves a strictly smaller cycle count than <code>ref</code> in effectively every observation pair.</p>
<p>The figure shows the heatmap of Cliff’s <span class="math inline">\delta</span> values across all operations and parameter sets.</p>
<figure class="viz-figure"><?xml version="1.0" encoding="utf-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
  "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg xmlns:xlink="http://www.w3.org/1999/xlink" width="184.885259pt" height="353.040139pt" viewBox="0 0 184.885259 353.040139" xmlns="http://www.w3.org/2000/svg" version="1.1">
 <metadata>
  <rdf:RDF xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
   <cc:Work>
    <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
    <dc:date>2026-04-26T19:42:53.317222</dc:date>
    <dc:format>image/svg+xml</dc:format>
    <dc:creator>
     <cc:Agent>
      <dc:title>Matplotlib v3.10.9, https://matplotlib.org/</dc:title>
     </cc:Agent>
    </dc:creator>
   </cc:Work>
  </rdf:RDF>
 </metadata>
 <defs>
  <style type="text/css">*{stroke-linejoin: round; stroke-linecap: butt}</style>
 </defs>
 <g id="figure_1">
  <g id="patch_1">
   <path d="M 0 353.040139 
L 184.885259 353.040139 
L 184.885259 0 
L 0 0 
L 0 353.040139 
z
" style="fill: none"/>
  </g>
  <g id="axes_1">
   <g id="patch_2">
    <path d="M 58.764063 283.775304 
L 145.916455 283.775304 
L 145.916455 22.318125 
L 58.764063 22.318125 
L 58.764063 283.775304 
z
" style="fill: none"/>
   </g>
   <g clip-path="url(#pf7f2b173a6)">
    <image xlink:href="data:image/png;base64,
iVBORw0KGgoAAAANSUhEUgAAAHoAAAFsCAYAAAADoa3WAAADX0lEQVR4nO3cwQnAMAwEQdn995yUkEcMCexMBQeLvlozcw2v7L2/nvDo/ws5QugIoSOEjhA6QugIoSOEjhA6QugIoSOEjhA6QugIoSOEjhA6QugIoSOEjhA6QugIoSOEjhA6QugIoSOEjhA6QugIoSOEjhA6QugIoSOEjhA6QugIoSOEjljjoVyCi44QOkLoCKEjhI4QOkLoCKEjhI4QOkLoCKEjhI4QOkLoCKEjhI4QOkLoCKEjhI4QOkLoCKEjhI4QOkLoCKEjhI4QOkLoCKEjhI4QOkLoCKEjhI4QOkLoCKEjhI4QOkLoCKEjhI4QOkLoCKEjhI4QOkLoCKEjhI4QOkLoCKEjhI4QOkLoCKEjhI4QOkLoCKEjhI4QOkLoCKEjhI4QOkLoCKEjhI4QOkLoCKEjhI4QOkLoCKEjhI4QOkLoCKEjhI4QOkLoCKEjhI4QOkLoCKEjhI4QOkLoCKEjhI4QOkLoCKEjhI4QOkLoCKEjhI4QOkLoCKEjhI4QOkLoCKEjhI4QOkLoCKEjhI4QOkLoCKEjhI4QOkLoCKEjhI4QOkLoCKEjhI4QOkLoCKEjhI4QOkLoCKEjhI4QOkLoCKEjhI4QOkLoCKEjhI4QOkLoCKEjhI4QOkLoCKEjhI4QOkLoCKEjhI4QOkLoCKEjhI4QOkLoCKEjhI4QOkLoCKEjhI4QOkLoCKEjhI4QOkLoCKEjhI4QOkLoCKEjhI4QOkLoCKEjhI4QOkLoCKEjhI4QOkLoCKEjhI4QOkLoCKEjhI4QOkLoCKEjhI4QOkLoCKEjhI4QOkLoCKEjhI4QOkLoCKEjhI4QOkLoCKEjhI4QOkLoCKEjhI4QOkLoCKEjhI4QOkLoCKEjhI4QOkLoCKEjhI4QOkLoCKEjhI4QOkLoCKEjhI4QOkLoCKEjhI4QOkLoCKEjhI4QOkLoCKEjhI4QOkLoCKEjhI4QOkLoCKEjhI4QOkLoCKEjhI4QOkLoCKEjhI4QOkLoCKEjhI4QOkLoCKEjhI4QOkLoCKEjhI4QOkLoCKEjhI4QOkLoCKEjhI4QOkLoCKEjhI4QOkLoCKEjhI4QOkLoCKEjhI4QOkLoCKEjhI4QOkLoCKEjhI4QOkLoCKEjhI4QOkLoCKEjhI4QOkLoCKEjhI4QOuIG2L4E29R41tsAAAAASUVORK5CYII=" id="image884dff1199" transform="scale(1 -1) translate(0 -262.08)" x="58.764063" y="-21.695304" width="87.84" height="262.08"/>
   </g>
   <g id="matplotlib.axis_1">
    <g id="xtick_1">
     <g id="line2d_1">
      <defs>
       <path id="me6cb13ff6e" d="M 0 0 
L 0 3.5 
" style="stroke: #000000; stroke-width: 0.8"/>
      </defs>
      <g>
       <use xlink:href="#me6cb13ff6e" x="73.289461" y="283.775304" style="stroke: #000000; stroke-width: 0.8"/>
      </g>
     </g>
     <g id="text_1">
      <!-- ML-KEM-512 -->
      <g transform="translate(34.939967 339.870611) rotate(-45) scale(0.1 -0.1)">
       <defs>
        <path id="DejaVuSans-4d" d="M 628 4666 
L 1569 4666 
L 2759 1491 
L 3956 4666 
L 4897 4666 
L 4897 0 
L 4281 0 
L 4281 4097 
L 3078 897 
L 2444 897 
L 1241 4097 
L 1241 0 
L 628 0 
L 628 4666 
z
" transform="scale(0.015625)"/>
        <path id="DejaVuSans-4c" d="M 628 4666 
L 1259 4666 
L 1259 531 
L 3531 531 
L 3531 0 
L 628 0 
L 628 4666 
z
" transform="scale(0.015625)"/>
        <path id="DejaVuSans-2d" d="M 313 2009 
L 1997 2009 
L 1997 1497 
L 313 1497 
L 313 2009 
z
" transform="scale(0.015625)"/>
        <path id="DejaVuSans-4b" d="M 628 4666 
L 1259 4666 
L 1259 2694 
L 3353 4666 
L 4166 4666 
L 1850 2491 
L 4331 0 
L 3500 0 
L 1259 2247 
L 1259 0 
L 628 0 
L 628 4666 
z
" transform="scale(0.015625)"/>
        <path id="DejaVuSans-45" d="M 628 4666 
L 3578 4666 
L 3578 4134 
L 1259 4134 
L 1259 2753 
L 3481 2753 
L 3481 2222 
L 1259 2222 
L 1259 531 
L 3634 531 
L 3634 0 
L 628 0 
L 628 4666 
z
" transform="scale(0.015625)"/>
        <path id="DejaVuSans-35" d="M 691 4666 
L 3169 4666 
L 3169 4134 
L 1269 4134 
L 1269 2991 
Q 1406 3038 1543 3061 
Q 1681 3084 1819 3084 
Q 2600 3084 3056 2656 
Q 3513 2228 3513 1497 
Q 3513 744 3044 326 
Q 2575 -91 1722 -91 
Q 1428 -91 1123 -41 
Q 819 9 494 109 
L 494 744 
Q 775 591 1075 516 
Q 1375 441 1709 441 
Q 2250 441 2565 725 
Q 2881 1009 2881 1497 
Q 2881 1984 2565 2268 
Q 2250 2553 1709 2553 
Q 1456 2553 1204 2497 
Q 953 2441 691 2322 
L 691 4666 
z
" transform="scale(0.015625)"/>
        <path id="DejaVuSans-31" d="M 794 531 
L 1825 531 
L 1825 4091 
L 703 3866 
L 703 4441 
L 1819 4666 
L 2450 4666 
L 2450 531 
L 3481 531 
L 3481 0 
L 794 0 
L 794 531 
z
" transform="scale(0.015625)"/>
        <path id="DejaVuSans-32" d="M 1228 531 
L 3431 531 
L 3431 0 
L 469 0 
L 469 531 
Q 828 903 1448 1529 
Q 2069 2156 2228 2338 
Q 2531 2678 2651 2914 
Q 2772 3150 2772 3378 
Q 2772 3750 2511 3984 
Q 2250 4219 1831 4219 
Q 1534 4219 1204 4116 
Q 875 4013 500 3803 
L 500 4441 
Q 881 4594 1212 4672 
Q 1544 4750 1819 4750 
Q 2544 4750 2975 4387 
Q 3406 4025 3406 3419 
Q 3406 3131 3298 2873 
Q 3191 2616 2906 2266 
Q 2828 2175 2409 1742 
Q 1991 1309 1228 531 
z
" transform="scale(0.015625)"/>
       </defs>
       <use xlink:href="#DejaVuSans-4d"/>
       <use xlink:href="#DejaVuSans-4c" transform="translate(86.279297 0)"/>
       <use xlink:href="#DejaVuSans-2d" transform="translate(140.242188 0)"/>
       <use xlink:href="#DejaVuSans-4b" transform="translate(176.326172 0)"/>
       <use xlink:href="#DejaVuSans-45" transform="translate(241.902344 0)"/>
       <use xlink:href="#DejaVuSans-4d" transform="translate(305.085938 0)"/>
       <use xlink:href="#DejaVuSans-2d" transform="translate(391.365234 0)"/>
       <use xlink:href="#DejaVuSans-35" transform="translate(427.449219 0)"/>
       <use xlink:href="#DejaVuSans-31" transform="translate(491.072266 0)"/>
       <use xlink:href="#DejaVuSans-32" transform="translate(554.695312 0)"/>
      </g>
     </g>
    </g>
    <g id="xtick_2">
     <g id="line2d_2">
      <g>
       <use xlink:href="#me6cb13ff6e" x="102.340259" y="283.775304" style="stroke: #000000; stroke-width: 0.8"/>
      </g>
     </g>
     <g id="text_2">
      <!-- ML-KEM-768 -->
      <g transform="translate(63.990765 339.870611) rotate(-45) scale(0.1 -0.1)">
       <defs>
        <path id="DejaVuSans-37" d="M 525 4666 
L 3525 4666 
L 3525 4397 
L 1831 0 
L 1172 0 
L 2766 4134 
L 525 4134 
L 525 4666 
z
" transform="scale(0.015625)"/>
        <path id="DejaVuSans-36" d="M 2113 2584 
Q 1688 2584 1439 2293 
Q 1191 2003 1191 1497 
Q 1191 994 1439 701 
Q 1688 409 2113 409 
Q 2538 409 2786 701 
Q 3034 994 3034 1497 
Q 3034 2003 2786 2293 
Q 2538 2584 2113 2584 
z
M 3366 4563 
L 3366 3988 
Q 3128 4100 2886 4159 
Q 2644 4219 2406 4219 
Q 1781 4219 1451 3797 
Q 1122 3375 1075 2522 
Q 1259 2794 1537 2939 
Q 1816 3084 2150 3084 
Q 2853 3084 3261 2657 
Q 3669 2231 3669 1497 
Q 3669 778 3244 343 
Q 2819 -91 2113 -91 
Q 1303 -91 875 529 
Q 447 1150 447 2328 
Q 447 3434 972 4092 
Q 1497 4750 2381 4750 
Q 2619 4750 2861 4703 
Q 3103 4656 3366 4563 
z
" transform="scale(0.015625)"/>
        <path id="DejaVuSans-38" d="M 2034 2216 
Q 1584 2216 1326 1975 
Q 1069 1734 1069 1313 
Q 1069 891 1326 650 
Q 1584 409 2034 409 
Q 2484 409 2743 651 
Q 3003 894 3003 1313 
Q 3003 1734 2745 1975 
Q 2488 2216 2034 2216 
z
M 1403 2484 
Q 997 2584 770 2862 
Q 544 3141 544 3541 
Q 544 4100 942 4425 
Q 1341 4750 2034 4750 
Q 2731 4750 3128 4425 
Q 3525 4100 3525 3541 
Q 3525 3141 3298 2862 
Q 3072 2584 2669 2484 
Q 3125 2378 3379 2068 
Q 3634 1759 3634 1313 
Q 3634 634 3220 271 
Q 2806 -91 2034 -91 
Q 1263 -91 848 271 
Q 434 634 434 1313 
Q 434 1759 690 2068 
Q 947 2378 1403 2484 
z
M 1172 3481 
Q 1172 3119 1398 2916 
Q 1625 2713 2034 2713 
Q 2441 2713 2670 2916 
Q 2900 3119 2900 3481 
Q 2900 3844 2670 4047 
Q 2441 4250 2034 4250 
Q 1625 4250 1398 4047 
Q 1172 3844 1172 3481 
z
" transform="scale(0.015625)"/>
       </defs>
       <use xlink:href="#DejaVuSans-4d"/>
       <use xlink:href="#DejaVuSans-4c" transform="translate(86.279297 0)"/>
       <use xlink:href="#DejaVuSans-2d" transform="translate(140.242188 0)"/>
       <use xlink:href="#DejaVuSans-4b" transform="translate(176.326172 0)"/>
       <use xlink:href="#DejaVuSans-45" transform="translate(241.902344 0)"/>
       <use xlink:href="#DejaVuSans-4d" transform="translate(305.085938 0)"/>
       <use xlink:href="#DejaVuSans-2d" transform="translate(391.365234 0)"/>
       <use xlink:href="#DejaVuSans-37" transform="translate(427.449219 0)"/>
       <use xlink:href="#DejaVuSans-36" transform="translate(491.072266 0)"/>
       <use xlink:href="#DejaVuSans-38" transform="translate(554.695312 0)"/>
      </g>
     </g>
    </g>
    <g id="xtick_3">
     <g id="line2d_3">
      <g>
       <use xlink:href="#me6cb13ff6e" x="131.391057" y="283.775304" style="stroke: #000000; stroke-width: 0.8"/>
      </g>
     </g>
     <g id="text_3">
      <!-- ML-KEM-1024 -->
      <g transform="translate(88.542595 344.369578) rotate(-45) scale(0.1 -0.1)">
       <defs>
        <path id="DejaVuSans-30" d="M 2034 4250 
Q 1547 4250 1301 3770 
Q 1056 3291 1056 2328 
Q 1056 1369 1301 889 
Q 1547 409 2034 409 
Q 2525 409 2770 889 
Q 3016 1369 3016 2328 
Q 3016 3291 2770 3770 
Q 2525 4250 2034 4250 
z
M 2034 4750 
Q 2819 4750 3233 4129 
Q 3647 3509 3647 2328 
Q 3647 1150 3233 529 
Q 2819 -91 2034 -91 
Q 1250 -91 836 529 
Q 422 1150 422 2328 
Q 422 3509 836 4129 
Q 1250 4750 2034 4750 
z
" transform="scale(0.015625)"/>
        <path id="DejaVuSans-34" d="M 2419 4116 
L 825 1625 
L 2419 1625 
L 2419 4116 
z
M 2253 4666 
L 3047 4666 
L 3047 1625 
L 3713 1625 
L 3713 1100 
L 3047 1100 
L 3047 0 
L 2419 0 
L 2419 1100 
L 313 1100 
L 313 1709 
L 2253 4666 
z
" transform="scale(0.015625)"/>
       </defs>
       <use xlink:href="#DejaVuSans-4d"/>
       <use xlink:href="#DejaVuSans-4c" transform="translate(86.279297 0)"/>
       <use xlink:href="#DejaVuSans-2d" transform="translate(140.242188 0)"/>
       <use xlink:href="#DejaVuSans-4b" transform="translate(176.326172 0)"/>
       <use xlink:href="#DejaVuSans-45" transform="translate(241.902344 0)"/>
       <use xlink:href="#DejaVuSans-4d" transform="translate(305.085938 0)"/>
       <use xlink:href="#DejaVuSans-2d" transform="translate(391.365234 0)"/>
       <use xlink:href="#DejaVuSans-31" transform="translate(427.449219 0)"/>
       <use xlink:href="#DejaVuSans-30" transform="translate(491.072266 0)"/>
       <use xlink:href="#DejaVuSans-32" transform="translate(554.695312 0)"/>
       <use xlink:href="#DejaVuSans-34" transform="translate(618.318359 0)"/>
      </g>
     </g>
    </g>
   </g>
   <g id="matplotlib.axis_2">
    <g id="ytick_1">
     <g id="line2d_4">
      <defs>
       <path id="m8c4aa968db" d="M 0 0 
L -3.5 0 
" style="stroke: #000000; stroke-width: 0.8"/>
      </defs>
      <g>
       <use xlink:href="#m8c4aa968db" x="58.764063" y="36.843524" style="stroke: #000000; stroke-width: 0.8"/>
      </g>
     </g>
     <g id="text_4">
      <!-- INVNTT -->
      <g transform="translate(14.970313 40.642743) scale(0.1 -0.1)">
       <defs>
        <path id="DejaVuSans-49" d="M 628 4666 
L 1259 4666 
L 1259 0 
L 628 0 
L 628 4666 
z
" transform="scale(0.015625)"/>
        <path id="DejaVuSans-4e" d="M 628 4666 
L 1478 4666 
L 3547 763 
L 3547 4666 
L 4159 4666 
L 4159 0 
L 3309 0 
L 1241 3903 
L 1241 0 
L 628 0 
L 628 4666 
z
" transform="scale(0.015625)"/>
        <path id="DejaVuSans-56" d="M 1831 0 
L 50 4666 
L 709 4666 
L 2188 738 
L 3669 4666 
L 4325 4666 
L 2547 0 
L 1831 0 
z
" transform="scale(0.015625)"/>
        <path id="DejaVuSans-54" d="M -19 4666 
L 3928 4666 
L 3928 4134 
L 2272 4134 
L 2272 0 
L 1638 0 
L 1638 4134 
L -19 4134 
L -19 4666 
z
" transform="scale(0.015625)"/>
       </defs>
       <use xlink:href="#DejaVuSans-49"/>
       <use xlink:href="#DejaVuSans-4e" transform="translate(29.492188 0)"/>
       <use xlink:href="#DejaVuSans-56" transform="translate(104.296875 0)"/>
       <use xlink:href="#DejaVuSans-4e" transform="translate(172.705078 0)"/>
       <use xlink:href="#DejaVuSans-54" transform="translate(247.509766 0)"/>
       <use xlink:href="#DejaVuSans-54" transform="translate(306.84375 0)"/>
      </g>
     </g>
    </g>
    <g id="ytick_2">
     <g id="line2d_5">
      <g>
       <use xlink:href="#m8c4aa968db" x="58.764063" y="65.894321" style="stroke: #000000; stroke-width: 0.8"/>
      </g>
     </g>
     <g id="text_5">
      <!-- basemul -->
      <g transform="translate(9.06875 69.69354) scale(0.1 -0.1)">
       <defs>
        <path id="DejaVuSans-62" d="M 3116 1747 
Q 3116 2381 2855 2742 
Q 2594 3103 2138 3103 
Q 1681 3103 1420 2742 
Q 1159 2381 1159 1747 
Q 1159 1113 1420 752 
Q 1681 391 2138 391 
Q 2594 391 2855 752 
Q 3116 1113 3116 1747 
z
M 1159 2969 
Q 1341 3281 1617 3432 
Q 1894 3584 2278 3584 
Q 2916 3584 3314 3078 
Q 3713 2572 3713 1747 
Q 3713 922 3314 415 
Q 2916 -91 2278 -91 
Q 1894 -91 1617 61 
Q 1341 213 1159 525 
L 1159 0 
L 581 0 
L 581 4863 
L 1159 4863 
L 1159 2969 
z
" transform="scale(0.015625)"/>
        <path id="DejaVuSans-61" d="M 2194 1759 
Q 1497 1759 1228 1600 
Q 959 1441 959 1056 
Q 959 750 1161 570 
Q 1363 391 1709 391 
Q 2188 391 2477 730 
Q 2766 1069 2766 1631 
L 2766 1759 
L 2194 1759 
z
M 3341 1997 
L 3341 0 
L 2766 0 
L 2766 531 
Q 2569 213 2275 61 
Q 1981 -91 1556 -91 
Q 1019 -91 701 211 
Q 384 513 384 1019 
Q 384 1609 779 1909 
Q 1175 2209 1959 2209 
L 2766 2209 
L 2766 2266 
Q 2766 2663 2505 2880 
Q 2244 3097 1772 3097 
Q 1472 3097 1187 3025 
Q 903 2953 641 2809 
L 641 3341 
Q 956 3463 1253 3523 
Q 1550 3584 1831 3584 
Q 2591 3584 2966 3190 
Q 3341 2797 3341 1997 
z
" transform="scale(0.015625)"/>
        <path id="DejaVuSans-73" d="M 2834 3397 
L 2834 2853 
Q 2591 2978 2328 3040 
Q 2066 3103 1784 3103 
Q 1356 3103 1142 2972 
Q 928 2841 928 2578 
Q 928 2378 1081 2264 
Q 1234 2150 1697 2047 
L 1894 2003 
Q 2506 1872 2764 1633 
Q 3022 1394 3022 966 
Q 3022 478 2636 193 
Q 2250 -91 1575 -91 
Q 1294 -91 989 -36 
Q 684 19 347 128 
L 347 722 
Q 666 556 975 473 
Q 1284 391 1588 391 
Q 1994 391 2212 530 
Q 2431 669 2431 922 
Q 2431 1156 2273 1281 
Q 2116 1406 1581 1522 
L 1381 1569 
Q 847 1681 609 1914 
Q 372 2147 372 2553 
Q 372 3047 722 3315 
Q 1072 3584 1716 3584 
Q 2034 3584 2315 3537 
Q 2597 3491 2834 3397 
z
" transform="scale(0.015625)"/>
        <path id="DejaVuSans-65" d="M 3597 1894 
L 3597 1613 
L 953 1613 
Q 991 1019 1311 708 
Q 1631 397 2203 397 
Q 2534 397 2845 478 
Q 3156 559 3463 722 
L 3463 178 
Q 3153 47 2828 -22 
Q 2503 -91 2169 -91 
Q 1331 -91 842 396 
Q 353 884 353 1716 
Q 353 2575 817 3079 
Q 1281 3584 2069 3584 
Q 2775 3584 3186 3129 
Q 3597 2675 3597 1894 
z
M 3022 2063 
Q 3016 2534 2758 2815 
Q 2500 3097 2075 3097 
Q 1594 3097 1305 2825 
Q 1016 2553 972 2059 
L 3022 2063 
z
" transform="scale(0.015625)"/>
        <path id="DejaVuSans-6d" d="M 3328 2828 
Q 3544 3216 3844 3400 
Q 4144 3584 4550 3584 
Q 5097 3584 5394 3201 
Q 5691 2819 5691 2113 
L 5691 0 
L 5113 0 
L 5113 2094 
Q 5113 2597 4934 2840 
Q 4756 3084 4391 3084 
Q 3944 3084 3684 2787 
Q 3425 2491 3425 1978 
L 3425 0 
L 2847 0 
L 2847 2094 
Q 2847 2600 2669 2842 
Q 2491 3084 2119 3084 
Q 1678 3084 1418 2786 
Q 1159 2488 1159 1978 
L 1159 0 
L 581 0 
L 581 3500 
L 1159 3500 
L 1159 2956 
Q 1356 3278 1631 3431 
Q 1906 3584 2284 3584 
Q 2666 3584 2933 3390 
Q 3200 3197 3328 2828 
z
" transform="scale(0.015625)"/>
        <path id="DejaVuSans-75" d="M 544 1381 
L 544 3500 
L 1119 3500 
L 1119 1403 
Q 1119 906 1312 657 
Q 1506 409 1894 409 
Q 2359 409 2629 706 
Q 2900 1003 2900 1516 
L 2900 3500 
L 3475 3500 
L 3475 0 
L 2900 0 
L 2900 538 
Q 2691 219 2414 64 
Q 2138 -91 1772 -91 
Q 1169 -91 856 284 
Q 544 659 544 1381 
z
M 1991 3584 
L 1991 3584 
z
" transform="scale(0.015625)"/>
        <path id="DejaVuSans-6c" d="M 603 4863 
L 1178 4863 
L 1178 0 
L 603 0 
L 603 4863 
z
" transform="scale(0.015625)"/>
       </defs>
       <use xlink:href="#DejaVuSans-62"/>
       <use xlink:href="#DejaVuSans-61" transform="translate(63.476562 0)"/>
       <use xlink:href="#DejaVuSans-73" transform="translate(124.755859 0)"/>
       <use xlink:href="#DejaVuSans-65" transform="translate(176.855469 0)"/>
       <use xlink:href="#DejaVuSans-6d" transform="translate(238.378906 0)"/>
       <use xlink:href="#DejaVuSans-75" transform="translate(335.791016 0)"/>
       <use xlink:href="#DejaVuSans-6c" transform="translate(399.169922 0)"/>
      </g>
     </g>
    </g>
    <g id="ytick_3">
     <g id="line2d_6">
      <g>
       <use xlink:href="#m8c4aa968db" x="58.764063" y="94.945119" style="stroke: #000000; stroke-width: 0.8"/>
      </g>
     </g>
     <g id="text_6">
      <!-- frommsg -->
      <g transform="translate(7.2 98.744338) scale(0.1 -0.1)">
       <defs>
        <path id="DejaVuSans-66" d="M 2375 4863 
L 2375 4384 
L 1825 4384 
Q 1516 4384 1395 4259 
Q 1275 4134 1275 3809 
L 1275 3500 
L 2222 3500 
L 2222 3053 
L 1275 3053 
L 1275 0 
L 697 0 
L 697 3053 
L 147 3053 
L 147 3500 
L 697 3500 
L 697 3744 
Q 697 4328 969 4595 
Q 1241 4863 1831 4863 
L 2375 4863 
z
" transform="scale(0.015625)"/>
        <path id="DejaVuSans-72" d="M 2631 2963 
Q 2534 3019 2420 3045 
Q 2306 3072 2169 3072 
Q 1681 3072 1420 2755 
Q 1159 2438 1159 1844 
L 1159 0 
L 581 0 
L 581 3500 
L 1159 3500 
L 1159 2956 
Q 1341 3275 1631 3429 
Q 1922 3584 2338 3584 
Q 2397 3584 2469 3576 
Q 2541 3569 2628 3553 
L 2631 2963 
z
" transform="scale(0.015625)"/>
        <path id="DejaVuSans-6f" d="M 1959 3097 
Q 1497 3097 1228 2736 
Q 959 2375 959 1747 
Q 959 1119 1226 758 
Q 1494 397 1959 397 
Q 2419 397 2687 759 
Q 2956 1122 2956 1747 
Q 2956 2369 2687 2733 
Q 2419 3097 1959 3097 
z
M 1959 3584 
Q 2709 3584 3137 3096 
Q 3566 2609 3566 1747 
Q 3566 888 3137 398 
Q 2709 -91 1959 -91 
Q 1206 -91 779 398 
Q 353 888 353 1747 
Q 353 2609 779 3096 
Q 1206 3584 1959 3584 
z
" transform="scale(0.015625)"/>
        <path id="DejaVuSans-67" d="M 2906 1791 
Q 2906 2416 2648 2759 
Q 2391 3103 1925 3103 
Q 1463 3103 1205 2759 
Q 947 2416 947 1791 
Q 947 1169 1205 825 
Q 1463 481 1925 481 
Q 2391 481 2648 825 
Q 2906 1169 2906 1791 
z
M 3481 434 
Q 3481 -459 3084 -895 
Q 2688 -1331 1869 -1331 
Q 1566 -1331 1297 -1286 
Q 1028 -1241 775 -1147 
L 775 -588 
Q 1028 -725 1275 -790 
Q 1522 -856 1778 -856 
Q 2344 -856 2625 -561 
Q 2906 -266 2906 331 
L 2906 616 
Q 2728 306 2450 153 
Q 2172 0 1784 0 
Q 1141 0 747 490 
Q 353 981 353 1791 
Q 353 2603 747 3093 
Q 1141 3584 1784 3584 
Q 2172 3584 2450 3431 
Q 2728 3278 2906 2969 
L 2906 3500 
L 3481 3500 
L 3481 434 
z
" transform="scale(0.015625)"/>
       </defs>
       <use xlink:href="#DejaVuSans-66"/>
       <use xlink:href="#DejaVuSans-72" transform="translate(35.205078 0)"/>
       <use xlink:href="#DejaVuSans-6f" transform="translate(74.068359 0)"/>
       <use xlink:href="#DejaVuSans-6d" transform="translate(135.25 0)"/>
       <use xlink:href="#DejaVuSans-6d" transform="translate(232.662109 0)"/>
       <use xlink:href="#DejaVuSans-73" transform="translate(330.074219 0)"/>
       <use xlink:href="#DejaVuSans-67" transform="translate(382.173828 0)"/>
      </g>
     </g>
    </g>
    <g id="ytick_4">
     <g id="line2d_7">
      <g>
       <use xlink:href="#m8c4aa968db" x="58.764063" y="123.995917" style="stroke: #000000; stroke-width: 0.8"/>
      </g>
     </g>
     <g id="text_7">
      <!-- NTT -->
      <g transform="translate(32.242188 127.795135) scale(0.1 -0.1)">
       <use xlink:href="#DejaVuSans-4e"/>
       <use xlink:href="#DejaVuSans-54" transform="translate(74.804688 0)"/>
       <use xlink:href="#DejaVuSans-54" transform="translate(134.138672 0)"/>
      </g>
     </g>
    </g>
    <g id="ytick_5">
     <g id="line2d_8">
      <g>
       <use xlink:href="#m8c4aa968db" x="58.764063" y="153.046714" style="stroke: #000000; stroke-width: 0.8"/>
      </g>
     </g>
     <g id="text_8">
      <!-- iDec -->
      <g transform="translate(29.634375 156.845933) scale(0.1 -0.1)">
       <defs>
        <path id="DejaVuSans-69" d="M 603 3500 
L 1178 3500 
L 1178 0 
L 603 0 
L 603 3500 
z
M 603 4863 
L 1178 4863 
L 1178 4134 
L 603 4134 
L 603 4863 
z
" transform="scale(0.015625)"/>
        <path id="DejaVuSans-44" d="M 1259 4147 
L 1259 519 
L 2022 519 
Q 2988 519 3436 956 
Q 3884 1394 3884 2338 
Q 3884 3275 3436 3711 
Q 2988 4147 2022 4147 
L 1259 4147 
z
M 628 4666 
L 1925 4666 
Q 3281 4666 3915 4102 
Q 4550 3538 4550 2338 
Q 4550 1131 3912 565 
Q 3275 0 1925 0 
L 628 0 
L 628 4666 
z
" transform="scale(0.015625)"/>
        <path id="DejaVuSans-63" d="M 3122 3366 
L 3122 2828 
Q 2878 2963 2633 3030 
Q 2388 3097 2138 3097 
Q 1578 3097 1268 2742 
Q 959 2388 959 1747 
Q 959 1106 1268 751 
Q 1578 397 2138 397 
Q 2388 397 2633 464 
Q 2878 531 3122 666 
L 3122 134 
Q 2881 22 2623 -34 
Q 2366 -91 2075 -91 
Q 1284 -91 818 406 
Q 353 903 353 1747 
Q 353 2603 823 3093 
Q 1294 3584 2113 3584 
Q 2378 3584 2631 3529 
Q 2884 3475 3122 3366 
z
" transform="scale(0.015625)"/>
       </defs>
       <use xlink:href="#DejaVuSans-69"/>
       <use xlink:href="#DejaVuSans-44" transform="translate(27.783203 0)"/>
       <use xlink:href="#DejaVuSans-65" transform="translate(104.785156 0)"/>
       <use xlink:href="#DejaVuSans-63" transform="translate(166.308594 0)"/>
      </g>
     </g>
    </g>
    <g id="ytick_6">
     <g id="line2d_9">
      <g>
       <use xlink:href="#m8c4aa968db" x="58.764063" y="182.097512" style="stroke: #000000; stroke-width: 0.8"/>
      </g>
     </g>
     <g id="text_9">
      <!-- iEnc -->
      <g transform="translate(30.83125 185.896731) scale(0.1 -0.1)">
       <defs>
        <path id="DejaVuSans-6e" d="M 3513 2113 
L 3513 0 
L 2938 0 
L 2938 2094 
Q 2938 2591 2744 2837 
Q 2550 3084 2163 3084 
Q 1697 3084 1428 2787 
Q 1159 2491 1159 1978 
L 1159 0 
L 581 0 
L 581 3500 
L 1159 3500 
L 1159 2956 
Q 1366 3272 1645 3428 
Q 1925 3584 2291 3584 
Q 2894 3584 3203 3211 
Q 3513 2838 3513 2113 
z
" transform="scale(0.015625)"/>
       </defs>
       <use xlink:href="#DejaVuSans-69"/>
       <use xlink:href="#DejaVuSans-45" transform="translate(27.783203 0)"/>
       <use xlink:href="#DejaVuSans-6e" transform="translate(90.966797 0)"/>
       <use xlink:href="#DejaVuSans-63" transform="translate(154.345703 0)"/>
      </g>
     </g>
    </g>
    <g id="ytick_7">
     <g id="line2d_10">
      <g>
       <use xlink:href="#m8c4aa968db" x="58.764063" y="211.14831" style="stroke: #000000; stroke-width: 0.8"/>
      </g>
     </g>
     <g id="text_10">
      <!-- iKeypair -->
      <g transform="translate(11.490625 214.947528) scale(0.1 -0.1)">
       <defs>
        <path id="DejaVuSans-79" d="M 2059 -325 
Q 1816 -950 1584 -1140 
Q 1353 -1331 966 -1331 
L 506 -1331 
L 506 -850 
L 844 -850 
Q 1081 -850 1212 -737 
Q 1344 -625 1503 -206 
L 1606 56 
L 191 3500 
L 800 3500 
L 1894 763 
L 2988 3500 
L 3597 3500 
L 2059 -325 
z
" transform="scale(0.015625)"/>
        <path id="DejaVuSans-70" d="M 1159 525 
L 1159 -1331 
L 581 -1331 
L 581 3500 
L 1159 3500 
L 1159 2969 
Q 1341 3281 1617 3432 
Q 1894 3584 2278 3584 
Q 2916 3584 3314 3078 
Q 3713 2572 3713 1747 
Q 3713 922 3314 415 
Q 2916 -91 2278 -91 
Q 1894 -91 1617 61 
Q 1341 213 1159 525 
z
M 3116 1747 
Q 3116 2381 2855 2742 
Q 2594 3103 2138 3103 
Q 1681 3103 1420 2742 
Q 1159 2381 1159 1747 
Q 1159 1113 1420 752 
Q 1681 391 2138 391 
Q 2594 391 2855 752 
Q 3116 1113 3116 1747 
z
" transform="scale(0.015625)"/>
       </defs>
       <use xlink:href="#DejaVuSans-69"/>
       <use xlink:href="#DejaVuSans-4b" transform="translate(27.783203 0)"/>
       <use xlink:href="#DejaVuSans-65" transform="translate(88.359375 0)"/>
       <use xlink:href="#DejaVuSans-79" transform="translate(149.882812 0)"/>
       <use xlink:href="#DejaVuSans-70" transform="translate(209.0625 0)"/>
       <use xlink:href="#DejaVuSans-61" transform="translate(272.539062 0)"/>
       <use xlink:href="#DejaVuSans-69" transform="translate(333.818359 0)"/>
       <use xlink:href="#DejaVuSans-72" transform="translate(361.601562 0)"/>
      </g>
     </g>
    </g>
    <g id="ytick_8">
     <g id="line2d_11">
      <g>
       <use xlink:href="#m8c4aa968db" x="58.764063" y="240.199107" style="stroke: #000000; stroke-width: 0.8"/>
      </g>
     </g>
     <g id="text_11">
      <!-- gen_a -->
      <g transform="translate(21.796875 243.859263) scale(0.1 -0.1)">
       <defs>
        <path id="DejaVuSans-5f" d="M 3263 -1063 
L 3263 -1509 
L -63 -1509 
L -63 -1063 
L 3263 -1063 
z
" transform="scale(0.015625)"/>
       </defs>
       <use xlink:href="#DejaVuSans-67"/>
       <use xlink:href="#DejaVuSans-65" transform="translate(63.476562 0)"/>
       <use xlink:href="#DejaVuSans-6e" transform="translate(125 0)"/>
       <use xlink:href="#DejaVuSans-5f" transform="translate(188.378906 0)"/>
       <use xlink:href="#DejaVuSans-61" transform="translate(238.378906 0)"/>
      </g>
     </g>
    </g>
    <g id="ytick_9">
     <g id="line2d_12">
      <g>
       <use xlink:href="#m8c4aa968db" x="58.764063" y="269.249905" style="stroke: #000000; stroke-width: 0.8"/>
      </g>
     </g>
     <g id="text_12">
      <!-- noise -->
      <g transform="translate(25.167188 273.049124) scale(0.1 -0.1)">
       <use xlink:href="#DejaVuSans-6e"/>
       <use xlink:href="#DejaVuSans-6f" transform="translate(63.378906 0)"/>
       <use xlink:href="#DejaVuSans-69" transform="translate(124.560547 0)"/>
       <use xlink:href="#DejaVuSans-73" transform="translate(152.34375 0)"/>
       <use xlink:href="#DejaVuSans-65" transform="translate(204.443359 0)"/>
      </g>
     </g>
    </g>
   </g>
   <g id="patch_3">
    <path d="M 58.764063 283.775304 
L 58.764063 22.318125 
" style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/>
   </g>
   <g id="patch_4">
    <path d="M 145.916455 283.775304 
L 145.916455 22.318125 
" style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/>
   </g>
   <g id="patch_5">
    <path d="M 58.764063 283.775304 
L 145.916455 283.775304 
" style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/>
   </g>
   <g id="patch_6">
    <path d="M 58.764063 22.318125 
L 145.916455 22.318125 
" style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/>
   </g>
   <g id="text_13">
    <!-- 1.000 -->
    <g style="fill: #ffffff" transform="translate(58.975399 39.602899) scale(0.1 -0.1)">
     <defs>
      <path id="DejaVuSans-2e" d="M 684 794 
L 1344 794 
L 1344 0 
L 684 0 
L 684 794 
z
" transform="scale(0.015625)"/>
     </defs>
     <use xlink:href="#DejaVuSans-31"/>
     <use xlink:href="#DejaVuSans-2e" transform="translate(63.623047 0)"/>
     <use xlink:href="#DejaVuSans-30" transform="translate(95.410156 0)"/>
     <use xlink:href="#DejaVuSans-30" transform="translate(159.033203 0)"/>
     <use xlink:href="#DejaVuSans-30" transform="translate(222.65625 0)"/>
    </g>
   </g>
   <g id="text_14">
    <!-- 1.000 -->
    <g style="fill: #ffffff" transform="translate(88.026196 39.602899) scale(0.1 -0.1)">
     <use xlink:href="#DejaVuSans-31"/>
     <use xlink:href="#DejaVuSans-2e" transform="translate(63.623047 0)"/>
     <use xlink:href="#DejaVuSans-30" transform="translate(95.410156 0)"/>
     <use xlink:href="#DejaVuSans-30" transform="translate(159.033203 0)"/>
     <use xlink:href="#DejaVuSans-30" transform="translate(222.65625 0)"/>
    </g>
   </g>
   <g id="text_15">
    <!-- 1.000 -->
    <g style="fill: #ffffff" transform="translate(117.076994 39.602899) scale(0.1 -0.1)">
     <use xlink:href="#DejaVuSans-31"/>
     <use xlink:href="#DejaVuSans-2e" transform="translate(63.623047 0)"/>
     <use xlink:href="#DejaVuSans-30" transform="translate(95.410156 0)"/>
     <use xlink:href="#DejaVuSans-30" transform="translate(159.033203 0)"/>
     <use xlink:href="#DejaVuSans-30" transform="translate(222.65625 0)"/>
    </g>
   </g>
   <g id="text_16">
    <!-- 1.000 -->
    <g style="fill: #ffffff" transform="translate(58.975399 68.653696) scale(0.1 -0.1)">
     <use xlink:href="#DejaVuSans-31"/>
     <use xlink:href="#DejaVuSans-2e" transform="translate(63.623047 0)"/>
     <use xlink:href="#DejaVuSans-30" transform="translate(95.410156 0)"/>
     <use xlink:href="#DejaVuSans-30" transform="translate(159.033203 0)"/>
     <use xlink:href="#DejaVuSans-30" transform="translate(222.65625 0)"/>
    </g>
   </g>
   <g id="text_17">
    <!-- 1.000 -->
    <g style="fill: #ffffff" transform="translate(88.026196 68.653696) scale(0.1 -0.1)">
     <use xlink:href="#DejaVuSans-31"/>
     <use xlink:href="#DejaVuSans-2e" transform="translate(63.623047 0)"/>
     <use xlink:href="#DejaVuSans-30" transform="translate(95.410156 0)"/>
     <use xlink:href="#DejaVuSans-30" transform="translate(159.033203 0)"/>
     <use xlink:href="#DejaVuSans-30" transform="translate(222.65625 0)"/>
    </g>
   </g>
   <g id="text_18">
    <!-- 1.000 -->
    <g style="fill: #ffffff" transform="translate(117.076994 68.653696) scale(0.1 -0.1)">
     <use xlink:href="#DejaVuSans-31"/>
     <use xlink:href="#DejaVuSans-2e" transform="translate(63.623047 0)"/>
     <use xlink:href="#DejaVuSans-30" transform="translate(95.410156 0)"/>
     <use xlink:href="#DejaVuSans-30" transform="translate(159.033203 0)"/>
     <use xlink:href="#DejaVuSans-30" transform="translate(222.65625 0)"/>
    </g>
   </g>
   <g id="text_19">
    <!-- 1.000 -->
    <g style="fill: #ffffff" transform="translate(58.975399 97.704494) scale(0.1 -0.1)">
     <use xlink:href="#DejaVuSans-31"/>
     <use xlink:href="#DejaVuSans-2e" transform="translate(63.623047 0)"/>
     <use xlink:href="#DejaVuSans-30" transform="translate(95.410156 0)"/>
     <use xlink:href="#DejaVuSans-30" transform="translate(159.033203 0)"/>
     <use xlink:href="#DejaVuSans-30" transform="translate(222.65625 0)"/>
    </g>
   </g>
   <g id="text_20">
    <!-- 1.000 -->
    <g style="fill: #ffffff" transform="translate(88.026196 97.704494) scale(0.1 -0.1)">
     <use xlink:href="#DejaVuSans-31"/>
     <use xlink:href="#DejaVuSans-2e" transform="translate(63.623047 0)"/>
     <use xlink:href="#DejaVuSans-30" transform="translate(95.410156 0)"/>
     <use xlink:href="#DejaVuSans-30" transform="translate(159.033203 0)"/>
     <use xlink:href="#DejaVuSans-30" transform="translate(222.65625 0)"/>
    </g>
   </g>
   <g id="text_21">
    <!-- 1.000 -->
    <g style="fill: #ffffff" transform="translate(117.076994 97.704494) scale(0.1 -0.1)">
     <use xlink:href="#DejaVuSans-31"/>
     <use xlink:href="#DejaVuSans-2e" transform="translate(63.623047 0)"/>
     <use xlink:href="#DejaVuSans-30" transform="translate(95.410156 0)"/>
     <use xlink:href="#DejaVuSans-30" transform="translate(159.033203 0)"/>
     <use xlink:href="#DejaVuSans-30" transform="translate(222.65625 0)"/>
    </g>
   </g>
   <g id="text_22">
    <!-- 1.000 -->
    <g style="fill: #ffffff" transform="translate(58.975399 126.755292) scale(0.1 -0.1)">
     <use xlink:href="#DejaVuSans-31"/>
     <use xlink:href="#DejaVuSans-2e" transform="translate(63.623047 0)"/>
     <use xlink:href="#DejaVuSans-30" transform="translate(95.410156 0)"/>
     <use xlink:href="#DejaVuSans-30" transform="translate(159.033203 0)"/>
     <use xlink:href="#DejaVuSans-30" transform="translate(222.65625 0)"/>
    </g>
   </g>
   <g id="text_23">
    <!-- 1.000 -->
    <g style="fill: #ffffff" transform="translate(88.026196 126.755292) scale(0.1 -0.1)">
     <use xlink:href="#DejaVuSans-31"/>
     <use xlink:href="#DejaVuSans-2e" transform="translate(63.623047 0)"/>
     <use xlink:href="#DejaVuSans-30" transform="translate(95.410156 0)"/>
     <use xlink:href="#DejaVuSans-30" transform="translate(159.033203 0)"/>
     <use xlink:href="#DejaVuSans-30" transform="translate(222.65625 0)"/>
    </g>
   </g>
   <g id="text_24">
    <!-- 1.000 -->
    <g style="fill: #ffffff" transform="translate(117.076994 126.755292) scale(0.1 -0.1)">
     <use xlink:href="#DejaVuSans-31"/>
     <use xlink:href="#DejaVuSans-2e" transform="translate(63.623047 0)"/>
     <use xlink:href="#DejaVuSans-30" transform="translate(95.410156 0)"/>
     <use xlink:href="#DejaVuSans-30" transform="translate(159.033203 0)"/>
     <use xlink:href="#DejaVuSans-30" transform="translate(222.65625 0)"/>
    </g>
   </g>
   <g id="text_25">
    <!-- 1.000 -->
    <g style="fill: #ffffff" transform="translate(58.975399 155.806089) scale(0.1 -0.1)">
     <use xlink:href="#DejaVuSans-31"/>
     <use xlink:href="#DejaVuSans-2e" transform="translate(63.623047 0)"/>
     <use xlink:href="#DejaVuSans-30" transform="translate(95.410156 0)"/>
     <use xlink:href="#DejaVuSans-30" transform="translate(159.033203 0)"/>
     <use xlink:href="#DejaVuSans-30" transform="translate(222.65625 0)"/>
    </g>
   </g>
   <g id="text_26">
    <!-- 1.000 -->
    <g style="fill: #ffffff" transform="translate(88.026196 155.806089) scale(0.1 -0.1)">
     <use xlink:href="#DejaVuSans-31"/>
     <use xlink:href="#DejaVuSans-2e" transform="translate(63.623047 0)"/>
     <use xlink:href="#DejaVuSans-30" transform="translate(95.410156 0)"/>
     <use xlink:href="#DejaVuSans-30" transform="translate(159.033203 0)"/>
     <use xlink:href="#DejaVuSans-30" transform="translate(222.65625 0)"/>
    </g>
   </g>
   <g id="text_27">
    <!-- 1.000 -->
    <g style="fill: #ffffff" transform="translate(117.076994 155.806089) scale(0.1 -0.1)">
     <use xlink:href="#DejaVuSans-31"/>
     <use xlink:href="#DejaVuSans-2e" transform="translate(63.623047 0)"/>
     <use xlink:href="#DejaVuSans-30" transform="translate(95.410156 0)"/>
     <use xlink:href="#DejaVuSans-30" transform="translate(159.033203 0)"/>
     <use xlink:href="#DejaVuSans-30" transform="translate(222.65625 0)"/>
    </g>
   </g>
   <g id="text_28">
    <!-- 1.000 -->
    <g style="fill: #ffffff" transform="translate(58.975399 184.856887) scale(0.1 -0.1)">
     <use xlink:href="#DejaVuSans-31"/>
     <use xlink:href="#DejaVuSans-2e" transform="translate(63.623047 0)"/>
     <use xlink:href="#DejaVuSans-30" transform="translate(95.410156 0)"/>
     <use xlink:href="#DejaVuSans-30" transform="translate(159.033203 0)"/>
     <use xlink:href="#DejaVuSans-30" transform="translate(222.65625 0)"/>
    </g>
   </g>
   <g id="text_29">
    <!-- 1.000 -->
    <g style="fill: #ffffff" transform="translate(88.026196 184.856887) scale(0.1 -0.1)">
     <use xlink:href="#DejaVuSans-31"/>
     <use xlink:href="#DejaVuSans-2e" transform="translate(63.623047 0)"/>
     <use xlink:href="#DejaVuSans-30" transform="translate(95.410156 0)"/>
     <use xlink:href="#DejaVuSans-30" transform="translate(159.033203 0)"/>
     <use xlink:href="#DejaVuSans-30" transform="translate(222.65625 0)"/>
    </g>
   </g>
   <g id="text_30">
    <!-- 1.000 -->
    <g style="fill: #ffffff" transform="translate(117.076994 184.856887) scale(0.1 -0.1)">
     <use xlink:href="#DejaVuSans-31"/>
     <use xlink:href="#DejaVuSans-2e" transform="translate(63.623047 0)"/>
     <use xlink:href="#DejaVuSans-30" transform="translate(95.410156 0)"/>
     <use xlink:href="#DejaVuSans-30" transform="translate(159.033203 0)"/>
     <use xlink:href="#DejaVuSans-30" transform="translate(222.65625 0)"/>
    </g>
   </g>
   <g id="text_31">
    <!-- 1.000 -->
    <g style="fill: #ffffff" transform="translate(58.975399 213.907685) scale(0.1 -0.1)">
     <use xlink:href="#DejaVuSans-31"/>
     <use xlink:href="#DejaVuSans-2e" transform="translate(63.623047 0)"/>
     <use xlink:href="#DejaVuSans-30" transform="translate(95.410156 0)"/>
     <use xlink:href="#DejaVuSans-30" transform="translate(159.033203 0)"/>
     <use xlink:href="#DejaVuSans-30" transform="translate(222.65625 0)"/>
    </g>
   </g>
   <g id="text_32">
    <!-- 1.000 -->
    <g style="fill: #ffffff" transform="translate(88.026196 213.907685) scale(0.1 -0.1)">
     <use xlink:href="#DejaVuSans-31"/>
     <use xlink:href="#DejaVuSans-2e" transform="translate(63.623047 0)"/>
     <use xlink:href="#DejaVuSans-30" transform="translate(95.410156 0)"/>
     <use xlink:href="#DejaVuSans-30" transform="translate(159.033203 0)"/>
     <use xlink:href="#DejaVuSans-30" transform="translate(222.65625 0)"/>
    </g>
   </g>
   <g id="text_33">
    <!-- 1.000 -->
    <g style="fill: #ffffff" transform="translate(117.076994 213.907685) scale(0.1 -0.1)">
     <use xlink:href="#DejaVuSans-31"/>
     <use xlink:href="#DejaVuSans-2e" transform="translate(63.623047 0)"/>
     <use xlink:href="#DejaVuSans-30" transform="translate(95.410156 0)"/>
     <use xlink:href="#DejaVuSans-30" transform="translate(159.033203 0)"/>
     <use xlink:href="#DejaVuSans-30" transform="translate(222.65625 0)"/>
    </g>
   </g>
   <g id="text_34">
    <!-- 1.000 -->
    <g style="fill: #ffffff" transform="translate(58.975399 242.958482) scale(0.1 -0.1)">
     <use xlink:href="#DejaVuSans-31"/>
     <use xlink:href="#DejaVuSans-2e" transform="translate(63.623047 0)"/>
     <use xlink:href="#DejaVuSans-30" transform="translate(95.410156 0)"/>
     <use xlink:href="#DejaVuSans-30" transform="translate(159.033203 0)"/>
     <use xlink:href="#DejaVuSans-30" transform="translate(222.65625 0)"/>
    </g>
   </g>
   <g id="text_35">
    <!-- 1.000 -->
    <g style="fill: #ffffff" transform="translate(88.026196 242.958482) scale(0.1 -0.1)">
     <use xlink:href="#DejaVuSans-31"/>
     <use xlink:href="#DejaVuSans-2e" transform="translate(63.623047 0)"/>
     <use xlink:href="#DejaVuSans-30" transform="translate(95.410156 0)"/>
     <use xlink:href="#DejaVuSans-30" transform="translate(159.033203 0)"/>
     <use xlink:href="#DejaVuSans-30" transform="translate(222.65625 0)"/>
    </g>
   </g>
   <g id="text_36">
    <!-- 1.000 -->
    <g style="fill: #ffffff" transform="translate(117.076994 242.958482) scale(0.1 -0.1)">
     <use xlink:href="#DejaVuSans-31"/>
     <use xlink:href="#DejaVuSans-2e" transform="translate(63.623047 0)"/>
     <use xlink:href="#DejaVuSans-30" transform="translate(95.410156 0)"/>
     <use xlink:href="#DejaVuSans-30" transform="translate(159.033203 0)"/>
     <use xlink:href="#DejaVuSans-30" transform="translate(222.65625 0)"/>
    </g>
   </g>
   <g id="text_37">
    <!-- 1.000 -->
    <g style="fill: #ffffff" transform="translate(58.975399 272.00928) scale(0.1 -0.1)">
     <use xlink:href="#DejaVuSans-31"/>
     <use xlink:href="#DejaVuSans-2e" transform="translate(63.623047 0)"/>
     <use xlink:href="#DejaVuSans-30" transform="translate(95.410156 0)"/>
     <use xlink:href="#DejaVuSans-30" transform="translate(159.033203 0)"/>
     <use xlink:href="#DejaVuSans-30" transform="translate(222.65625 0)"/>
    </g>
   </g>
   <g id="text_38">
    <!-- 1.000 -->
    <g style="fill: #ffffff" transform="translate(88.026196 272.00928) scale(0.1 -0.1)">
     <use xlink:href="#DejaVuSans-31"/>
     <use xlink:href="#DejaVuSans-2e" transform="translate(63.623047 0)"/>
     <use xlink:href="#DejaVuSans-30" transform="translate(95.410156 0)"/>
     <use xlink:href="#DejaVuSans-30" transform="translate(159.033203 0)"/>
     <use xlink:href="#DejaVuSans-30" transform="translate(222.65625 0)"/>
    </g>
   </g>
   <g id="text_39">
    <!-- 0.999 -->
    <g style="fill: #ffffff" transform="translate(117.076994 272.00928) scale(0.1 -0.1)">
     <defs>
      <path id="DejaVuSans-39" d="M 703 97 
L 703 672 
Q 941 559 1184 500 
Q 1428 441 1663 441 
Q 2288 441 2617 861 
Q 2947 1281 2994 2138 
Q 2813 1869 2534 1725 
Q 2256 1581 1919 1581 
Q 1219 1581 811 2004 
Q 403 2428 403 3163 
Q 403 3881 828 4315 
Q 1253 4750 1959 4750 
Q 2769 4750 3195 4129 
Q 3622 3509 3622 2328 
Q 3622 1225 3098 567 
Q 2575 -91 1691 -91 
Q 1453 -91 1209 -44 
Q 966 3 703 97 
z
M 1959 2075 
Q 2384 2075 2632 2365 
Q 2881 2656 2881 3163 
Q 2881 3666 2632 3958 
Q 2384 4250 1959 4250 
Q 1534 4250 1286 3958 
Q 1038 3666 1038 3163 
Q 1038 2656 1286 2365 
Q 1534 2075 1959 2075 
z
" transform="scale(0.015625)"/>
     </defs>
     <use xlink:href="#DejaVuSans-30"/>
     <use xlink:href="#DejaVuSans-2e" transform="translate(63.623047 0)"/>
     <use xlink:href="#DejaVuSans-39" transform="translate(95.410156 0)"/>
     <use xlink:href="#DejaVuSans-39" transform="translate(159.033203 0)"/>
     <use xlink:href="#DejaVuSans-39" transform="translate(222.65625 0)"/>
    </g>
   </g>
   <g id="text_40">
    <!-- Cliff's delta (ref vs. avx2) -->
    <g transform="translate(26.995259 16.318125) scale(0.12 -0.12)">
     <defs>
      <path id="DejaVuSans-43" d="M 4122 4306 
L 4122 3641 
Q 3803 3938 3442 4084 
Q 3081 4231 2675 4231 
Q 1875 4231 1450 3742 
Q 1025 3253 1025 2328 
Q 1025 1406 1450 917 
Q 1875 428 2675 428 
Q 3081 428 3442 575 
Q 3803 722 4122 1019 
L 4122 359 
Q 3791 134 3420 21 
Q 3050 -91 2638 -91 
Q 1578 -91 968 557 
Q 359 1206 359 2328 
Q 359 3453 968 4101 
Q 1578 4750 2638 4750 
Q 3056 4750 3426 4639 
Q 3797 4528 4122 4306 
z
" transform="scale(0.015625)"/>
      <path id="DejaVuSans-27" d="M 1147 4666 
L 1147 2931 
L 616 2931 
L 616 4666 
L 1147 4666 
z
" transform="scale(0.015625)"/>
      <path id="DejaVuSans-20" transform="scale(0.015625)"/>
      <path id="DejaVuSans-64" d="M 2906 2969 
L 2906 4863 
L 3481 4863 
L 3481 0 
L 2906 0 
L 2906 525 
Q 2725 213 2448 61 
Q 2172 -91 1784 -91 
Q 1150 -91 751 415 
Q 353 922 353 1747 
Q 353 2572 751 3078 
Q 1150 3584 1784 3584 
Q 2172 3584 2448 3432 
Q 2725 3281 2906 2969 
z
M 947 1747 
Q 947 1113 1208 752 
Q 1469 391 1925 391 
Q 2381 391 2643 752 
Q 2906 1113 2906 1747 
Q 2906 2381 2643 2742 
Q 2381 3103 1925 3103 
Q 1469 3103 1208 2742 
Q 947 2381 947 1747 
z
" transform="scale(0.015625)"/>
      <path id="DejaVuSans-74" d="M 1172 4494 
L 1172 3500 
L 2356 3500 
L 2356 3053 
L 1172 3053 
L 1172 1153 
Q 1172 725 1289 603 
Q 1406 481 1766 481 
L 2356 481 
L 2356 0 
L 1766 0 
Q 1100 0 847 248 
Q 594 497 594 1153 
L 594 3053 
L 172 3053 
L 172 3500 
L 594 3500 
L 594 4494 
L 1172 4494 
z
" transform="scale(0.015625)"/>
      <path id="DejaVuSans-28" d="M 1984 4856 
Q 1566 4138 1362 3434 
Q 1159 2731 1159 2009 
Q 1159 1288 1364 580 
Q 1569 -128 1984 -844 
L 1484 -844 
Q 1016 -109 783 600 
Q 550 1309 550 2009 
Q 550 2706 781 3412 
Q 1013 4119 1484 4856 
L 1984 4856 
z
" transform="scale(0.015625)"/>
      <path id="DejaVuSans-76" d="M 191 3500 
L 800 3500 
L 1894 563 
L 2988 3500 
L 3597 3500 
L 2284 0 
L 1503 0 
L 191 3500 
z
" transform="scale(0.015625)"/>
      <path id="DejaVuSans-78" d="M 3513 3500 
L 2247 1797 
L 3578 0 
L 2900 0 
L 1881 1375 
L 863 0 
L 184 0 
L 1544 1831 
L 300 3500 
L 978 3500 
L 1906 2253 
L 2834 3500 
L 3513 3500 
z
" transform="scale(0.015625)"/>
      <path id="DejaVuSans-29" d="M 513 4856 
L 1013 4856 
Q 1481 4119 1714 3412 
Q 1947 2706 1947 2009 
Q 1947 1309 1714 600 
Q 1481 -109 1013 -844 
L 513 -844 
Q 928 -128 1133 580 
Q 1338 1288 1338 2009 
Q 1338 2731 1133 3434 
Q 928 4138 513 4856 
z
" transform="scale(0.015625)"/>
     </defs>
     <use xlink:href="#DejaVuSans-43"/>
     <use xlink:href="#DejaVuSans-6c" transform="translate(69.824219 0)"/>
     <use xlink:href="#DejaVuSans-69" transform="translate(97.607422 0)"/>
     <use xlink:href="#DejaVuSans-66" transform="translate(125.390625 0)"/>
     <use xlink:href="#DejaVuSans-66" transform="translate(160.595703 0)"/>
     <use xlink:href="#DejaVuSans-27" transform="translate(195.800781 0)"/>
     <use xlink:href="#DejaVuSans-73" transform="translate(223.291016 0)"/>
     <use xlink:href="#DejaVuSans-20" transform="translate(275.390625 0)"/>
     <use xlink:href="#DejaVuSans-64" transform="translate(307.177734 0)"/>
     <use xlink:href="#DejaVuSans-65" transform="translate(370.654297 0)"/>
     <use xlink:href="#DejaVuSans-6c" transform="translate(432.177734 0)"/>
     <use xlink:href="#DejaVuSans-74" transform="translate(459.960938 0)"/>
     <use xlink:href="#DejaVuSans-61" transform="translate(499.169922 0)"/>
     <use xlink:href="#DejaVuSans-20" transform="translate(560.449219 0)"/>
     <use xlink:href="#DejaVuSans-28" transform="translate(592.236328 0)"/>
     <use xlink:href="#DejaVuSans-72" transform="translate(631.25 0)"/>
     <use xlink:href="#DejaVuSans-65" transform="translate(670.113281 0)"/>
     <use xlink:href="#DejaVuSans-66" transform="translate(731.636719 0)"/>
     <use xlink:href="#DejaVuSans-20" transform="translate(766.841797 0)"/>
     <use xlink:href="#DejaVuSans-76" transform="translate(798.628906 0)"/>
     <use xlink:href="#DejaVuSans-73" transform="translate(857.808594 0)"/>
     <use xlink:href="#DejaVuSans-2e" transform="translate(909.908203 0)"/>
     <use xlink:href="#DejaVuSans-20" transform="translate(941.695312 0)"/>
     <use xlink:href="#DejaVuSans-61" transform="translate(973.482422 0)"/>
     <use xlink:href="#DejaVuSans-76" transform="translate(1034.761719 0)"/>
     <use xlink:href="#DejaVuSans-78" transform="translate(1093.941406 0)"/>
     <use xlink:href="#DejaVuSans-32" transform="translate(1153.121094 0)"/>
     <use xlink:href="#DejaVuSans-29" transform="translate(1216.744141 0)"/>
    </g>
   </g>
  </g>
 </g>
 <defs>
  <clipPath id="pf7f2b173a6">
   <rect x="58.764063" y="22.318125" width="87.152393" height="261.457179"/>
  </clipPath>
 </defs>
</svg>
<figcaption class="viz-caption">Cliff&#39;s $\delta$ (`ref` vs. `avx2`) for all operations and parameter sets. $\delta = +1$: AVX2 is faster in every observation pair. Nearly all cells are at $+1.000$.</figcaption></figure>
<h3 id="cross-parameter-consistency">Cross-Parameter Consistency</h3>
<p>The figure shows the <code>avx2</code> speedup for the four per-polynomial operations across ML-KEM-512, ML-KEM-768, and ML-KEM-1024. Since all three instantiations operate on 256-coefficient polynomials, speedups for <code>frommsg</code> and <code>INVNTT</code> should be parameter-independent. This holds approximately: frommsg varies by only <span class="math inline">\pm{10\%}</span>, <abbr class="smallcaps">INVNTT</abbr> by <span class="math inline">\pm{6\%}</span>.</p>
<p><code>NTT</code> shows a more pronounced variation (<span class="math inline">35.5\times</span> at ML-KEM-512, <span class="math inline">39.4\times</span> at ML-KEM-768, <span class="math inline">34.6\times</span> at ML-KEM-1024) that is statistically real (non-overlapping 95% CIs). We attribute this to <em>cache state effects</em>: the surrounding polyvec loops that precede each <abbr class="smallcaps">NTT</abbr> call have a footprint that varies with <span class="math inline">k</span>, leaving different cache residency patterns that affect <abbr class="smallcaps">NTT</abbr> latency in the scalar <code>ref</code> path. The AVX2 path is less sensitive because its smaller register footprint keeps more state in vector registers.</p>
<figure class="viz-figure"><?xml version="1.0" encoding="utf-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
  "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg xmlns:xlink="http://www.w3.org/1999/xlink" width="565.485pt" height="280.237344pt" viewBox="0 0 565.485 280.237344" xmlns="http://www.w3.org/2000/svg" version="1.1">
 <metadata>
  <rdf:RDF xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
   <cc:Work>
    <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
    <dc:date>2026-04-26T19:42:53.906045</dc:date>
    <dc:format>image/svg+xml</dc:format>
    <dc:creator>
     <cc:Agent>
      <dc:title>Matplotlib v3.10.9, https://matplotlib.org/</dc:title>
     </cc:Agent>
    </dc:creator>
   </cc:Work>
  </rdf:RDF>
 </metadata>
 <defs>
  <style type="text/css">*{stroke-linejoin: round; stroke-linecap: butt}</style>
 </defs>
 <g id="figure_1">
  <g id="patch_1">
   <path d="M 0 280.237344 
L 565.485 280.237344 
L 565.485 0 
L 0 0 
L 0 280.237344 
z
" style="fill: none"/>
  </g>
  <g id="axes_1">
   <g id="patch_2">
    <path d="M 40.625 256.359219 
L 558.285 256.359219 
L 558.285 10.999219 
L 40.625 10.999219 
L 40.625 256.359219 
z
" style="fill: none"/>
   </g>
   <g id="patch_3">
    <path d="M 64.155 256.359219 
L 95.528333 256.359219 
L 95.528333 96.374484 
L 64.155 96.374484 
z
" clip-path="url(#pee0884f294)" style="fill: #333333"/>
   </g>
   <g id="patch_4">
    <path d="M 189.648333 256.359219 
L 221.021667 256.359219 
L 221.021667 59.156834 
L 189.648333 59.156834 
z
" clip-path="url(#pee0884f294)" style="fill: #333333"/>
   </g>
   <g id="patch_5">
    <path d="M 315.141667 256.359219 
L 346.515 256.359219 
L 346.515 73.94969 
L 315.141667 73.94969 
z
" clip-path="url(#pee0884f294)" style="fill: #333333"/>
   </g>
   <g id="patch_6">
    <path d="M 440.635 256.359219 
L 472.008333 256.359219 
L 472.008333 131.834407 
L 440.635 131.834407 
z
" clip-path="url(#pee0884f294)" style="fill: #333333"/>
   </g>
   <g id="patch_7">
    <path d="M 95.528333 256.359219 
L 126.901667 256.359219 
L 126.901667 84.067966 
L 95.528333 84.067966 
z
" clip-path="url(#pee0884f294)" style="fill: #777777"/>
   </g>
   <g id="patch_8">
    <path d="M 221.021667 256.359219 
L 252.395 256.359219 
L 252.395 73.291703 
L 221.021667 73.291703 
z
" clip-path="url(#pee0884f294)" style="fill: #777777"/>
   </g>
   <g id="patch_9">
    <path d="M 346.515 256.359219 
L 377.888333 256.359219 
L 377.888333 89.592982 
L 346.515 89.592982 
z
" clip-path="url(#pee0884f294)" style="fill: #777777"/>
   </g>
   <g id="patch_10">
    <path d="M 472.008333 256.359219 
L 503.381667 256.359219 
L 503.381667 118.288821 
L 472.008333 118.288821 
z
" clip-path="url(#pee0884f294)" style="fill: #777777"/>
   </g>
   <g id="patch_11">
    <path d="M 126.901667 256.359219 
L 158.275 256.359219 
L 158.275 62.22823 
L 126.901667 62.22823 
z
" clip-path="url(#pee0884f294)" style="fill: #bbbbbb"/>
   </g>
   <g id="patch_12">
    <path d="M 252.395 256.359219 
L 283.768333 256.359219 
L 283.768333 79.36652 
L 252.395 79.36652 
z
" clip-path="url(#pee0884f294)" style="fill: #bbbbbb"/>
   </g>
   <g id="patch_13">
    <path d="M 377.888333 256.359219 
L 409.261667 256.359219 
L 409.261667 110.428438 
L 377.888333 110.428438 
z
" clip-path="url(#pee0884f294)" style="fill: #bbbbbb"/>
   </g>
   <g id="patch_14">
    <path d="M 503.381667 256.359219 
L 534.755 256.359219 
L 534.755 135.130844 
L 503.381667 135.130844 
z
" clip-path="url(#pee0884f294)" style="fill: #bbbbbb"/>
   </g>
   <g id="matplotlib.axis_1">
    <g id="xtick_1">
     <g id="line2d_1">
      <defs>
       <path id="m9ee6a81661" d="M 0 0 
L 0 3.5 
" style="stroke: #000000; stroke-width: 0.8"/>
      </defs>
      <g>
       <use xlink:href="#m9ee6a81661" x="111.215" y="256.359219" style="stroke: #000000; stroke-width: 0.8"/>
      </g>
     </g>
     <g id="text_1">
      <!-- frommsg -->
      <g transform="translate(88.932969 270.957656) scale(0.1 -0.1)">
       <defs>
        <path id="DejaVuSans-66" d="M 2375 4863 
L 2375 4384 
L 1825 4384 
Q 1516 4384 1395 4259 
Q 1275 4134 1275 3809 
L 1275 3500 
L 2222 3500 
L 2222 3053 
L 1275 3053 
L 1275 0 
L 697 0 
L 697 3053 
L 147 3053 
L 147 3500 
L 697 3500 
L 697 3744 
Q 697 4328 969 4595 
Q 1241 4863 1831 4863 
L 2375 4863 
z
" transform="scale(0.015625)"/>
        <path id="DejaVuSans-72" d="M 2631 2963 
Q 2534 3019 2420 3045 
Q 2306 3072 2169 3072 
Q 1681 3072 1420 2755 
Q 1159 2438 1159 1844 
L 1159 0 
L 581 0 
L 581 3500 
L 1159 3500 
L 1159 2956 
Q 1341 3275 1631 3429 
Q 1922 3584 2338 3584 
Q 2397 3584 2469 3576 
Q 2541 3569 2628 3553 
L 2631 2963 
z
" transform="scale(0.015625)"/>
        <path id="DejaVuSans-6f" d="M 1959 3097 
Q 1497 3097 1228 2736 
Q 959 2375 959 1747 
Q 959 1119 1226 758 
Q 1494 397 1959 397 
Q 2419 397 2687 759 
Q 2956 1122 2956 1747 
Q 2956 2369 2687 2733 
Q 2419 3097 1959 3097 
z
M 1959 3584 
Q 2709 3584 3137 3096 
Q 3566 2609 3566 1747 
Q 3566 888 3137 398 
Q 2709 -91 1959 -91 
Q 1206 -91 779 398 
Q 353 888 353 1747 
Q 353 2609 779 3096 
Q 1206 3584 1959 3584 
z
" transform="scale(0.015625)"/>
        <path id="DejaVuSans-6d" d="M 3328 2828 
Q 3544 3216 3844 3400 
Q 4144 3584 4550 3584 
Q 5097 3584 5394 3201 
Q 5691 2819 5691 2113 
L 5691 0 
L 5113 0 
L 5113 2094 
Q 5113 2597 4934 2840 
Q 4756 3084 4391 3084 
Q 3944 3084 3684 2787 
Q 3425 2491 3425 1978 
L 3425 0 
L 2847 0 
L 2847 2094 
Q 2847 2600 2669 2842 
Q 2491 3084 2119 3084 
Q 1678 3084 1418 2786 
Q 1159 2488 1159 1978 
L 1159 0 
L 581 0 
L 581 3500 
L 1159 3500 
L 1159 2956 
Q 1356 3278 1631 3431 
Q 1906 3584 2284 3584 
Q 2666 3584 2933 3390 
Q 3200 3197 3328 2828 
z
" transform="scale(0.015625)"/>
        <path id="DejaVuSans-73" d="M 2834 3397 
L 2834 2853 
Q 2591 2978 2328 3040 
Q 2066 3103 1784 3103 
Q 1356 3103 1142 2972 
Q 928 2841 928 2578 
Q 928 2378 1081 2264 
Q 1234 2150 1697 2047 
L 1894 2003 
Q 2506 1872 2764 1633 
Q 3022 1394 3022 966 
Q 3022 478 2636 193 
Q 2250 -91 1575 -91 
Q 1294 -91 989 -36 
Q 684 19 347 128 
L 347 722 
Q 666 556 975 473 
Q 1284 391 1588 391 
Q 1994 391 2212 530 
Q 2431 669 2431 922 
Q 2431 1156 2273 1281 
Q 2116 1406 1581 1522 
L 1381 1569 
Q 847 1681 609 1914 
Q 372 2147 372 2553 
Q 372 3047 722 3315 
Q 1072 3584 1716 3584 
Q 2034 3584 2315 3537 
Q 2597 3491 2834 3397 
z
" transform="scale(0.015625)"/>
        <path id="DejaVuSans-67" d="M 2906 1791 
Q 2906 2416 2648 2759 
Q 2391 3103 1925 3103 
Q 1463 3103 1205 2759 
Q 947 2416 947 1791 
Q 947 1169 1205 825 
Q 1463 481 1925 481 
Q 2391 481 2648 825 
Q 2906 1169 2906 1791 
z
M 3481 434 
Q 3481 -459 3084 -895 
Q 2688 -1331 1869 -1331 
Q 1566 -1331 1297 -1286 
Q 1028 -1241 775 -1147 
L 775 -588 
Q 1028 -725 1275 -790 
Q 1522 -856 1778 -856 
Q 2344 -856 2625 -561 
Q 2906 -266 2906 331 
L 2906 616 
Q 2728 306 2450 153 
Q 2172 0 1784 0 
Q 1141 0 747 490 
Q 353 981 353 1791 
Q 353 2603 747 3093 
Q 1141 3584 1784 3584 
Q 2172 3584 2450 3431 
Q 2728 3278 2906 2969 
L 2906 3500 
L 3481 3500 
L 3481 434 
z
" transform="scale(0.015625)"/>
       </defs>
       <use xlink:href="#DejaVuSans-66"/>
       <use xlink:href="#DejaVuSans-72" transform="translate(35.205078 0)"/>
       <use xlink:href="#DejaVuSans-6f" transform="translate(74.068359 0)"/>
       <use xlink:href="#DejaVuSans-6d" transform="translate(135.25 0)"/>
       <use xlink:href="#DejaVuSans-6d" transform="translate(232.662109 0)"/>
       <use xlink:href="#DejaVuSans-73" transform="translate(330.074219 0)"/>
       <use xlink:href="#DejaVuSans-67" transform="translate(382.173828 0)"/>
      </g>
     </g>
    </g>
    <g id="xtick_2">
     <g id="line2d_2">
      <g>
       <use xlink:href="#m9ee6a81661" x="236.708333" y="256.359219" style="stroke: #000000; stroke-width: 0.8"/>
      </g>
     </g>
     <g id="text_2">
      <!-- INVNTT -->
      <g transform="translate(218.311458 270.957656) scale(0.1 -0.1)">
       <defs>
        <path id="DejaVuSans-49" d="M 628 4666 
L 1259 4666 
L 1259 0 
L 628 0 
L 628 4666 
z
" transform="scale(0.015625)"/>
        <path id="DejaVuSans-4e" d="M 628 4666 
L 1478 4666 
L 3547 763 
L 3547 4666 
L 4159 4666 
L 4159 0 
L 3309 0 
L 1241 3903 
L 1241 0 
L 628 0 
L 628 4666 
z
" transform="scale(0.015625)"/>
        <path id="DejaVuSans-56" d="M 1831 0 
L 50 4666 
L 709 4666 
L 2188 738 
L 3669 4666 
L 4325 4666 
L 2547 0 
L 1831 0 
z
" transform="scale(0.015625)"/>
        <path id="DejaVuSans-54" d="M -19 4666 
L 3928 4666 
L 3928 4134 
L 2272 4134 
L 2272 0 
L 1638 0 
L 1638 4134 
L -19 4134 
L -19 4666 
z
" transform="scale(0.015625)"/>
       </defs>
       <use xlink:href="#DejaVuSans-49"/>
       <use xlink:href="#DejaVuSans-4e" transform="translate(29.492188 0)"/>
       <use xlink:href="#DejaVuSans-56" transform="translate(104.296875 0)"/>
       <use xlink:href="#DejaVuSans-4e" transform="translate(172.705078 0)"/>
       <use xlink:href="#DejaVuSans-54" transform="translate(247.509766 0)"/>
       <use xlink:href="#DejaVuSans-54" transform="translate(306.84375 0)"/>
      </g>
     </g>
    </g>
    <g id="xtick_3">
     <g id="line2d_3">
      <g>
       <use xlink:href="#m9ee6a81661" x="362.201667" y="256.359219" style="stroke: #000000; stroke-width: 0.8"/>
      </g>
     </g>
     <g id="text_3">
      <!-- basemul -->
      <g transform="translate(340.85401 270.957656) scale(0.1 -0.1)">
       <defs>
        <path id="DejaVuSans-62" d="M 3116 1747 
Q 3116 2381 2855 2742 
Q 2594 3103 2138 3103 
Q 1681 3103 1420 2742 
Q 1159 2381 1159 1747 
Q 1159 1113 1420 752 
Q 1681 391 2138 391 
Q 2594 391 2855 752 
Q 3116 1113 3116 1747 
z
M 1159 2969 
Q 1341 3281 1617 3432 
Q 1894 3584 2278 3584 
Q 2916 3584 3314 3078 
Q 3713 2572 3713 1747 
Q 3713 922 3314 415 
Q 2916 -91 2278 -91 
Q 1894 -91 1617 61 
Q 1341 213 1159 525 
L 1159 0 
L 581 0 
L 581 4863 
L 1159 4863 
L 1159 2969 
z
" transform="scale(0.015625)"/>
        <path id="DejaVuSans-61" d="M 2194 1759 
Q 1497 1759 1228 1600 
Q 959 1441 959 1056 
Q 959 750 1161 570 
Q 1363 391 1709 391 
Q 2188 391 2477 730 
Q 2766 1069 2766 1631 
L 2766 1759 
L 2194 1759 
z
M 3341 1997 
L 3341 0 
L 2766 0 
L 2766 531 
Q 2569 213 2275 61 
Q 1981 -91 1556 -91 
Q 1019 -91 701 211 
Q 384 513 384 1019 
Q 384 1609 779 1909 
Q 1175 2209 1959 2209 
L 2766 2209 
L 2766 2266 
Q 2766 2663 2505 2880 
Q 2244 3097 1772 3097 
Q 1472 3097 1187 3025 
Q 903 2953 641 2809 
L 641 3341 
Q 956 3463 1253 3523 
Q 1550 3584 1831 3584 
Q 2591 3584 2966 3190 
Q 3341 2797 3341 1997 
z
" transform="scale(0.015625)"/>
        <path id="DejaVuSans-65" d="M 3597 1894 
L 3597 1613 
L 953 1613 
Q 991 1019 1311 708 
Q 1631 397 2203 397 
Q 2534 397 2845 478 
Q 3156 559 3463 722 
L 3463 178 
Q 3153 47 2828 -22 
Q 2503 -91 2169 -91 
Q 1331 -91 842 396 
Q 353 884 353 1716 
Q 353 2575 817 3079 
Q 1281 3584 2069 3584 
Q 2775 3584 3186 3129 
Q 3597 2675 3597 1894 
z
M 3022 2063 
Q 3016 2534 2758 2815 
Q 2500 3097 2075 3097 
Q 1594 3097 1305 2825 
Q 1016 2553 972 2059 
L 3022 2063 
z
" transform="scale(0.015625)"/>
        <path id="DejaVuSans-75" d="M 544 1381 
L 544 3500 
L 1119 3500 
L 1119 1403 
Q 1119 906 1312 657 
Q 1506 409 1894 409 
Q 2359 409 2629 706 
Q 2900 1003 2900 1516 
L 2900 3500 
L 3475 3500 
L 3475 0 
L 2900 0 
L 2900 538 
Q 2691 219 2414 64 
Q 2138 -91 1772 -91 
Q 1169 -91 856 284 
Q 544 659 544 1381 
z
M 1991 3584 
L 1991 3584 
z
" transform="scale(0.015625)"/>
        <path id="DejaVuSans-6c" d="M 603 4863 
L 1178 4863 
L 1178 0 
L 603 0 
L 603 4863 
z
" transform="scale(0.015625)"/>
       </defs>
       <use xlink:href="#DejaVuSans-62"/>
       <use xlink:href="#DejaVuSans-61" transform="translate(63.476562 0)"/>
       <use xlink:href="#DejaVuSans-73" transform="translate(124.755859 0)"/>
       <use xlink:href="#DejaVuSans-65" transform="translate(176.855469 0)"/>
       <use xlink:href="#DejaVuSans-6d" transform="translate(238.378906 0)"/>
       <use xlink:href="#DejaVuSans-75" transform="translate(335.791016 0)"/>
       <use xlink:href="#DejaVuSans-6c" transform="translate(399.169922 0)"/>
      </g>
     </g>
    </g>
    <g id="xtick_4">
     <g id="line2d_4">
      <g>
       <use xlink:href="#m9ee6a81661" x="487.695" y="256.359219" style="stroke: #000000; stroke-width: 0.8"/>
      </g>
     </g>
     <g id="text_4">
      <!-- NTT -->
      <g transform="translate(477.934062 270.957656) scale(0.1 -0.1)">
       <use xlink:href="#DejaVuSans-4e"/>
       <use xlink:href="#DejaVuSans-54" transform="translate(74.804688 0)"/>
       <use xlink:href="#DejaVuSans-54" transform="translate(134.138672 0)"/>
      </g>
     </g>
    </g>
   </g>
   <g id="matplotlib.axis_2">
    <g id="ytick_1">
     <g id="line2d_5">
      <defs>
       <path id="m5e4ca4062c" d="M 0 0 
L -3.5 0 
" style="stroke: #000000; stroke-width: 0.8"/>
      </defs>
      <g>
       <use xlink:href="#m5e4ca4062c" x="40.625" y="256.359219" style="stroke: #000000; stroke-width: 0.8"/>
      </g>
     </g>
     <g id="text_5">
      <!-- 0 -->
      <g transform="translate(27.2625 260.158438) scale(0.1 -0.1)">
       <defs>
        <path id="DejaVuSans-30" d="M 2034 4250 
Q 1547 4250 1301 3770 
Q 1056 3291 1056 2328 
Q 1056 1369 1301 889 
Q 1547 409 2034 409 
Q 2525 409 2770 889 
Q 3016 1369 3016 2328 
Q 3016 3291 2770 3770 
Q 2525 4250 2034 4250 
z
M 2034 4750 
Q 2819 4750 3233 4129 
Q 3647 3509 3647 2328 
Q 3647 1150 3233 529 
Q 2819 -91 2034 -91 
Q 1250 -91 836 529 
Q 422 1150 422 2328 
Q 422 3509 836 4129 
Q 1250 4750 2034 4750 
z
" transform="scale(0.015625)"/>
       </defs>
       <use xlink:href="#DejaVuSans-30"/>
      </g>
     </g>
    </g>
    <g id="ytick_2">
     <g id="line2d_6">
      <g>
       <use xlink:href="#m5e4ca4062c" x="40.625" y="221.30779" style="stroke: #000000; stroke-width: 0.8"/>
      </g>
     </g>
     <g id="text_6">
      <!-- 10 -->
      <g transform="translate(20.9 225.107009) scale(0.1 -0.1)">
       <defs>
        <path id="DejaVuSans-31" d="M 794 531 
L 1825 531 
L 1825 4091 
L 703 3866 
L 703 4441 
L 1819 4666 
L 2450 4666 
L 2450 531 
L 3481 531 
L 3481 0 
L 794 0 
L 794 531 
z
" transform="scale(0.015625)"/>
       </defs>
       <use xlink:href="#DejaVuSans-31"/>
       <use xlink:href="#DejaVuSans-30" transform="translate(63.623047 0)"/>
      </g>
     </g>
    </g>
    <g id="ytick_3">
     <g id="line2d_7">
      <g>
       <use xlink:href="#m5e4ca4062c" x="40.625" y="186.256362" style="stroke: #000000; stroke-width: 0.8"/>
      </g>
     </g>
     <g id="text_7">
      <!-- 20 -->
      <g transform="translate(20.9 190.05558) scale(0.1 -0.1)">
       <defs>
        <path id="DejaVuSans-32" d="M 1228 531 
L 3431 531 
L 3431 0 
L 469 0 
L 469 531 
Q 828 903 1448 1529 
Q 2069 2156 2228 2338 
Q 2531 2678 2651 2914 
Q 2772 3150 2772 3378 
Q 2772 3750 2511 3984 
Q 2250 4219 1831 4219 
Q 1534 4219 1204 4116 
Q 875 4013 500 3803 
L 500 4441 
Q 881 4594 1212 4672 
Q 1544 4750 1819 4750 
Q 2544 4750 2975 4387 
Q 3406 4025 3406 3419 
Q 3406 3131 3298 2873 
Q 3191 2616 2906 2266 
Q 2828 2175 2409 1742 
Q 1991 1309 1228 531 
z
" transform="scale(0.015625)"/>
       </defs>
       <use xlink:href="#DejaVuSans-32"/>
       <use xlink:href="#DejaVuSans-30" transform="translate(63.623047 0)"/>
      </g>
     </g>
    </g>
    <g id="ytick_4">
     <g id="line2d_8">
      <g>
       <use xlink:href="#m5e4ca4062c" x="40.625" y="151.204933" style="stroke: #000000; stroke-width: 0.8"/>
      </g>
     </g>
     <g id="text_8">
      <!-- 30 -->
      <g transform="translate(20.9 155.004152) scale(0.1 -0.1)">
       <defs>
        <path id="DejaVuSans-33" d="M 2597 2516 
Q 3050 2419 3304 2112 
Q 3559 1806 3559 1356 
Q 3559 666 3084 287 
Q 2609 -91 1734 -91 
Q 1441 -91 1130 -33 
Q 819 25 488 141 
L 488 750 
Q 750 597 1062 519 
Q 1375 441 1716 441 
Q 2309 441 2620 675 
Q 2931 909 2931 1356 
Q 2931 1769 2642 2001 
Q 2353 2234 1838 2234 
L 1294 2234 
L 1294 2753 
L 1863 2753 
Q 2328 2753 2575 2939 
Q 2822 3125 2822 3475 
Q 2822 3834 2567 4026 
Q 2313 4219 1838 4219 
Q 1578 4219 1281 4162 
Q 984 4106 628 3988 
L 628 4550 
Q 988 4650 1302 4700 
Q 1616 4750 1894 4750 
Q 2613 4750 3031 4423 
Q 3450 4097 3450 3541 
Q 3450 3153 3228 2886 
Q 3006 2619 2597 2516 
z
" transform="scale(0.015625)"/>
       </defs>
       <use xlink:href="#DejaVuSans-33"/>
       <use xlink:href="#DejaVuSans-30" transform="translate(63.623047 0)"/>
      </g>
     </g>
    </g>
    <g id="ytick_5">
     <g id="line2d_9">
      <g>
       <use xlink:href="#m5e4ca4062c" x="40.625" y="116.153504" style="stroke: #000000; stroke-width: 0.8"/>
      </g>
     </g>
     <g id="text_9">
      <!-- 40 -->
      <g transform="translate(20.9 119.952723) scale(0.1 -0.1)">
       <defs>
        <path id="DejaVuSans-34" d="M 2419 4116 
L 825 1625 
L 2419 1625 
L 2419 4116 
z
M 2253 4666 
L 3047 4666 
L 3047 1625 
L 3713 1625 
L 3713 1100 
L 3047 1100 
L 3047 0 
L 2419 0 
L 2419 1100 
L 313 1100 
L 313 1709 
L 2253 4666 
z
" transform="scale(0.015625)"/>
       </defs>
       <use xlink:href="#DejaVuSans-34"/>
       <use xlink:href="#DejaVuSans-30" transform="translate(63.623047 0)"/>
      </g>
     </g>
    </g>
    <g id="ytick_6">
     <g id="line2d_10">
      <g>
       <use xlink:href="#m5e4ca4062c" x="40.625" y="81.102076" style="stroke: #000000; stroke-width: 0.8"/>
      </g>
     </g>
     <g id="text_10">
      <!-- 50 -->
      <g transform="translate(20.9 84.901295) scale(0.1 -0.1)">
       <defs>
        <path id="DejaVuSans-35" d="M 691 4666 
L 3169 4666 
L 3169 4134 
L 1269 4134 
L 1269 2991 
Q 1406 3038 1543 3061 
Q 1681 3084 1819 3084 
Q 2600 3084 3056 2656 
Q 3513 2228 3513 1497 
Q 3513 744 3044 326 
Q 2575 -91 1722 -91 
Q 1428 -91 1123 -41 
Q 819 9 494 109 
L 494 744 
Q 775 591 1075 516 
Q 1375 441 1709 441 
Q 2250 441 2565 725 
Q 2881 1009 2881 1497 
Q 2881 1984 2565 2268 
Q 2250 2553 1709 2553 
Q 1456 2553 1204 2497 
Q 953 2441 691 2322 
L 691 4666 
z
" transform="scale(0.015625)"/>
       </defs>
       <use xlink:href="#DejaVuSans-35"/>
       <use xlink:href="#DejaVuSans-30" transform="translate(63.623047 0)"/>
      </g>
     </g>
    </g>
    <g id="ytick_7">
     <g id="line2d_11">
      <g>
       <use xlink:href="#m5e4ca4062c" x="40.625" y="46.050647" style="stroke: #000000; stroke-width: 0.8"/>
      </g>
     </g>
     <g id="text_11">
      <!-- 60 -->
      <g transform="translate(20.9 49.849866) scale(0.1 -0.1)">
       <defs>
        <path id="DejaVuSans-36" d="M 2113 2584 
Q 1688 2584 1439 2293 
Q 1191 2003 1191 1497 
Q 1191 994 1439 701 
Q 1688 409 2113 409 
Q 2538 409 2786 701 
Q 3034 994 3034 1497 
Q 3034 2003 2786 2293 
Q 2538 2584 2113 2584 
z
M 3366 4563 
L 3366 3988 
Q 3128 4100 2886 4159 
Q 2644 4219 2406 4219 
Q 1781 4219 1451 3797 
Q 1122 3375 1075 2522 
Q 1259 2794 1537 2939 
Q 1816 3084 2150 3084 
Q 2853 3084 3261 2657 
Q 3669 2231 3669 1497 
Q 3669 778 3244 343 
Q 2819 -91 2113 -91 
Q 1303 -91 875 529 
Q 447 1150 447 2328 
Q 447 3434 972 4092 
Q 1497 4750 2381 4750 
Q 2619 4750 2861 4703 
Q 3103 4656 3366 4563 
z
" transform="scale(0.015625)"/>
       </defs>
       <use xlink:href="#DejaVuSans-36"/>
       <use xlink:href="#DejaVuSans-30" transform="translate(63.623047 0)"/>
      </g>
     </g>
    </g>
    <g id="ytick_8">
     <g id="line2d_12">
      <g>
       <use xlink:href="#m5e4ca4062c" x="40.625" y="10.999219" style="stroke: #000000; stroke-width: 0.8"/>
      </g>
     </g>
     <g id="text_12">
      <!-- 70 -->
      <g transform="translate(20.9 14.798438) scale(0.1 -0.1)">
       <defs>
        <path id="DejaVuSans-37" d="M 525 4666 
L 3525 4666 
L 3525 4397 
L 1831 0 
L 1172 0 
L 2766 4134 
L 525 4134 
L 525 4666 
z
" transform="scale(0.015625)"/>
       </defs>
       <use xlink:href="#DejaVuSans-37"/>
       <use xlink:href="#DejaVuSans-30" transform="translate(63.623047 0)"/>
      </g>
     </g>
    </g>
    <g id="text_13">
     <!-- Speedup ref $\to$ avx2 ($\times$) -->
     <g transform="translate(14.8 195.379219) rotate(-90) scale(0.1 -0.1)">
      <defs>
       <path id="DejaVuSans-53" d="M 3425 4513 
L 3425 3897 
Q 3066 4069 2747 4153 
Q 2428 4238 2131 4238 
Q 1616 4238 1336 4038 
Q 1056 3838 1056 3469 
Q 1056 3159 1242 3001 
Q 1428 2844 1947 2747 
L 2328 2669 
Q 3034 2534 3370 2195 
Q 3706 1856 3706 1288 
Q 3706 609 3251 259 
Q 2797 -91 1919 -91 
Q 1588 -91 1214 -16 
Q 841 59 441 206 
L 441 856 
Q 825 641 1194 531 
Q 1563 422 1919 422 
Q 2459 422 2753 634 
Q 3047 847 3047 1241 
Q 3047 1584 2836 1778 
Q 2625 1972 2144 2069 
L 1759 2144 
Q 1053 2284 737 2584 
Q 422 2884 422 3419 
Q 422 4038 858 4394 
Q 1294 4750 2059 4750 
Q 2388 4750 2728 4690 
Q 3069 4631 3425 4513 
z
" transform="scale(0.015625)"/>
       <path id="DejaVuSans-70" d="M 1159 525 
L 1159 -1331 
L 581 -1331 
L 581 3500 
L 1159 3500 
L 1159 2969 
Q 1341 3281 1617 3432 
Q 1894 3584 2278 3584 
Q 2916 3584 3314 3078 
Q 3713 2572 3713 1747 
Q 3713 922 3314 415 
Q 2916 -91 2278 -91 
Q 1894 -91 1617 61 
Q 1341 213 1159 525 
z
M 3116 1747 
Q 3116 2381 2855 2742 
Q 2594 3103 2138 3103 
Q 1681 3103 1420 2742 
Q 1159 2381 1159 1747 
Q 1159 1113 1420 752 
Q 1681 391 2138 391 
Q 2594 391 2855 752 
Q 3116 1113 3116 1747 
z
" transform="scale(0.015625)"/>
       <path id="DejaVuSans-64" d="M 2906 2969 
L 2906 4863 
L 3481 4863 
L 3481 0 
L 2906 0 
L 2906 525 
Q 2725 213 2448 61 
Q 2172 -91 1784 -91 
Q 1150 -91 751 415 
Q 353 922 353 1747 
Q 353 2572 751 3078 
Q 1150 3584 1784 3584 
Q 2172 3584 2448 3432 
Q 2725 3281 2906 2969 
z
M 947 1747 
Q 947 1113 1208 752 
Q 1469 391 1925 391 
Q 2381 391 2643 752 
Q 2906 1113 2906 1747 
Q 2906 2381 2643 2742 
Q 2381 3103 1925 3103 
Q 1469 3103 1208 2742 
Q 947 2381 947 1747 
z
" transform="scale(0.015625)"/>
       <path id="DejaVuSans-20" transform="scale(0.015625)"/>
       <path id="DejaVuSans-2192" d="M 5050 2147 
L 5050 1866 
L 3822 638 
L 3447 1013 
L 4175 1741 
L 366 1741 
L 366 2272 
L 4175 2272 
L 3447 3000 
L 3822 3375 
L 5050 2147 
z
" transform="scale(0.015625)"/>
       <path id="DejaVuSans-76" d="M 191 3500 
L 800 3500 
L 1894 563 
L 2988 3500 
L 3597 3500 
L 2284 0 
L 1503 0 
L 191 3500 
z
" transform="scale(0.015625)"/>
       <path id="DejaVuSans-78" d="M 3513 3500 
L 2247 1797 
L 3578 0 
L 2900 0 
L 1881 1375 
L 863 0 
L 184 0 
L 1544 1831 
L 300 3500 
L 978 3500 
L 1906 2253 
L 2834 3500 
L 3513 3500 
z
" transform="scale(0.015625)"/>
       <path id="DejaVuSans-28" d="M 1984 4856 
Q 1566 4138 1362 3434 
Q 1159 2731 1159 2009 
Q 1159 1288 1364 580 
Q 1569 -128 1984 -844 
L 1484 -844 
Q 1016 -109 783 600 
Q 550 1309 550 2009 
Q 550 2706 781 3412 
Q 1013 4119 1484 4856 
L 1984 4856 
z
" transform="scale(0.015625)"/>
       <path id="DejaVuSans-d7" d="M 4488 3438 
L 3059 2003 
L 4488 575 
L 4116 197 
L 2681 1631 
L 1247 197 
L 878 575 
L 2303 2003 
L 878 3438 
L 1247 3816 
L 2681 2381 
L 4116 3816 
L 4488 3438 
z
" transform="scale(0.015625)"/>
       <path id="DejaVuSans-29" d="M 513 4856 
L 1013 4856 
Q 1481 4119 1714 3412 
Q 1947 2706 1947 2009 
Q 1947 1309 1714 600 
Q 1481 -109 1013 -844 
L 513 -844 
Q 928 -128 1133 580 
Q 1338 1288 1338 2009 
Q 1338 2731 1133 3434 
Q 928 4138 513 4856 
z
" transform="scale(0.015625)"/>
      </defs>
      <use xlink:href="#DejaVuSans-53" transform="translate(0 0.015625)"/>
      <use xlink:href="#DejaVuSans-70" transform="translate(63.476562 0.015625)"/>
      <use xlink:href="#DejaVuSans-65" transform="translate(126.953125 0.015625)"/>
      <use xlink:href="#DejaVuSans-65" transform="translate(188.476562 0.015625)"/>
      <use xlink:href="#DejaVuSans-64" transform="translate(250 0.015625)"/>
      <use xlink:href="#DejaVuSans-75" transform="translate(313.476562 0.015625)"/>
      <use xlink:href="#DejaVuSans-70" transform="translate(376.855469 0.015625)"/>
      <use xlink:href="#DejaVuSans-20" transform="translate(440.332031 0.015625)"/>
      <use xlink:href="#DejaVuSans-72" transform="translate(472.119141 0.015625)"/>
      <use xlink:href="#DejaVuSans-65" transform="translate(513.232422 0.015625)"/>
      <use xlink:href="#DejaVuSans-66" transform="translate(574.755859 0.015625)"/>
      <use xlink:href="#DejaVuSans-20" transform="translate(609.960938 0.015625)"/>
      <use xlink:href="#DejaVuSans-2192" transform="translate(661.230469 0.015625)"/>
      <use xlink:href="#DejaVuSans-20" transform="translate(764.501953 0.015625)"/>
      <use xlink:href="#DejaVuSans-61" transform="translate(796.289062 0.015625)"/>
      <use xlink:href="#DejaVuSans-76" transform="translate(857.568359 0.015625)"/>
      <use xlink:href="#DejaVuSans-78" transform="translate(916.748047 0.015625)"/>
      <use xlink:href="#DejaVuSans-32" transform="translate(975.927734 0.015625)"/>
      <use xlink:href="#DejaVuSans-20" transform="translate(1039.550781 0.015625)"/>
      <use xlink:href="#DejaVuSans-28" transform="translate(1071.337891 0.015625)"/>
      <use xlink:href="#DejaVuSans-d7" transform="translate(1110.351562 0.015625)"/>
      <use xlink:href="#DejaVuSans-29" transform="translate(1194.140625 0.015625)"/>
     </g>
    </g>
   </g>
   <g id="LineCollection_1">
    <path d="M 79.841667 96.374484 
L 79.841667 96.374484 
" clip-path="url(#pee0884f294)" style="fill: none; stroke: #000000; stroke-width: 1.5"/>
    <path d="M 205.335 59.156834 
L 205.335 59.156834 
" clip-path="url(#pee0884f294)" style="fill: none; stroke: #000000; stroke-width: 1.5"/>
    <path d="M 330.828333 73.94969 
L 330.828333 71.450929 
" clip-path="url(#pee0884f294)" style="fill: none; stroke: #000000; stroke-width: 1.5"/>
    <path d="M 456.321667 131.871303 
L 456.321667 123.439476 
" clip-path="url(#pee0884f294)" style="fill: none; stroke: #000000; stroke-width: 1.5"/>
   </g>
   <g id="LineCollection_2">
    <path d="M 111.215 84.067966 
L 111.215 84.067966 
" clip-path="url(#pee0884f294)" style="fill: none; stroke: #000000; stroke-width: 1.5"/>
    <path d="M 236.708333 73.291703 
L 236.708333 73.253604 
" clip-path="url(#pee0884f294)" style="fill: none; stroke: #000000; stroke-width: 1.5"/>
    <path d="M 362.201667 89.592982 
L 362.201667 89.592982 
" clip-path="url(#pee0884f294)" style="fill: none; stroke: #000000; stroke-width: 1.5"/>
    <path d="M 487.695 119.857803 
L 487.695 118.288821 
" clip-path="url(#pee0884f294)" style="fill: none; stroke: #000000; stroke-width: 1.5"/>
   </g>
   <g id="LineCollection_3">
    <path d="M 142.588333 62.22823 
L 142.588333 62.22823 
" clip-path="url(#pee0884f294)" style="fill: none; stroke: #000000; stroke-width: 1.5"/>
    <path d="M 268.081667 79.40055 
L 268.081667 79.36652 
" clip-path="url(#pee0884f294)" style="fill: none; stroke: #000000; stroke-width: 1.5"/>
    <path d="M 393.575 110.428438 
L 393.575 110.428438 
" clip-path="url(#pee0884f294)" style="fill: none; stroke: #000000; stroke-width: 1.5"/>
    <path d="M 519.068333 135.166249 
L 519.068333 133.858053 
" clip-path="url(#pee0884f294)" style="fill: none; stroke: #000000; stroke-width: 1.5"/>
   </g>
   <g id="patch_15">
    <path d="M 40.625 256.359219 
L 40.625 10.999219 
" style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/>
   </g>
   <g id="patch_16">
    <path d="M 558.285 256.359219 
L 558.285 10.999219 
" style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/>
   </g>
   <g id="patch_17">
    <path d="M 40.625 256.359219 
L 558.285 256.359219 
" style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/>
   </g>
   <g id="patch_18">
    <path d="M 40.625 10.999219 
L 558.285 10.999219 
" style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/>
   </g>
   <g id="legend_1">
    <g id="patch_19">
     <path d="M 470.657305 24.825717 
L 487.317305 24.825717 
L 487.317305 18.994717 
L 470.657305 18.994717 
z
" style="fill: #333333"/>
    </g>
    <g id="text_14">
     <!-- ML-KEM-512 -->
     <g transform="translate(493.981305 24.825717) scale(0.0833 -0.0833)">
      <defs>
       <path id="DejaVuSans-4d" d="M 628 4666 
L 1569 4666 
L 2759 1491 
L 3956 4666 
L 4897 4666 
L 4897 0 
L 4281 0 
L 4281 4097 
L 3078 897 
L 2444 897 
L 1241 4097 
L 1241 0 
L 628 0 
L 628 4666 
z
" transform="scale(0.015625)"/>
       <path id="DejaVuSans-4c" d="M 628 4666 
L 1259 4666 
L 1259 531 
L 3531 531 
L 3531 0 
L 628 0 
L 628 4666 
z
" transform="scale(0.015625)"/>
       <path id="DejaVuSans-2d" d="M 313 2009 
L 1997 2009 
L 1997 1497 
L 313 1497 
L 313 2009 
z
" transform="scale(0.015625)"/>
       <path id="DejaVuSans-4b" d="M 628 4666 
L 1259 4666 
L 1259 2694 
L 3353 4666 
L 4166 4666 
L 1850 2491 
L 4331 0 
L 3500 0 
L 1259 2247 
L 1259 0 
L 628 0 
L 628 4666 
z
" transform="scale(0.015625)"/>
       <path id="DejaVuSans-45" d="M 628 4666 
L 3578 4666 
L 3578 4134 
L 1259 4134 
L 1259 2753 
L 3481 2753 
L 3481 2222 
L 1259 2222 
L 1259 531 
L 3634 531 
L 3634 0 
L 628 0 
L 628 4666 
z
" transform="scale(0.015625)"/>
      </defs>
      <use xlink:href="#DejaVuSans-4d"/>
      <use xlink:href="#DejaVuSans-4c" transform="translate(86.279297 0)"/>
      <use xlink:href="#DejaVuSans-2d" transform="translate(140.242188 0)"/>
      <use xlink:href="#DejaVuSans-4b" transform="translate(176.326172 0)"/>
      <use xlink:href="#DejaVuSans-45" transform="translate(241.902344 0)"/>
      <use xlink:href="#DejaVuSans-4d" transform="translate(305.085938 0)"/>
      <use xlink:href="#DejaVuSans-2d" transform="translate(391.365234 0)"/>
      <use xlink:href="#DejaVuSans-35" transform="translate(427.449219 0)"/>
      <use xlink:href="#DejaVuSans-31" transform="translate(491.072266 0)"/>
      <use xlink:href="#DejaVuSans-32" transform="translate(554.695312 0)"/>
     </g>
    </g>
    <g id="patch_20">
     <path d="M 470.657305 37.052595 
L 487.317305 37.052595 
L 487.317305 31.221595 
L 470.657305 31.221595 
z
" style="fill: #777777"/>
    </g>
    <g id="text_15">
     <!-- ML-KEM-768 -->
     <g transform="translate(493.981305 37.052595) scale(0.0833 -0.0833)">
      <defs>
       <path id="DejaVuSans-38" d="M 2034 2216 
Q 1584 2216 1326 1975 
Q 1069 1734 1069 1313 
Q 1069 891 1326 650 
Q 1584 409 2034 409 
Q 2484 409 2743 651 
Q 3003 894 3003 1313 
Q 3003 1734 2745 1975 
Q 2488 2216 2034 2216 
z
M 1403 2484 
Q 997 2584 770 2862 
Q 544 3141 544 3541 
Q 544 4100 942 4425 
Q 1341 4750 2034 4750 
Q 2731 4750 3128 4425 
Q 3525 4100 3525 3541 
Q 3525 3141 3298 2862 
Q 3072 2584 2669 2484 
Q 3125 2378 3379 2068 
Q 3634 1759 3634 1313 
Q 3634 634 3220 271 
Q 2806 -91 2034 -91 
Q 1263 -91 848 271 
Q 434 634 434 1313 
Q 434 1759 690 2068 
Q 947 2378 1403 2484 
z
M 1172 3481 
Q 1172 3119 1398 2916 
Q 1625 2713 2034 2713 
Q 2441 2713 2670 2916 
Q 2900 3119 2900 3481 
Q 2900 3844 2670 4047 
Q 2441 4250 2034 4250 
Q 1625 4250 1398 4047 
Q 1172 3844 1172 3481 
z
" transform="scale(0.015625)"/>
      </defs>
      <use xlink:href="#DejaVuSans-4d"/>
      <use xlink:href="#DejaVuSans-4c" transform="translate(86.279297 0)"/>
      <use xlink:href="#DejaVuSans-2d" transform="translate(140.242188 0)"/>
      <use xlink:href="#DejaVuSans-4b" transform="translate(176.326172 0)"/>
      <use xlink:href="#DejaVuSans-45" transform="translate(241.902344 0)"/>
      <use xlink:href="#DejaVuSans-4d" transform="translate(305.085938 0)"/>
      <use xlink:href="#DejaVuSans-2d" transform="translate(391.365234 0)"/>
      <use xlink:href="#DejaVuSans-37" transform="translate(427.449219 0)"/>
      <use xlink:href="#DejaVuSans-36" transform="translate(491.072266 0)"/>
      <use xlink:href="#DejaVuSans-38" transform="translate(554.695312 0)"/>
     </g>
    </g>
    <g id="patch_21">
     <path d="M 470.657305 49.279473 
L 487.317305 49.279473 
L 487.317305 43.448473 
L 470.657305 43.448473 
z
" style="fill: #bbbbbb"/>
    </g>
    <g id="text_16">
     <!-- ML-KEM-1024 -->
     <g transform="translate(493.981305 49.279473) scale(0.0833 -0.0833)">
      <use xlink:href="#DejaVuSans-4d"/>
      <use xlink:href="#DejaVuSans-4c" transform="translate(86.279297 0)"/>
      <use xlink:href="#DejaVuSans-2d" transform="translate(140.242188 0)"/>
      <use xlink:href="#DejaVuSans-4b" transform="translate(176.326172 0)"/>
      <use xlink:href="#DejaVuSans-45" transform="translate(241.902344 0)"/>
      <use xlink:href="#DejaVuSans-4d" transform="translate(305.085938 0)"/>
      <use xlink:href="#DejaVuSans-2d" transform="translate(391.365234 0)"/>
      <use xlink:href="#DejaVuSans-31" transform="translate(427.449219 0)"/>
      <use xlink:href="#DejaVuSans-30" transform="translate(491.072266 0)"/>
      <use xlink:href="#DejaVuSans-32" transform="translate(554.695312 0)"/>
      <use xlink:href="#DejaVuSans-34" transform="translate(618.318359 0)"/>
     </g>
    </g>
   </g>
  </g>
 </g>
 <defs>
  <clipPath id="pee0884f294">
   <rect x="40.625" y="10.999219" width="517.66" height="245.36"/>
  </clipPath>
 </defs>
</svg>
<figcaption class="viz-caption">Per-polynomial operation speedup (`ref` $\to$ `avx2`) across security parameters. Polynomial dimension is 256 for all; variation reflects cache-state differences in the calling context.</figcaption></figure>
<h3 id="hardware-counter-breakdown">Hardware Counter Breakdown</h3>
<div class="annotation annotation--static">
<p><strong>Phase 2:</strong> <abbr class="smallcaps">IPC</abbr>, L1/L2/L3 cache miss rates, branch mispredictions via <abbr class="smallcaps">PAPI</abbr>. This section will contain bar charts of per-counter values comparing ref and avx2 for each operation, explaining the mechanistic origins of the speedup.</p>
</div>
<h3 id="energy-efficiency">Energy Efficiency</h3>
<div class="annotation annotation--static">
<p><strong>Phase 2:</strong> Intel <abbr class="smallcaps">RAPL</abbr> pkg + <abbr class="smallcaps">DRAM</abbr> energy readings per operation. <abbr class="smallcaps">EDP</abbr> (energy-delay product) comparison. Energy per <abbr class="smallcaps">KEM</abbr> operation.</p>
</div>
<h2 id="discussion">Discussion</h2>
<h3 id="why-arithmetic-operations-benefit-most">Why Arithmetic Operations Benefit Most</h3>
<p>The <abbr class="smallcaps">NTT</abbr> butterfly loop processes 128 pairs of 16-bit coefficients per forward transform. In the scalar <code>ref</code> path, each butterfly requires a modular multiplication (implemented as a Barrett reduction), an addition, and a subtraction—roughly 10–15 instructions per pair with data-dependent serialization through the multiply-add chain. The AVX2 path uses <code>vpmullw</code>/<code>vpmulhw</code> to compute 16 Montgomery multiplications per instruction, processing an entire butterfly layer in $$16 fewer instruction cycles.</p>
<p>The observed <abbr class="smallcaps">INVNTT</abbr> speedup of <span class="math inline">56.3\times</span> at ML-KEM-512 <em>exceeds</em> the theoretical <span class="math inline">16\times</span> register-width advantage. We attribute this to two compounding factors: (1) the unrolled hand-written assembly eliminates loop overhead and branch prediction pressure; (2) the inverse <abbr class="smallcaps">NTT</abbr> has a slightly different access pattern than the forward <abbr class="smallcaps">NTT</abbr> that benefits from out-of-order execution with wide issue ports on the Cascade Lake microarchitecture.</p>
<div class="annotation annotation--static">
<p><strong>Phase 2:</strong> Confirm with <abbr class="smallcaps">IPC</abbr> and port utilisation counters.</p>
</div>
<h3 id="why-the-compiler-cannot-auto-vectorize-ntt">Why the Compiler Cannot Auto-Vectorize NTT</h3>
<p>A striking result is that <code>ref</code> and <code>refnv</code> perform nearly identically for all arithmetic operations (<span class="math inline">\leq 10\%</span> difference, with <code>refnv</code> occasionally faster). This means GCC’s tree-vectorizer produces no net benefit for the <abbr class="smallcaps">NTT</abbr> inner loop.</p>
<p>The fundamental obstacle is <em>modular reduction</em>: <a href="https://en.wikipedia.org/wiki/Barrett_reduction" class="link-external" target="_blank" rel="noopener noreferrer" data-link-icon="wikipedia" data-link-icon-type="svg">Barrett reduction</a> and <a href="https://en.wikipedia.org/wiki/Montgomery_modular_multiplication" class="link-external" target="_blank" rel="noopener noreferrer" data-link-icon="wikipedia" data-link-icon-type="svg">Montgomery reduction</a> require a multiply-high operation (<code>vpmulhw</code>) that <abbr class="smallcaps">GCC</abbr> cannot express through the scalar multiply-add chain it generates for the C reference code. Additionally, the <abbr class="smallcaps">NTT</abbr> butterfly requires coefficient interleaving (odd/even index separation) that the auto-vectorizer does not recognize as a known shuffle pattern. The hand-written assembly encodes these patterns directly in <code>vpunpck*</code> instructions.</p>
<p>This finding has practical significance: developers porting <abbr class="smallcaps">ML-KEM</abbr> to new platforms cannot rely on the compiler to provide <abbr class="smallcaps">SIMD</abbr> speedup for the <abbr class="smallcaps">NTT</abbr>. Hand-written intrinsics or architecture-specific assembly are necessary to achieve the substantiate performance gains that we have observed.</p>
<h3 id="why-shake-operations-benefit-less">Why SHAKE Operations Benefit Less</h3>
<p><code>gen_a</code> expands a public seed into a <span class="math inline">k \times k</span> matrix of polynomials using SHAKE-128. Each Keccak-f[1600] permutation operates on a 200-byte state that does not fit in AVX2 registers (16 lanes <span class="math inline">\times</span> 16 bits = 32 bytes). The AVX2 Keccak implementation achieves <span class="math inline">3.8\times</span>–<span class="math inline">4.7\times</span> primarily by batching multiple independent absorb phases and using vectorized <abbr class="smallcaps">XOR</abbr> across parallel state words—a different kind of <abbr class="smallcaps">SIMD</abbr> parallelism than the arithmetic path. The bottleneck shifts to memory bandwidth as the permutation state is repeatedly loaded from and stored to L1 cache.</p>
<h3 id="why-noise-sampling-barely-benefits">Why Noise Sampling Barely Benefits</h3>
<p><abbr class="smallcaps">CBD</abbr> noise sampling reads adjacent bits from a byte stream and computes <a href="https://en.wikipedia.org/wiki/Hamming_weight" class="link-external" target="_blank" rel="noopener noreferrer" data-link-icon="wikipedia" data-link-icon-type="svg">Hamming weights</a>. The scalar path already uses bitwise operations with no data-dependent branches (constant-time design). The AVX2 path can batch the popcount computation but remains bottlenecked by the sequential bitstream access pattern. The small <span class="math inline">1.2\times</span>–<span class="math inline">1.4\times</span> speedup reflects this fundamental memory access bottleneck rather than compute limitation.</p>
<h3 id="ntt-cache-state-variation-across-parameter-sets">NTT Cache-State Variation Across Parameter Sets</h3>
<p>The <span class="math inline">13\%</span> variation in <abbr class="smallcaps">NTT</abbr> speedup across parameter sets (the corresponding section) despite identical polynomial dimensions suggests that execution context matters even for nominally isolated micro-benchmarks. Higher-<span class="math inline">k</span> polyvec operations that precede each <abbr class="smallcaps">NTT</abbr> call have larger memory footprints (<span class="math inline">k</span> more polynomials in the accumulation buffer), potentially evicting portions of the instruction cache or L1 data cache that the scalar <abbr class="smallcaps">NTT</abbr> path relies on. The AVX2 path is less affected because it maintains more coefficient state in vector registers between operations.</p>
<div class="annotation annotation--static">
<p><strong>Phase 2:</strong> Verify with L1/L2 miss counters split by scalar vs AVX2.</p>
</div>
<h3 id="implications-for-deployment">Implications for Deployment</h3>
<p>The end-to-end <abbr class="smallcaps">KEM</abbr> speedups of <span class="math inline">5.4\times</span>–<span class="math inline">7.1\times</span> (Supplementary, the figure) represent the practical deployment benefit. Deployments that cannot use hand-written <abbr class="smallcaps">SIMD</abbr> (e.g., some constrained environments, or languages without inline assembly support) should expect performance within a factor of <span class="math inline">5</span>–<span class="math inline">7</span> of the AVX2 reference. Auto-vectorization provides essentially no shortcut: the gap between compiler-optimized C and hand-written <abbr class="smallcaps">SIMD</abbr> is the full <span class="math inline">5</span>–<span class="math inline">7\times</span>, not a fraction of it.</p>
<h3 id="limitations">Limitations</h3>
<p><strong>No hardware counter data (Phase 1).</strong> The mechanistic explanations in this section are derived analytically from instruction-set structure and publicly known microarchitecture details. Phase 2 will validate these with <abbr class="smallcaps">PAPI</abbr> counter measurements.</p>
<div class="annotation annotation--static">
<p><strong>Phase 2:</strong> <abbr class="smallcaps">PAPI</abbr> counters: <abbr class="smallcaps">IPC</abbr>, cache miss rates.</p>
</div>
<p><strong>Single microarchitecture.</strong> All results are from Intel Cascade Lake (Xeon Platinum 8268). Speedup ratios may differ on other AVX2 hosts (e.g., Intel Skylake, <abbr class="smallcaps">AMD</abbr> Zen 3/4) due to differences in execution port configuration, vector throughput, and out-of-order window size.</p>
<div class="annotation annotation--static">
<p><strong>Phase 3:</strong> Repeat on <abbr class="smallcaps">AMD</abbr> Zen, <abbr class="smallcaps">ARM</abbr> Graviton3, <abbr class="smallcaps">RISC-V</abbr>.</p>
</div>
<p><strong>Frequency scaling.</strong> <abbr class="smallcaps">OSCAR</abbr> nodes may operate in a power-capped mode that reduces Turbo Boost frequency under sustained <abbr class="smallcaps">SIMD</abbr> load. <abbr class="smallcaps">RDTSC</abbr> counts wall-clock ticks at the invariant <abbr class="smallcaps">TSC</abbr> frequency, which may differ from the actual core frequency during <abbr class="smallcaps">SIMD</abbr> execution.</p>
<div class="annotation annotation--static">
<p><strong>Phase 2:</strong> Characterize frequency during benchmarks; consider RAPL-normalized cycle counts.</p>
</div>
<h2 id="related-work">Related Work</h2>
<p><strong><abbr class="smallcaps">ML-KEM</abbr> / Kyber implementations.</strong>
The AVX2 implementation studied here was developed by Schwabe and Seiler<sup class="cite-marker" id="cite-back-5"><a href="#ref-kyber-avx2" class="cite-link" data-cite-keys="ref-kyber-avx2">[5]</a></sup> and forms the optimized path in both the <code>pq-crystals/kyber</code> reference repository and PQClean<sup class="cite-marker" id="cite-back-9"><a href="#ref-pqclean" class="cite-link" data-cite-keys="ref-pqclean">[9]</a></sup>. Bos et al.<sup class="cite-marker" id="cite-back-10"><a href="#ref-kyber2018" class="cite-link" data-cite-keys="ref-kyber2018">[10]</a></sup> describe the original Kyber submission; <abbr class="smallcaps">FIPS</abbr> 203<sup class="cite-marker" id="cite-back-1"><a href="#ref-fips203" class="cite-link" data-cite-keys="ref-fips203">[1]</a></sup> is the standardized form. The <abbr class="smallcaps">ARM</abbr> <abbr class="smallcaps">NEON</abbr> and Cortex-M4 implementations are available in pqm4<sup class="cite-marker" id="cite-back-11"><a href="#ref-pqm4" class="cite-link" data-cite-keys="ref-pqm4">[11]</a></sup>; cross-ISA comparison is planned for Phase 3.</p>
<p><strong><abbr class="smallcaps">PQC</abbr> benchmarking.</strong>
eBACS/SUPERCOP provides a cross-platform benchmark suite<sup class="cite-marker" id="cite-back-12"><a href="#ref-supercop" class="cite-link" data-cite-keys="ref-supercop">[12]</a></sup> that reports median cycle counts for many cryptographic primitives, including Kyber. Our contribution complements this with a statistically rigorous decomposition using nonparametric effect-size analysis and bootstrapped CIs. Kannwischer et al.<sup class="cite-marker" id="cite-back-11"><a href="#ref-pqm4" class="cite-link" data-cite-keys="ref-pqm4">[11]</a></sup> present systematic benchmarks on <abbr class="smallcaps">ARM</abbr> Cortex-M4 (pqm4), which focuses on constrained-device performance rather than <abbr class="smallcaps">SIMD</abbr> analysis.</p>
<p><strong><abbr class="smallcaps">SIMD</abbr> in cryptography.</strong>
Gueron and Krasnov demonstrated AVX2 speedups for <abbr class="smallcaps">AES-GCM</abbr><sup class="cite-marker" id="cite-back-13"><a href="#ref-gueron2014" class="cite-link" data-cite-keys="ref-gueron2014">[13]</a></sup>; similar techniques underpin the Kyber AVX2 implementation. Bernstein’s vectorized polynomial arithmetic for Curve25519<sup class="cite-marker" id="cite-back-14"><a href="#ref-bernstein2006" class="cite-link" data-cite-keys="ref-bernstein2006">[14]</a></sup> established the template of hand-written vector intrinsics for cryptographic field arithmetic.</p>
<p><strong><abbr class="smallcaps">NTT</abbr> optimization.</strong>
Longa and Naehrig<sup class="cite-marker" id="cite-back-6"><a href="#ref-ntt-survey" class="cite-link" data-cite-keys="ref-ntt-survey">[6]</a></sup> survey <abbr class="smallcaps">NTT</abbr> algorithms for ideal lattice-based cryptography and analyze instruction counts for vectorized implementations. Our measurements provide the first empirical cycle-count decomposition isolating the compiler’s contribution vs. hand-written <abbr class="smallcaps">SIMD</abbr> for the <abbr class="smallcaps">ML-KEM</abbr> <abbr class="smallcaps">NTT</abbr> specifically.</p>
<p><strong>Hardware counter profiling.</strong>
Bernstein and Schwabe<sup class="cite-marker" id="cite-back-15"><a href="#ref-cachetime" class="cite-link" data-cite-keys="ref-cachetime">[15]</a></sup> discuss the relationship between cache behavior and cryptographic timing. <abbr class="smallcaps">PAPI</abbr><sup class="cite-marker" id="cite-back-7"><a href="#ref-papi" class="cite-link" data-cite-keys="ref-papi">[7]</a></sup> provides a portable interface to hardware performance counters used in related profiling work. Phase 2 of this study will add <abbr class="smallcaps">PAPI</abbr> counter collection to provide the mechanistic hardware-level explanation of the speedups observed here.</p>
<h2 id="conclusion">Conclusion</h2>
<p>We presented the first statistically rigorous decomposition of <abbr class="smallcaps">SIMD</abbr> speedup in <abbr class="smallcaps">ML-KEM</abbr> (Kyber), isolating the contributions of compiler optimization, auto-vectorization, and hand-written AVX2 assembly. Our main findings are:</p>
<ol type="1">
<li><strong>Hand-written <abbr class="smallcaps">SIMD</abbr> is necessary, not optional.</strong> GCC’s auto-vectorizer provides negligible benefit (<span class="math inline">&lt;10\%</span>) for NTT-based arithmetic, and for <code>INVNTT</code> actually produces slightly slower code than non-vectorized O3. The full <span class="math inline">35\times</span>–<span class="math inline">56\times</span> speedup on arithmetic operations comes entirely from hand-written assembly.</li>
<li><strong>The distribution of <abbr class="smallcaps">SIMD</abbr> benefit across operations is highly non-uniform.</strong> Arithmetic operations (NTT, <abbr class="smallcaps">INVNTT</abbr>, basemul, frommsg) achieve <span class="math inline">35\times</span>–<span class="math inline">56\times</span>; SHAKE-based expansion (gen_a) achieves only <span class="math inline">3.8\times</span>–<span class="math inline">4.7\times</span>; and noise sampling achieves <span class="math inline">1.2\times</span>–<span class="math inline">1.4\times</span>. The bottleneck shifts from compute to memory bandwidth for non-arithmetic operations.</li>
<li><strong>The statistical signal is overwhelming.</strong> Cliff’s <span class="math inline">\delta = +1.000</span> for nearly all operations means AVX2 is faster than <code>ref</code> in every single observation pair across <span class="math inline">n \ge 2{,}000</span> measurements. These results are stable across three <abbr class="smallcaps">ML-KEM</abbr> parameter sets.</li>
<li><strong>Context affects even isolated micro-benchmarks.</strong> The <abbr class="smallcaps">NTT</abbr> speedup varies by 13% across parameter sets despite identical polynomial dimensions, attributed to cache-state effects from surrounding polyvec operations.</li>
</ol>
<p><strong>Future work.</strong> Planned extensions include: hardware performance counter profiles (IPC, cache miss rates) via <abbr class="smallcaps">PAPI</abbr> to validate the mechanistic explanations in the corresponding section; energy measurement via Intel <abbr class="smallcaps">RAPL</abbr>; extension to <abbr class="smallcaps">ML-DSA</abbr> (Dilithium) and <abbr class="smallcaps">SLH-DSA</abbr> (SPHINCS+) with the same harness; and cross-ISA comparison with <abbr class="smallcaps">ARM</abbr> NEON/SVE (Graviton3) and <abbr class="smallcaps">RISC-V</abbr> V. A compiler version sensitivity study (GCC 11–14, Clang 14–17) will characterize how stable the auto-vectorization gap is across compiler releases.</p>
<p><strong>Artifact.</strong> The benchmark harness, <abbr class="smallcaps">SLURM</abbr> job templates, raw cycle-count data, analysis pipeline, and this paper are released at <a href="https://git.levineuwirth.org/neuwirth/where-simd-helps" class="uri link-external" target="_blank" rel="noopener noreferrer" data-link-icon="forgejo" data-link-icon-type="svg">https://git.levineuwirth.org/neuwirth/where-simd-helps</a> under the <abbr class="smallcaps">MIT</abbr> License.</p>
<h2 id="supplementary-kem-level-end-to-end-speedup">Supplementary: KEM-level end-to-end speedup</h2>
<p>The figure shows the hand-written <abbr class="smallcaps">SIMD</abbr> speedup for the top-level <abbr class="smallcaps">KEM</abbr> operations: key generation (<code>kyber_keypair</code>), encapsulation (<code>kyber_encaps</code>), and decapsulation (<code>kyber_decaps</code>). These composite operations aggregate the speedups of their constituent primitives, weighted by relative cycle counts.</p>
<p>Decapsulation achieves the highest speedup (<span class="math inline">6.9\times</span>–<span class="math inline">7.1\times</span>) because it involves the largest share of arithmetic operations (two additional <abbr class="smallcaps">NTT</abbr> and <abbr class="smallcaps">INVNTT</abbr> calls for re-encryption verification). Key generation achieves the lowest (<span class="math inline">5.3\times</span>–<span class="math inline">5.9\times</span>) because it involves one fewer polynomial multiplication step relative to encapsulation.</p>
<figure class="viz-figure"><?xml version="1.0" encoding="utf-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
  "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg xmlns:xlink="http://www.w3.org/1999/xlink" width="565.5125pt" height="280.237344pt" viewBox="0 0 565.5125 280.237344" xmlns="http://www.w3.org/2000/svg" version="1.1">
 <metadata>
  <rdf:RDF xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
   <cc:Work>
    <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
    <dc:date>2026-04-26T19:42:54.497782</dc:date>
    <dc:format>image/svg+xml</dc:format>
    <dc:creator>
     <cc:Agent>
      <dc:title>Matplotlib v3.10.9, https://matplotlib.org/</dc:title>
     </cc:Agent>
    </dc:creator>
   </cc:Work>
  </rdf:RDF>
 </metadata>
 <defs>
  <style type="text/css">*{stroke-linejoin: round; stroke-linecap: butt}</style>
 </defs>
 <g id="figure_1">
  <g id="patch_1">
   <path d="M 0 280.237344 
L 565.5125 280.237344 
L 565.5125 0 
L 0 0 
L 0 280.237344 
z
" style="fill: none"/>
  </g>
  <g id="axes_1">
   <g id="patch_2">
    <path d="M 34.2625 256.359219 
L 558.3125 256.359219 
L 558.3125 10.999219 
L 34.2625 10.999219 
L 34.2625 256.359219 
z
" style="fill: none"/>
   </g>
   <g id="patch_3">
    <path d="M 58.082955 256.359219 
L 101.392872 256.359219 
L 101.392872 110.460975 
L 58.082955 110.460975 
z
" clip-path="url(#p1ff4918728)" style="fill: #333333"/>
   </g>
   <g id="patch_4">
    <path d="M 231.322624 256.359219 
L 274.632541 256.359219 
L 274.632541 93.435568 
L 231.322624 93.435568 
z
" clip-path="url(#p1ff4918728)" style="fill: #333333"/>
   </g>
   <g id="patch_5">
    <path d="M 404.562293 256.359219 
L 447.872211 256.359219 
L 447.872211 62.026133 
L 404.562293 62.026133 
z
" clip-path="url(#p1ff4918728)" style="fill: #333333"/>
   </g>
   <g id="patch_6">
    <path d="M 101.392872 256.359219 
L 144.702789 256.359219 
L 144.702789 106.001082 
L 101.392872 106.001082 
z
" clip-path="url(#p1ff4918728)" style="fill: #777777"/>
   </g>
   <g id="patch_7">
    <path d="M 274.632541 256.359219 
L 317.942459 256.359219 
L 317.942459 88.424809 
L 274.632541 88.424809 
z
" clip-path="url(#p1ff4918728)" style="fill: #777777"/>
   </g>
   <g id="patch_8">
    <path d="M 447.872211 256.359219 
L 491.182128 256.359219 
L 491.182128 63.372107 
L 447.872211 63.372107 
z
" clip-path="url(#p1ff4918728)" style="fill: #777777"/>
   </g>
   <g id="patch_9">
    <path d="M 144.702789 256.359219 
L 188.012707 256.359219 
L 188.012707 94.697396 
L 144.702789 94.697396 
z
" clip-path="url(#p1ff4918728)" style="fill: #bbbbbb"/>
   </g>
   <g id="patch_10">
    <path d="M 317.942459 256.359219 
L 361.252376 256.359219 
L 361.252376 82.581292 
L 317.942459 82.581292 
z
" clip-path="url(#p1ff4918728)" style="fill: #bbbbbb"/>
   </g>
   <g id="patch_11">
    <path d="M 491.182128 256.359219 
L 534.492045 256.359219 
L 534.492045 67.686319 
L 491.182128 67.686319 
z
" clip-path="url(#p1ff4918728)" style="fill: #bbbbbb"/>
   </g>
   <g id="matplotlib.axis_1">
    <g id="xtick_1">
     <g id="line2d_1">
      <defs>
       <path id="me29431d917" d="M 0 0 
L 0 3.5 
" style="stroke: #000000; stroke-width: 0.8"/>
      </defs>
      <g>
       <use xlink:href="#me29431d917" x="123.047831" y="256.359219" style="stroke: #000000; stroke-width: 0.8"/>
      </g>
     </g>
     <g id="text_1">
      <!-- KeyGen -->
      <g transform="translate(103.863456 270.957656) scale(0.1 -0.1)">
       <defs>
        <path id="DejaVuSans-4b" d="M 628 4666 
L 1259 4666 
L 1259 2694 
L 3353 4666 
L 4166 4666 
L 1850 2491 
L 4331 0 
L 3500 0 
L 1259 2247 
L 1259 0 
L 628 0 
L 628 4666 
z
" transform="scale(0.015625)"/>
        <path id="DejaVuSans-65" d="M 3597 1894 
L 3597 1613 
L 953 1613 
Q 991 1019 1311 708 
Q 1631 397 2203 397 
Q 2534 397 2845 478 
Q 3156 559 3463 722 
L 3463 178 
Q 3153 47 2828 -22 
Q 2503 -91 2169 -91 
Q 1331 -91 842 396 
Q 353 884 353 1716 
Q 353 2575 817 3079 
Q 1281 3584 2069 3584 
Q 2775 3584 3186 3129 
Q 3597 2675 3597 1894 
z
M 3022 2063 
Q 3016 2534 2758 2815 
Q 2500 3097 2075 3097 
Q 1594 3097 1305 2825 
Q 1016 2553 972 2059 
L 3022 2063 
z
" transform="scale(0.015625)"/>
        <path id="DejaVuSans-79" d="M 2059 -325 
Q 1816 -950 1584 -1140 
Q 1353 -1331 966 -1331 
L 506 -1331 
L 506 -850 
L 844 -850 
Q 1081 -850 1212 -737 
Q 1344 -625 1503 -206 
L 1606 56 
L 191 3500 
L 800 3500 
L 1894 763 
L 2988 3500 
L 3597 3500 
L 2059 -325 
z
" transform="scale(0.015625)"/>
        <path id="DejaVuSans-47" d="M 3809 666 
L 3809 1919 
L 2778 1919 
L 2778 2438 
L 4434 2438 
L 4434 434 
Q 4069 175 3628 42 
Q 3188 -91 2688 -91 
Q 1594 -91 976 548 
Q 359 1188 359 2328 
Q 359 3472 976 4111 
Q 1594 4750 2688 4750 
Q 3144 4750 3555 4637 
Q 3966 4525 4313 4306 
L 4313 3634 
Q 3963 3931 3569 4081 
Q 3175 4231 2741 4231 
Q 1884 4231 1454 3753 
Q 1025 3275 1025 2328 
Q 1025 1384 1454 906 
Q 1884 428 2741 428 
Q 3075 428 3337 486 
Q 3600 544 3809 666 
z
" transform="scale(0.015625)"/>
        <path id="DejaVuSans-6e" d="M 3513 2113 
L 3513 0 
L 2938 0 
L 2938 2094 
Q 2938 2591 2744 2837 
Q 2550 3084 2163 3084 
Q 1697 3084 1428 2787 
Q 1159 2491 1159 1978 
L 1159 0 
L 581 0 
L 581 3500 
L 1159 3500 
L 1159 2956 
Q 1366 3272 1645 3428 
Q 1925 3584 2291 3584 
Q 2894 3584 3203 3211 
Q 3513 2838 3513 2113 
z
" transform="scale(0.015625)"/>
       </defs>
       <use xlink:href="#DejaVuSans-4b"/>
       <use xlink:href="#DejaVuSans-65" transform="translate(60.576172 0)"/>
       <use xlink:href="#DejaVuSans-79" transform="translate(122.099609 0)"/>
       <use xlink:href="#DejaVuSans-47" transform="translate(181.279297 0)"/>
       <use xlink:href="#DejaVuSans-65" transform="translate(258.769531 0)"/>
       <use xlink:href="#DejaVuSans-6e" transform="translate(320.292969 0)"/>
      </g>
     </g>
    </g>
    <g id="xtick_2">
     <g id="line2d_2">
      <g>
       <use xlink:href="#me29431d917" x="296.2875" y="256.359219" style="stroke: #000000; stroke-width: 0.8"/>
      </g>
     </g>
     <g id="text_2">
      <!-- Encaps -->
      <g transform="translate(278.367187 270.957656) scale(0.1 -0.1)">
       <defs>
        <path id="DejaVuSans-45" d="M 628 4666 
L 3578 4666 
L 3578 4134 
L 1259 4134 
L 1259 2753 
L 3481 2753 
L 3481 2222 
L 1259 2222 
L 1259 531 
L 3634 531 
L 3634 0 
L 628 0 
L 628 4666 
z
" transform="scale(0.015625)"/>
        <path id="DejaVuSans-63" d="M 3122 3366 
L 3122 2828 
Q 2878 2963 2633 3030 
Q 2388 3097 2138 3097 
Q 1578 3097 1268 2742 
Q 959 2388 959 1747 
Q 959 1106 1268 751 
Q 1578 397 2138 397 
Q 2388 397 2633 464 
Q 2878 531 3122 666 
L 3122 134 
Q 2881 22 2623 -34 
Q 2366 -91 2075 -91 
Q 1284 -91 818 406 
Q 353 903 353 1747 
Q 353 2603 823 3093 
Q 1294 3584 2113 3584 
Q 2378 3584 2631 3529 
Q 2884 3475 3122 3366 
z
" transform="scale(0.015625)"/>
        <path id="DejaVuSans-61" d="M 2194 1759 
Q 1497 1759 1228 1600 
Q 959 1441 959 1056 
Q 959 750 1161 570 
Q 1363 391 1709 391 
Q 2188 391 2477 730 
Q 2766 1069 2766 1631 
L 2766 1759 
L 2194 1759 
z
M 3341 1997 
L 3341 0 
L 2766 0 
L 2766 531 
Q 2569 213 2275 61 
Q 1981 -91 1556 -91 
Q 1019 -91 701 211 
Q 384 513 384 1019 
Q 384 1609 779 1909 
Q 1175 2209 1959 2209 
L 2766 2209 
L 2766 2266 
Q 2766 2663 2505 2880 
Q 2244 3097 1772 3097 
Q 1472 3097 1187 3025 
Q 903 2953 641 2809 
L 641 3341 
Q 956 3463 1253 3523 
Q 1550 3584 1831 3584 
Q 2591 3584 2966 3190 
Q 3341 2797 3341 1997 
z
" transform="scale(0.015625)"/>
        <path id="DejaVuSans-70" d="M 1159 525 
L 1159 -1331 
L 581 -1331 
L 581 3500 
L 1159 3500 
L 1159 2969 
Q 1341 3281 1617 3432 
Q 1894 3584 2278 3584 
Q 2916 3584 3314 3078 
Q 3713 2572 3713 1747 
Q 3713 922 3314 415 
Q 2916 -91 2278 -91 
Q 1894 -91 1617 61 
Q 1341 213 1159 525 
z
M 3116 1747 
Q 3116 2381 2855 2742 
Q 2594 3103 2138 3103 
Q 1681 3103 1420 2742 
Q 1159 2381 1159 1747 
Q 1159 1113 1420 752 
Q 1681 391 2138 391 
Q 2594 391 2855 752 
Q 3116 1113 3116 1747 
z
" transform="scale(0.015625)"/>
        <path id="DejaVuSans-73" d="M 2834 3397 
L 2834 2853 
Q 2591 2978 2328 3040 
Q 2066 3103 1784 3103 
Q 1356 3103 1142 2972 
Q 928 2841 928 2578 
Q 928 2378 1081 2264 
Q 1234 2150 1697 2047 
L 1894 2003 
Q 2506 1872 2764 1633 
Q 3022 1394 3022 966 
Q 3022 478 2636 193 
Q 2250 -91 1575 -91 
Q 1294 -91 989 -36 
Q 684 19 347 128 
L 347 722 
Q 666 556 975 473 
Q 1284 391 1588 391 
Q 1994 391 2212 530 
Q 2431 669 2431 922 
Q 2431 1156 2273 1281 
Q 2116 1406 1581 1522 
L 1381 1569 
Q 847 1681 609 1914 
Q 372 2147 372 2553 
Q 372 3047 722 3315 
Q 1072 3584 1716 3584 
Q 2034 3584 2315 3537 
Q 2597 3491 2834 3397 
z
" transform="scale(0.015625)"/>
       </defs>
       <use xlink:href="#DejaVuSans-45"/>
       <use xlink:href="#DejaVuSans-6e" transform="translate(63.183594 0)"/>
       <use xlink:href="#DejaVuSans-63" transform="translate(126.5625 0)"/>
       <use xlink:href="#DejaVuSans-61" transform="translate(181.542969 0)"/>
       <use xlink:href="#DejaVuSans-70" transform="translate(242.822266 0)"/>
       <use xlink:href="#DejaVuSans-73" transform="translate(306.298828 0)"/>
      </g>
     </g>
    </g>
    <g id="xtick_3">
     <g id="line2d_3">
      <g>
       <use xlink:href="#me29431d917" x="469.527169" y="256.359219" style="stroke: #000000; stroke-width: 0.8"/>
      </g>
     </g>
     <g id="text_3">
      <!-- Decaps -->
      <g transform="translate(451.008419 270.957656) scale(0.1 -0.1)">
       <defs>
        <path id="DejaVuSans-44" d="M 1259 4147 
L 1259 519 
L 2022 519 
Q 2988 519 3436 956 
Q 3884 1394 3884 2338 
Q 3884 3275 3436 3711 
Q 2988 4147 2022 4147 
L 1259 4147 
z
M 628 4666 
L 1925 4666 
Q 3281 4666 3915 4102 
Q 4550 3538 4550 2338 
Q 4550 1131 3912 565 
Q 3275 0 1925 0 
L 628 0 
L 628 4666 
z
" transform="scale(0.015625)"/>
       </defs>
       <use xlink:href="#DejaVuSans-44"/>
       <use xlink:href="#DejaVuSans-65" transform="translate(77.001953 0)"/>
       <use xlink:href="#DejaVuSans-63" transform="translate(138.525391 0)"/>
       <use xlink:href="#DejaVuSans-61" transform="translate(193.505859 0)"/>
       <use xlink:href="#DejaVuSans-70" transform="translate(254.785156 0)"/>
       <use xlink:href="#DejaVuSans-73" transform="translate(318.261719 0)"/>
      </g>
     </g>
    </g>
   </g>
   <g id="matplotlib.axis_2">
    <g id="ytick_1">
     <g id="line2d_4">
      <defs>
       <path id="ma46031d231" d="M 0 0 
L -3.5 0 
" style="stroke: #000000; stroke-width: 0.8"/>
      </defs>
      <g>
       <use xlink:href="#ma46031d231" x="34.2625" y="256.359219" style="stroke: #000000; stroke-width: 0.8"/>
      </g>
     </g>
     <g id="text_4">
      <!-- 0 -->
      <g transform="translate(20.9 260.158438) scale(0.1 -0.1)">
       <defs>
        <path id="DejaVuSans-30" d="M 2034 4250 
Q 1547 4250 1301 3770 
Q 1056 3291 1056 2328 
Q 1056 1369 1301 889 
Q 1547 409 2034 409 
Q 2525 409 2770 889 
Q 3016 1369 3016 2328 
Q 3016 3291 2770 3770 
Q 2525 4250 2034 4250 
z
M 2034 4750 
Q 2819 4750 3233 4129 
Q 3647 3509 3647 2328 
Q 3647 1150 3233 529 
Q 2819 -91 2034 -91 
Q 1250 -91 836 529 
Q 422 1150 422 2328 
Q 422 3509 836 4129 
Q 1250 4750 2034 4750 
z
" transform="scale(0.015625)"/>
       </defs>
       <use xlink:href="#DejaVuSans-30"/>
      </g>
     </g>
    </g>
    <g id="ytick_2">
     <g id="line2d_5">
      <g>
       <use xlink:href="#ma46031d231" x="34.2625" y="229.096997" style="stroke: #000000; stroke-width: 0.8"/>
      </g>
     </g>
     <g id="text_5">
      <!-- 1 -->
      <g transform="translate(20.9 232.896215) scale(0.1 -0.1)">
       <defs>
        <path id="DejaVuSans-31" d="M 794 531 
L 1825 531 
L 1825 4091 
L 703 3866 
L 703 4441 
L 1819 4666 
L 2450 4666 
L 2450 531 
L 3481 531 
L 3481 0 
L 794 0 
L 794 531 
z
" transform="scale(0.015625)"/>
       </defs>
       <use xlink:href="#DejaVuSans-31"/>
      </g>
     </g>
    </g>
    <g id="ytick_3">
     <g id="line2d_6">
      <g>
       <use xlink:href="#ma46031d231" x="34.2625" y="201.834774" style="stroke: #000000; stroke-width: 0.8"/>
      </g>
     </g>
     <g id="text_6">
      <!-- 2 -->
      <g transform="translate(20.9 205.633993) scale(0.1 -0.1)">
       <defs>
        <path id="DejaVuSans-32" d="M 1228 531 
L 3431 531 
L 3431 0 
L 469 0 
L 469 531 
Q 828 903 1448 1529 
Q 2069 2156 2228 2338 
Q 2531 2678 2651 2914 
Q 2772 3150 2772 3378 
Q 2772 3750 2511 3984 
Q 2250 4219 1831 4219 
Q 1534 4219 1204 4116 
Q 875 4013 500 3803 
L 500 4441 
Q 881 4594 1212 4672 
Q 1544 4750 1819 4750 
Q 2544 4750 2975 4387 
Q 3406 4025 3406 3419 
Q 3406 3131 3298 2873 
Q 3191 2616 2906 2266 
Q 2828 2175 2409 1742 
Q 1991 1309 1228 531 
z
" transform="scale(0.015625)"/>
       </defs>
       <use xlink:href="#DejaVuSans-32"/>
      </g>
     </g>
    </g>
    <g id="ytick_4">
     <g id="line2d_7">
      <g>
       <use xlink:href="#ma46031d231" x="34.2625" y="174.572552" style="stroke: #000000; stroke-width: 0.8"/>
      </g>
     </g>
     <g id="text_7">
      <!-- 3 -->
      <g transform="translate(20.9 178.371771) scale(0.1 -0.1)">
       <defs>
        <path id="DejaVuSans-33" d="M 2597 2516 
Q 3050 2419 3304 2112 
Q 3559 1806 3559 1356 
Q 3559 666 3084 287 
Q 2609 -91 1734 -91 
Q 1441 -91 1130 -33 
Q 819 25 488 141 
L 488 750 
Q 750 597 1062 519 
Q 1375 441 1716 441 
Q 2309 441 2620 675 
Q 2931 909 2931 1356 
Q 2931 1769 2642 2001 
Q 2353 2234 1838 2234 
L 1294 2234 
L 1294 2753 
L 1863 2753 
Q 2328 2753 2575 2939 
Q 2822 3125 2822 3475 
Q 2822 3834 2567 4026 
Q 2313 4219 1838 4219 
Q 1578 4219 1281 4162 
Q 984 4106 628 3988 
L 628 4550 
Q 988 4650 1302 4700 
Q 1616 4750 1894 4750 
Q 2613 4750 3031 4423 
Q 3450 4097 3450 3541 
Q 3450 3153 3228 2886 
Q 3006 2619 2597 2516 
z
" transform="scale(0.015625)"/>
       </defs>
       <use xlink:href="#DejaVuSans-33"/>
      </g>
     </g>
    </g>
    <g id="ytick_5">
     <g id="line2d_8">
      <g>
       <use xlink:href="#ma46031d231" x="34.2625" y="147.31033" style="stroke: #000000; stroke-width: 0.8"/>
      </g>
     </g>
     <g id="text_8">
      <!-- 4 -->
      <g transform="translate(20.9 151.109549) scale(0.1 -0.1)">
       <defs>
        <path id="DejaVuSans-34" d="M 2419 4116 
L 825 1625 
L 2419 1625 
L 2419 4116 
z
M 2253 4666 
L 3047 4666 
L 3047 1625 
L 3713 1625 
L 3713 1100 
L 3047 1100 
L 3047 0 
L 2419 0 
L 2419 1100 
L 313 1100 
L 313 1709 
L 2253 4666 
z
" transform="scale(0.015625)"/>
       </defs>
       <use xlink:href="#DejaVuSans-34"/>
      </g>
     </g>
    </g>
    <g id="ytick_6">
     <g id="line2d_9">
      <g>
       <use xlink:href="#ma46031d231" x="34.2625" y="120.048108" style="stroke: #000000; stroke-width: 0.8"/>
      </g>
     </g>
     <g id="text_9">
      <!-- 5 -->
      <g transform="translate(20.9 123.847326) scale(0.1 -0.1)">
       <defs>
        <path id="DejaVuSans-35" d="M 691 4666 
L 3169 4666 
L 3169 4134 
L 1269 4134 
L 1269 2991 
Q 1406 3038 1543 3061 
Q 1681 3084 1819 3084 
Q 2600 3084 3056 2656 
Q 3513 2228 3513 1497 
Q 3513 744 3044 326 
Q 2575 -91 1722 -91 
Q 1428 -91 1123 -41 
Q 819 9 494 109 
L 494 744 
Q 775 591 1075 516 
Q 1375 441 1709 441 
Q 2250 441 2565 725 
Q 2881 1009 2881 1497 
Q 2881 1984 2565 2268 
Q 2250 2553 1709 2553 
Q 1456 2553 1204 2497 
Q 953 2441 691 2322 
L 691 4666 
z
" transform="scale(0.015625)"/>
       </defs>
       <use xlink:href="#DejaVuSans-35"/>
      </g>
     </g>
    </g>
    <g id="ytick_7">
     <g id="line2d_10">
      <g>
       <use xlink:href="#ma46031d231" x="34.2625" y="92.785885" style="stroke: #000000; stroke-width: 0.8"/>
      </g>
     </g>
     <g id="text_10">
      <!-- 6 -->
      <g transform="translate(20.9 96.585104) scale(0.1 -0.1)">
       <defs>
        <path id="DejaVuSans-36" d="M 2113 2584 
Q 1688 2584 1439 2293 
Q 1191 2003 1191 1497 
Q 1191 994 1439 701 
Q 1688 409 2113 409 
Q 2538 409 2786 701 
Q 3034 994 3034 1497 
Q 3034 2003 2786 2293 
Q 2538 2584 2113 2584 
z
M 3366 4563 
L 3366 3988 
Q 3128 4100 2886 4159 
Q 2644 4219 2406 4219 
Q 1781 4219 1451 3797 
Q 1122 3375 1075 2522 
Q 1259 2794 1537 2939 
Q 1816 3084 2150 3084 
Q 2853 3084 3261 2657 
Q 3669 2231 3669 1497 
Q 3669 778 3244 343 
Q 2819 -91 2113 -91 
Q 1303 -91 875 529 
Q 447 1150 447 2328 
Q 447 3434 972 4092 
Q 1497 4750 2381 4750 
Q 2619 4750 2861 4703 
Q 3103 4656 3366 4563 
z
" transform="scale(0.015625)"/>
       </defs>
       <use xlink:href="#DejaVuSans-36"/>
      </g>
     </g>
    </g>
    <g id="ytick_8">
     <g id="line2d_11">
      <g>
       <use xlink:href="#ma46031d231" x="34.2625" y="65.523663" style="stroke: #000000; stroke-width: 0.8"/>
      </g>
     </g>
     <g id="text_11">
      <!-- 7 -->
      <g transform="translate(20.9 69.322882) scale(0.1 -0.1)">
       <defs>
        <path id="DejaVuSans-37" d="M 525 4666 
L 3525 4666 
L 3525 4397 
L 1831 0 
L 1172 0 
L 2766 4134 
L 525 4134 
L 525 4666 
z
" transform="scale(0.015625)"/>
       </defs>
       <use xlink:href="#DejaVuSans-37"/>
      </g>
     </g>
    </g>
    <g id="ytick_9">
     <g id="line2d_12">
      <g>
       <use xlink:href="#ma46031d231" x="34.2625" y="38.261441" style="stroke: #000000; stroke-width: 0.8"/>
      </g>
     </g>
     <g id="text_12">
      <!-- 8 -->
      <g transform="translate(20.9 42.06066) scale(0.1 -0.1)">
       <defs>
        <path id="DejaVuSans-38" d="M 2034 2216 
Q 1584 2216 1326 1975 
Q 1069 1734 1069 1313 
Q 1069 891 1326 650 
Q 1584 409 2034 409 
Q 2484 409 2743 651 
Q 3003 894 3003 1313 
Q 3003 1734 2745 1975 
Q 2488 2216 2034 2216 
z
M 1403 2484 
Q 997 2584 770 2862 
Q 544 3141 544 3541 
Q 544 4100 942 4425 
Q 1341 4750 2034 4750 
Q 2731 4750 3128 4425 
Q 3525 4100 3525 3541 
Q 3525 3141 3298 2862 
Q 3072 2584 2669 2484 
Q 3125 2378 3379 2068 
Q 3634 1759 3634 1313 
Q 3634 634 3220 271 
Q 2806 -91 2034 -91 
Q 1263 -91 848 271 
Q 434 634 434 1313 
Q 434 1759 690 2068 
Q 947 2378 1403 2484 
z
M 1172 3481 
Q 1172 3119 1398 2916 
Q 1625 2713 2034 2713 
Q 2441 2713 2670 2916 
Q 2900 3119 2900 3481 
Q 2900 3844 2670 4047 
Q 2441 4250 2034 4250 
Q 1625 4250 1398 4047 
Q 1172 3844 1172 3481 
z
" transform="scale(0.015625)"/>
       </defs>
       <use xlink:href="#DejaVuSans-38"/>
      </g>
     </g>
    </g>
    <g id="ytick_10">
     <g id="line2d_13">
      <g>
       <use xlink:href="#ma46031d231" x="34.2625" y="10.999219" style="stroke: #000000; stroke-width: 0.8"/>
      </g>
     </g>
     <g id="text_13">
      <!-- 9 -->
      <g transform="translate(20.9 14.798438) scale(0.1 -0.1)">
       <defs>
        <path id="DejaVuSans-39" d="M 703 97 
L 703 672 
Q 941 559 1184 500 
Q 1428 441 1663 441 
Q 2288 441 2617 861 
Q 2947 1281 2994 2138 
Q 2813 1869 2534 1725 
Q 2256 1581 1919 1581 
Q 1219 1581 811 2004 
Q 403 2428 403 3163 
Q 403 3881 828 4315 
Q 1253 4750 1959 4750 
Q 2769 4750 3195 4129 
Q 3622 3509 3622 2328 
Q 3622 1225 3098 567 
Q 2575 -91 1691 -91 
Q 1453 -91 1209 -44 
Q 966 3 703 97 
z
M 1959 2075 
Q 2384 2075 2632 2365 
Q 2881 2656 2881 3163 
Q 2881 3666 2632 3958 
Q 2384 4250 1959 4250 
Q 1534 4250 1286 3958 
Q 1038 3666 1038 3163 
Q 1038 2656 1286 2365 
Q 1534 2075 1959 2075 
z
" transform="scale(0.015625)"/>
       </defs>
       <use xlink:href="#DejaVuSans-39"/>
      </g>
     </g>
    </g>
    <g id="text_14">
     <!-- Speedup ref $\to$ avx2 ($\times$) -->
     <g transform="translate(14.8 195.379219) rotate(-90) scale(0.1 -0.1)">
      <defs>
       <path id="DejaVuSans-53" d="M 3425 4513 
L 3425 3897 
Q 3066 4069 2747 4153 
Q 2428 4238 2131 4238 
Q 1616 4238 1336 4038 
Q 1056 3838 1056 3469 
Q 1056 3159 1242 3001 
Q 1428 2844 1947 2747 
L 2328 2669 
Q 3034 2534 3370 2195 
Q 3706 1856 3706 1288 
Q 3706 609 3251 259 
Q 2797 -91 1919 -91 
Q 1588 -91 1214 -16 
Q 841 59 441 206 
L 441 856 
Q 825 641 1194 531 
Q 1563 422 1919 422 
Q 2459 422 2753 634 
Q 3047 847 3047 1241 
Q 3047 1584 2836 1778 
Q 2625 1972 2144 2069 
L 1759 2144 
Q 1053 2284 737 2584 
Q 422 2884 422 3419 
Q 422 4038 858 4394 
Q 1294 4750 2059 4750 
Q 2388 4750 2728 4690 
Q 3069 4631 3425 4513 
z
" transform="scale(0.015625)"/>
       <path id="DejaVuSans-64" d="M 2906 2969 
L 2906 4863 
L 3481 4863 
L 3481 0 
L 2906 0 
L 2906 525 
Q 2725 213 2448 61 
Q 2172 -91 1784 -91 
Q 1150 -91 751 415 
Q 353 922 353 1747 
Q 353 2572 751 3078 
Q 1150 3584 1784 3584 
Q 2172 3584 2448 3432 
Q 2725 3281 2906 2969 
z
M 947 1747 
Q 947 1113 1208 752 
Q 1469 391 1925 391 
Q 2381 391 2643 752 
Q 2906 1113 2906 1747 
Q 2906 2381 2643 2742 
Q 2381 3103 1925 3103 
Q 1469 3103 1208 2742 
Q 947 2381 947 1747 
z
" transform="scale(0.015625)"/>
       <path id="DejaVuSans-75" d="M 544 1381 
L 544 3500 
L 1119 3500 
L 1119 1403 
Q 1119 906 1312 657 
Q 1506 409 1894 409 
Q 2359 409 2629 706 
Q 2900 1003 2900 1516 
L 2900 3500 
L 3475 3500 
L 3475 0 
L 2900 0 
L 2900 538 
Q 2691 219 2414 64 
Q 2138 -91 1772 -91 
Q 1169 -91 856 284 
Q 544 659 544 1381 
z
M 1991 3584 
L 1991 3584 
z
" transform="scale(0.015625)"/>
       <path id="DejaVuSans-20" transform="scale(0.015625)"/>
       <path id="DejaVuSans-72" d="M 2631 2963 
Q 2534 3019 2420 3045 
Q 2306 3072 2169 3072 
Q 1681 3072 1420 2755 
Q 1159 2438 1159 1844 
L 1159 0 
L 581 0 
L 581 3500 
L 1159 3500 
L 1159 2956 
Q 1341 3275 1631 3429 
Q 1922 3584 2338 3584 
Q 2397 3584 2469 3576 
Q 2541 3569 2628 3553 
L 2631 2963 
z
" transform="scale(0.015625)"/>
       <path id="DejaVuSans-66" d="M 2375 4863 
L 2375 4384 
L 1825 4384 
Q 1516 4384 1395 4259 
Q 1275 4134 1275 3809 
L 1275 3500 
L 2222 3500 
L 2222 3053 
L 1275 3053 
L 1275 0 
L 697 0 
L 697 3053 
L 147 3053 
L 147 3500 
L 697 3500 
L 697 3744 
Q 697 4328 969 4595 
Q 1241 4863 1831 4863 
L 2375 4863 
z
" transform="scale(0.015625)"/>
       <path id="DejaVuSans-2192" d="M 5050 2147 
L 5050 1866 
L 3822 638 
L 3447 1013 
L 4175 1741 
L 366 1741 
L 366 2272 
L 4175 2272 
L 3447 3000 
L 3822 3375 
L 5050 2147 
z
" transform="scale(0.015625)"/>
       <path id="DejaVuSans-76" d="M 191 3500 
L 800 3500 
L 1894 563 
L 2988 3500 
L 3597 3500 
L 2284 0 
L 1503 0 
L 191 3500 
z
" transform="scale(0.015625)"/>
       <path id="DejaVuSans-78" d="M 3513 3500 
L 2247 1797 
L 3578 0 
L 2900 0 
L 1881 1375 
L 863 0 
L 184 0 
L 1544 1831 
L 300 3500 
L 978 3500 
L 1906 2253 
L 2834 3500 
L 3513 3500 
z
" transform="scale(0.015625)"/>
       <path id="DejaVuSans-28" d="M 1984 4856 
Q 1566 4138 1362 3434 
Q 1159 2731 1159 2009 
Q 1159 1288 1364 580 
Q 1569 -128 1984 -844 
L 1484 -844 
Q 1016 -109 783 600 
Q 550 1309 550 2009 
Q 550 2706 781 3412 
Q 1013 4119 1484 4856 
L 1984 4856 
z
" transform="scale(0.015625)"/>
       <path id="DejaVuSans-d7" d="M 4488 3438 
L 3059 2003 
L 4488 575 
L 4116 197 
L 2681 1631 
L 1247 197 
L 878 575 
L 2303 2003 
L 878 3438 
L 1247 3816 
L 2681 2381 
L 4116 3816 
L 4488 3438 
z
" transform="scale(0.015625)"/>
       <path id="DejaVuSans-29" d="M 513 4856 
L 1013 4856 
Q 1481 4119 1714 3412 
Q 1947 2706 1947 2009 
Q 1947 1309 1714 600 
Q 1481 -109 1013 -844 
L 513 -844 
Q 928 -128 1133 580 
Q 1338 1288 1338 2009 
Q 1338 2731 1133 3434 
Q 928 4138 513 4856 
z
" transform="scale(0.015625)"/>
      </defs>
      <use xlink:href="#DejaVuSans-53" transform="translate(0 0.015625)"/>
      <use xlink:href="#DejaVuSans-70" transform="translate(63.476562 0.015625)"/>
      <use xlink:href="#DejaVuSans-65" transform="translate(126.953125 0.015625)"/>
      <use xlink:href="#DejaVuSans-65" transform="translate(188.476562 0.015625)"/>
      <use xlink:href="#DejaVuSans-64" transform="translate(250 0.015625)"/>
      <use xlink:href="#DejaVuSans-75" transform="translate(313.476562 0.015625)"/>
      <use xlink:href="#DejaVuSans-70" transform="translate(376.855469 0.015625)"/>
      <use xlink:href="#DejaVuSans-20" transform="translate(440.332031 0.015625)"/>
      <use xlink:href="#DejaVuSans-72" transform="translate(472.119141 0.015625)"/>
      <use xlink:href="#DejaVuSans-65" transform="translate(513.232422 0.015625)"/>
      <use xlink:href="#DejaVuSans-66" transform="translate(574.755859 0.015625)"/>
      <use xlink:href="#DejaVuSans-20" transform="translate(609.960938 0.015625)"/>
      <use xlink:href="#DejaVuSans-2192" transform="translate(661.230469 0.015625)"/>
      <use xlink:href="#DejaVuSans-20" transform="translate(764.501953 0.015625)"/>
      <use xlink:href="#DejaVuSans-61" transform="translate(796.289062 0.015625)"/>
      <use xlink:href="#DejaVuSans-76" transform="translate(857.568359 0.015625)"/>
      <use xlink:href="#DejaVuSans-78" transform="translate(916.748047 0.015625)"/>
      <use xlink:href="#DejaVuSans-32" transform="translate(975.927734 0.015625)"/>
      <use xlink:href="#DejaVuSans-20" transform="translate(1039.550781 0.015625)"/>
      <use xlink:href="#DejaVuSans-28" transform="translate(1071.337891 0.015625)"/>
      <use xlink:href="#DejaVuSans-d7" transform="translate(1110.351562 0.015625)"/>
      <use xlink:href="#DejaVuSans-29" transform="translate(1194.140625 0.015625)"/>
     </g>
    </g>
   </g>
   <g id="LineCollection_1">
    <path d="M 79.737913 110.56871 
L 79.737913 110.362461 
" clip-path="url(#p1ff4918728)" style="fill: none; stroke: #000000; stroke-width: 1.5"/>
    <path d="M 252.977583 93.59235 
L 252.977583 93.287844 
" clip-path="url(#p1ff4918728)" style="fill: none; stroke: #000000; stroke-width: 1.5"/>
    <path d="M 426.217252 62.130424 
L 426.217252 61.96244 
" clip-path="url(#p1ff4918728)" style="fill: none; stroke: #000000; stroke-width: 1.5"/>
   </g>
   <g id="LineCollection_2">
    <path d="M 123.047831 106.028695 
L 123.047831 105.969155 
" clip-path="url(#p1ff4918728)" style="fill: none; stroke: #000000; stroke-width: 1.5"/>
    <path d="M 296.2875 88.470502 
L 296.2875 88.371189 
" clip-path="url(#p1ff4918728)" style="fill: none; stroke: #000000; stroke-width: 1.5"/>
    <path d="M 469.527169 63.419473 
L 469.527169 63.332963 
" clip-path="url(#p1ff4918728)" style="fill: none; stroke: #000000; stroke-width: 1.5"/>
   </g>
   <g id="LineCollection_3">
    <path d="M 166.357748 94.950958 
L 166.357748 94.460929 
" clip-path="url(#p1ff4918728)" style="fill: none; stroke: #000000; stroke-width: 1.5"/>
    <path d="M 339.597417 82.780021 
L 339.597417 82.409857 
" clip-path="url(#p1ff4918728)" style="fill: none; stroke: #000000; stroke-width: 1.5"/>
    <path d="M 512.837087 67.878289 
L 512.837087 67.519672 
" clip-path="url(#p1ff4918728)" style="fill: none; stroke: #000000; stroke-width: 1.5"/>
   </g>
   <g id="patch_12">
    <path d="M 34.2625 256.359219 
L 34.2625 10.999219 
" style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/>
   </g>
   <g id="patch_13">
    <path d="M 558.3125 256.359219 
L 558.3125 10.999219 
" style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/>
   </g>
   <g id="patch_14">
    <path d="M 34.2625 256.359219 
L 558.3125 256.359219 
" style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/>
   </g>
   <g id="patch_15">
    <path d="M 34.2625 10.999219 
L 558.3125 10.999219 
" style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/>
   </g>
   <g id="legend_1">
    <g id="patch_16">
     <path d="M 41.7595 24.825717 
L 58.4195 24.825717 
L 58.4195 18.994717 
L 41.7595 18.994717 
z
" style="fill: #333333"/>
    </g>
    <g id="text_15">
     <!-- ML-KEM-512 -->
     <g transform="translate(65.0835 24.825717) scale(0.0833 -0.0833)">
      <defs>
       <path id="DejaVuSans-4d" d="M 628 4666 
L 1569 4666 
L 2759 1491 
L 3956 4666 
L 4897 4666 
L 4897 0 
L 4281 0 
L 4281 4097 
L 3078 897 
L 2444 897 
L 1241 4097 
L 1241 0 
L 628 0 
L 628 4666 
z
" transform="scale(0.015625)"/>
       <path id="DejaVuSans-4c" d="M 628 4666 
L 1259 4666 
L 1259 531 
L 3531 531 
L 3531 0 
L 628 0 
L 628 4666 
z
" transform="scale(0.015625)"/>
       <path id="DejaVuSans-2d" d="M 313 2009 
L 1997 2009 
L 1997 1497 
L 313 1497 
L 313 2009 
z
" transform="scale(0.015625)"/>
      </defs>
      <use xlink:href="#DejaVuSans-4d"/>
      <use xlink:href="#DejaVuSans-4c" transform="translate(86.279297 0)"/>
      <use xlink:href="#DejaVuSans-2d" transform="translate(140.242188 0)"/>
      <use xlink:href="#DejaVuSans-4b" transform="translate(176.326172 0)"/>
      <use xlink:href="#DejaVuSans-45" transform="translate(241.902344 0)"/>
      <use xlink:href="#DejaVuSans-4d" transform="translate(305.085938 0)"/>
      <use xlink:href="#DejaVuSans-2d" transform="translate(391.365234 0)"/>
      <use xlink:href="#DejaVuSans-35" transform="translate(427.449219 0)"/>
      <use xlink:href="#DejaVuSans-31" transform="translate(491.072266 0)"/>
      <use xlink:href="#DejaVuSans-32" transform="translate(554.695312 0)"/>
     </g>
    </g>
    <g id="patch_17">
     <path d="M 41.7595 37.052595 
L 58.4195 37.052595 
L 58.4195 31.221595 
L 41.7595 31.221595 
z
" style="fill: #777777"/>
    </g>
    <g id="text_16">
     <!-- ML-KEM-768 -->
     <g transform="translate(65.0835 37.052595) scale(0.0833 -0.0833)">
      <use xlink:href="#DejaVuSans-4d"/>
      <use xlink:href="#DejaVuSans-4c" transform="translate(86.279297 0)"/>
      <use xlink:href="#DejaVuSans-2d" transform="translate(140.242188 0)"/>
      <use xlink:href="#DejaVuSans-4b" transform="translate(176.326172 0)"/>
      <use xlink:href="#DejaVuSans-45" transform="translate(241.902344 0)"/>
      <use xlink:href="#DejaVuSans-4d" transform="translate(305.085938 0)"/>
      <use xlink:href="#DejaVuSans-2d" transform="translate(391.365234 0)"/>
      <use xlink:href="#DejaVuSans-37" transform="translate(427.449219 0)"/>
      <use xlink:href="#DejaVuSans-36" transform="translate(491.072266 0)"/>
      <use xlink:href="#DejaVuSans-38" transform="translate(554.695312 0)"/>
     </g>
    </g>
    <g id="patch_18">
     <path d="M 41.7595 49.279473 
L 58.4195 49.279473 
L 58.4195 43.448473 
L 41.7595 43.448473 
z
" style="fill: #bbbbbb"/>
    </g>
    <g id="text_17">
     <!-- ML-KEM-1024 -->
     <g transform="translate(65.0835 49.279473) scale(0.0833 -0.0833)">
      <use xlink:href="#DejaVuSans-4d"/>
      <use xlink:href="#DejaVuSans-4c" transform="translate(86.279297 0)"/>
      <use xlink:href="#DejaVuSans-2d" transform="translate(140.242188 0)"/>
      <use xlink:href="#DejaVuSans-4b" transform="translate(176.326172 0)"/>
      <use xlink:href="#DejaVuSans-45" transform="translate(241.902344 0)"/>
      <use xlink:href="#DejaVuSans-4d" transform="translate(305.085938 0)"/>
      <use xlink:href="#DejaVuSans-2d" transform="translate(391.365234 0)"/>
      <use xlink:href="#DejaVuSans-31" transform="translate(427.449219 0)"/>
      <use xlink:href="#DejaVuSans-30" transform="translate(491.072266 0)"/>
      <use xlink:href="#DejaVuSans-32" transform="translate(554.695312 0)"/>
      <use xlink:href="#DejaVuSans-34" transform="translate(618.318359 0)"/>
     </g>
    </g>
   </g>
  </g>
 </g>
 <defs>
  <clipPath id="p1ff4918728">
   <rect x="34.2625" y="10.999219" width="524.05" height="245.36"/>
  </clipPath>
 </defs>
</svg>
<figcaption class="viz-caption">End-to-end KEM speedup (`ref` $\to$ `avx2`) for `kyber_keypair`, `kyber_encaps`, and `kyber_decaps`. Intel Xeon Platinum 8268; 95% bootstrap CI.</figcaption></figure>
<h3 id="full-operation-set">Full Operation Set</h3>
<div class="annotation annotation--static">
<p><strong><abbr class="smallcaps">TODO</abbr>:</strong> Full operation speedup table for all 20 benchmarked operations, including <code>poly_compress</code>, <code>poly_decompress</code>, <code>polyvec_compress</code>, <code>poly_tomsg</code>, and the <code>*_derand</code> <abbr class="smallcaps">KEM</abbr> variants.</p>
</div>]]></summary>
</entry>
<entry>
    <title>Empirical Musings on Spaced Repetition for Learning Beyond Memorization</title>
    <link href="https://levineuwirth.org/essays/empirical-musings-spaced-repetition.html" />
    <id>https://levineuwirth.org/essays/empirical-musings-spaced-repetition.html</id>
    <published>2026-03-26T00:00:00Z</published>
    <updated>2026-03-26T00:00:00Z</updated>
    <summary type="html"><![CDATA[]]></summary>
</entry>
<entry>
    <title>The Philosophical Legacy of Dostoevsky's Implicit Rejection of Logic and Science in Part I of <em>Notes from Underground</em></title>
    <link href="https://levineuwirth.org/essays/notes-from-underground.html" />
    <id>https://levineuwirth.org/essays/notes-from-underground.html</id>
    <published>2025-10-24T00:00:00Z</published>
    <updated>2025-10-24T00:00:00Z</updated>
    <summary type="html"><![CDATA[<p><em>Notes from Underground</em> is widely admired as a cornerstone of literature, culture, and philosophy.<sup class="cite-marker" id="cite-back-1"><a href="#ref-Frank" class="cite-link" data-cite-keys="ref-Frank">[1]</a></sup> Dostoevsky masterfully combines the narrative of the now-iconic Underground Man with implicit philosophical undercurrents. The result is a piece which is simultaneously a masterwork of fiction and a deeply influential philosophical treatise. Intriguingly, Dostoevsky never explicitly defines what the philosophical positions that he is advocating for or against are in his work, instead exclusively expressing them implicitly through storytelling. This paper will develop the argument that the primary philosophical undercurrent in <em>Notes from Underground</em> is a rejection of logic and science as end-alls in modern life through comparison of Dostoevsky’s implicit revelation to the more explicitly articulated philosophical works of his contemporaries.</p>
<p><em>Notes from Underground</em> opens with a contemplation on suffering, while also hinting at the notion of futility. In sections <abbr class="smallcaps">III</abbr> and IV of part 1, the motif of the stone wall is introduced, one which will recur throughout the remainder of the part. The stone wall is emblematic of a barrier; it is the “only” object which “perhaps will stop” one from their goals.<sup class="cite-marker" id="cite-back-2"><a href="#ref-Notes" class="cite-link" data-cite-keys="ref-Notes">[2]</a></sup> But the stone wall introduces an immediate double entendre. Dostoevsky initially refers to it as a “calming influence.” The calming influence to which he refers is the supposed illusion of stability that the stone wall provides. The stability follows from scientific laws that are uniformly true — Underground Man provides the example of the equation <span class="math inline">2+2=4</span>, elaborating: “…I shall never be able to break through such a stone wall… but I shall not reconcile myself to it… As though such a stone wall were really the same thing as peace of mind.”<sup class="cite-marker" id="cite-back-2"><a href="#ref-Notes" class="cite-link" data-cite-keys="ref-Notes">[2]</a></sup></p>
<p>The Underground Man has thus, in the opening four sections of the work, established a contradiction. The apparent resultant stability that logic and science provide through laws of arithmetic and reason is one that, in the eyes of the Underground Man, incurs an unacceptable price in the reduction of creativity, of freedom of expression. Indeed, the primary grievance that the Underground Man indicates is the forced acceptance of advocates of such laws and, “consequently, all [their] results.” This forced acceptance disregards, even outright dismisses his opinion on the laws.<sup class="sidenote-ref" id="snref-a"><a href="#sn-a">a</a></sup><span class="sidenote" id="sn-a"><sup class="sidenote-num">a</sup> <span class="sidenote-para">This is arguably a mischaracterization of scientific ideals, one
repeated by many scientific credential-lacking philosophers. We withhold
development of such an argument here; it would need to be a distinct
paper.</span></span> There is apparently nothing which the stone wall is <em>actually</em> useful for.</p>
<p>Dostoevsky, through his introduction and subsequent discussion of the stone wall in relation to scientific laws, has commenced his implicit philosophical treatise. Throughout the remainder of the work, as will be discussed further, the Underground Man’s actions and anecdotes serve as illustrative evidence that the stability provided by the stone wall of science as a framework of thinking (and one which greatly captivates the Underground Man) is nothing more than illusion, for the Underground Man’s actions are indicative of anything but stability, morality, etc. He further demonstrates, through the explicit discontent and boredom that Underground Man expresses in section V, that the stone wall of reason is insufficient even as mere entertainment.</p>
<p>Nietzsche is a contemporary of Dostoevsky who was influenced not only by this philosophical argument, but additionally by the character of the Underground Man himself. In his <em>On the Genealogy of Morals</em>, he develops an explicit comparison of science to the “ascetic ideal,” proclaiming that “science rests on the same basis as does the ascetic ideal: a certain impoverishment of life is the presupposition of the latter as of the former.”<sup class="cite-marker" id="cite-back-3"><a href="#ref-Nietzsche_Gene" class="cite-link" data-cite-keys="ref-Nietzsche_Gene">[3]</a></sup> One might describe the Underground Man’s situation as something of a cursed asceticism. He is certainly a hermit to the same extent that a religious ascetic would be. Yet he is not an ascetic due to religious ideals, nor is he one due to lack of social compulsion — would such an ascetic not only be compelled to write about himself to such an extent, but describe it as the “greatest possible pleasure?” He is almost narcissistic in his self-indulgence through writing, a quality not advocated for by any major religion of which he could be an ascetic. Therefore, what Nietzsche really means is that science promotes a lifestyle that is akin to the sacrifice and abnegation that asceticism entails, while providing no real stability — the stone wall <em>is</em> an illusion, as Dostoevsky claims — and, thus, rejects science as an end-all. It seems that Dostoevsky’s example deeply resonated with Nietzsche. He describes the lifestyle of sacrifice and abnegation as “periods of exhaustion, often of sunset, of decay — the effervescing strength, the confidence in life, the confidence in the future are no more.”<sup class="cite-marker" id="cite-back-3"><a href="#ref-Nietzsche_Gene" class="cite-link" data-cite-keys="ref-Nietzsche_Gene">[3]</a></sup> Over ten years before this writing, he had already begun to form his opinion on science in <em>The Birth of Tragedy,</em> writing “What I then laid hands on, something terrible and dangerous, a problem with horns… it was the problem of science.”<sup class="cite-marker" id="cite-back-4"><a href="#ref-Nietzsche_Tragedy" class="cite-link" data-cite-keys="ref-Nietzsche_Tragedy">[4]</a></sup></p>
<p>Martin Heidegger is another of Dostoevsky’s contemporaries who outlines, perhaps even formalizes<sup class="sidenote-ref" id="snref-b"><a href="#sn-b">b</a></sup><span class="sidenote" id="sn-b"><sup class="sidenote-num">b</sup> <span class="sidenote-para">Though Heidegger, demonstrated by his argument in “Letter on Humanism,”
would <em>hate</em> reduction to mere “formalization” of his
predecessor, and is probably rolling in his grave at the thought.</span></span> a similar, aggressive perspective. In “Letter on Humanism,” Heidegger argues that “such names as ‘logic,’ ‘ethics,’ and ‘physics’ begin to flourish only when original thinking comes to an end.”<sup class="cite-marker" id="cite-back-5"><a href="#ref-Heidegger_Letter" class="cite-link" data-cite-keys="ref-Heidegger_Letter">[5]</a></sup> Heidegger goes further within “Building Dwelling Thinking,” indicating therein that “…building is closer to the essence of spaces and the essential origins of ‘space’ than any geometry and mathematics.”<sup class="cite-marker" id="cite-back-6"><a href="#ref-Heidegger_Building" class="cite-link" data-cite-keys="ref-Heidegger_Building">[6]</a></sup><sup class="sidenote-ref" id="snref-c"><a href="#sn-c">c</a></sup><span class="sidenote" id="sn-c"><sup class="sidenote-num">c</sup> <span class="sidenote-para">It may be debated the extent to which Heidegger intends for “building”
in this work to come across in a metaphorical sense. He does remark, 8
pages before the chosen quote, that “We limit ourselves to building in
the sense of…”, which implies that further, implicit meanings are
present (an argument with which I strongly concur). He never explicitly
mentions any such metaphorical intention.</span></span> Heidegger’s insistence that the consideration of science and logic as end-alls is a reductive position appears to have been influenced by Dostoevsky in <em>Notes from Underground</em>. Heidegger, once again in “Building Dwelling Thinking,” presents an ingenious discourse on the necessity of some higher ulterior motivation than mere fulfillment of rational inquiry without exterior purpose, asserting that “The essence of building is letting dwell”<sup class="cite-marker" id="cite-back-6"><a href="#ref-Heidegger_Building" class="cite-link" data-cite-keys="ref-Heidegger_Building">[6]</a></sup><sup class="sidenote-ref" id="snref-d"><a href="#sn-d">d</a></sup><span class="sidenote" id="sn-d"><sup class="sidenote-num">d</sup> <span class="sidenote-para">My proposed interpretation of “dwelling” in this more metaphorical
sense.</span></span> — or, to paraphrase, an interior motivation and fascination with one’s pursuits is a prerequisite for the derivation of any sense of fulfillment from said pursuits. This is in stark contrast to the image of asceticism developed by Dostoevsky and Nietzsche, wherein science is a pursuit which reduces the extent of one’s livelihood, thereby diminishing the qualities Heidegger presents as necessities.</p>
<p>In section 5 the Underground Man expands his digression on science, therein beginning the expansion in scope of Dostoevsky’s philosophical argument. Yet, before doing this, Dostoevsky feels it necessary to explicitly characterize the “laws of nature,” doing so through the Underground Man’s description of them as “a disgusting business” due to the “infinite worry and trouble” they have caused him.<sup class="cite-marker" id="cite-back-2"><a href="#ref-Notes" class="cite-link" data-cite-keys="ref-Notes">[2]</a></sup> Here, Nietzsche and Dostoevsky begin to diverge. Nietzsche concedes that “…as for these celebrated victories of science; there is no doubt that they are victories…”<sup class="cite-marker" id="cite-back-3"><a href="#ref-Nietzsche_Gene" class="cite-link" data-cite-keys="ref-Nietzsche_Gene">[3]</a></sup> acknowledging that there is some merit to this “disgusting business.” But Nietzsche is hardly the only philosopher to have felt the influence of <em>Notes from Underground</em>, and other philosophers have continued to agree more strongly with the Underground Man’s classification to our current day and age.<sup class="sidenote-ref" id="snref-e"><a href="#sn-e">e</a></sup><span class="sidenote" id="sn-e"><sup class="sidenote-num">e</sup> <span class="sidenote-para">This is, once again, arguably another broad and disappointing
mischaracterization of science. We withhold arguments here and refer you
to Richard Feynman’s 1988 book <em>What Do You Care What Other People
Think?</em></span></span></p>
<p>One such example of a philosopher in deep agreement with Dostoevsky is Lev Shestov. Shestov holds, contrary to Nietzsche, that the victories of science are better classified as stagnations, writing “In the ‘ultimate questions of life’ we are not a bit nearer the truth than our ancestors were… reason is a laggard, without much foresight…”<sup class="cite-marker" id="cite-back-7"><a href="#ref-Shestov" class="cite-link" data-cite-keys="ref-Shestov">[7]</a></sup> Shestov, in his work, develops an argument much closer in sentiment to Underground Man, and this is no coincidence; Dostoevsky is mentioned by name countless times in his work. Yet, for all of Shestov’s agreement with Dostoevsky, in comparing <em>All Things Are Possible</em> and <em>Notes from Underground</em> an interesting contradiction arises. Shestov develops his claim that we have made no progress in answering the questions of life in a way that suggests he believes that ancient people had few answers and we have not added any. Dostoevsky, on the other hand, would almost certainly argue that his ancestors, say those who were around at the same time as Christ, had <em>all</em> of the answers, and over the next nearly 2,000 years no further answers were contributed because none were necessary; the questions were already satisfactorily answered. In section 7 of part I, amidst a lengthy development of his implicit philosophical treatise, Dostoevsky interjects with an intriguing reference to religion. The Underground Man asks “who was it who first said… the only reason man behaves dishonorably is because he does not know his own interests…”<sup class="cite-marker" id="cite-back-2"><a href="#ref-Notes" class="cite-link" data-cite-keys="ref-Notes">[2]</a></sup> The discussion evolves into a wide-ranging one, touching upon enlightenment, innocence, and human nature in the subsequent lines. It is no accident that, to begin the section of part one directly at the center of a sequence of sections (5–9) entirely focused on development of his philosophical position against science and reason, he refers to religion in the abstract, never opting for the imagery of any one specific religion, but instead using religion to center and ground his argument. Dostoevsky’s subtle yet crucial grounding of his argument in ancient ideas demonstrates an agreement with Shestov, if only one that is viewed from a different perspective.</p>
<p>The Underground Man goes on, still in section 7, the center of his philosophical argument, to presciently discuss the dangers of unrestricted science and reason. In one of his most brilliant quotes, the Underground Man argues that “man is so obsessed by systems and abstract deductions that he is ready to distort the truth deliberately…”, going further to emphasize the necessity of reliance on the senses.<sup class="cite-marker" id="cite-back-2"><a href="#ref-Notes" class="cite-link" data-cite-keys="ref-Notes">[2]</a></sup> Interestingly, the Underground Man uses the example of war, illustrating through the imagery of bloodshed the pitfalls of reason’s application and interaction with human nature. We may once again turn to Heidegger as an example of a philosopher who expanded upon this position.<sup class="sidenote-ref" id="snref-f"><a href="#sn-f">f</a></sup><span class="sidenote" id="sn-f"><sup class="sidenote-num">f</sup> <span class="sidenote-para">With the obvious irony that, of course, Heidegger had at least
<em>some</em> (and likely <em>plenty</em> of) affiliation with the Nazi
party.</span></span> In <em>The Question Concerning Technology</em>, Heidegger constructs an interpretation of technology as a mechanicism of “revealing,” and, after much development, presents the incredible claim that “The destining of revealing is in itself not just any danger, but <em>the</em> danger.”<sup class="cite-marker" id="cite-back-6"><a href="#ref-Heidegger_Building" class="cite-link" data-cite-keys="ref-Heidegger_Building">[6]</a></sup> Underground Man, throughout section 5, gradually transitions his discussion from the individual (which was the focus of the immediately preceding sections 3 and 4) to the collective, discussing the consideration of warfare and violence by civilization at large as an “abomination” only after his previous meditation on the individualistic impact of reason; Heidegger seems more interested in society from the start, neglecting to explicitly speak to the impact of technological progress through scientific innovation on the individual.</p>
<p>Ellul was a philosopher who was, more similarly to Dostoevsky, equally concerned with the individual and the collective. Dostoevsky begins to discuss the collective impact through his brilliant “conversation” between the Underground Man and the reader, actively addressing and involving the latter in the second person. The reader (“you”) postulates that science will have “completely re-educated human nature and directed it along the road of normal behavior,” before the Underground Man deconstructs any notion of normality in such “normal” behavior.<sup class="cite-marker" id="cite-back-2"><a href="#ref-Notes" class="cite-link" data-cite-keys="ref-Notes">[2]</a></sup> We may compare this to Ellul, who, not too unlike Heidegger, describes how “Science brings to the light of day everything man had believed sacred… Technique takes possession of it and enslaves it.”<sup class="cite-marker" id="cite-back-8"><a href="#ref-Ellul" class="cite-link" data-cite-keys="ref-Ellul">[8]</a></sup> The Underground Man himself will develop a stunningly similar argument in which he concludes that “there will be no more independent actions or adventures in the world.” Where Dostoevsky and Ellul differ is that Dostoevsky, once again implicitly through the Underground Man, argues that it is the laws of nature themselves (or, science in the abstract) that opens the possibility of such slavery to determinism, whereas Ellul (and, to a lesser extent, Heidegger) argues that it is technology (or, science in tangible application) that does so. Both come to strikingly similar conclusions, regardless of the means by which they reached them.</p>
<p>The Underground Man subsequently presents a depiction of resistance, creating a character who advocates for sending “‘all these logarithms to the devil so that we can again live according to our foolish will’.”<sup class="cite-marker" id="cite-back-2"><a href="#ref-Notes" class="cite-link" data-cite-keys="ref-Notes">[2]</a></sup> He goes on to argue that such a character “would certainly find followers.” Interestingly, while Ellul himself never made such explicit predictions nor advocated for an anti-Technique revolution, it is well known and documented that Ted Kaczynski was profoundly influenced by Ellul’s work, particularly <em>The Technological Society</em>, and these influences were part of his motivation to commit atrocities in the name of eco-terrorist ideology. Indeed, in Kaczynski’s own <em>Industrial Society and Its Future</em><sup class="sidenote-ref" id="snref-g"><a href="#sn-g">g</a></sup><span class="sidenote" id="sn-g"><sup class="sidenote-num">g</sup> <span class="sidenote-para">More commonly referred to as the “Unabomber Manifesto.”</span></span>, the phrase “technological society” occurs 10 times.<sup class="cite-marker" id="cite-back-9"><a href="#ref-Kacz" class="cite-link" data-cite-keys="ref-Kacz">[9]</a></sup> Whether the revolution called for in this document has found any followers, as a more extreme case of “sending all these logarithms to the devil,” is not clear.</p>
<p>The Underground Man continues into section 8 with a discussion of the absolute necessity of free will, describing in the process the shortcomings of reason. He argues that “Reason is only reason… whereas volition is a manifestation of the whole of life.”<sup class="cite-marker" id="cite-back-2"><a href="#ref-Notes" class="cite-link" data-cite-keys="ref-Notes">[2]</a></sup> This argument, once again, is not much unlike Heidegger’s argument in <em>Building Dwelling Thinking</em>. The strength of Dostoevsky’s conviction on behalf of volition and free will also deeply influenced Jean-Paul Sartre. Sartre develops an argument that he is “condemned to be free,” elaborating that “no limits to my freedom can be found except freedom itself… that we are not free to cease being free.”<sup class="cite-marker" id="cite-back-10"><a href="#ref-Sartre" class="cite-link" data-cite-keys="ref-Sartre">[10]</a></sup> The Underground Man is also an advocate of such unrestricted freedom, describing this absolute freedom as “the right to desire for himself even what is very stupid and not to be bound by an obligation to desire only what is sensible.” Sartre goes on to describe how “man being condemned to be free carries the weight of the whole world on his shoulders; he is responsible for the world.”<sup class="cite-marker" id="cite-back-10"><a href="#ref-Sartre" class="cite-link" data-cite-keys="ref-Sartre">[10]</a></sup> This explicitly solidifies a recurring implicit theme across Dostoevsky’s work: that all is interconnected, and that everyone is to blame for everything. In <em>Notes from Underground</em>, this is continually reiterated through the depiction of the Underground Man’s <em>underground</em> condition in incredible detail. The Underground Man has a seemingly contradictory self-awareness of his state, an awareness that in some ways he himself has created the conditions and the environment that proliferated such a state, and yet, at the same time, the meditations of the laws of nature and the interactions depicted in part II are used to implicitly build an argument of interconnection. The influence of this construction on Sartre is, once again, not one that I merely postulate; Sartre mentions Dostoevsky by name twice in <em>Being and Nothingness</em>.</p>
<p>If Sartre was an advocate of unrestricted freedom as an absolute necessity in the same way that Dostoevsky was (implicitly through the Underground Man, of course), then Camus was much like our earlier example of Shestov, coming to near identical conclusions from a different perspective. Camus, much like the Underground Man, found suffering to be absolutely essential to happiness, writing in perhaps the most famous words of 20th century philosophy “The struggle itself toward the heights is enough to fill a man’s heart. One must imagine Sisyphus happy.”<sup class="cite-marker" id="cite-back-11"><a href="#ref-Camus_Myth" class="cite-link" data-cite-keys="ref-Camus_Myth">[11]</a></sup> Nearly 80 years earlier, the Underground Man had demonstrated a similar, if less strong, conclusion through his illustration of the “‘pleasure even in toothache.’” In fact, while the majority of sections 3 and 4 of part I are devoted to this meditation on suffering, the Underground Man elaborates on it again in section 9, stating “Does reason not make mistakes…? Is it not possible that man loves something besides prosperity? Perhaps he is just as fond of suffering?” Where Camus and Dostoevsky differ is in their view of the source of suffering. Where Dostoevsky relates the example of the toothache as an inevitable, almost mundane instance of suffering, one which the Utopian future that science promises cannot ever truly aspire to negate, Camus develops suffering as the result of existential inquiry — and he argues that such inquiry is vital. Camus never takes a stance so explicitly against science and reason as, say, Nietzsche, rather elaborating, once again in <em>The Myth of Sisyphus</em>, that “I realize that if through science I can seize phenomena and enumerate them, I cannot, for all that, apprehend the world.”<sup class="cite-marker" id="cite-back-11"><a href="#ref-Camus_Myth" class="cite-link" data-cite-keys="ref-Camus_Myth">[11]</a></sup> Thus, Camus’ stance on science is somewhere between Nietzsche’s and Dostoevsky’s. He acknowledges that science alone is insufficient for answering questions of stature similar to the “ultimate” ones raised by Shestov. This shortcoming of science, Camus argues, is a source of suffering, as it proliferates the existential dread that such questions impose. Yet Camus advocates for suffering elegantly in <em>Return to Tipasa</em>, beautifully proclaiming “In the depths of winter, I finally learned that within me there lay an invincible summer.”<sup class="cite-marker" id="cite-back-11"><a href="#ref-Camus_Myth" class="cite-link" data-cite-keys="ref-Camus_Myth">[11]</a></sup><sup class="sidenote-ref" id="snref-h"><a href="#sn-h">h</a></sup><span class="sidenote" id="sn-h"><sup class="sidenote-num">h</sup> <span class="sidenote-para">This prose is even more beautiful in French, so we refer you to the
original <em>Retour à Tipasa</em> from <em>L’Été.</em></span></span> Dostoevsky, rather than appreciating (or, at least, feeling truly neutral) science as an emanation of suffering, argues that suffering is the ideological inverse of science. The Underground Man, again in section 9, discusses the Crystal Palace — an unmistakable emblem of science and reason. In doing so, he refers to how “suffering is not permitted… In the Crystal Palace it is unthinkable: suffering is doubt, it is negation.”<sup class="cite-marker" id="cite-back-2"><a href="#ref-Notes" class="cite-link" data-cite-keys="ref-Notes">[2]</a></sup> Thus the Underground Man and, implicitly, Dostoevsky, take issue with what they perceive as the end goal of science: the cessation of suffering, the construction of a Utopian world, and the inevitable reduction, perhaps even cessation, of freedom as a consequence.<sup class="sidenote-ref" id="snref-i"><a href="#sn-i">i</a></sup><span class="sidenote" id="sn-i"><sup class="sidenote-num">i</sup> <span class="sidenote-para">Once again, I would argue that this is a mischaracterization — perhaps
to some this is an end goal of <em>technology</em>, but not of
<em>science</em>. I refer you, in lieu of an extended argument, to
chapter IV of Carl Sagan’s 1994 <em>Pale Blue Dot.</em></span></span></p>
<p>The Underground Man goes on, in section 10 now, to argue (in an unusually explicit way) that the primary conflict that arises between this notion of freedom and free will and science and reason is the objectivity of science. The Underground Man acknowledges and disregards this objectivity when he states “What do I care whether it is against the laws of nature? What does it matter so long as it exists in my desires?”<sup class="cite-marker" id="cite-back-2"><a href="#ref-Notes" class="cite-link" data-cite-keys="ref-Notes">[2]</a></sup> He elaborates on his rejection of the rigidity and seriousness in objectivity of science and reason a few lines later: “I rejected the Crystal Palace myself for the sole reason that one would not be allowed to stick one’s tongue out at it.” These examples reinforce the previous development of the argument that Dostoevsky perceives freedom as inevitable, much like Sartre. The Underground Man goes further to characterize why science and reason in particular are the target of his scrutiny by saying “Perhaps what I resented was that among all our buildings there has never been one at which one could not stick out one’s tongue.”</p>
<p>This scrutiny of the harshly perceived immutability of science and reason likely influenced the philosopher Edmund Husserl. Husserl, originally trained as a mathematician,<sup class="cite-marker" id="cite-back-12"><a href="#ref-Cooper" class="cite-link" data-cite-keys="ref-Cooper">[12]</a></sup> was in some ways a stark contrast to Dostoevsky. He believed in the necessity of the philosopher “withdrawing into himself and attempting, within himself, to overthrow and build anew all the sciences that, up until then, he has been accepting.”<sup class="cite-marker" id="cite-back-13"><a href="#ref-Husserl_Meditations" class="cite-link" data-cite-keys="ref-Husserl_Meditations">[13]</a></sup> The belief in such a necessity implies a belief in the validity and worthiness of science that is contrary to Dostoevsky’s implicit arguments. Yet this perspective on science, the perspective that one must develop their own scientific views for themselves, is emblematic of the broader skepticism that Dostoevsky advocates through the Underground Man. For Husserl does not advocate blind acceptance of science, but rather the replication and verification of any ends which are to be considered objectively true, like “laws of nature.” Of course, Husserl does not pay any attention to the fact that building anew “all the sciences” is likely an impossible task, and one that is directly in opposition to the collaborative nature of science as an enterprise.<sup class="sidenote-ref" id="snref-j"><a href="#sn-j">j</a></sup><span class="sidenote" id="sn-j"><sup class="sidenote-num">j</sup> <span class="sidenote-para">As a mathematician more so than a scientist in training myself, I would
argue this is very much the thinking and position of a mathematician and
<em>not</em> a scientist. There is a difference, if subtle!</span></span> Yet, although Husserl does not appear to explicitly indicate this necessity as one that is necessary only as an intellectual exercise or means of philosophical development otherwise, he does express in his later work a broader skepticism and disdain for the objectivity of science and reason, much like the Underground Man. Where the Underground Man expresses his disdain for science’s perceived immutability compared to other institutions of society, Husserl expresses his disdain in a more explicit and straightforward way, borrowing from Kant (with acknowledgment) when he states that “the objective sciences (no matter how much they… may consider themselves… to be in possession of the only true method) are not seriously sciences at all… not cognitions of what exists in ultimate truth.”<sup class="cite-marker" id="cite-back-14"><a href="#ref-Husserl_Crisis" class="cite-link" data-cite-keys="ref-Husserl_Crisis">[14]</a></sup> Yet, like Nietzsche, Husserl concedes the “virtue of their obvious theoretical and practical accomplishments.”<sup class="cite-marker" id="cite-back-14"><a href="#ref-Husserl_Crisis" class="cite-link" data-cite-keys="ref-Husserl_Crisis">[14]</a></sup> Husserl’s notion of skepticism and rejection of objectivity, regardless of his perceived virtues of the <em>objective</em> sciences, creates an interesting juxtaposition of Dostoevsky’s ideas with other ideas which Dostoevsky would’ve disapproved of. The Underground Man’s rejection is perhaps more emotionally charged when, at the end of a paragraph of rhetorical questions, he asks “Can this be the sole purpose? I don’t believe it.”<sup class="cite-marker" id="cite-back-2"><a href="#ref-Notes" class="cite-link" data-cite-keys="ref-Notes">[2]</a></sup> Although the Underground Man’s (and thus, Dostoevsky’s) ideas are distinctly differentiable from Husserl’s, in another intriguing, deliberate contradiction that Dostoevsky introduces to his text through another dialogue between reader and Underground Man, he acknowledges that the Underground Man “longs for life, yet [he tries] to solve the problems of life by a logical tangle!”<sup class="cite-marker" id="cite-back-2"><a href="#ref-Notes" class="cite-link" data-cite-keys="ref-Notes">[2]</a></sup> This (as he describes it, “insolent”) logical tangle<sup class="cite-marker" id="cite-back-2"><a href="#ref-Notes" class="cite-link" data-cite-keys="ref-Notes">[2]</a></sup> is not much unlike Husserl’s advocated individualized building of the sciences anew from scratch.</p>
<p>Finally, at the close of part I, Dostoevsky provides one further reason to be critical of science and reason, particularly in their perceived role as the progenitors of technology and automation. Similarly to his view on suffering, the Underground Man is, like Heidegger, an advocate of work, justifying his composition of part II with “Writing down things is, in fact, a sort of work. People say work makes man better and more honest. Well, here’s a chance for me…”<sup class="cite-marker" id="cite-back-2"><a href="#ref-Notes" class="cite-link" data-cite-keys="ref-Notes">[2]</a></sup> It should come as no surprise, then, that Hannah Arendt, a philosopher heavily influenced by (and personally involved with) Heidegger, is another party who shares similar views. Arendt captures her vision of the failed Utopia that technological progress catalyzed by science would provide with strong language, stating “What we are confronted with is the prospect of a society of laborers without labor, that is, without the only activity left to them. Surely, nothing could be worse.”<sup class="cite-marker" id="cite-back-15"><a href="#ref-Arendt" class="cite-link" data-cite-keys="ref-Arendt">[15]</a></sup></p>
<p>Thus, at the end of the first part of <em>Notes from Underground</em> which we have confined our analysis to, all of the implicit philosophical undercurrents have been developed and connected full circle. We have now returned to the futility and boredom that both Dostoevsky and Arendt argue (the former implicitly and the latter explicitly) would arise from uninhibited forward progress in the realms of science and reason. Where in the later sections of part I the Underground Man returns to being primarily concerned with himself on the individual level, his self-centered contemplation of the Crystal Palace and philosophical discussions make an implicit argument concerning the collective. Arendt, likely influenced by this argument, whether directly or transitively through Heidegger, saves the strongest of words in her work for the perceived discrepancy, one she shares with Dostoevsky, between what science and reason promise and what they <em>actually</em> provide.</p>
<p><em>Notes from Underground</em> is a work that has retained its emotional and philosophical power, and, as a consequence, one that has stood the test of time. It is a work that is timelessly prescient, drawing unbelievably accurate conclusions about the discrepancies between the perceived end-goals of the end-alls of science and reason, end-goals that seemingly come from a place of daydreaming and fantasy, and the reality of the century following its composition: two world wars, intense geopolitical climate in the years where the wars were not active, immense economic turmoil and suffering, etc. If science <em>was</em> truly promising Utopia during Dostoevsky’s time, it certainly failed to deliver in the subsequent century, and Dostoevsky presciently observed the inevitable shortcomings before they had even had a chance to occur. Regardless of the degree to which one agrees or disagrees with Dostoevsky’s implicit conclusions and the more explicit conclusions of his contemporaries, one must acknowledge the incredible stature of his work, and its lasting legacy that continues to endure to the present day.</p>]]></summary>
</entry>
<entry>
    <title>Ozymandias</title>
    <link href="https://levineuwirth.org/poetry/ozymandias.html" />
    <id>https://levineuwirth.org/poetry/ozymandias.html</id>
    <published>1818-01-11T00:00:00Z</published>
    <updated>1818-01-11T00:00:00Z</updated>
    <summary type="html"><![CDATA[<p>I met a traveller from an antique land,<br />
Who said — “Two vast and trunkless legs of stone<br />
Stand in the desert. . . . Near them, on the sand,<br />
Half sunk a shattered visage lies, whose frown,<br />
And wrinkled lip, and sneer of cold command,<br />
Tell that its sculptor well those passions read<br />
Which yet survive, stamped on these lifeless things,<br />
The hand that mocked them, and the heart that fed;<br />
And on the pedestal, these words appear:<br />
My name is Ozymandias, King of Kings;<br />
Look on my Works, ye Mighty, and despair!<br />
Nothing beside remains. Round the decay<br />
Of that colossal Wreck, boundless and bare<br />
The lone and level sands stretch far away.”</p>]]></summary>
</entry>
<entry>
    <title>Sonnet 60</title>
    <link href="https://levineuwirth.org/poetry/sonnet-60.html" />
    <id>https://levineuwirth.org/poetry/sonnet-60.html</id>
    <published>1609-05-20T00:00:00Z</published>
    <updated>1609-05-20T00:00:00Z</updated>
    <summary type="html"><![CDATA[<p>Like as the waves make towards the pebbled shore,<br />
So do our minutes hasten to their end;<br />
Each changing place with that which goes before,<br />
In sequent toil all forwards do contend.</p>
<p>Nativity, once in the main of light,<br />
Crawls to maturity, wherewith being crown’d,<br />
Crooked eclipses ’gainst his glory fight,<br />
And Time that gave doth now his gift confound.</p>
<p>Time doth transfix the flourish set on youth,<br />
And delves the parallels in beauty’s brow,<br />
Feeds on the rarities of nature’s truth,<br />
And nothing stands but for his scythe to mow.</p>
<p>And yet to times in hope my verse shall stand,<br />
Praising thy worth, despite his cruel hand.</p>]]></summary>
</entry>

</feed>
