summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPrefetch2023-01-01 16:40:56 +0100
committerPrefetch2023-01-01 17:02:29 +0100
commitb1a9b1b9b2f04efd6dc39bd2a02c544d34d1259c (patch)
tree1fd87919deee17e58f8ad19c09abd54bd4a70886
parent1d700ab734aa9b6711eb31796beb25cb7659d8e0 (diff)
Change license, add Makefile, add image caching control
-rw-r--r--Makefile28
-rw-r--r--source/_includes/footer.html4
-rw-r--r--source/_includes/image.html14
-rw-r--r--source/_includes/preamble.html2
-rw-r--r--source/blog/2022/email-server-revisited/index.md3
-rw-r--r--source/know/concept/bernstein-vazirani-algorithm/index.md3
-rw-r--r--source/know/concept/bloch-sphere/index.md3
-rw-r--r--source/know/concept/deutsch-jozsa-algorithm/index.md6
-rw-r--r--source/know/concept/dispersive-broadening/index.md3
-rw-r--r--source/know/concept/fabry-perot-cavity/index.md3
-rw-r--r--source/know/concept/feynman-diagram/index.md15
-rw-r--r--source/know/concept/metacentric-height/index.md3
-rw-r--r--source/know/concept/modulational-instability/index.md3
-rw-r--r--source/know/concept/optical-wave-breaking/index.md9
-rw-r--r--source/know/concept/quantum-fourier-transform/index.md6
-rw-r--r--source/know/concept/quantum-gate/index.md9
-rw-r--r--source/know/concept/random-phase-approximation/index.md12
-rw-r--r--source/know/concept/repetition-code/index.md15
-rw-r--r--source/know/concept/rutherford-scattering/index.md6
-rw-r--r--source/know/concept/self-energy/index.md9
-rw-r--r--source/know/concept/self-phase-modulation/index.md3
-rw-r--r--source/know/concept/self-steepening/index.md3
-rw-r--r--source/know/concept/shors-algorithm/index.md3
-rw-r--r--source/know/concept/simons-algorithm/index.md3
-rw-r--r--source/know/concept/step-index-fiber/index.md6
-rw-r--r--source/know/concept/toffoli-gate/index.md18
26 files changed, 136 insertions, 56 deletions
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..05af8fe
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,28 @@
+.PHONY: serve build compress deploy clean
+
+
+serve:
+ EXECJS_RUNTIME=MiniRacer bundle exec jekyll serve --livereload --incremental
+
+
+build:
+ EXECJS_RUNTIME=MiniRacer JEKYLL_ENV=production bundle exec jekyll build
+
+
+FINDARGS1 = -name "*.html" -o -name "*.xml" -o -name "*.css" -o -name "*.js"
+FINDARGS2 = -name "*.svg" -o -name "*.webmanifest" -o -name "*.ico" -o -name "*.txt"
+compress:
+ for f in `find public/ -type f $(FINDARGS1) -o $(FINDARGS2)`; do \
+ echo "Compressing $$f..." ; \
+ gzip --keep --force -9 $$f ; \
+ brotli --keep --force -Z $$f ; \
+ done
+
+
+deploy:
+ rsync --rsh="ssh -p $(PORT)" --stats --checksum --recursive public/ $(HOST):/srv/prefetch.eu/public/
+
+
+clean:
+ rm -rf public/*
+ rm -rf source/.jekyll-cache/*
diff --git a/source/_includes/footer.html b/source/_includes/footer.html
index d91d3d5..b3679e8 100644
--- a/source/_includes/footer.html
+++ b/source/_includes/footer.html
@@ -1,7 +1,7 @@
<hr>
<div class="footl noha">
-&copy; Marcus R.A. Newman,
-<a href="https://creativecommons.org/licenses/by-sa/4.0/">CC BY-SA 4.0</a>.
+&copy; 2023 Marcus R.A. Newman,
+<a href="https://creativecommons.org/licenses/by-nc-sa/4.0/">CC BY-NC-SA 4.0</a>.
</div>
<div class="footr noha">
<a href="https://prefetch.goatcounter.com/">Visitor statistics</a>
diff --git a/source/_includes/image.html b/source/_includes/image.html
index 5b4f35f..df13976 100644
--- a/source/_includes/image.html
+++ b/source/_includes/image.html
@@ -2,6 +2,8 @@
{% assign name = name_dot_format | first %}
{% assign format = name_dot_format | last %}
+{% assign version = include.version | default: "1" %}
+
{% comment %} Let 'suffix' = last 4 chars of 'name', 'prefix' = the rest {% endcomment %}
{% assign suffix = name | slice: -4, 4 %}
{% assign rname = name | split: "" | reverse | join: "" %}
@@ -27,14 +29,16 @@
{% assign add_style = 'style="' | append: set_style | append: '"' %}
{% endif %}
<p>
-<a href="{{ name_full }}.{{ format }}">
+<a href="{{ name_full }}.{{ format }}?v={{ version }}">
<picture>
- <source srcset="{{ name_half }}.avif" type="image/avif">
+ <source srcset="{{ name_half }}.avif?v={{ version }}" type="image/avif">
{% if name_full == name_half %}
- <img src="{{ name_half }}.{{ format }}" {{ add_class }} {{ add_style }} alt="{{ include.alt }}" title="{{ include.alt }}">
+ <img src="{{ name_half }}.{{ format }}?v={{ version }}" {{ add_class }} {{ add_style }}
+ alt="{{ include.alt }}" title="{{ include.alt }}">
{% else %}
- <source srcset="{{ name_half }}.webp" type="image/webp">
- <img src="{{ name_half }}.jpg" {{ add_class }} {{ add_style }} alt="{{ include.alt }}" title="{{ include.alt }}">
+ <source srcset="{{ name_half }}.webp?v={{ version }}" type="image/webp">
+ <img src="{{ name_half }}.jpg?v={{ version }}" {{ add_class }} {{ add_style }}
+ alt="{{ include.alt }}" title="{{ include.alt }}">
{% endif %}
</picture>
</a>
diff --git a/source/_includes/preamble.html b/source/_includes/preamble.html
index 7b57115..4d3c92f 100644
--- a/source/_includes/preamble.html
+++ b/source/_includes/preamble.html
@@ -19,6 +19,6 @@
{% endif %}
<link rel="stylesheet" href="/infra/css/main.css?v=20221119">
-{% if jekyll.environment != "development" %}
+{% if jekyll.environment == "production" %}
<script data-goatcounter="https://prefetch.goatcounter.com/count" async src="/infra/js/count.js?v=20221103"></script>
{% endif %}
diff --git a/source/blog/2022/email-server-revisited/index.md b/source/blog/2022/email-server-revisited/index.md
index eb3fc18..20eff24 100644
--- a/source/blog/2022/email-server-revisited/index.md
+++ b/source/blog/2022/email-server-revisited/index.md
@@ -181,7 +181,8 @@ One day, I tried to send an email to an Outlook-based account,
and OpenSMTPD reported it had been unable to make the delivery,
because Microsoft had thrown an error:
-{% include image.html file="microsoft-bounce.png" width="100%" class="darkinv" alt="Bounce message due to error from Microsoft" %}
+{% include image.html file="microsoft-bounce.png" width="100%" class="darkinv"
+ alt="Bounce message due to error from Microsoft" %}
To their credit, they seem to be offering a way out.
This approach is reasonable: preventively ban high-risk IP ranges,
diff --git a/source/know/concept/bernstein-vazirani-algorithm/index.md b/source/know/concept/bernstein-vazirani-algorithm/index.md
index 85017dc..5f224dc 100644
--- a/source/know/concept/bernstein-vazirani-algorithm/index.md
+++ b/source/know/concept/bernstein-vazirani-algorithm/index.md
@@ -36,7 +36,8 @@ However, the Bernstein-Vazirani algorithm
allows a quantum computer to do it with only a single query.
It uses the following circuit:
-{% include image.html file="bernstein-vazirani-circuit.png" width="52%" alt="Bernstein-Vazirani circuit" %}
+{% include image.html file="bernstein-vazirani-circuit.png" width="52%"
+ alt="Bernstein-Vazirani circuit" %}
Where $$U_f$$ is a phase oracle,
whose action is defined as follows,
diff --git a/source/know/concept/bloch-sphere/index.md b/source/know/concept/bloch-sphere/index.md
index 0ca6f1b..99ac45d 100644
--- a/source/know/concept/bloch-sphere/index.md
+++ b/source/know/concept/bloch-sphere/index.md
@@ -13,7 +13,8 @@ In quantum mechanics, particularly quantum information,
the **Bloch sphere** is an invaluable tool to visualize qubits.
All pure qubit states are represented by a point on the sphere's surface:
-{% include image.html file="sketch-full.png" width="67%" alt="Bloch sphere" %}
+{% include image.html file="sketch-full.png" width="67%"
+ alt="Bloch sphere" %}
The $$x$$, $$y$$ and $$z$$-axes represent the components of a spin-1/2-alike system,
and their extremes are the eigenstates of the Pauli matrices:
diff --git a/source/know/concept/deutsch-jozsa-algorithm/index.md b/source/know/concept/deutsch-jozsa-algorithm/index.md
index 5f2f268..44b06ad 100644
--- a/source/know/concept/deutsch-jozsa-algorithm/index.md
+++ b/source/know/concept/deutsch-jozsa-algorithm/index.md
@@ -41,7 +41,8 @@ In other words, we only need to determine if $$f(0) = f(1)$$ or $$f(0) \neq f(1)
To do this, we use the following quantum circuit,
where $$U_f$$ is the oracle we query:
-{% include image.html file="deutsch-circuit.png" width="48%" alt="Deutsch circuit" %}
+{% include image.html file="deutsch-circuit.png" width="48%"
+ alt="Deutsch circuit" %}
Due to unitarity constraints,
the action of $$U_f$$ is defined to be as follows,
@@ -141,7 +142,8 @@ We are promised that $$f(x)$$ is either constant or balanced;
other possibilities are assumed to be impossible.
This algorithm is then implemented by the following quantum circuit:
-{% include image.html file="deutsch-jozsa-circuit.png" width="52%" alt="Deutsch-Jozsa circuit" %}
+{% include image.html file="deutsch-jozsa-circuit.png" width="52%"
+ alt="Deutsch-Jozsa circuit" %}
There are $$N$$ qubits in initial state $$\Ket{0}$$, and one in $$\Ket{1}$$.
For clarity, the oracle $$U_f$$ works like so:
diff --git a/source/know/concept/dispersive-broadening/index.md b/source/know/concept/dispersive-broadening/index.md
index 9642737..55a31e6 100644
--- a/source/know/concept/dispersive-broadening/index.md
+++ b/source/know/concept/dispersive-broadening/index.md
@@ -62,7 +62,8 @@ This phenomenon is illustrated below for our example of a Gaussian pulse
with parameter values $$T_0 = 1\:\mathrm{ps}$$, $$P_0 = 1\:\mathrm{kW}$$,
$$\beta_2 = -10 \:\mathrm{ps}^2/\mathrm{m}$$ and $$\gamma = 0$$:
-{% include image.html file="simulation-full.png" width="100%" alt="Dispersive broadening simulation results" %}
+{% include image.html file="simulation-full.png" width="100%"
+ alt="Dispersive broadening simulation results" %}
The **instantaneous frequency** $$\omega_\mathrm{GVD}(z, t)$$,
which describes the dominant angular frequency at a given point in the time domain,
diff --git a/source/know/concept/fabry-perot-cavity/index.md b/source/know/concept/fabry-perot-cavity/index.md
index c013f1d..c88e62d 100644
--- a/source/know/concept/fabry-perot-cavity/index.md
+++ b/source/know/concept/fabry-perot-cavity/index.md
@@ -19,7 +19,8 @@ We divide the $$x$$-axis into three domains: left $$L$$, center $$C$$, and right
The cavity $$C$$ has length $$\ell$$ and is centered on $$x = 0$$.
Let $$n_L$$, $$n_C$$ and $$n_R$$ be the respective domains' refractive indices:
-{% include image.html file="sketch-full.png" width="70%" alt="Cavity structure" %}
+{% include image.html file="sketch-full.png" width="70%"
+ alt="Cavity structure" %}
diff --git a/source/know/concept/feynman-diagram/index.md b/source/know/concept/feynman-diagram/index.md
index ace8dbc..1f1c957 100644
--- a/source/know/concept/feynman-diagram/index.md
+++ b/source/know/concept/feynman-diagram/index.md
@@ -38,7 +38,8 @@ Let the subscript $$I$$ refer to the
and $$\mathcal{T}\{\}$$ denote the
[time-ordered product](/know/concept/time-ordered-product/):
-{% include image.html file="fermion-light.png" width="60%" alt="Fermion line diagram" %}
+{% include image.html file="fermion-light.png" width="60%"
+ alt="Fermion line diagram" %}
$$\begin{aligned}
= i \hbar G_{s_2 s_1}^0(\vb{r}_2, t_2; \vb{r}_1, t_1)
@@ -58,7 +59,8 @@ Less common is a **heavy fermion line**, representing
a causal Green's function $$G$$ for the entire Hamiltonian $$\hat{H}$$,
where the subscript $$H$$ refers to the [Heisenberg picture](/know/concept/heisenberg-picture/):
-{% include image.html file="fermion-heavy.png" width="60%" alt="Heavy fermion line diagram" %}
+{% include image.html file="fermion-heavy.png" width="60%"
+ alt="Heavy fermion line diagram" %}
$$\begin{aligned}
= i \hbar G_{s_2 s_1}(\vb{r}_2, t_2; \vb{r}_1, t_1)
@@ -72,7 +74,8 @@ which we assume to be instantaneous, i.e. time-independent
hence it starts and ends at the same time,
and no arrow is drawn:
-{% include image.html file="boson.png" width="60%" alt="Boson/interaction line diagram" %}
+{% include image.html file="boson.png" width="60%"
+ alt="Boson/interaction line diagram" %}
$$\begin{aligned}
= \frac{1}{i \hbar} W_{s_2 s_1}(\vb{r}_2, t_2; \vb{r}_1, t_1)
@@ -94,7 +97,8 @@ $$\begin{aligned}
One-body (time-dependent) operators $$\hat{V}$$ in $$\hat{H}_1$$
are instead represented by a special vertex:
-{% include image.html file="impurity.png" width="35%" alt="One-body perturbation (e.g. impurity) diagram" %}
+{% include image.html file="impurity.png" width="35%"
+ alt="One-body perturbation (e.g. impurity) diagram" %}
$$\begin{aligned}
= \frac{1}{i \hbar} V_s(\vb{r}, t)
@@ -171,7 +175,8 @@ Working in Fourier space allows us to simplify calculations.
Consider the following diagram and the resulting expression,
where $$\tilde{\vb{r}} = (\vb{r}, t)$$, and $$\tilde{\vb{k}} = (\vb{k}, \omega)$$:
-{% include image.html file="example.png" width="40%" alt="Example: fermion-fermion interaction" %}
+{% include image.html file="example.png" width="40%"
+ alt="Example: fermion-fermion interaction" %}
$$\begin{aligned}
&= (i \hbar)^3 \sum_{s s'} \!\!\iint \dd{\tilde{\vb{r}}} \dd{\tilde{\vb{r}}'}
diff --git a/source/know/concept/metacentric-height/index.md b/source/know/concept/metacentric-height/index.md
index 3d81d44..97afff6 100644
--- a/source/know/concept/metacentric-height/index.md
+++ b/source/know/concept/metacentric-height/index.md
@@ -26,7 +26,8 @@ does not coincide with the origin in general,
as is illustrated in the following sketch
of our choice of coordinate system:
-{% include image.html file="sketch-full.png" width="75%" alt="Boat's coordinate system" %}
+{% include image.html file="sketch-full.png" width="75%"
+ alt="Boat's coordinate system" %}
Here, $$B$$ is the **center of buoyancy**, equal to
the center of mass of the volume of water displaced by the boat
diff --git a/source/know/concept/modulational-instability/index.md b/source/know/concept/modulational-instability/index.md
index f1c246c..d646503 100644
--- a/source/know/concept/modulational-instability/index.md
+++ b/source/know/concept/modulational-instability/index.md
@@ -185,7 +185,8 @@ $$\begin{aligned}
= \sqrt{P_0} \sech\!\Big(\frac{t}{T_0}\Big)
\end{aligned}$$
-{% include image.html file="simulation-full.png" width="100%" alt="Modulational instability simulation results" %}
+{% include image.html file="simulation-full.png" width="100%"
+ alt="Modulational instability simulation results" %}
Where $$L_\mathrm{NL} = 1/(\gamma P_0)$$ is the characteristic length of nonlinear effects.
Note that no noise was added to the simulation;
diff --git a/source/know/concept/optical-wave-breaking/index.md b/source/know/concept/optical-wave-breaking/index.md
index 3509bc2..1b6b558 100644
--- a/source/know/concept/optical-wave-breaking/index.md
+++ b/source/know/concept/optical-wave-breaking/index.md
@@ -34,7 +34,8 @@ Shortly before the slope would become infinite,
small waves start "falling off" the edge of the pulse,
hence the name *wave breaking*:
-{% include image.html file="frequency-full.png" width="100%" alt="Instantaneous frequency profile evolution" %}
+{% include image.html file="frequency-full.png" width="100%"
+ alt="Instantaneous frequency profile evolution" %}
Several interesting things happen around this moment.
To demonstrate this, spectrograms of the same simulation
@@ -51,7 +52,8 @@ After OWB, a train of small waves falls off the edges,
which eventually melt together, leading to a trapezoid shape in the $$t$$-domain.
Dispersive broadening then continues normally:
-{% include image.html file="spectrograms-full.png" width="100%" alt="Spectrograms of pulse shape evolution" %}
+{% include image.html file="spectrograms-full.png" width="100%"
+ alt="Spectrograms of pulse shape evolution" %}
We call the distance at which the wave breaks $$L_\mathrm{WB}$$,
and want to predict it analytically.
@@ -189,7 +191,8 @@ $$\begin{aligned}
This prediction for $$L_\mathrm{WB}$$ appears to agree well
with the OWB observed in the simulation:
-{% include image.html file="simulation-full.png" width="100%" alt="Optical wave breaking simulation results" %}
+{% include image.html file="simulation-full.png" width="100%"
+ alt="Optical wave breaking simulation results" %}
Because all spectral broadening up to $$L_\mathrm{WB}$$ is caused by SPM,
whose $$\omega$$-domain behaviour is known,
diff --git a/source/know/concept/quantum-fourier-transform/index.md b/source/know/concept/quantum-fourier-transform/index.md
index 1c68ad0..217596b 100644
--- a/source/know/concept/quantum-fourier-transform/index.md
+++ b/source/know/concept/quantum-fourier-transform/index.md
@@ -172,13 +172,15 @@ The quantum circuit to execute the mentioned steps is illustrated below,
excluding the swapping part to get the right order.
Here, $$R_m$$ means $$R_\phi$$ with $$\phi = 2 \pi / 2^m$$:
-{% include image.html file="qft-circuit-noswap.png" width="100%" alt="QFT circuit, without final swap" %}
+{% include image.html file="qft-circuit-noswap.png" width="100%"
+ alt="QFT circuit, without final swap" %}
Again, note how the inputs $$\Ket{x_j}$$ and outputs $$\Ket{k_j}$$ are in the opposite order.
The complete circuit, including the swapping at the end,
therefore looks like this:
-{% include image.html file="qft-circuit-swap.png" width="85%" alt="QFT circuit, including final swap" %}
+{% include image.html file="qft-circuit-swap.png" width="85%"
+ alt="QFT circuit, including final swap" %}
For each of the $$n$$ qubits, $$\mathcal{O}(n)$$ gates are applied,
so overall the QFT algorithm is $$\mathcal{O}(n^2)$$.
diff --git a/source/know/concept/quantum-gate/index.md b/source/know/concept/quantum-gate/index.md
index e8ff579..9704e53 100644
--- a/source/know/concept/quantum-gate/index.md
+++ b/source/know/concept/quantum-gate/index.md
@@ -204,7 +204,8 @@ but not always in the basis of $$\Ket{0}_1$$, $$\Ket{1}_1$$, $$\Ket{0}_2$$ and $
With that said, the first two-qubit gate is $$\mathrm{SWAP}$$,
which simply swaps $$\Ket{\psi_1}$$ and $$\Ket{\psi_2}$$:
-{% include image.html file="swap.png" width="22%" alt="SWAP gate diagram" %}
+{% include image.html file="swap.png" width="22%"
+ alt="SWAP gate diagram" %}
$$\begin{aligned}
\boxed{
@@ -231,7 +232,8 @@ $$\begin{aligned}
Next, there is the **controlled NOT gate** $$\mathrm{CNOT}$$,
which "flips" (applies $$X$$ to) $$\Ket{\psi_2}$$ if $$\Ket{\psi_1}$$ is true:
-{% include image.html file="cnot.png" width="22%" alt="CNOT gate diagram" %}
+{% include image.html file="cnot.png" width="22%"
+ alt="CNOT gate diagram" %}
$$\begin{aligned}
\boxed{
@@ -256,7 +258,8 @@ More generally, from every one-qubit gate $$U$$,
we can define a two-qubit **controlled U gate** $$\mathrm{CU}$$,
which applies $$U$$ to $$\Ket{\psi_2}$$ if $$\Ket{\psi_1}$$ is true:
-{% include image.html file="cu.png" width="22%" alt="CU gate diagram" %}
+{% include image.html file="cu.png" width="22%"
+ alt="CU gate diagram" %}
$$\begin{aligned}
\boxed{
diff --git a/source/know/concept/random-phase-approximation/index.md b/source/know/concept/random-phase-approximation/index.md
index 0d0b428..03fd302 100644
--- a/source/know/concept/random-phase-approximation/index.md
+++ b/source/know/concept/random-phase-approximation/index.md
@@ -71,17 +71,20 @@ leaving only the single most divergent one at each order $$n$$,
i.e. the ones where all $$n$$ interaction lines
carry the same momentum and energy:
-{% include image.html file="self-energy.png" width="92%" alt="RPA self-energy definition" %}
+{% include image.html file="self-energy.png" width="92%"
+ alt="RPA self-energy definition" %}
Where we have defined the **screened interaction** $$W^\mathrm{RPA}$$,
denoted by a double wavy line:
-{% include image.html file="interaction.png" width="95%" alt="RPA screened interaction definition" %}
+{% include image.html file="interaction.png" width="95%"
+ alt="RPA screened interaction definition" %}
Rearranging the above sequence of diagrams quickly leads to the following
[Dyson equation](/know/concept/dyson-equation/):
-{% include image.html file="dyson.png" width="55%" alt="Dyson equation for screened interaction" %}
+{% include image.html file="dyson.png" width="55%"
+ alt="Dyson equation for screened interaction" %}
In Fourier space, this equation's linear shape
means it is algebraic, so we can write it out:
@@ -98,7 +101,8 @@ with an internal wavevector $$\vb{q}$$, fermionic frequency $$i \omega_m^F$$, an
Abbreviating $$\tilde{\vb{k}} \equiv (\vb{k}, i \omega_n^B)$$
and $$\tilde{\vb{q}} \equiv (\vb{q}, i \omega_n^F)$$:
-{% include image.html file="pairbubble.png" width="45%" alt="Internal variables of pair-bubble diagram" %}
+{% include image.html file="pairbubble.png" width="45%"
+ alt="Internal variables of pair-bubble diagram" %}
We isolate the Dyson equation for $$W^\mathrm{RPA}$$,
which reveals its physical interpretation as a *screened* interaction:
diff --git a/source/know/concept/repetition-code/index.md b/source/know/concept/repetition-code/index.md
index 89e6f4d..fa039a3 100644
--- a/source/know/concept/repetition-code/index.md
+++ b/source/know/concept/repetition-code/index.md
@@ -77,7 +77,8 @@ $$\begin{aligned}
Such a transformation is easy to achieve with the following sequence
of [quantum gates](/know/concept/quantum-gate/):
-{% include image.html file="bit-flip-encode.png" width="32%" alt="Bit flip code encoder" %}
+{% include image.html file="bit-flip-encode.png" width="32%"
+ alt="Bit flip code encoder" %}
So, a little while after encoding the state $$\Ket{\psi}$$ like that,
a bit flip occurs on the 2nd qubit:
@@ -180,7 +181,8 @@ without affecting $$\ket{\overline{\psi}}$$ itself,
by applying $$\mathrm{CNOT}$$s to some ancillary qubits
and then measuring those:
-{% include image.html file="bit-flip-detect.png" width="62%" alt="Bit flip code decoder" %}
+{% include image.html file="bit-flip-detect.png" width="62%"
+ alt="Bit flip code decoder" %}
The two measurements, respectively representing $$ZZI$$ and $$IZZ$$,
yield $$\Ket{1}$$ if a bit flip definitely occurred,
@@ -231,14 +233,16 @@ $$\begin{aligned}
= \alpha \Ket{+\!+\!+} + \beta \Ket{-\!-\!-}
\end{aligned}$$
-{% include image.html file="phase-flip-encode.png" width="40%" alt="Phase flip code encoder" %}
+{% include image.html file="phase-flip-encode.png" width="40%"
+ alt="Phase flip code encoder" %}
A phase flip along the $$Z$$-axis
corresponds to a bit flip along the $$X$$-axis $$\Ket{+} \to \Ket{-}$$.
In this case, the stabilizers are $$XXI$$ and $$IXX$$,
and the error detection circuit is as follows:
-{% include image.html file="phase-flip-detect.png" width="70%" alt="Phase flip code decoder" %}
+{% include image.html file="phase-flip-detect.png" width="70%"
+ alt="Phase flip code decoder" %}
This system protects us against all single-qubit phase flips,
but not against bit flips.
@@ -281,7 +285,8 @@ This encoding is achieved by the following quantum circuit,
which simply consists of the phase flip encoder,
followed by 3 copies of the bit flip encoder:
-{% include image.html file="shor-code-encode.png" width="55%" alt="Shor code encoder" %}
+{% include image.html file="shor-code-encode.png" width="55%"
+ alt="Shor code encoder" %}
We thus use 9 physical qubits to store 1 logical qubit.
Fortunately, more efficient schemes exist.
diff --git a/source/know/concept/rutherford-scattering/index.md b/source/know/concept/rutherford-scattering/index.md
index 6f5a21f..edf391c 100644
--- a/source/know/concept/rutherford-scattering/index.md
+++ b/source/know/concept/rutherford-scattering/index.md
@@ -19,7 +19,8 @@ Let 2 be initially at rest, and 1 approach it with velocity $$\vb{v}_1$$.
Coulomb repulsion causes 1 to deflect by an angle $$\theta$$,
and pushes 2 away in the process:
-{% include image.html file="two-body-full.png" width="50%" alt="Two-body repulsive 'collision'" %}
+{% include image.html file="two-body-full.png" width="50%"
+ alt="Two-body repulsive 'collision'" %}
Here, $$b$$ is called the **impact parameter**.
Intuitively, we expect $$\theta$$ to be larger for smaller $$b$$.
@@ -67,7 +68,8 @@ then by comparing $$t > 0$$ and $$t < 0$$
we can see that $$v_x$$ is unchanged for any given $$\pm t$$,
while $$v_y$$ simply changes sign:
-{% include image.html file="one-body-full.png" width="60%" alt="Equivalent one-body deflection" %}
+{% include image.html file="one-body-full.png" width="60%"
+ alt="Equivalent one-body deflection" %}
From our expression for $$\vb{r}$$,
we can find $$\vb{v}$$ by differentiating with respect to time:
diff --git a/source/know/concept/self-energy/index.md b/source/know/concept/self-energy/index.md
index f233466..4120011 100644
--- a/source/know/concept/self-energy/index.md
+++ b/source/know/concept/self-energy/index.md
@@ -204,7 +204,8 @@ that exactly $$2^m m!$$ diagrams at each order are topologically equivalent,
so we are left with non-equivalent diagrams only.
Let $$G(b,a) = G_{ba}$$:
-{% include image.html file="expansion.png" width="90%" alt="Full expansion of G in Feynman diagrams" %}
+{% include image.html file="expansion.png" width="90%"
+ alt="Full expansion of G in Feynman diagrams" %}
A **reducible diagram** is a Feynman diagram
that can be cut in two valid diagrams
@@ -215,7 +216,8 @@ At last, we define the **self-energy** $$\Sigma(y,x)$$
as the sum of all irreducible terms in $$G(b,a)$$,
after removing the two external lines from/to $$a$$ and $$b$$:
-{% include image.html file="definition.png" width="90%" alt="Definition of self-energy" %}
+{% include image.html file="definition.png" width="90%"
+ alt="Definition of the self-energy" %}
Despite its appearance, the self-energy has the semantics of a line,
so it has two endpoints over which to integrate if necessary.
@@ -234,7 +236,8 @@ Thanks to this recursive structure,
you can convince youself that $$G(b,a)$$ obeys
a [Dyson equation](/know/concept/dyson-equation/) involving $$\Sigma(y, x)$$:
-{% include image.html file="dyson.png" width="95%" alt="Dyson equation in Feynman diagrams" %}
+{% include image.html file="dyson.png" width="95%"
+ alt="Dyson equation in Feynman diagrams" %}
This makes sense: in the "normal" Dyson equation
we have a one-body perturbation instead of $$\Sigma$$,
diff --git a/source/know/concept/self-phase-modulation/index.md b/source/know/concept/self-phase-modulation/index.md
index 931e10b..bc5a103 100644
--- a/source/know/concept/self-phase-modulation/index.md
+++ b/source/know/concept/self-phase-modulation/index.md
@@ -69,7 +69,8 @@ $$\begin{aligned}
A(z, t) = \sqrt{P_0} \exp\!\Big(\!-\!\frac{t^2}{2 T_0^2}\Big) \exp\!\bigg( i \gamma z P_0 \exp\!\Big(\!-\!\frac{t^2}{T_0^2}\Big) \bigg)
\end{aligned}$$
-{% include image.html file="simulation-full.png" width="100%" alt="Self-phase modulation simulation results" %}
+{% include image.html file="simulation-full.png" width="100%"
+ alt="Self-phase modulation simulation results" %}
The **instantaneous frequency** $$\omega_\mathrm{SPM}(z, t)$$,
which describes the dominant angular frequency at a given point in the time domain,
diff --git a/source/know/concept/self-steepening/index.md b/source/know/concept/self-steepening/index.md
index fd48e0f..f96c020 100644
--- a/source/know/concept/self-steepening/index.md
+++ b/source/know/concept/self-steepening/index.md
@@ -126,7 +126,8 @@ $$L_\mathrm{shock} = 0.847\,\mathrm{m}$$,
which turns out to be accurate,
although the simulation breaks down due to insufficient resolution:
-{% include image.html file="simulation-full.png" width="100%" alt="Self-steepening simulation results" %}
+{% include image.html file="simulation-full.png" width="100%"
+ alt="Self-steepening simulation results" %}
Unfortunately, self-steepening cannot be simulated perfectly: as the
pulse approaches $$L_\mathrm{shock}$$, its spectrum broadens to infinite
diff --git a/source/know/concept/shors-algorithm/index.md b/source/know/concept/shors-algorithm/index.md
index 5ae5077..678d5d2 100644
--- a/source/know/concept/shors-algorithm/index.md
+++ b/source/know/concept/shors-algorithm/index.md
@@ -48,7 +48,8 @@ The period $$s$$ is the smallest integer satisfying $$f(x) = f(x+s)$$.
To do this, the following $$2q$$-qubit quantum circuit is used,
with $$q$$ chosen so that $$N^2 \le 2^q < 2 N^2$$:
-{% include image.html file="shors-circuit.png" width="70%" alt="Shor's circuit" %}
+{% include image.html file="shors-circuit.png" width="70%"
+ alt="Shor's circuit" %}
Here, $$\mathrm{QFT}_q$$ refers to the $$q$$-qubit
[quantum Fourier transform](/know/concept/quantum-fourier-transform/),
diff --git a/source/know/concept/simons-algorithm/index.md b/source/know/concept/simons-algorithm/index.md
index 294912b..63bb808 100644
--- a/source/know/concept/simons-algorithm/index.md
+++ b/source/know/concept/simons-algorithm/index.md
@@ -52,7 +52,8 @@ A quantum computer needs to query $$f$$ only $$\mathcal{O}(n)$$ times,
although the exact number varies due to the algorithm's probabilistic nature.
It uses the following circuit:
-{% include image.html file="simons-circuit.png" width="52%" alt="Simon's circuit" %}
+{% include image.html file="simons-circuit.png" width="52%"
+ alt="Simon's circuit" %}
The XOR oracle $$U_f$$ implements $$f$$,
and has the following action for $$n$$-bit $$a$$ and $$b$$:
diff --git a/source/know/concept/step-index-fiber/index.md b/source/know/concept/step-index-fiber/index.md
index 210a339..2d049a1 100644
--- a/source/know/concept/step-index-fiber/index.md
+++ b/source/know/concept/step-index-fiber/index.md
@@ -269,7 +269,8 @@ $$\begin{aligned}
\end{cases}
\end{aligned}$$
-{% include image.html file="bessel-full.png" width="100%" alt="First few solutions to Bessel's equation" %}
+{% include image.html file="bessel-full.png" width="100%"
+ alt="First few solutions to Bessel's equation" %}
Looking at these solutions with our constraints for $$R_o$$ in mind,
we see that for $$\mu > 0$$ none of the solutions decay
@@ -429,7 +430,8 @@ An example graphical solution of the transcendental equation
is illustrated below for a fiber with $$V = 5$$,
where red and blue respectively denote the left and right-hand side:
-{% include image.html file="transcendental-full.png" width="100%" alt="Graphical solution of transcendental equation" %}
+{% include image.html file="transcendental-full.png" version="2" width="100%"
+ alt="Graphical solution of transcendental equation" %}
For the ground state the light is well-confined in the core,
but for higher modes it increasingly leaks into the cladding,
diff --git a/source/know/concept/toffoli-gate/index.md b/source/know/concept/toffoli-gate/index.md
index 9a99e69..23dc81e 100644
--- a/