Initial commit

This commit is contained in:
Marius Drechsler 2024-07-17 10:14:20 +02:00
commit 9aca6c3042
40 changed files with 2557 additions and 0 deletions

19
.direnv/bin/nix-direnv-reload Executable file
View file

@ -0,0 +1,19 @@
#!/usr/bin/env bash
set -e
if [[ ! -d "/home/mya/thesis" ]]; then
echo "Cannot find source directory; Did you move it?"
echo "(Looking for "/home/mya/thesis")"
echo 'Cannot force reload with this script - use "direnv reload" manually and then try again'
exit 1
fi
# rebuild the cache forcefully
_nix_direnv_force_reload=1 direnv exec "/home/mya/thesis" true
# Update the mtime for .envrc.
# This will cause direnv to reload again - but without re-building.
touch "/home/mya/thesis/.envrc"
# Also update the timestamp of whatever profile_rc we have.
# This makes sure that we know we are up to date.
touch -r "/home/mya/thesis/.envrc" "/home/mya/thesis/.direnv"/*.rc

View file

@ -0,0 +1 @@
/nix/store/72x8cqlqwfpj59mhy3mk2rh12zacddmr-source

View file

@ -0,0 +1 @@
/nix/store/8mf17vg4416wkyd7kc1b4yp4pgvsi0qy-source

View file

@ -0,0 +1 @@
/nix/store/i9syjxw0famqkabw2d01n723m3sc7vdn-source

View file

@ -0,0 +1 @@
/nix/store/na7sykizsgkzh9i3wc8m8pz5xfqib2rv-source

View file

@ -0,0 +1 @@
/nix/store/rylyv28gslxqq5pxzr4llgrp2asq898n-source

View file

@ -0,0 +1 @@
/nix/store/yj1wxm9hh8610iyzqnz75kvs6xl8j3my-source

View file

@ -0,0 +1 @@
/nix/store/zmfxzr0ln2qgqg72g8a66v5jr1lqmwd1-nix-shell-env

File diff suppressed because it is too large Load diff

1
.envrc Normal file
View file

@ -0,0 +1 @@
use flake

1
README.md Normal file
View file

@ -0,0 +1 @@
# MQT QCEC Diff Thesis

23
bibliography.bib Normal file
View file

@ -0,0 +1,23 @@
@article{quetschlich2023mqtbench,
title={{{MQT Bench}}: Benchmarking Software and Design Automation Tools for Quantum Computing},
shorttitle={{MQT Bench}},
journal={{Quantum}},
author={Quetschlich, Nils and Burgholzer, Lukas and Wille, Robert},
year={2023},
note={{{MQT Bench}} is available at \url{https://www.cda.cit.tum.de/mqtbench/}},
}
@article{burgholzer2021ec,
title={Advanced Equivalence Checking for Quantum Circuits},
volume={40},
ISSN={1937-4151},
url={http://dx.doi.org/10.1109/TCAD.2020.3032630},
DOI={10.1109/tcad.2020.3032630},
number={9},
journal={IEEE Transactions on Computer-Aided Design of Integrated Circuits and Systems},
publisher={Institute of Electrical and Electronics Engineers (IEEE)},
author={Burgholzer, Lukas and Wille, Robert},
year={2021},
month=sep,
pages={18101824}
}

3
content/SMHD.typ Normal file
View file

@ -0,0 +1,3 @@
= S-Metric Helper Data Method
#figure(include("../graphics/quantizers/two-metric-enroll.typ"))

70
content/background.typ Normal file
View file

@ -0,0 +1,70 @@
#import "@preview/fletcher:0.5.1": diagram, node, edge
#import "@preview/gentle-clues:0.9.0": example
#import "@preview/quill:0.3.0": quantum-circuit, lstick, rstick, ctrl, targ, mqgate, meter
= Background
== Quantum Computation and Quantum Circuits
A quantum computer is a device that performs calculations by using certain phenomena of quantum mechanics.
The algorithms that run on this device are specified in quantum circuits.
#example[
@example_qc shows a simple quantum circuit that implements a specific quantum algorithm.
#figure(
quantum-circuit(
lstick($|0$), $H$, mqgate($U$, n: 2, width: 5em, inputs: ((qubit: 0, label: $x$), (qubit: 1, label: $y$)), outputs: ((qubit: 0, label: $x$), (qubit: 1, label: $y plus.circle f(x)$))), $H$, meter(), [\ ],
lstick($|1$), $H$, 1, 1, 1
),
caption: [A quantum circuit implementing the Deutsch-Jozsa algorithm]
) <example_qc>
]
== Decision Diagrams
Decision diagrams in general are directed acyclical graphs, that may be used to express control flow through a series of conditions.
It consists of a set of decision nodes and terminal nodes.
The decision nodes represent an arbitrary decision based on an input value and may thus have any number of outgoing edges.
The terminal nodes represent output values and may not have outgoing edges.
A @bdd is a specific kind of decision diagram, where there are two terminal nodes (0 and 1) and each decision node has two outgoing edges, depending solely on a single bit of an input value.
@bdd[s] may be used to represent any boolean function.
#example[
Example @bdd[s] implementing boolean functions with an arity of $2$ are show in @example_bdd_xor and @example_bdd_and.
#figure(
diagram(
node-stroke: .1em,
node((0, 0), [$x_0$], radius: 1em),
edge((0, 0), (-1, 1), [0], "->"),
edge((0, 0), (1, 1), [1], "->"),
node((-1, 1), [$x_1$], radius: 1em),
node((1, 1), [$x_1$], radius: 1em),
edge((-1, 1), (-1, 2), [0], "->"),
edge((-1, 1), (1, 2), [1], "->"),
edge((1, 1), (1, 2), [0], "->"),
edge((1, 1), (-1, 2), [1], "->"),
node((-1, 2), [$0$]),
node((1, 2), [$1$]),
),
caption: [A @bdd for an XOR gate.]
) <example_bdd_xor>
#figure(
diagram(
node-stroke: .1em,
node((1, 0), [$x_0$], radius: 1em),
edge((1, 0), (0, 2), [0], "->"),
edge((1, 0), (1, 1), [1], "->"),
node((1, 1), [$x_1$], radius: 1em),
edge((1, 1), (0, 2), [0], "->"),
edge((1, 1), (1, 2), [1], "->"),
node((0, 2), [$0$]),
node((1, 2), [$1$]),
),
caption: [A @bdd for an AND gate.]
) <example_bdd_and>
]

16
content/benchmarks.typ Normal file
View file

@ -0,0 +1,16 @@
#import "@preview/tablex:0.0.8": tablex
#import "@preview/unify:0.6.0": qty
= Benchmarks
== Google Benchmark
== MQT QCEC Bench
To generate test cases for the application schemes, @mqt Bench was used. @quetschlich2023mqtbench
#tablex(
columns: (1fr, 1fr, 1fr),
rows: (auto, auto, auto),
[*Benchmark Name*], [*Diff Run Time*], [*Proportional Run Time*],
[DJ], [$qty("1.2e-6", "s")$], [$qty("1.5e-6", "s")$],
[Grover], [$qty("1.3e-3", "s")$], [$qty("1.7e-3", "s")$]
)

2
content/conclusion.typ Normal file
View file

@ -0,0 +1,2 @@
= Conclusion
#lorem(200)

View file

@ -0,0 +1,36 @@
#import "@preview/lovelace:0.3.0": pseudocode-list
= Implementation
== Visualisation
Initially, a visualisation of the diff algorithms applied to quantum circuits was created to assess their usefulness in equivalence checking.
Additionally, this served as exercise to better understand the algorithms to be used for the implementation in @qcec.
== QCEC Application Scheme
The Myers' Algorithm was implemented as an application scheme in @qcec.
#figure(
block(
pseudocode-list[
+ do something
+ do something else
+ *while* still something to do
+ do even more
+ *if* not done yet *then*
+ wait a bit
+ resume working
+ *else*
+ go home
+ *end*
+ *end*
],
width: 100%
),
caption: [Myers' algorithm.]
) <myers_algorithm>
== QCEC Benchmarking Tool
As @qcec doesnt have built-in benchmarks, a benchmarking tool was developed to test different configurations on various circuit pairs.

35
content/introduction.typ Normal file
View file

@ -0,0 +1,35 @@
= Introduction
These are the introducing words
== Notation
To ensure a consistent notation of functions and ideas, we will now introduce some required conventions
Random distributed variables will be notated with a capital letter, i.e. $X$, its realization will be the corresponding lower case letter, $x$.
Vectors will be written in bold test: $bold(k)$ represents a vector of quantized symbols.
We will call a quantized symbol $k$. $k$ consists of all possible binary symbols, i.e. $0, 01, 110$.
A quantizer will be defined as a function $cal(Q)(x, bold(a))$ that returns a quantized symbol $k$.
@example-quantizer shows the curve of a 2-bit quantizer that receives $tilde(x)$ as input. In the case, that the value of $tilde(x)$ equals one of the four bounds, the quantized value is chosen randomly from the relevant bins.
#figure(
include("../graphics/quantizers/two-metric-enroll.typ"),
caption: [Example quantizer function]) <example-quantizer>
For the S-Metric Helper Data Method, we introduce a function
$ cal(Q)(s,m) $<eq-1>
where s determines the amount of metrics and m the bit width of the symbols.
=== Tilde-Domain<tilde-domain>
AS also described in REFSMHD, we will use a CDF to transform the real PUF values into the Tilde-Domain
This transformation can be performed using the function $sym(xi) = tilde(x)$. The key property of this transformation is the resulting uniform distribution of $x$.
Considering a normal distribution, the CDF is defined as
$ sym(xi)(frac(x - sym(mu))(sym(sigma))) = frac(1)(2)[1 + erf(frac(x - sym(mu))(sym(sigma) sqrt(2)))] $

2
content/outlook.typ Normal file
View file

@ -0,0 +1,2 @@
= Outlook
#lorem(200)

3
content/state.typ Normal file
View file

@ -0,0 +1,3 @@
= State of the Art
There are a variety of existing approaches to providing a suitable oracle for quantum circuit equivalence checking based on @dd[s].
@qcec currently implements gate-cost, lookahead, one-to-one, proportional and sequential application schemes. @burgholzer2021ec

99
flake.lock generated Normal file
View file

@ -0,0 +1,99 @@
{
"nodes": {
"flake-utils": {
"inputs": {
"systems": "systems"
},
"locked": {
"lastModified": 1710146030,
"narHash": "sha256-SZ5L6eA7HJ/nmkzGG7/ISclqe6oZdOZTNoesiInkXPQ=",
"owner": "numtide",
"repo": "flake-utils",
"rev": "b1d9ab70662946ef0850d488da1c9019f3a9752a",
"type": "github"
},
"original": {
"owner": "numtide",
"repo": "flake-utils",
"type": "github"
}
},
"nixpkgs": {
"locked": {
"lastModified": 1720553833,
"narHash": "sha256-IXMiHQMtdShDXcBW95ctA+m5Oq2kLxnBt7WlMxvDQXA=",
"owner": "nixos",
"repo": "nixpkgs",
"rev": "249fbde2a178a2ea2638b65b9ecebd531b338cf9",
"type": "github"
},
"original": {
"owner": "nixos",
"ref": "nixos-24.05",
"repo": "nixpkgs",
"type": "github"
}
},
"root": {
"inputs": {
"flake-utils": "flake-utils",
"nixpkgs": "nixpkgs",
"typix": "typix",
"typst-packages": "typst-packages"
}
},
"systems": {
"locked": {
"lastModified": 1681028828,
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
"owner": "nix-systems",
"repo": "default",
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
"type": "github"
},
"original": {
"owner": "nix-systems",
"repo": "default",
"type": "github"
}
},
"typix": {
"inputs": {
"nixpkgs": [
"nixpkgs"
]
},
"locked": {
"lastModified": 1720341806,
"narHash": "sha256-Z9h+Q2ijuUzoK6E8eOIs5nyMkwA3wD1ILzx29qTo+x4=",
"owner": "loqusion",
"repo": "typix",
"rev": "058a5dc2fb7abd6bfbfa355898914bcc01798213",
"type": "github"
},
"original": {
"owner": "loqusion",
"repo": "typix",
"type": "github"
}
},
"typst-packages": {
"flake": false,
"locked": {
"lastModified": 1720615207,
"narHash": "sha256-Hh2fgicC68hq5oTig+tKzbqh8XbxQ+3PSKThIqOU5eo=",
"owner": "typst",
"repo": "packages",
"rev": "cd9b4250966792262b007fe200d9aa3bcb8d5aa4",
"type": "github"
},
"original": {
"owner": "typst",
"repo": "packages",
"type": "github"
}
}
},
"root": "root",
"version": 7
}

56
flake.nix Normal file
View file

@ -0,0 +1,56 @@
{
inputs = {
nixpkgs.url = github:nixos/nixpkgs/nixos-24.05;
flake-utils.url = github:numtide/flake-utils;
typix = {
url = github:loqusion/typix;
inputs.nixpkgs.follows = "nixpkgs";
};
typst-packages = {
url = github:typst/packages;
flake = false;
};
};
outputs = { self, nixpkgs, flake-utils, typix, typst-packages, ... }: flake-utils.lib.eachDefaultSystem (system:
let
pkgs = nixpkgs.legacyPackages.${system};
inherit (pkgs) lib;
tx = typix.lib.${system};
typstPackagesSrc = "${typst-packages}/packages";
typstPackagesCache = pkgs.stdenv.mkDerivation {
name = "typst-packages-cache";
src = typstPackagesSrc;
dontBuild = true;
installPhase = ''
mkdir -p "$out/typst/packages"
cp -LR --reflink=auto --no-preserve=mode -t "$out/typst/packages" "$src"/*
'';
};
typstProject = {
typstSource = "main.typ";
fontPaths = [
"./template/resources/"
];
};
typstProjectSrc = {
src = ./.;
XDG_CACHE_HOME = typstPackagesCache;
};
in {
devShell = pkgs.mkShell {
buildInputs = with pkgs; [
typst
];
};
packages.mqt-qcec-diff-thesis = tx.buildTypstProject (typstProject // typstProjectSrc);
packages.default = self.packages.${system}.mqt-qcec-diff-thesis;
apps.watch = flake-utils.lib.mkApp { drv = tx.watchTypstProject typstProject; };
apps.default = self.apps.${system}.watch;
}
);
}

11
glossary.typ Normal file
View file

@ -0,0 +1,11 @@
#import "@preview/glossarium:0.4.1": print-glossary
#counter(heading).update(0)
#heading(numbering: none)[Glossary]
#print-glossary((
(key: "bdd", short: "BDD", plural: "BDDs", long: "binary decision diagram", longplural: "binary decision diagrams"),
(key: "dd", short: "DD", plural: "DDs", long: "decision diagram", longplural: "decision diagrams"),
(key: "mqt", short: "MQT", long: "Munich Quantum Toolkit"),
(key: "qcec", short: "QCEC", long: "Quantum Circuit Equivalence Checker"),
))

View file

@ -0,0 +1,21 @@
#import "@preview/cetz:0.2.2": canvas, plot
#let line_style = (stroke: (paint: black, thickness: 2pt))
#let dashed = (stroke: (dash: "dashed"))
#canvas({
plot.plot(size: (8,6),
x-tick-step: 0.25,
y-label: $cal(Q)(2, 1, tilde(x))$,
x-label: $tilde(x)$,
y-tick-step: none,
y-ticks: ((0.25, [00]), (0.5, [01]), (0.75, [10]), (1, [11])),
axis-style: "left",
x-min: 0,
x-max: 1,
y-min: 0,
y-max: 1,{
plot.add(((0,0), (0.25,0.25), (0.5,0.5), (0.75,0.75), (1, 1)), line: "vh", style: line_style)
plot.add-hline(0.25, 0.5, 0.75, 1, style: dashed)
plot.add-vline(0.25, 0.5, 0.75, 1, style: dashed)
})
})

BIN
main.pdf Normal file

Binary file not shown.

40
main.typ Normal file
View file

@ -0,0 +1,40 @@
#import "@preview/cetz:0.2.2"
#import "@preview/fletcher:0.5.1"
#import "@preview/gentle-clues:0.9.0"
#import "@preview/glossarium:0.4.1": make-glossary
#import "@preview/lovelace:0.3.0"
#import "@preview/tablex:0.0.8"
#import "@preview/unify:0.6.0"
#import "@preview/quill:0.3.0"
#import "template/conf.typ": conf
#show: make-glossary
#set document(title: "Towards Efficient Helper Data Algorithms for Multi-Bit PUF Quantization", author: "Marius Drechsler")
#show: doc => conf(
title: "Towards Efficient Helper Data Algorithms for Multi-Bit PUF Quantization",
author: "Marius Drechsler",
chair: "Chair for Security in Information Technology",
school: "School of Computation, Information and Technology",
degree: "Bachelor of Science (B.Sc.)",
examiner: "Prof. Dr. Georg Sigl",
supervisor: "M.Sc. Jonas Ruchti",
submitted: "22.07.2024",
doc
)
#include "content/introduction.typ"
#include "content/SMHD.typ"
#include "content/state.typ"
#include "content/implementation.typ"
#include "content/benchmarks.typ"
#include "content/conclusion.typ"
#include "content/outlook.typ"
#include "glossary.typ"
#counter(heading).update(0)
#bibliography("bibliography.bib", style: "mla")

3
template/colour.typ Normal file
View file

@ -0,0 +1,3 @@
#let tum_blue = rgb(0, 101, 189)
#let tum_white = rgb(255, 255, 255)
#let tum_black = rgb(0, 0, 0)

98
template/conf.typ Normal file
View file

@ -0,0 +1,98 @@
#import "cover.typ": cover_page
#import "title.typ": title_page
#import "contents.typ": contents_page
#let conf(
title: "",
author: "",
chair: "",
school: "",
degree: "",
examiner: "",
supervisor: "",
submitted: "",
doc
) = {
cover_page(
title: title,
author: author,
chair: chair,
school: school
)
pagebreak()
pagebreak()
title_page(
title: title,
author: author,
chair: chair,
school: school,
degree: degree,
examiner: examiner,
supervisor: supervisor,
submitted: submitted
)
pagebreak()
set math.equation(numbering: "(1)")
set page(
paper: "a4",
margin: (
top: 3cm,
bottom: 3cm,
x: 2cm,
),
header: [],
footer: []
)
set par(justify: true)
set align(left)
set text(
font: "Times New Roman",
size: 12pt,
)
set heading(numbering: "1.")
show heading: it => locate(loc => {
let levels = counter(heading).at(loc)
set text(font: "TUM Neue Helvetica")
if it.level == 1 [
#set text(size: 24pt)
#pagebreak()
#if levels.at(0) != 0 {
numbering("1", levels.at(0))
}
#it.body
#v(1em, weak: true)
] else if it.level == 2 [
#set text(size: 16pt)
#v(1em)
#numbering("1.1", levels.at(0), levels.at(1))
#it.body
#v(1em, weak: true)
] else if it.level == 3 [
#set text(size: 16pt)
#v(1em, weak: true)
#numbering("1.1.1", levels.at(0), levels.at(1), levels.at(2))
#it.body
#v(1em, weak: true)
] else [
#set text(size: 12pt)
#v(1em, weak: true)
#it.body
#v(1em, weak: true)
]
})
contents_page()
pagebreak()
doc
}

14
template/contents.typ Normal file
View file

@ -0,0 +1,14 @@
#import "colour.typ": *
#let contents_page() = {
set text(font: "TUM Neue Helvetica")
show outline.entry.where(
level: 1
): it => {
v(1em)
strong(it)
}
outline(indent: auto)
}

46
template/cover.typ Normal file
View file

@ -0,0 +1,46 @@
#import "colour.typ": *
#let cover_page(
title: "",
author: "",
chair: "",
school: ""
) = {
set text(
font: "TUM Neue Helvetica"
)
set page(
paper: "a4",
margin: (
top: 3cm,
bottom: 1cm,
x: 1cm,
),
header: [
#grid(
columns: (1fr, 1fr),
rows: (auto),
text(
fill: tum_blue,
size: 8pt,
[#chair \ #school \ Technical University of Munich]
),
align(bottom + right, image("resources/TUM_Logo_blau.svg", height: 50%))
)
],
footer: []
)
v(1cm)
set align(top + left)
text(size: 24pt, [*#title*])
v(3cm)
text(fill: tum_blue, size: 17pt, [*#author*])
set align(bottom + right)
image("resources/TUM_Tower.png", width: 60%)
}

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 430 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 399 KiB

View file

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg 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#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" version="1.1" id="Ebene_1" x="0px" y="0px" width="408.16" height="212.46684" viewBox="-16.014 -31 408.16 212.46684" enable-background="new -16.014 -31 149 114" xml:space="preserve" sodipodi:docname="TUM_Web_Logo_blau.svg" inkscape:version="1.0.1 (3bc2e813f5, 2020-09-07)"><metadata id="metadata13"><rdf:RDF><cc:Work rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/><dc:title>TUM_Web_Logo_blau</dc:title></cc:Work></rdf:RDF></metadata><defs id="defs11"/><sodipodi:namedview pagecolor="#ffffff" bordercolor="#666666" borderopacity="1" objecttolerance="10" gridtolerance="10" guidetolerance="10" inkscape:pageopacity="0" inkscape:pageshadow="2" inkscape:window-width="1920" inkscape:window-height="986" id="namedview9" showgrid="false" fit-margin-top="0" fit-margin-left="0" fit-margin-right="0" fit-margin-bottom="0" inkscape:zoom="1.754386" inkscape:cx="124.61021" inkscape:cy="115.2546" inkscape:window-x="-11" inkscape:window-y="-11" inkscape:window-maximized="1" inkscape:current-layer="Ebene_1"/>
<title id="title2">TUM_Web_Logo_blau</title>
<desc id="desc4">TUM</desc>
<path fill="#3070b3" d="m 140.54052,-31 v 173.32822 h 44.72985 V -31 H 392.146 V 181.46685 H 353.00738 V 8.138629 H 308.2775 V 181.46685 H 269.13887 V 8.138629 H 224.40902 V 181.46685 H 101.4019 V 8.138629 H 62.26327 V 181.46685 H 23.12462 V 8.138629 H -16.014 V -31 Z" id="path6" style="stroke-width:5.59123"/>
</svg>

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 240 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 92 KiB

64
template/title.typ Normal file
View file

@ -0,0 +1,64 @@
#import "colour.typ": *
#let title_page(
title: "",
author: "",
chair: "",
school: "",
degree: "",
examiner: "",
supervisor: "",
submitted: ""
) = {
set text(
font: "TUM Neue Helvetica",
size: 10pt
)
set page(
paper: "a4",
margin: (
top: 5cm,
bottom: 3cm,
x: 2cm,
),
header: [
#grid(
columns: (1fr, 1fr),
rows: (auto),
text(
fill: tum_blue,
size: 8pt,
[#chair \ #school \ Technical University of Munich]
),
align(bottom + right, image("resources/TUM_Logo_blau.svg", height: 30%))
)
],
footer: []
)
v(1cm)
set align(top + left)
text(size: 24pt, [*#title*])
v(3cm)
text(fill: tum_blue, size: 17pt, [*#author*])
v(3cm)
[Thesis for the attainment of the academic degree]
v(1em)
[*#degree*]
v(1em)
[at the #school of the Technical University of Munich.]
v(3cm)
[*Examiner:*\ #examiner]
v(0em)
[*Supervisor:*\ #supervisor]
v(0em)
[*Submitted:*\ Munich, #submitted]
}