Added images for blog, refactored code
authorNeil Smith <neil.git@njae.me.uk>
Sat, 24 Mar 2018 22:35:43 +0000 (22:35 +0000)
committerNeil Smith <neil.git@njae.me.uk>
Sat, 24 Mar 2018 22:35:43 +0000 (22:35 +0000)
24 files changed:
.directory [deleted file]
.gitignore
blog-images/360px-Cipher_device.JPG [new file with mode: 0644]
blog-images/3d-axes-cosine.svg [new file with mode: 0644]
blog-images/3d-axes-old.svg [new file with mode: 0644]
blog-images/3d-axes.png [new file with mode: 0644]
blog-images/3d-axes.svg [new file with mode: 0644]
blog-images/582px-Wien-Parlament-Julius_Ceasar.jpg [new file with mode: 0644]
blog-images/Monkey-typing.jpg [new file with mode: 0644]
blog-images/caesar_break_parameter_trials.png [new file with mode: 0644]
blog-images/chuttersnap-233105-unsplash.jpg [new file with mode: 0644]
blog-images/letter-treemap.png [new file with mode: 0644]
blog-images/manhattan-grid.png [new file with mode: 0644]
blog-images/manhattan-grid.svg [new file with mode: 0644]
blog-images/photo-1493953659556-556b14bdaca8.jpeg [new file with mode: 0644]
blog-images/tim-evans-88330-unsplash.jpg [new file with mode: 0644]
blog-images/ubtgram-relative-counts.png [new file with mode: 0644]
caesar_break_parameter_trials.csv
caesar_break_parameter_trials.ipynb [new file with mode: 0644]
caesar_break_parameter_trials.py [new file with mode: 0644]
find_best_caesar_break_parameters.py [deleted file]
letter-treemap.png [deleted file]
show-ngram-counts.ipynb [new file with mode: 0644]
support/norms.py

diff --git a/.directory b/.directory
deleted file mode 100644 (file)
index ac9bba3..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-[Dolphin]
-Timestamp=2018,3,6,14,19,0
-Version=4
-ViewMode=1
index 9f5e76992b2006ff53ba21a6525b3171e719139f..1e960071cc5059dd65191383b0276d8b1e74874a 100644 (file)
@@ -6,3 +6,4 @@
 *pyc
 .ipynb*
 *.sublime-workspace
+.directory/*
\ No newline at end of file
diff --git a/blog-images/360px-Cipher_device.JPG b/blog-images/360px-Cipher_device.JPG
new file mode 100644 (file)
index 0000000..63a29ad
Binary files /dev/null and b/blog-images/360px-Cipher_device.JPG differ
diff --git a/blog-images/3d-axes-cosine.svg b/blog-images/3d-axes-cosine.svg
new file mode 100644 (file)
index 0000000..55da400
--- /dev/null
@@ -0,0 +1,394 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<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"
+   width="127mm"
+   height="126mm"
+   viewBox="0 0 127 126"
+   version="1.1"
+   id="svg8"
+   inkscape:version="0.92.2 (5c3e80d, 2017-08-06)"
+   sodipodi:docname="3d-axes-cosine.svg">
+  <defs
+     id="defs2">
+    <marker
+       inkscape:isstock="true"
+       style="overflow:visible"
+       id="marker965"
+       refX="0"
+       refY="0"
+       orient="auto"
+       inkscape:stockid="Arrow1Lend">
+      <path
+         inkscape:connector-curvature="0"
+         transform="matrix(-0.8,0,0,-0.8,-10,0)"
+         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
+         d="M 0,0 5,-5 -12.5,0 5,5 Z"
+         id="path963" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="marker5206"
+       style="overflow:visible"
+       inkscape:isstock="true">
+      <path
+         id="path5204"
+         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:isstock="true"
+       style="overflow:visible"
+       id="marker5158"
+       refX="0"
+       refY="0"
+       orient="auto"
+       inkscape:stockid="Arrow2Mend"
+       inkscape:collect="always">
+      <path
+         transform="scale(-0.6)"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
+         id="path5156"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Mend"
+       style="overflow:visible"
+       inkscape:isstock="true"
+       inkscape:collect="always">
+      <path
+         id="path4552"
+         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="-431.42493 : 3.6909255e-14 : 0"
+       inkscape:vp_y="0 : 2640.3206 : 0"
+       inkscape:vp_z="379.95884 : 153.2481 : 0"
+       inkscape:persp3d-origin="517.35035 : 293.80927 : 1"
+       id="perspective5090" />
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Lend"
+       style="overflow:visible"
+       inkscape:isstock="true">
+      <path
+         id="path4546"
+         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow1Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Lend"
+       style="overflow:visible"
+       inkscape:isstock="true"
+       inkscape:collect="always">
+      <path
+         id="path4528"
+         d="M 0,0 5,-5 -12.5,0 5,5 Z"
+         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
+         transform="matrix(-0.8,0,0,-0.8,-10,0)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="-114.14784 : 9.7655741e-15 : 0"
+       inkscape:vp_y="0 : 698.58485 : 0"
+       inkscape:vp_z="100.53077 : 40.546894 : 0"
+       inkscape:persp3d-origin="65.731879 : -11.131238 : 1"
+       id="perspective10" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="-30.201616 : 2.5838081e-15 : 0"
+       inkscape:vp_y="0 : 184.83391 : 0"
+       inkscape:vp_z="26.598766 : 10.728032 : 0"
+       inkscape:persp3d-origin="58.49679 : 96.761382 : 1"
+       id="perspective10-7" />
+    <marker
+       inkscape:stockid="Arrow1Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Lend-5"
+       style="overflow:visible"
+       inkscape:isstock="true">
+      <path
+         id="path4528-1"
+         d="M 0,0 5,-5 -12.5,0 5,5 Z"
+         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
+         transform="matrix(-0.8,0,0,-0.8,-10,0)"
+         inkscape:connector-curvature="0" />
+    </marker>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="0.62138672"
+     inkscape:cx="-208.0166"
+     inkscape:cy="-20.35886"
+     inkscape:document-units="mm"
+     inkscape:current-layer="g5437"
+     showgrid="false"
+     showguides="false"
+     inkscape:window-width="1920"
+     inkscape:window-height="1137"
+     inkscape:window-x="1200"
+     inkscape:window-y="0"
+     inkscape:window-maximized="1" />
+  <metadata
+     id="metadata5">
+    <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></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(0,-171)">
+    <g
+       id="g5437"
+       transform="translate(-39.268124,119.39867)"
+       inkscape:transform-center-x="4.2579496"
+       inkscape:transform-center-y="81.222364">
+      <g
+         inkscape:export-ydpi="40.32"
+         inkscape:export-xdpi="40.32"
+         inkscape:corner7="-0.096712199 : 0.030746383 : 0.25 : 1"
+         inkscape:corner0="0.36241751 : 0.14303737 : 0 : 1"
+         inkscape:perspectiveID="#perspective10"
+         style="fill:none;fill-opacity:1;stroke:#cd0000;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:4, 4;stroke-dashoffset:0;stroke-opacity:1"
+         id="g12"
+         sodipodi:type="inkscape:box3d">
+        <path
+           points="63.630827,167.25361 88.76352,157.11689 88.76352,78.672108 63.630827,88.808831 "
+           d="M 63.630827,88.808831 V 167.25361 L 88.76352,157.11689 V 78.672108 Z"
+           inkscape:box3dsidetype="6"
+           style="fill:#b0b0de;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.41790694;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+           id="path14"
+           sodipodi:type="inkscape:box3dside" />
+        <path
+           points="141.17218,78.672108 141.17218,157.11689 88.76352,157.11689 88.76352,78.672108 "
+           d="m 88.76352,78.672108 h 52.40866 V 157.11689 H 88.76352 Z"
+           inkscape:box3dsidetype="11"
+           style="fill:#e9e9ff;fill-rule:evenodd;stroke:#000000;stroke-width:0.41790694;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+           id="path24"
+           sodipodi:type="inkscape:box3dside" />
+        <path
+           points="116.03949,167.25361 141.17218,157.11689 88.76352,157.11689 63.630827,167.25361 "
+           d="m 63.630827,167.25361 h 52.408663 l 25.13269,-10.13672 H 88.76352 Z"
+           inkscape:box3dsidetype="13"
+           style="fill:#8d8dc5;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.41790694;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:0.04179069, 0.04179069;stroke-dashoffset:0;stroke-opacity:1"
+           id="path22"
+           sodipodi:type="inkscape:box3dside" />
+        <path
+           points="116.03949,88.808831 141.17218,78.672108 88.76352,78.672108 63.630827,88.808831 "
+           d="M 63.630827,88.808831 H 116.03949 L 141.17218,78.672108 H 88.76352 Z"
+           inkscape:box3dsidetype="5"
+           style="fill:#4d4d9f;fill-opacity:0;fill-rule:evenodd;stroke:#000000;stroke-width:0.41790694;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:0.04179069, 0.04179069;stroke-dashoffset:0;stroke-opacity:1"
+           id="path16"
+           sodipodi:type="inkscape:box3dside" />
+        <path
+           points="116.03949,167.25361 141.17218,157.11689 141.17218,78.672108 116.03949,88.808831 "
+           d="m 116.03949,88.808831 v 78.444779 l 25.13269,-10.13672 V 78.672108 Z"
+           inkscape:box3dsidetype="14"
+           style="fill:#d7d7ff;fill-opacity:0;fill-rule:evenodd;stroke:#000000;stroke-width:0.41790694;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+           id="path20"
+           sodipodi:type="inkscape:box3dside" />
+        <path
+           points="116.03949,88.808831 116.03949,167.25361 63.630827,167.25361 63.630827,88.808831 "
+           d="M 63.630827,88.808831 H 116.03949 V 167.25361 H 63.630827 Z"
+           inkscape:box3dsidetype="3"
+           style="fill:#8686bf;fill-opacity:0;fill-rule:evenodd;stroke:#000000;stroke-width:0.41790694;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:0.04179069, 0.04179069;stroke-dashoffset:0;stroke-opacity:1"
+           id="path18"
+           sodipodi:type="inkscape:box3dside" />
+        <path
+           inkscape:connector-curvature="0"
+           id="path4841"
+           d="M 88.763516,157.11689 116.03949,88.808834"
+           style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.76499999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#Arrow1Lend)" />
+        <text
+           id="text5256"
+           y="57.703236"
+           x="87.71376"
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:11.28888893px;line-height:125%;font-family:Ubuntu;-inkscape-font-specification:'Ubuntu, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0.2619375px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           xml:space="preserve"><tspan
+             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:11.28888893px;font-family:Ubuntu;-inkscape-font-specification:'Ubuntu, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332px"
+             y="57.703236"
+             x="87.71376"
+             id="tspan5254"
+             sodipodi:role="line">a</tspan></text>
+      </g>
+      <text
+         inkscape:export-ydpi="40.32"
+         inkscape:export-xdpi="40.32"
+         id="text5256-5"
+         y="158.73051"
+         x="160.17534"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:11.28888893px;line-height:125%;font-family:Ubuntu;-inkscape-font-specification:'Ubuntu, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0.2619375px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:4.00000004, 4.00000004;stroke-dashoffset:0;stroke-opacity:1"
+         xml:space="preserve"><tspan
+           y="158.73051"
+           x="160.17534"
+           id="tspan5302"
+           sodipodi:role="line">b</tspan></text>
+      <text
+         inkscape:export-ydpi="40.32"
+         inkscape:export-xdpi="40.32"
+         id="text5256-3"
+         y="176.46587"
+         x="39.69239"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:11.28888893px;line-height:125%;font-family:Ubuntu;-inkscape-font-specification:'Ubuntu, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0.2619375px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:4.00000004, 4.00000004;stroke-dashoffset:0;stroke-opacity:1"
+         xml:space="preserve"><tspan
+           y="176.46587"
+           x="39.69239"
+           id="tspan5312"
+           sodipodi:role="line">c</tspan></text>
+      <g
+         inkscape:export-ydpi="40.32"
+         inkscape:export-xdpi="40.32"
+         inkscape:corner7="-1.1258966 : -0.44841544 : 0.61527524 : 1"
+         inkscape:corner0="0.82766516 : -0.29696219 : 0 : 1"
+         inkscape:perspectiveID="#perspective10-7"
+         style="fill:none;fill-opacity:1;stroke:#cd0000;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:4, 4;stroke-dashoffset:0;stroke-opacity:1"
+         id="g12-7"
+         sodipodi:type="inkscape:box3d">
+        <path
+           points="72.768089,163.72233 89.133651,157.12164 89.133651,129.12794 72.768089,135.72863 "
+           d="m 72.768089,135.72863 v 27.9937 l 16.365562,-6.60069 v -27.9937 z"
+           inkscape:box3dsidetype="6"
+           style="fill:#b0b0de;fill-opacity:0.49756099;fill-rule:evenodd;stroke:#000000;stroke-width:0.41790694;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+           id="path14-4"
+           sodipodi:type="inkscape:box3dside" />
+        <path
+           points="148.13437,129.12794 148.13437,157.12164 89.133651,157.12164 89.133651,129.12794 "
+           d="m 89.133651,129.12794 h 59.000719 v 27.9937 H 89.133651 Z"
+           inkscape:box3dsidetype="11"
+           style="fill:#e9e9ff;fill-opacity:0.50243901;fill-rule:evenodd;stroke:#000000;stroke-width:0.41790694;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+           id="path24-1"
+           sodipodi:type="inkscape:box3dside" />
+        <path
+           points="131.76881,163.72233 148.13437,157.12164 89.133651,157.12164 72.768089,163.72233 "
+           d="m 72.768089,163.72233 h 59.000721 l 16.36556,-6.60069 H 89.133651 Z"
+           inkscape:box3dsidetype="13"
+           style="fill:#8d8dc5;fill-opacity:0.49803922;fill-rule:evenodd;stroke:#000000;stroke-width:0.41790694;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:0.04179069, 0.04179069;stroke-dashoffset:0;stroke-opacity:1"
+           id="path22-7"
+           sodipodi:type="inkscape:box3dside" />
+        <path
+           points="131.76881,135.72863 148.13437,129.12794 89.133651,129.12794 72.768089,135.72863 "
+           d="m 72.768089,135.72863 h 59.000721 l 16.36556,-6.60069 H 89.133651 Z"
+           inkscape:box3dsidetype="5"
+           style="fill:#4d4d9f;fill-opacity:0;fill-rule:evenodd;stroke:#000000;stroke-width:0.41790694;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:0.04179069, 0.04179069;stroke-dashoffset:0;stroke-opacity:1"
+           id="path16-1"
+           sodipodi:type="inkscape:box3dside" />
+        <path
+           points="131.76881,163.72233 148.13437,157.12164 148.13437,129.12794 131.76881,135.72863 "
+           d="m 131.76881,135.72863 v 27.9937 l 16.36556,-6.60069 v -27.9937 z"
+           inkscape:box3dsidetype="14"
+           style="fill:#d7d7ff;fill-opacity:0;fill-rule:evenodd;stroke:#000000;stroke-width:0.41790694;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+           id="path20-1"
+           sodipodi:type="inkscape:box3dside" />
+        <path
+           points="131.76881,135.72863 131.76881,163.72233 72.768089,163.72233 72.768089,135.72863 "
+           d="m 72.768089,135.72863 h 59.000721 v 27.9937 H 72.768089 Z"
+           inkscape:box3dsidetype="3"
+           style="fill:#8686bf;fill-opacity:0;fill-rule:evenodd;stroke:#000000;stroke-width:0.41790694;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:0.04179069, 0.04179069;stroke-dashoffset:0;stroke-opacity:1"
+           id="path18-1"
+           sodipodi:type="inkscape:box3dside" />
+        <path
+           inkscape:connector-curvature="0"
+           id="path4841-7"
+           d="M 88.763516,157.11689 116.03949,88.808834"
+           style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.76499999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#Arrow1Lend-5)" />
+        <text
+           id="text5256-0"
+           y="57.703236"
+           x="87.71376"
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:11.28888893px;line-height:125%;font-family:Ubuntu;-inkscape-font-specification:'Ubuntu, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0.2619375px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           xml:space="preserve"><tspan
+             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:11.28888893px;font-family:Ubuntu;-inkscape-font-specification:'Ubuntu, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332px"
+             y="57.703236"
+             x="87.71376"
+             id="tspan5254-4"
+             sodipodi:role="line">a</tspan></text>
+      </g>
+      <path
+         inkscape:export-ydpi="40.32"
+         inkscape:export-xdpi="40.32"
+         inkscape:connector-curvature="0"
+         id="path5196"
+         d="M 88.763516,157.11689 49.392215,173.09366"
+         style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker5206)" />
+      <path
+         inkscape:export-ydpi="40.32"
+         inkscape:export-xdpi="40.32"
+         inkscape:connector-curvature="0"
+         id="path5094"
+         d="m 88.763516,157.11689 67.503234,-0.20343"
+         style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow2Mend)" />
+      <path
+         inkscape:export-ydpi="40.32"
+         inkscape:export-xdpi="40.32"
+         inkscape:connector-curvature="0"
+         id="path5142"
+         d="M 88.763516,157.11689 89.416942,63.664361"
+         style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker5158)" />
+      <path
+         style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker965)"
+         d="M 88.763516,157.11689 131.76881,135.72863"
+         id="path955"
+         inkscape:connector-curvature="0"
+         sodipodi:nodetypes="cc" />
+      <path
+         style="fill:#653553;fill-opacity:0.55121952;stroke:#000000;stroke-width:0.5636456;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+         id="path1058"
+         sodipodi:type="arc"
+         sodipodi:cx="89.133652"
+         sodipodi:cy="157.12163"
+         sodipodi:rx="22.455404"
+         sodipodi:ry="40.979568"
+         sodipodi:start="5.3258384"
+         sodipodi:end="6.0007794"
+         d="m 102.06103,123.61398 a 22.455404,40.979568 0 0 1 8.63852,22.08799 l -21.565898,11.41966 z"
+         inkscape:transform-center-x="22.590677"
+         inkscape:transform-center-y="-18.309183" />
+    </g>
+  </g>
+</svg>
diff --git a/blog-images/3d-axes-old.svg b/blog-images/3d-axes-old.svg
new file mode 100644 (file)
index 0000000..4a3c882
--- /dev/null
@@ -0,0 +1,257 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<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"
+   width="210mm"
+   height="297mm"
+   viewBox="0 0 210 297"
+   version="1.1"
+   id="svg8"
+   inkscape:version="0.92.2 (5c3e80d, 2017-08-06)"
+   sodipodi:docname="3d-axes.svg">
+  <defs
+     id="defs2">
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0.0"
+       refX="0.0"
+       id="marker5206"
+       style="overflow:visible;"
+       inkscape:isstock="true">
+      <path
+         id="path5204"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#000000;stroke-opacity:1;fill:#000000;fill-opacity:1"
+         d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+         transform="scale(0.6) rotate(180) translate(0,0)" />
+    </marker>
+    <marker
+       inkscape:isstock="true"
+       style="overflow:visible;"
+       id="marker5158"
+       refX="0.0"
+       refY="0.0"
+       orient="auto"
+       inkscape:stockid="Arrow2Mend"
+       inkscape:collect="always">
+      <path
+         transform="scale(0.6) rotate(180) translate(0,0)"
+         d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#000000;stroke-opacity:1;fill:#000000;fill-opacity:1"
+         id="path5156" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0.0"
+       refX="0.0"
+       id="Arrow2Mend"
+       style="overflow:visible;"
+       inkscape:isstock="true"
+       inkscape:collect="always">
+      <path
+         id="path4552"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#000000;stroke-opacity:1;fill:#000000;fill-opacity:1"
+         d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+         transform="scale(0.6) rotate(180) translate(0,0)" />
+    </marker>
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="-431.42495 : 3.6909256e-14 : 0"
+       inkscape:vp_y="0 : 2640.3207 : 0"
+       inkscape:vp_z="379.95886 : 153.2481 : 0"
+       inkscape:persp3d-origin="517.35037 : 293.80928 : 1"
+       id="perspective5090" />
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0.0"
+       refX="0.0"
+       id="Arrow2Lend"
+       style="overflow:visible;"
+       inkscape:isstock="true">
+      <path
+         id="path4546"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#000000;stroke-opacity:1;fill:#000000;fill-opacity:1"
+         d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+         transform="scale(1.1) rotate(180) translate(1,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow1Lend"
+       orient="auto"
+       refY="0.0"
+       refX="0.0"
+       id="Arrow1Lend"
+       style="overflow:visible;"
+       inkscape:isstock="true">
+      <path
+         id="path4528"
+         d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
+         transform="scale(0.8) rotate(180) translate(12.5,0)" />
+    </marker>
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="-114.14785 : 9.7655743e-15 : 0"
+       inkscape:vp_y="0 : 698.58486 : 0"
+       inkscape:vp_z="100.53078 : 40.546895 : 0"
+       inkscape:persp3d-origin="105 : 108.26743 : 1"
+       id="perspective10" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="0.62138672"
+     inkscape:cx="252.34638"
+     inkscape:cy="704.84939"
+     inkscape:document-units="mm"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     showguides="false"
+     inkscape:window-width="1920"
+     inkscape:window-height="1137"
+     inkscape:window-x="1200"
+     inkscape:window-y="0"
+     inkscape:window-maximized="1" />
+  <metadata
+     id="metadata5">
+    <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></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1">
+    <g
+       sodipodi:type="inkscape:box3d"
+       id="g12"
+       style="fill:none;fill-opacity:1;stroke:#cd0000;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:4, 4;stroke-dashoffset:0;stroke-opacity:1"
+       inkscape:perspectiveID="#perspective10"
+       inkscape:corner0="0.36241751 : 0.14303737 : 0 : 1"
+       inkscape:corner7="-0.096712199 : 0.030746383 : 0.25 : 1"
+       inkscape:export-xdpi="40.32"
+       inkscape:export-ydpi="40.32">
+      <path
+         sodipodi:type="inkscape:box3dside"
+         id="path14"
+         style="fill:#b0b0de;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.41790694;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+         inkscape:box3dsidetype="6"
+         d="M 63.630822,88.808835 V 167.25362 L 88.763517,157.11689 V 78.672111 Z"
+         points="63.630822,167.25362 88.763517,157.11689 88.763517,78.672111 63.630822,88.808835 " />
+      <path
+         sodipodi:type="inkscape:box3dside"
+         id="path24"
+         style="fill:#e9e9ff;fill-rule:evenodd;stroke:#000000;stroke-width:0.41790694;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+         inkscape:box3dsidetype="11"
+         d="M 88.763517,78.672111 H 141.17219 V 157.11689 H 88.763517 Z"
+         points="141.17219,78.672111 141.17219,157.11689 88.763517,157.11689 88.763517,78.672111 " />
+      <path
+         sodipodi:type="inkscape:box3dside"
+         id="path22"
+         style="fill:#8d8dc5;fill-rule:evenodd;stroke:#000000;stroke-width:0.41790694;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:0.04179069, 0.04179069000000000;stroke-dashoffset:0;stroke-opacity:1;fill-opacity:1"
+         inkscape:box3dsidetype="13"
+         d="m 63.630822,167.25362 h 52.408668 l 25.1327,-10.13673 H 88.763517 Z"
+         points="116.03949,167.25362 141.17219,157.11689 88.763517,157.11689 63.630822,167.25362 " />
+      <path
+         sodipodi:type="inkscape:box3dside"
+         id="path16"
+         style="fill:#4d4d9f;fill-opacity:0;fill-rule:evenodd;stroke:#000000;stroke-width:0.41790694;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:0.04179069, 0.04179069;stroke-dashoffset:0;stroke-opacity:1"
+         inkscape:box3dsidetype="5"
+         d="m 63.630822,88.808835 h 52.408668 l 25.1327,-10.136724 H 88.763517 Z"
+         points="116.03949,88.808835 141.17219,78.672111 88.763517,78.672111 63.630822,88.808835 " />
+      <path
+         sodipodi:type="inkscape:box3dside"
+         id="path20"
+         style="fill:#d7d7ff;fill-opacity:0;fill-rule:evenodd;stroke:#000000;stroke-width:0.41790694;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+         inkscape:box3dsidetype="14"
+         d="m 116.03949,88.808835 v 78.444785 l 25.1327,-10.13673 V 78.672111 Z"
+         points="116.03949,167.25362 141.17219,157.11689 141.17219,78.672111 116.03949,88.808835 " />
+      <path
+         sodipodi:type="inkscape:box3dside"
+         id="path18"
+         style="fill:#8686bf;fill-opacity:0;fill-rule:evenodd;stroke:#000000;stroke-width:0.41790694;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:0.04179069, 0.04179069;stroke-dashoffset:0;stroke-opacity:1"
+         inkscape:box3dsidetype="3"
+         d="M 63.630822,88.808835 H 116.03949 V 167.25362 H 63.630822 Z"
+         points="116.03949,88.808835 116.03949,167.25362 63.630822,167.25362 63.630822,88.808835 " />
+      <path
+         style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.76499999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#Arrow1Lend)"
+         d="M 88.763516,157.11689 116.03949,88.808834"
+         id="path4841"
+         inkscape:connector-curvature="0" />
+      <text
+         xml:space="preserve"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:11.28888893px;line-height:125%;font-family:Ubuntu;-inkscape-font-specification:'Ubuntu, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0.2619375px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         x="87.71376"
+         y="57.703236"
+         id="text5256"><tspan
+           sodipodi:role="line"
+           id="tspan5254"
+           x="87.71376"
+           y="57.703236"
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:11.28888893px;font-family:Ubuntu;-inkscape-font-specification:'Ubuntu, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332px">a</tspan></text>
+    </g>
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none;marker-end:url(#Arrow2Mend)"
+       d="m 88.763516,157.11689 67.503234,-0.20343"
+       id="path5094"
+       inkscape:connector-curvature="0"
+       inkscape:export-xdpi="40.32"
+       inkscape:export-ydpi="40.32" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none;marker-end:url(#marker5158)"
+       d="M 88.763516,157.11689 89.416942,63.664361"
+       id="path5142"
+       inkscape:connector-curvature="0"
+       inkscape:export-xdpi="40.32"
+       inkscape:export-ydpi="40.32" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none;marker-end:url(#marker5206)"
+       d="M 88.763516,157.11689 49.392215,173.09366"
+       id="path5196"
+       inkscape:connector-curvature="0"
+       inkscape:export-xdpi="40.32"
+       inkscape:export-ydpi="40.32" />
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:11.28888893px;line-height:125%;font-family:Ubuntu;-inkscape-font-specification:'Ubuntu, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0.2619375px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:4.00000004, 4.00000004;stroke-dashoffset:0;stroke-opacity:1"
+       x="160.17534"
+       y="158.73051"
+       id="text5256-5"
+       inkscape:export-xdpi="40.32"
+       inkscape:export-ydpi="40.32"><tspan
+         sodipodi:role="line"
+         id="tspan5302"
+         x="160.17534"
+         y="158.73051">b</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:11.28888893px;line-height:125%;font-family:Ubuntu;-inkscape-font-specification:'Ubuntu, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0.2619375px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:4.00000004, 4.00000004;stroke-dashoffset:0;stroke-opacity:1"
+       x="39.69239"
+       y="176.46587"
+       id="text5256-3"
+       inkscape:export-xdpi="40.32"
+       inkscape:export-ydpi="40.32"><tspan
+         sodipodi:role="line"
+         id="tspan5312"
+         x="39.69239"
+         y="176.46587">c</tspan></text>
+  </g>
+</svg>
diff --git a/blog-images/3d-axes.png b/blog-images/3d-axes.png
new file mode 100644 (file)
index 0000000..dfe7aed
Binary files /dev/null and b/blog-images/3d-axes.png differ
diff --git a/blog-images/3d-axes.svg b/blog-images/3d-axes.svg
new file mode 100644 (file)
index 0000000..c359cfd
--- /dev/null
@@ -0,0 +1,269 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<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"
+   width="127mm"
+   height="126mm"
+   viewBox="0 0 127 126"
+   version="1.1"
+   id="svg8"
+   inkscape:version="0.92.2 (5c3e80d, 2017-08-06)"
+   sodipodi:docname="3d-axes.svg">
+  <defs
+     id="defs2">
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="marker5206"
+       style="overflow:visible"
+       inkscape:isstock="true">
+      <path
+         id="path5204"
+         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:isstock="true"
+       style="overflow:visible"
+       id="marker5158"
+       refX="0"
+       refY="0"
+       orient="auto"
+       inkscape:stockid="Arrow2Mend"
+       inkscape:collect="always">
+      <path
+         transform="scale(-0.6)"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
+         id="path5156"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Mend"
+       style="overflow:visible"
+       inkscape:isstock="true"
+       inkscape:collect="always">
+      <path
+         id="path4552"
+         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="-431.42493 : 3.6909255e-14 : 0"
+       inkscape:vp_y="0 : 2640.3206 : 0"
+       inkscape:vp_z="379.95884 : 153.2481 : 0"
+       inkscape:persp3d-origin="517.35035 : 293.80927 : 1"
+       id="perspective5090" />
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Lend"
+       style="overflow:visible"
+       inkscape:isstock="true">
+      <path
+         id="path4546"
+         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow1Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Lend"
+       style="overflow:visible"
+       inkscape:isstock="true">
+      <path
+         id="path4528"
+         d="M 0,0 5,-5 -12.5,0 5,5 Z"
+         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
+         transform="matrix(-0.8,0,0,-0.8,-10,0)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="-114.14784 : 9.7655741e-15 : 0"
+       inkscape:vp_y="0 : 698.58485 : 0"
+       inkscape:vp_z="100.53077 : 40.546894 : 0"
+       inkscape:persp3d-origin="65.731879 : -11.131238 : 1"
+       id="perspective10" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="0.62138672"
+     inkscape:cx="-208.0166"
+     inkscape:cy="-20.35886"
+     inkscape:document-units="mm"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     showguides="false"
+     inkscape:window-width="1920"
+     inkscape:window-height="1137"
+     inkscape:window-x="1200"
+     inkscape:window-y="0"
+     inkscape:window-maximized="1" />
+  <metadata
+     id="metadata5">
+    <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></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(0,-171)">
+    <g
+       id="g5437"
+       transform="translate(-39.268124,119.39867)"
+       inkscape:transform-center-x="4.2579496"
+       inkscape:transform-center-y="81.222364">
+      <g
+         inkscape:export-ydpi="40.32"
+         inkscape:export-xdpi="40.32"
+         inkscape:corner7="-0.096712199 : 0.030746383 : 0.25 : 1"
+         inkscape:corner0="0.36241751 : 0.14303737 : 0 : 1"
+         inkscape:perspectiveID="#perspective10"
+         style="fill:none;fill-opacity:1;stroke:#cd0000;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:4, 4;stroke-dashoffset:0;stroke-opacity:1"
+         id="g12"
+         sodipodi:type="inkscape:box3d">
+        <path
+           points="63.630826,167.25361 88.763519,157.11688 88.763519,78.672104 63.630826,88.808827 "
+           d="M 63.630826,88.808827 V 167.25361 L 88.763519,157.11688 V 78.672104 Z"
+           inkscape:box3dsidetype="6"
+           style="fill:#b0b0de;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.41790694;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+           id="path14"
+           sodipodi:type="inkscape:box3dside" />
+        <path
+           points="141.17218,78.672104 141.17218,157.11688 88.763519,157.11688 88.763519,78.672104 "
+           d="M 88.763519,78.672104 H 141.17218 V 157.11688 H 88.763519 Z"
+           inkscape:box3dsidetype="11"
+           style="fill:#e9e9ff;fill-rule:evenodd;stroke:#000000;stroke-width:0.41790694;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+           id="path24"
+           sodipodi:type="inkscape:box3dside" />
+        <path
+           points="116.03949,167.25361 141.17218,157.11688 88.763519,157.11688 63.630826,167.25361 "
+           d="m 63.630826,167.25361 h 52.408664 l 25.13269,-10.13673 H 88.763519 Z"
+           inkscape:box3dsidetype="13"
+           style="fill:#8d8dc5;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.41790694;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:0.04179069, 0.04179069;stroke-dashoffset:0;stroke-opacity:1"
+           id="path22"
+           sodipodi:type="inkscape:box3dside" />
+        <path
+           points="116.03949,88.808827 141.17218,78.672104 88.763519,78.672104 63.630826,88.808827 "
+           d="M 63.630826,88.808827 H 116.03949 L 141.17218,78.672104 H 88.763519 Z"
+           inkscape:box3dsidetype="5"
+           style="fill:#4d4d9f;fill-opacity:0;fill-rule:evenodd;stroke:#000000;stroke-width:0.41790694;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:0.04179069, 0.04179069;stroke-dashoffset:0;stroke-opacity:1"
+           id="path16"
+           sodipodi:type="inkscape:box3dside" />
+        <path
+           points="116.03949,167.25361 141.17218,157.11688 141.17218,78.672104 116.03949,88.808827 "
+           d="m 116.03949,88.808827 v 78.444783 l 25.13269,-10.13673 V 78.672104 Z"
+           inkscape:box3dsidetype="14"
+           style="fill:#d7d7ff;fill-opacity:0;fill-rule:evenodd;stroke:#000000;stroke-width:0.41790694;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+           id="path20"
+           sodipodi:type="inkscape:box3dside" />
+        <path
+           points="116.03949,88.808827 116.03949,167.25361 63.630826,167.25361 63.630826,88.808827 "
+           d="M 63.630826,88.808827 H 116.03949 V 167.25361 H 63.630826 Z"
+           inkscape:box3dsidetype="3"
+           style="fill:#8686bf;fill-opacity:0;fill-rule:evenodd;stroke:#000000;stroke-width:0.41790694;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:0.04179069, 0.04179069;stroke-dashoffset:0;stroke-opacity:1"
+           id="path18"
+           sodipodi:type="inkscape:box3dside" />
+        <path
+           inkscape:connector-curvature="0"
+           id="path4841"
+           d="M 88.763516,157.11689 116.03949,88.808834"
+           style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.76499999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#Arrow1Lend)" />
+        <text
+           id="text5256"
+           y="57.703236"
+           x="87.71376"
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:11.28888893px;line-height:125%;font-family:Ubuntu;-inkscape-font-specification:'Ubuntu, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0.2619375px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           xml:space="preserve"><tspan
+             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:11.28888893px;font-family:Ubuntu;-inkscape-font-specification:'Ubuntu, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332px"
+             y="57.703236"
+             x="87.71376"
+             id="tspan5254"
+             sodipodi:role="line">a</tspan></text>
+      </g>
+      <path
+         inkscape:export-ydpi="40.32"
+         inkscape:export-xdpi="40.32"
+         inkscape:connector-curvature="0"
+         id="path5094"
+         d="m 88.763516,157.11689 67.503234,-0.20343"
+         style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow2Mend)" />
+      <path
+         inkscape:export-ydpi="40.32"
+         inkscape:export-xdpi="40.32"
+         inkscape:connector-curvature="0"
+         id="path5142"
+         d="M 88.763516,157.11689 89.416942,63.664361"
+         style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker5158)" />
+      <path
+         inkscape:export-ydpi="40.32"
+         inkscape:export-xdpi="40.32"
+         inkscape:connector-curvature="0"
+         id="path5196"
+         d="M 88.763516,157.11689 49.392215,173.09366"
+         style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker5206)" />
+      <text
+         inkscape:export-ydpi="40.32"
+         inkscape:export-xdpi="40.32"
+         id="text5256-5"
+         y="158.73051"
+         x="160.17534"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:11.28888893px;line-height:125%;font-family:Ubuntu;-inkscape-font-specification:'Ubuntu, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0.2619375px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:4.00000004, 4.00000004;stroke-dashoffset:0;stroke-opacity:1"
+         xml:space="preserve"><tspan
+           y="158.73051"
+           x="160.17534"
+           id="tspan5302"
+           sodipodi:role="line">b</tspan></text>
+      <text
+         inkscape:export-ydpi="40.32"
+         inkscape:export-xdpi="40.32"
+         id="text5256-3"
+         y="176.46587"
+         x="39.69239"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:11.28888893px;line-height:125%;font-family:Ubuntu;-inkscape-font-specification:'Ubuntu, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0.2619375px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:4.00000004, 4.00000004;stroke-dashoffset:0;stroke-opacity:1"
+         xml:space="preserve"><tspan
+           y="176.46587"
+           x="39.69239"
+           id="tspan5312"
+           sodipodi:role="line">c</tspan></text>
+    </g>
+  </g>
+</svg>
diff --git a/blog-images/582px-Wien-Parlament-Julius_Ceasar.jpg b/blog-images/582px-Wien-Parlament-Julius_Ceasar.jpg
new file mode 100644 (file)
index 0000000..494d334
Binary files /dev/null and b/blog-images/582px-Wien-Parlament-Julius_Ceasar.jpg differ
diff --git a/blog-images/Monkey-typing.jpg b/blog-images/Monkey-typing.jpg
new file mode 100644 (file)
index 0000000..684f7fa
Binary files /dev/null and b/blog-images/Monkey-typing.jpg differ
diff --git a/blog-images/caesar_break_parameter_trials.png b/blog-images/caesar_break_parameter_trials.png
new file mode 100644 (file)
index 0000000..9142192
Binary files /dev/null and b/blog-images/caesar_break_parameter_trials.png differ
diff --git a/blog-images/chuttersnap-233105-unsplash.jpg b/blog-images/chuttersnap-233105-unsplash.jpg
new file mode 100644 (file)
index 0000000..595a6ac
Binary files /dev/null and b/blog-images/chuttersnap-233105-unsplash.jpg differ
diff --git a/blog-images/letter-treemap.png b/blog-images/letter-treemap.png
new file mode 100644 (file)
index 0000000..6cde8ed
Binary files /dev/null and b/blog-images/letter-treemap.png differ
diff --git a/blog-images/manhattan-grid.png b/blog-images/manhattan-grid.png
new file mode 100644 (file)
index 0000000..1b3172e
Binary files /dev/null and b/blog-images/manhattan-grid.png differ
diff --git a/blog-images/manhattan-grid.svg b/blog-images/manhattan-grid.svg
new file mode 100644 (file)
index 0000000..6dd6097
--- /dev/null
@@ -0,0 +1,363 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<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"
+   width="144.81808mm"
+   height="147.03627mm"
+   viewBox="0 0 144.81808 147.03627"
+   version="1.1"
+   id="svg5464"
+   inkscape:version="0.92.2 (5c3e80d, 2017-08-06)"
+   sodipodi:docname="manhattan-grid.svg">
+  <defs
+     id="defs5458">
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Lend"
+       style="overflow:visible"
+       inkscape:isstock="true">
+      <path
+         id="path4546"
+         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:isstock="true"
+       style="overflow:visible"
+       id="marker6246"
+       refX="0"
+       refY="0"
+       orient="auto"
+       inkscape:stockid="Arrow2Mend">
+      <path
+         transform="scale(-0.6)"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
+         id="path6244"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Mend"
+       style="overflow:visible"
+       inkscape:isstock="true"
+       inkscape:collect="always">
+      <path
+         id="path4552"
+         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="0.87877353"
+     inkscape:cx="81.601042"
+     inkscape:cy="298.63198"
+     inkscape:document-units="mm"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     inkscape:window-width="1920"
+     inkscape:window-height="1137"
+     inkscape:window-x="1200"
+     inkscape:window-y="0"
+     inkscape:window-maximized="1" />
+  <metadata
+     id="metadata5461">
+    <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></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-45,-4.9637313)">
+    <rect
+       style="fill:#b0b0de;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       id="rect5466"
+       width="20"
+       height="20"
+       x="50"
+       y="77" />
+    <rect
+       style="fill:#b0b0de;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       id="rect5466-9"
+       width="20"
+       height="20"
+       x="75"
+       y="77" />
+    <rect
+       style="fill:#b0b0de;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       id="rect5466-4"
+       width="20"
+       height="20"
+       x="100"
+       y="77" />
+    <rect
+       style="fill:#b0b0de;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       id="rect5466-9-9"
+       width="20"
+       height="20"
+       x="124.99999"
+       y="77" />
+    <rect
+       style="fill:#b0b0de;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       id="rect5466-93"
+       width="20"
+       height="20"
+       x="125"
+       y="77" />
+    <rect
+       style="fill:#b0b0de;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       id="rect5466-9-6"
+       width="20"
+       height="20"
+       x="150"
+       y="77" />
+    <rect
+       style="fill:#b0b0de;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       id="rect5466-7"
+       width="20.000002"
+       height="20"
+       x="50"
+       y="52" />
+    <rect
+       style="fill:#b0b0de;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       id="rect5466-9-4"
+       width="20.000002"
+       height="20"
+       x="74.999992"
+       y="52" />
+    <rect
+       style="fill:#b0b0de;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       id="rect5466-4-6"
+       width="20.000002"
+       height="20"
+       x="99.999992"
+       y="52" />
+    <rect
+       style="fill:#b0b0de;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       id="rect5466-9-9-3"
+       width="20.000002"
+       height="20"
+       x="125"
+       y="52" />
+    <rect
+       style="fill:#b0b0de;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       id="rect5466-93-8"
+       width="20.000002"
+       height="20"
+       x="125"
+       y="52" />
+    <rect
+       style="fill:#b0b0de;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       id="rect5466-9-6-0"
+       width="20.000002"
+       height="20"
+       x="150"
+       y="52" />
+    <rect
+       style="fill:#b0b0de;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       id="rect5466-79"
+       width="20"
+       height="20"
+       x="50"
+       y="27" />
+    <rect
+       style="fill:#b0b0de;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       id="rect5466-9-7"
+       width="20"
+       height="20"
+       x="75"
+       y="27" />
+    <rect
+       style="fill:#b0b0de;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       id="rect5466-4-5"
+       width="20"
+       height="20"
+       x="100"
+       y="27" />
+    <rect
+       style="fill:#b0b0de;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       id="rect5466-9-9-1"
+       width="20"
+       height="20"
+       x="124.99999"
+       y="27" />
+    <rect
+       style="fill:#b0b0de;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       id="rect5466-93-3"
+       width="20"
+       height="20"
+       x="125"
+       y="27" />
+    <rect
+       style="fill:#b0b0de;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       id="rect5466-9-6-7"
+       width="20"
+       height="20"
+       x="150"
+       y="27" />
+    <rect
+       style="fill:#b0b0de;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       id="rect5466-8"
+       width="20"
+       height="20"
+       x="50"
+       y="102" />
+    <rect
+       style="fill:#b0b0de;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       id="rect5466-9-0"
+       width="20"
+       height="20"
+       x="75"
+       y="102" />
+    <rect
+       style="fill:#b0b0de;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       id="rect5466-4-9"
+       width="20"
+       height="20"
+       x="100"
+       y="102" />
+    <rect
+       style="fill:#b0b0de;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       id="rect5466-9-9-5"
+       width="20"
+       height="20"
+       x="124.99999"
+       y="102" />
+    <rect
+       style="fill:#b0b0de;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       id="rect5466-93-2"
+       width="20"
+       height="20"
+       x="125"
+       y="102" />
+    <rect
+       style="fill:#b0b0de;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       id="rect5466-9-6-1"
+       width="20"
+       height="20"
+       x="150"
+       y="102" />
+    <rect
+       style="fill:#b0b0de;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       id="rect5466-3"
+       width="20"
+       height="20"
+       x="50"
+       y="127" />
+    <rect
+       style="fill:#b0b0de;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       id="rect5466-9-2"
+       width="20"
+       height="20"
+       x="75"
+       y="127" />
+    <rect
+       style="fill:#b0b0de;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       id="rect5466-4-7"
+       width="20"
+       height="20"
+       x="100"
+       y="127" />
+    <rect
+       style="fill:#b0b0de;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       id="rect5466-9-9-33"
+       width="20"
+       height="20"
+       x="124.99999"
+       y="127" />
+    <rect
+       style="fill:#b0b0de;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       id="rect5466-93-23"
+       width="20"
+       height="20"
+       x="125"
+       y="127" />
+    <rect
+       style="fill:#b0b0de;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       id="rect5466-9-6-8"
+       width="20"
+       height="20"
+       x="150"
+       y="127" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.96145296;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow2Mend)"
+       d="m 45,149.51127 c 138.04583,0 138.60247,0 138.60247,0"
+       id="path5668"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.96919084;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker6246)"
+       d="m 47.52738,152 c 0,-138.014252 0,-138.579884 0,-138.579884"
+       id="path6236"
+       inkscape:connector-curvature="0" />
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.96875px;line-height:125%;font-family:Ubuntu;-inkscape-font-specification:'Ubuntu, Normal';text-align:start;letter-spacing:0.2619375px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       x="47.527378"
+       y="13.420116"
+       id="text6358"><tspan
+         sodipodi:role="line"
+         id="tspan6356"
+         x="47.527378"
+         y="17.120945"
+         style="stroke-width:0.26458332px"></tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.96875px;line-height:125%;font-family:Ubuntu;-inkscape-font-specification:'Ubuntu, Normal';text-align:start;letter-spacing:0.2619375px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       x="50.928932"
+       y="10.980709"
+       id="text6362"><tspan
+         sodipodi:role="line"
+         id="tspan6360"
+         x="50.928932"
+         y="10.980709"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:11.28888893px;font-family:Ubuntu;-inkscape-font-specification:'Ubuntu, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332px">a</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.96875px;line-height:125%;font-family:Ubuntu;-inkscape-font-specification:'Ubuntu, Normal';text-align:start;letter-spacing:0.2619375px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       x="183.74466"
+       y="143.61157"
+       id="text6362-8"><tspan
+         sodipodi:role="line"
+         id="tspan6470"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:11.28888893px;font-family:Ubuntu;-inkscape-font-specification:'Ubuntu, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start"
+         x="183.74466"
+         y="143.61157">b</tspan></text>
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4.30000019;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow2Lend)"
+       d="M 72.5,149.52917 V 124.5 h 50 v -25 H 175"
+       id="path6436"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccc" />
+  </g>
+</svg>
diff --git a/blog-images/photo-1493953659556-556b14bdaca8.jpeg b/blog-images/photo-1493953659556-556b14bdaca8.jpeg
new file mode 100644 (file)
index 0000000..3656e26
Binary files /dev/null and b/blog-images/photo-1493953659556-556b14bdaca8.jpeg differ
diff --git a/blog-images/tim-evans-88330-unsplash.jpg b/blog-images/tim-evans-88330-unsplash.jpg
new file mode 100644 (file)
index 0000000..9af62f6
Binary files /dev/null and b/blog-images/tim-evans-88330-unsplash.jpg differ
diff --git a/blog-images/ubtgram-relative-counts.png b/blog-images/ubtgram-relative-counts.png
new file mode 100644 (file)
index 0000000..9f7c44e
Binary files /dev/null and b/blog-images/ubtgram-relative-counts.png differ
index e18f92c5604d97855b83cff0fdce99d17c7385a1..30c1a336c30447a3c9de2493d8f3ae127c7618ad 100644 (file)
-<<<<<<< HEAD
-,message_length
-scoring, 300, 100, 50, 30, 20, 10, 5
-Pletters, 0.9994, 0.9994, 0.9994, 0.9966, 0.9778, 0.8174, 0.4712
-Pletters, 0.9994, 0.9994, 0.9994, 0.9966, 0.9778, 0.8174, 0.4712
-Pletters, 0.9994, 0.9994, 0.9994, 0.9966, 0.9778, 0.8174, 0.4712
-Pletters, 0.9994, 0.9994, 0.9994, 0.9966, 0.9778, 0.8174, 0.4712
-Pletters, 0.9994, 0.9994, 0.9994, 0.9966, 0.9778, 0.8174, 0.4712
-Pletters, 0.9994, 0.9994, 0.9994, 0.9966, 0.9778, 0.8174, 0.4712
-Pletters, 0.9994, 0.9994, 0.9994, 0.9966, 0.9778, 0.8174, 0.4712
-cosine_distance + euclidean_scaled, 0.9996, 0.9996, 0.9974, 0.9836, 0.9356, 0.7124, 0.4218
-cosine_distance + euclidean_scaled, 0.9996, 0.9996, 0.9974, 0.9836, 0.9356, 0.7124, 0.4218
-cosine_distance + euclidean_scaled, 0.9996, 0.9996, 0.9974, 0.9836, 0.9356, 0.7124, 0.4218
-cosine_distance + euclidean_scaled, 0.9996, 0.9996, 0.9974, 0.9836, 0.9356, 0.7124, 0.4218
-cosine_distance + euclidean_scaled, 0.9996, 0.9996, 0.9974, 0.9836, 0.9356, 0.7124, 0.4218
-cosine_distance + euclidean_scaled, 0.9996, 0.9996, 0.9974, 0.9836, 0.9356, 0.7124, 0.4218
-cosine_distance + euclidean_scaled, 0.9996, 0.9996, 0.9974, 0.9836, 0.9356, 0.7124, 0.4218
-cosine_distance + normalised, 0.9994, 0.9996, 0.998, 0.9836, 0.934, 0.7186, 0.4402
-cosine_distance + normalised, 0.9994, 0.9996, 0.998, 0.9836, 0.934, 0.7186, 0.4402
-cosine_distance + normalised, 0.9994, 0.9996, 0.998, 0.9836, 0.934, 0.7186, 0.4402
-cosine_distance + normalised, 0.9994, 0.9996, 0.998, 0.9836, 0.934, 0.7186, 0.4402
-cosine_distance + normalised, 0.9994, 0.9996, 0.998, 0.9836, 0.934, 0.7186, 0.4402
-cosine_distance + normalised, 0.9994, 0.9996, 0.998, 0.9836, 0.934, 0.7186, 0.4402
-cosine_distance + normalised, 0.9994, 0.9996, 0.998, 0.9836, 0.934, 0.7186, 0.4402
-geometric_mean + euclidean_scaled, 0.9996, 0.9996, 0.99, 0.9506, 0.8892, 0.6562, 0.4368
-geometric_mean + euclidean_scaled, 0.9996, 0.9996, 0.99, 0.9506, 0.8892, 0.6562, 0.4368
-geometric_mean + euclidean_scaled, 0.9996, 0.9996, 0.99, 0.9506, 0.8892, 0.6562, 0.4368
-geometric_mean + euclidean_scaled, 0.9996, 0.9996, 0.99, 0.9506, 0.8892, 0.6562, 0.4368
-geometric_mean + euclidean_scaled, 0.9996, 0.9996, 0.99, 0.9506, 0.8892, 0.6562, 0.4368
-geometric_mean + euclidean_scaled, 0.9996, 0.9996, 0.99, 0.9506, 0.8892, 0.6562, 0.4368
-geometric_mean + euclidean_scaled, 0.9996, 0.9996, 0.99, 0.9506, 0.8892, 0.6562, 0.4368
-geometric_mean + normalised, 0.9996, 0.9992, 0.9902, 0.9222, 0.9408, 0.7062, 0.4568
-geometric_mean + normalised, 0.9996, 0.9992, 0.9902, 0.9222, 0.9408, 0.7062, 0.4568
-geometric_mean + normalised, 0.9996, 0.9992, 0.9902, 0.9222, 0.9408, 0.7062, 0.4568
-geometric_mean + normalised, 0.9996, 0.9992, 0.9902, 0.9222, 0.9408, 0.7062, 0.4568
-geometric_mean + normalised, 0.9996, 0.9992, 0.9902, 0.9222, 0.9408, 0.7062, 0.4568
-geometric_mean + normalised, 0.9996, 0.9992, 0.9902, 0.9222, 0.9408, 0.7062, 0.4568
-geometric_mean + normalised, 0.9996, 0.9992, 0.9902, 0.9222, 0.9408, 0.7062, 0.4568
-harmonic_mean + euclidean_scaled, 0.4688, 0.5122, 0.6894, 0.5948, 0.5258, 0.4426, 0.3642
-harmonic_mean + euclidean_scaled, 0.4688, 0.5122, 0.6894, 0.5948, 0.5258, 0.4426, 0.3642
-harmonic_mean + euclidean_scaled, 0.4688, 0.5122, 0.6894, 0.5948, 0.5258, 0.4426, 0.3642
-harmonic_mean + euclidean_scaled, 0.4688, 0.5122, 0.6894, 0.5948, 0.5258, 0.4426, 0.3642
-harmonic_mean + euclidean_scaled, 0.4688, 0.5122, 0.6894, 0.5948, 0.5258, 0.4426, 0.3642
-harmonic_mean + euclidean_scaled, 0.4688, 0.5122, 0.6894, 0.5948, 0.5258, 0.4426, 0.3642
-harmonic_mean + euclidean_scaled, 0.4688, 0.5122, 0.6894, 0.5948, 0.5258, 0.4426, 0.3642
-harmonic_mean + normalised, 0.8134, 0.8368, 0.7672, 0.2674, 0.8608, 0.6736, 0.453
-harmonic_mean + normalised, 0.8134, 0.8368, 0.7672, 0.2674, 0.8608, 0.6736, 0.453
-harmonic_mean + normalised, 0.8134, 0.8368, 0.7672, 0.2674, 0.8608, 0.6736, 0.453
-harmonic_mean + normalised, 0.8134, 0.8368, 0.7672, 0.2674, 0.8608, 0.6736, 0.453
-harmonic_mean + normalised, 0.8134, 0.8368, 0.7672, 0.2674, 0.8608, 0.6736, 0.453
-harmonic_mean + normalised, 0.8134, 0.8368, 0.7672, 0.2674, 0.8608, 0.6736, 0.453
-harmonic_mean + normalised, 0.8134, 0.8368, 0.7672, 0.2674, 0.8608, 0.6736, 0.453
-l1 + euclidean_scaled, 0.9998, 0.9994, 0.9984, 0.9904, 0.9502, 0.7558, 0.4348
-l1 + euclidean_scaled, 0.9998, 0.9994, 0.9984, 0.9904, 0.9502, 0.7558, 0.4348
-l1 + euclidean_scaled, 0.9998, 0.9994, 0.9984, 0.9904, 0.9502, 0.7558, 0.4348
-l1 + euclidean_scaled, 0.9998, 0.9994, 0.9984, 0.9904, 0.9502, 0.7558, 0.4348
-l1 + euclidean_scaled, 0.9998, 0.9994, 0.9984, 0.9904, 0.9502, 0.7558, 0.4348
-l1 + euclidean_scaled, 0.9998, 0.9994, 0.9984, 0.9904, 0.9502, 0.7558, 0.4348
-l1 + euclidean_scaled, 0.9998, 0.9994, 0.9984, 0.9904, 0.9502, 0.7558, 0.4348
-l1 + normalised, 0.9998, 0.9998, 0.9986, 0.9882, 0.955, 0.7252, 0.4432
-l1 + normalised, 0.9998, 0.9998, 0.9986, 0.9882, 0.955, 0.7252, 0.4432
-l1 + normalised, 0.9998, 0.9998, 0.9986, 0.9882, 0.955, 0.7252, 0.4432
-l1 + normalised, 0.9998, 0.9998, 0.9986, 0.9882, 0.955, 0.7252, 0.4432
-l1 + normalised, 0.9998, 0.9998, 0.9986, 0.9882, 0.955, 0.7252, 0.4432
-l1 + normalised, 0.9998, 0.9998, 0.9986, 0.9882, 0.955, 0.7252, 0.4432
-l1 + normalised, 0.9998, 0.9998, 0.9986, 0.9882, 0.955, 0.7252, 0.4432
-l2 + euclidean_scaled, 0.9996, 0.9988, 0.9992, 0.9786, 0.9368, 0.712, 0.4336
-l2 + euclidean_scaled, 0.9996, 0.9988, 0.9992, 0.9786, 0.9368, 0.712, 0.4336
-l2 + euclidean_scaled, 0.9996, 0.9988, 0.9992, 0.9786, 0.9368, 0.712, 0.4336
-l2 + euclidean_scaled, 0.9996, 0.9988, 0.9992, 0.9786, 0.9368, 0.712, 0.4336
-l2 + euclidean_scaled, 0.9996, 0.9988, 0.9992, 0.9786, 0.9368, 0.712, 0.4336
-l2 + euclidean_scaled, 0.9996, 0.9988, 0.9992, 0.9786, 0.9368, 0.712, 0.4336
-l2 + euclidean_scaled, 0.9996, 0.9988, 0.9992, 0.9786, 0.9368, 0.712, 0.4336
-l2 + normalised, 0.9998, 0.999, 0.998, 0.9818, 0.933, 0.709, 0.4356
-l2 + normalised, 0.9998, 0.999, 0.998, 0.9818, 0.933, 0.709, 0.4356
-l2 + normalised, 0.9998, 0.999, 0.998, 0.9818, 0.933, 0.709, 0.4356
-l2 + normalised, 0.9998, 0.999, 0.998, 0.9818, 0.933, 0.709, 0.4356
-l2 + normalised, 0.9998, 0.999, 0.998, 0.9818, 0.933, 0.709, 0.4356
-l2 + normalised, 0.9998, 0.999, 0.998, 0.9818, 0.933, 0.709, 0.4356
-l2 + normalised, 0.9998, 0.999, 0.998, 0.9818, 0.933, 0.709, 0.4356
-l3 + euclidean_scaled, 0.9996, 0.999, 0.996, 0.9684, 0.8934, 0.6282, 0.4084
-l3 + euclidean_scaled, 0.9996, 0.999, 0.996, 0.9684, 0.8934, 0.6282, 0.4084
-l3 + euclidean_scaled, 0.9996, 0.999, 0.996, 0.9684, 0.8934, 0.6282, 0.4084
-l3 + euclidean_scaled, 0.9996, 0.999, 0.996, 0.9684, 0.8934, 0.6282, 0.4084
-l3 + euclidean_scaled, 0.9996, 0.999, 0.996, 0.9684, 0.8934, 0.6282, 0.4084
-l3 + euclidean_scaled, 0.9996, 0.999, 0.996, 0.9684, 0.8934, 0.6282, 0.4084
-l3 + euclidean_scaled, 0.9996, 0.999, 0.996, 0.9684, 0.8934, 0.6282, 0.4084
-l3 + normalised, 1.0, 0.9986, 0.9932, 0.963, 0.8696, 0.594, 0.4122
-l3 + normalised, 1.0, 0.9986, 0.9932, 0.963, 0.8696, 0.594, 0.4122
-l3 + normalised, 1.0, 0.9986, 0.9932, 0.963, 0.8696, 0.594, 0.4122
-l3 + normalised, 1.0, 0.9986, 0.9932, 0.963, 0.8696, 0.594, 0.4122
-l3 + normalised, 1.0, 0.9986, 0.9932, 0.963, 0.8696, 0.594, 0.4122
-l3 + normalised, 1.0, 0.9986, 0.9932, 0.963, 0.8696, 0.594, 0.4122
-l3 + normalised, 1.0, 0.9986, 0.9932, 0.963, 0.8696, 0.594, 0.4122
-=======
 "name",100,50,30,20,10,5\r
-"Pletters",4996,4997,4984,4900,4063,2358\r
-"cosine_similarity + euclidean_scaled",4998,4986,4914,4659,3528,2198\r
-"cosine_similarity + normalised",4997,4993,4917,4659,3557,2084\r
-"l1 + euclidean_scaled",4998,4992,4951,4755,3767,2192\r
-"l1 + normalised",4998,4996,4936,4767,3596,2161\r
-"l2 + euclidean_scaled",4998,4990,4926,4683,3567,2179\r
-"l2 + normalised",4995,4993,4920,4672,3610,2135\r
-"l3 + euclidean_scaled",4996,4964,4822,4457,3167,2018\r
-"l3 + normalised",4999,4973,4797,4351,2872,1989\r
->>>>>>> 883806c... More tweaking
+"Pbigrams",99975,99972,99962,99831,95323,67277\r
+"Pletters",99952,99937,99683,97936,81597,47758\r
+"Ptrigrams",99991,99994,99990,99944,97994,74922\r
+"cosine_similarity + l1_scaled",99948,99764,98358,93346,71183,43193\r
+"cosine_similarity + l2_scaled",99946,99768,98345,93399,71353,43259\r
+"l1 + l1_scaled",99949,99879,98944,95454,72617,42940\r
+"l1 + l2_scaled",99945,99889,98996,95350,74966,44413\r
+"l2 + l1_scaled",99946,99822,98336,93457,71287,43350\r
+"l2 + l2_scaled",99957,99796,98274,93471,71413,43288\r
+"l3 + l1_scaled",99942,99324,95766,87384,59770,40661\r
+"l3 + l2_scaled",99922,99445,96568,89109,63241,39819\r
diff --git a/caesar_break_parameter_trials.ipynb b/caesar_break_parameter_trials.ipynb
new file mode 100644 (file)
index 0000000..9e290b3
--- /dev/null
@@ -0,0 +1,935 @@
+{
+ "cells": [
+  {
+   "cell_type": "code",
+   "execution_count": 1,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "import random\n",
+    "import csv\n",
+    "import matplotlib as mpl\n",
+    "import matplotlib.pyplot as plt\n",
+    "%matplotlib inline\n",
+    "\n",
+    "import pandas as pd\n",
+    "\n",
+    "from support.utilities import *\n",
+    "from support.language_models import *\n",
+    "from support.norms import *\n",
+    "from cipher.caesar import *"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 2,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "trials = 100000"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 15,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "corpus = sanitise(cat([\n",
+    "    open('support/shakespeare.txt').read(), \n",
+    "    open('support/sherlock-holmes.txt').read(), \n",
+    "    open('support/war-and-peace.txt').read()\n",
+    "    ]))\n",
+    "corpus_length = len(corpus)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 8,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "def random_ciphertext(message_length):\n",
+    "    sample_start = random.randint(0, corpus_length - message_length)\n",
+    "    sample = corpus[sample_start:(sample_start + message_length)]\n",
+    "    key = random.randint(1, 25)\n",
+    "    ciphertext = caesar_encipher(sample, key)\n",
+    "    return key, ciphertext"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 25,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "(16, 'qhusedludjyedqbjxydw', 'areconventionalthing')"
+      ]
+     },
+     "execution_count": 25,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "k, c = random_ciphertext(20)\n",
+    "k, c, caesar_decipher(c, k)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 4,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "l2_scaled_english_counts = l2_scale(english_counts)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 5,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "metrics = [{'func': l1, 'invert': True, 'name': 'l1'}, \n",
+    "    {'func': l2, 'invert': True, 'name': 'l2'},\n",
+    "    {'func': l3, 'invert': True, 'name': 'l3'},\n",
+    "    {'func': cosine_similarity, 'invert': False, 'name': 'cosine_similarity'}]\n",
+    "    # {'func': harmonic_mean, 'invert': True, 'name': 'harmonic_mean'},\n",
+    "    # {'func': geometric_mean, 'invert': True, 'name': 'geometric_mean'}]\n",
+    "scalings = [{'corpus_frequency': normalised_english_counts, \n",
+    "         'scaling': l1_scale,\n",
+    "         'name': 'l1_scaled'},\n",
+    "        {'corpus_frequency': l2_scaled_english_counts, \n",
+    "         'scaling': l2_scale,\n",
+    "         'name': 'l2_scaled'}]\n",
+    "message_lengths = [100, 50, 30, 20, 10, 5]"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 6,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "def make_frequency_compare_function(\n",
+    "        target_frequency, frequency_scaling, metric, invert):\n",
+    "    def frequency_compare(text):\n",
+    "        counts = frequency_scaling(frequencies(text))\n",
+    "        if invert:\n",
+    "            score = -1 * metric(target_frequency, counts)\n",
+    "        else:\n",
+    "            score = metric(target_frequency, counts)\n",
+    "        return score\n",
+    "    return frequency_compare"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 7,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "models = (\n",
+    "    [ {'func': make_frequency_compare_function(\n",
+    "            s['corpus_frequency'], s['scaling'], \n",
+    "            m['func'], m['invert']),\n",
+    "       'name': '{} + {}'.format(m['name'], s['name'])}\n",
+    "        for m in metrics\n",
+    "        for s in scalings ] \n",
+    "    + \n",
+    "    [{'func': Pletters, 'name': 'Pletters'}, \n",
+    "     {'func': Pbigrams, 'name': 'Pbigrams'},\n",
+    "     {'func': Ptrigrams, 'name': 'Ptrigrams'}]\n",
+    ")"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 9,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "# def eval_models():\n",
+    "#     [eval_one_model(m, l) \n",
+    "#         for m in models\n",
+    "#         for l in message_lengths]"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 10,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "def eval_models():\n",
+    "    return {m['name']: {l: eval_one_model(m, l) for l in message_lengths}\n",
+    "               for m in models}"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 11,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "# def eval_one_model(model, message_length):\n",
+    "#     print(model['name'], message_length)\n",
+    "#     if model['name'] not in scores:\n",
+    "#         scores[model['name']] = collections.defaultdict(int)\n",
+    "#     for _ in range(trials):\n",
+    "#         key, ciphertext = random_ciphertext(message_length)\n",
+    "#         found_key, _ = caesar_break(ciphertext, model['func'])\n",
+    "#         if found_key == key:\n",
+    "#             scores[model['name']][message_length] += 1 \n",
+    "#     return scores[model['name']][message_length]"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 12,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "def eval_one_model(model, message_length):\n",
+    "    print(model['name'], message_length)\n",
+    "    successes = 0\n",
+    "    for _ in range(trials):\n",
+    "        key, ciphertext = random_ciphertext(message_length)\n",
+    "        found_key, _ = caesar_break(ciphertext, model['func'])\n",
+    "        if found_key == key:\n",
+    "            successes += 1 \n",
+    "    return successes"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 32,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "def write_results(scores):\n",
+    "    with open('caesar_break_parameter_trials.csv', 'w') as f:\n",
+    "        writer = csv.DictWriter(f, ['name'] + message_lengths, \n",
+    "            quoting=csv.QUOTE_NONNUMERIC)\n",
+    "        writer.writeheader()\n",
+    "        for scoring in sorted(scores):\n",
+    "            scores[scoring]['name'] = scoring\n",
+    "            writer.writerow(scores[scoring])"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 26,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "l1 + l1_scaled 100\n",
+      "l1 + l1_scaled 50\n",
+      "l1 + l1_scaled 30\n",
+      "l1 + l1_scaled 20\n",
+      "l1 + l1_scaled 10\n",
+      "l1 + l1_scaled 5\n",
+      "l1 + l2_scaled 100\n",
+      "l1 + l2_scaled 50\n",
+      "l1 + l2_scaled 30\n",
+      "l1 + l2_scaled 20\n",
+      "l1 + l2_scaled 10\n",
+      "l1 + l2_scaled 5\n",
+      "l2 + l1_scaled 100\n",
+      "l2 + l1_scaled 50\n",
+      "l2 + l1_scaled 30\n",
+      "l2 + l1_scaled 20\n",
+      "l2 + l1_scaled 10\n",
+      "l2 + l1_scaled 5\n",
+      "l2 + l2_scaled 100\n",
+      "l2 + l2_scaled 50\n",
+      "l2 + l2_scaled 30\n",
+      "l2 + l2_scaled 20\n",
+      "l2 + l2_scaled 10\n",
+      "l2 + l2_scaled 5\n",
+      "l3 + l1_scaled 100\n",
+      "l3 + l1_scaled 50\n",
+      "l3 + l1_scaled 30\n",
+      "l3 + l1_scaled 20\n",
+      "l3 + l1_scaled 10\n",
+      "l3 + l1_scaled 5\n",
+      "l3 + l2_scaled 100\n",
+      "l3 + l2_scaled 50\n",
+      "l3 + l2_scaled 30\n",
+      "l3 + l2_scaled 20\n",
+      "l3 + l2_scaled 10\n",
+      "l3 + l2_scaled 5\n",
+      "cosine_similarity + l1_scaled 100\n",
+      "cosine_similarity + l1_scaled 50\n",
+      "cosine_similarity + l1_scaled 30\n",
+      "cosine_similarity + l1_scaled 20\n",
+      "cosine_similarity + l1_scaled 10\n",
+      "cosine_similarity + l1_scaled 5\n",
+      "cosine_similarity + l2_scaled 100\n",
+      "cosine_similarity + l2_scaled 50\n",
+      "cosine_similarity + l2_scaled 30\n",
+      "cosine_similarity + l2_scaled 20\n",
+      "cosine_similarity + l2_scaled 10\n",
+      "cosine_similarity + l2_scaled 5\n",
+      "Pletters 100\n",
+      "Pletters 50\n",
+      "Pletters 30\n",
+      "Pletters 20\n",
+      "Pletters 10\n",
+      "Pletters 5\n",
+      "Pbigrams 100\n",
+      "Pbigrams 50\n",
+      "Pbigrams 30\n",
+      "Pbigrams 20\n",
+      "Pbigrams 10\n",
+      "Pbigrams 5\n",
+      "Ptrigrams 100\n",
+      "Ptrigrams 50\n",
+      "Ptrigrams 30\n",
+      "Ptrigrams 20\n",
+      "Ptrigrams 10\n",
+      "Ptrigrams 5\n"
+     ]
+    },
+    {
+     "data": {
+      "text/plain": [
+       "{'Pbigrams': {5: 67277,\n",
+       "  10: 95323,\n",
+       "  20: 99831,\n",
+       "  30: 99962,\n",
+       "  50: 99972,\n",
+       "  100: 99975},\n",
+       " 'Pletters': {5: 47758,\n",
+       "  10: 81597,\n",
+       "  20: 97936,\n",
+       "  30: 99683,\n",
+       "  50: 99937,\n",
+       "  100: 99952},\n",
+       " 'Ptrigrams': {5: 74922,\n",
+       "  10: 97994,\n",
+       "  20: 99944,\n",
+       "  30: 99990,\n",
+       "  50: 99994,\n",
+       "  100: 99991},\n",
+       " 'cosine_similarity + l1_scaled': {5: 43193,\n",
+       "  10: 71183,\n",
+       "  20: 93346,\n",
+       "  30: 98358,\n",
+       "  50: 99764,\n",
+       "  100: 99948},\n",
+       " 'cosine_similarity + l2_scaled': {5: 43259,\n",
+       "  10: 71353,\n",
+       "  20: 93399,\n",
+       "  30: 98345,\n",
+       "  50: 99768,\n",
+       "  100: 99946},\n",
+       " 'l1 + l1_scaled': {5: 42940,\n",
+       "  10: 72617,\n",
+       "  20: 95454,\n",
+       "  30: 98944,\n",
+       "  50: 99879,\n",
+       "  100: 99949},\n",
+       " 'l1 + l2_scaled': {5: 44413,\n",
+       "  10: 74966,\n",
+       "  20: 95350,\n",
+       "  30: 98996,\n",
+       "  50: 99889,\n",
+       "  100: 99945},\n",
+       " 'l2 + l1_scaled': {5: 43350,\n",
+       "  10: 71287,\n",
+       "  20: 93457,\n",
+       "  30: 98336,\n",
+       "  50: 99822,\n",
+       "  100: 99946},\n",
+       " 'l2 + l2_scaled': {5: 43288,\n",
+       "  10: 71413,\n",
+       "  20: 93471,\n",
+       "  30: 98274,\n",
+       "  50: 99796,\n",
+       "  100: 99957},\n",
+       " 'l3 + l1_scaled': {5: 40661,\n",
+       "  10: 59770,\n",
+       "  20: 87384,\n",
+       "  30: 95766,\n",
+       "  50: 99324,\n",
+       "  100: 99942},\n",
+       " 'l3 + l2_scaled': {5: 39819,\n",
+       "  10: 63241,\n",
+       "  20: 89109,\n",
+       "  30: 96568,\n",
+       "  50: 99445,\n",
+       "  100: 99922}}"
+      ]
+     },
+     "execution_count": 26,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "scores = eval_models()\n",
+    "scores"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 34,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "write_results(scores)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 35,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/html": [
+       "<div>\n",
+       "<table border=\"1\" class=\"dataframe\">\n",
+       "  <thead>\n",
+       "    <tr style=\"text-align: right;\">\n",
+       "      <th></th>\n",
+       "      <th>100</th>\n",
+       "      <th>50</th>\n",
+       "      <th>30</th>\n",
+       "      <th>20</th>\n",
+       "      <th>10</th>\n",
+       "      <th>5</th>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>name</th>\n",
+       "      <th></th>\n",
+       "      <th></th>\n",
+       "      <th></th>\n",
+       "      <th></th>\n",
+       "      <th></th>\n",
+       "      <th></th>\n",
+       "    </tr>\n",
+       "  </thead>\n",
+       "  <tbody>\n",
+       "    <tr>\n",
+       "      <th>Pbigrams</th>\n",
+       "      <td>99975</td>\n",
+       "      <td>99972</td>\n",
+       "      <td>99962</td>\n",
+       "      <td>99831</td>\n",
+       "      <td>95323</td>\n",
+       "      <td>67277</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>Pletters</th>\n",
+       "      <td>99952</td>\n",
+       "      <td>99937</td>\n",
+       "      <td>99683</td>\n",
+       "      <td>97936</td>\n",
+       "      <td>81597</td>\n",
+       "      <td>47758</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>Ptrigrams</th>\n",
+       "      <td>99991</td>\n",
+       "      <td>99994</td>\n",
+       "      <td>99990</td>\n",
+       "      <td>99944</td>\n",
+       "      <td>97994</td>\n",
+       "      <td>74922</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>cosine_similarity + l1_scaled</th>\n",
+       "      <td>99948</td>\n",
+       "      <td>99764</td>\n",
+       "      <td>98358</td>\n",
+       "      <td>93346</td>\n",
+       "      <td>71183</td>\n",
+       "      <td>43193</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>cosine_similarity + l2_scaled</th>\n",
+       "      <td>99946</td>\n",
+       "      <td>99768</td>\n",
+       "      <td>98345</td>\n",
+       "      <td>93399</td>\n",
+       "      <td>71353</td>\n",
+       "      <td>43259</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>l1 + l1_scaled</th>\n",
+       "      <td>99949</td>\n",
+       "      <td>99879</td>\n",
+       "      <td>98944</td>\n",
+       "      <td>95454</td>\n",
+       "      <td>72617</td>\n",
+       "      <td>42940</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>l1 + l2_scaled</th>\n",
+       "      <td>99945</td>\n",
+       "      <td>99889</td>\n",
+       "      <td>98996</td>\n",
+       "      <td>95350</td>\n",
+       "      <td>74966</td>\n",
+       "      <td>44413</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>l2 + l1_scaled</th>\n",
+       "      <td>99946</td>\n",
+       "      <td>99822</td>\n",
+       "      <td>98336</td>\n",
+       "      <td>93457</td>\n",
+       "      <td>71287</td>\n",
+       "      <td>43350</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>l2 + l2_scaled</th>\n",
+       "      <td>99957</td>\n",
+       "      <td>99796</td>\n",
+       "      <td>98274</td>\n",
+       "      <td>93471</td>\n",
+       "      <td>71413</td>\n",
+       "      <td>43288</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>l3 + l1_scaled</th>\n",
+       "      <td>99942</td>\n",
+       "      <td>99324</td>\n",
+       "      <td>95766</td>\n",
+       "      <td>87384</td>\n",
+       "      <td>59770</td>\n",
+       "      <td>40661</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>l3 + l2_scaled</th>\n",
+       "      <td>99922</td>\n",
+       "      <td>99445</td>\n",
+       "      <td>96568</td>\n",
+       "      <td>89109</td>\n",
+       "      <td>63241</td>\n",
+       "      <td>39819</td>\n",
+       "    </tr>\n",
+       "  </tbody>\n",
+       "</table>\n",
+       "</div>"
+      ],
+      "text/plain": [
+       "                                 100     50     30     20     10      5\n",
+       "name                                                                   \n",
+       "Pbigrams                       99975  99972  99962  99831  95323  67277\n",
+       "Pletters                       99952  99937  99683  97936  81597  47758\n",
+       "Ptrigrams                      99991  99994  99990  99944  97994  74922\n",
+       "cosine_similarity + l1_scaled  99948  99764  98358  93346  71183  43193\n",
+       "cosine_similarity + l2_scaled  99946  99768  98345  93399  71353  43259\n",
+       "l1 + l1_scaled                 99949  99879  98944  95454  72617  42940\n",
+       "l1 + l2_scaled                 99945  99889  98996  95350  74966  44413\n",
+       "l2 + l1_scaled                 99946  99822  98336  93457  71287  43350\n",
+       "l2 + l2_scaled                 99957  99796  98274  93471  71413  43288\n",
+       "l3 + l1_scaled                 99942  99324  95766  87384  59770  40661\n",
+       "l3 + l2_scaled                 99922  99445  96568  89109  63241  39819"
+      ]
+     },
+     "execution_count": 35,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "results = pd.read_csv('caesar_break_parameter_trials.csv').set_index('name')\n",
+    "results"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 36,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/html": [
+       "<div>\n",
+       "<table border=\"1\" class=\"dataframe\">\n",
+       "  <thead>\n",
+       "    <tr style=\"text-align: right;\">\n",
+       "      <th></th>\n",
+       "      <th>100</th>\n",
+       "      <th>50</th>\n",
+       "      <th>30</th>\n",
+       "      <th>20</th>\n",
+       "      <th>10</th>\n",
+       "      <th>5</th>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>name</th>\n",
+       "      <th></th>\n",
+       "      <th></th>\n",
+       "      <th></th>\n",
+       "      <th></th>\n",
+       "      <th></th>\n",
+       "      <th></th>\n",
+       "    </tr>\n",
+       "  </thead>\n",
+       "  <tbody>\n",
+       "    <tr>\n",
+       "      <th>l3 + l2_scaled</th>\n",
+       "      <td>99922</td>\n",
+       "      <td>99445</td>\n",
+       "      <td>96568</td>\n",
+       "      <td>89109</td>\n",
+       "      <td>63241</td>\n",
+       "      <td>39819</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>l3 + l1_scaled</th>\n",
+       "      <td>99942</td>\n",
+       "      <td>99324</td>\n",
+       "      <td>95766</td>\n",
+       "      <td>87384</td>\n",
+       "      <td>59770</td>\n",
+       "      <td>40661</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>l1 + l1_scaled</th>\n",
+       "      <td>99949</td>\n",
+       "      <td>99879</td>\n",
+       "      <td>98944</td>\n",
+       "      <td>95454</td>\n",
+       "      <td>72617</td>\n",
+       "      <td>42940</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>cosine_similarity + l1_scaled</th>\n",
+       "      <td>99948</td>\n",
+       "      <td>99764</td>\n",
+       "      <td>98358</td>\n",
+       "      <td>93346</td>\n",
+       "      <td>71183</td>\n",
+       "      <td>43193</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>cosine_similarity + l2_scaled</th>\n",
+       "      <td>99946</td>\n",
+       "      <td>99768</td>\n",
+       "      <td>98345</td>\n",
+       "      <td>93399</td>\n",
+       "      <td>71353</td>\n",
+       "      <td>43259</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>l2 + l2_scaled</th>\n",
+       "      <td>99957</td>\n",
+       "      <td>99796</td>\n",
+       "      <td>98274</td>\n",
+       "      <td>93471</td>\n",
+       "      <td>71413</td>\n",
+       "      <td>43288</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>l2 + l1_scaled</th>\n",
+       "      <td>99946</td>\n",
+       "      <td>99822</td>\n",
+       "      <td>98336</td>\n",
+       "      <td>93457</td>\n",
+       "      <td>71287</td>\n",
+       "      <td>43350</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>l1 + l2_scaled</th>\n",
+       "      <td>99945</td>\n",
+       "      <td>99889</td>\n",
+       "      <td>98996</td>\n",
+       "      <td>95350</td>\n",
+       "      <td>74966</td>\n",
+       "      <td>44413</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>Pletters</th>\n",
+       "      <td>99952</td>\n",
+       "      <td>99937</td>\n",
+       "      <td>99683</td>\n",
+       "      <td>97936</td>\n",
+       "      <td>81597</td>\n",
+       "      <td>47758</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>Pbigrams</th>\n",
+       "      <td>99975</td>\n",
+       "      <td>99972</td>\n",
+       "      <td>99962</td>\n",
+       "      <td>99831</td>\n",
+       "      <td>95323</td>\n",
+       "      <td>67277</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>Ptrigrams</th>\n",
+       "      <td>99991</td>\n",
+       "      <td>99994</td>\n",
+       "      <td>99990</td>\n",
+       "      <td>99944</td>\n",
+       "      <td>97994</td>\n",
+       "      <td>74922</td>\n",
+       "    </tr>\n",
+       "  </tbody>\n",
+       "</table>\n",
+       "</div>"
+      ],
+      "text/plain": [
+       "                                 100     50     30     20     10      5\n",
+       "name                                                                   \n",
+       "l3 + l2_scaled                 99922  99445  96568  89109  63241  39819\n",
+       "l3 + l1_scaled                 99942  99324  95766  87384  59770  40661\n",
+       "l1 + l1_scaled                 99949  99879  98944  95454  72617  42940\n",
+       "cosine_similarity + l1_scaled  99948  99764  98358  93346  71183  43193\n",
+       "cosine_similarity + l2_scaled  99946  99768  98345  93399  71353  43259\n",
+       "l2 + l2_scaled                 99957  99796  98274  93471  71413  43288\n",
+       "l2 + l1_scaled                 99946  99822  98336  93457  71287  43350\n",
+       "l1 + l2_scaled                 99945  99889  98996  95350  74966  44413\n",
+       "Pletters                       99952  99937  99683  97936  81597  47758\n",
+       "Pbigrams                       99975  99972  99962  99831  95323  67277\n",
+       "Ptrigrams                      99991  99994  99990  99944  97994  74922"
+      ]
+     },
+     "execution_count": 36,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "results.sort_values('5')"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 42,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "image/png": "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\n",
+      "text/plain": [
+       "<matplotlib.figure.Figure at 0x7f9dbbf9e320>"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "ax = results.sort_values('5', ascending=False).T.plot(figsize=(12, 8))\n",
+    "ax.legend(loc='center left', bbox_to_anchor=(0.1, 0.5))\n",
+    "\n",
+    "# ubtg[['unigrams', 'bigrams', 'trigrams']].plot(figsize=(8, 6), ylim=(0, 1.1))\n",
+    "plt.savefig('blog-images/caesar_break_parameter_trials.png')"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 38,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/html": [
+       "<div>\n",
+       "<table border=\"1\" class=\"dataframe\">\n",
+       "  <thead>\n",
+       "    <tr style=\"text-align: right;\">\n",
+       "      <th></th>\n",
+       "      <th>100</th>\n",
+       "      <th>50</th>\n",
+       "      <th>30</th>\n",
+       "      <th>20</th>\n",
+       "      <th>10</th>\n",
+       "      <th>5</th>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>name</th>\n",
+       "      <th></th>\n",
+       "      <th></th>\n",
+       "      <th></th>\n",
+       "      <th></th>\n",
+       "      <th></th>\n",
+       "      <th></th>\n",
+       "    </tr>\n",
+       "  </thead>\n",
+       "  <tbody>\n",
+       "    <tr>\n",
+       "      <th>Pbigrams</th>\n",
+       "      <td>0.99981</td>\n",
+       "      <td>0.99978</td>\n",
+       "      <td>0.999680</td>\n",
+       "      <td>0.998370</td>\n",
+       "      <td>0.953287</td>\n",
+       "      <td>0.672810</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>Pletters</th>\n",
+       "      <td>0.99958</td>\n",
+       "      <td>0.99943</td>\n",
+       "      <td>0.996890</td>\n",
+       "      <td>0.979419</td>\n",
+       "      <td>0.816019</td>\n",
+       "      <td>0.477609</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>Ptrigrams</th>\n",
+       "      <td>0.99997</td>\n",
+       "      <td>1.00000</td>\n",
+       "      <td>0.999960</td>\n",
+       "      <td>0.999500</td>\n",
+       "      <td>0.979999</td>\n",
+       "      <td>0.749265</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>cosine_similarity + l1_scaled</th>\n",
+       "      <td>0.99954</td>\n",
+       "      <td>0.99770</td>\n",
+       "      <td>0.983639</td>\n",
+       "      <td>0.933516</td>\n",
+       "      <td>0.711873</td>\n",
+       "      <td>0.431956</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>cosine_similarity + l2_scaled</th>\n",
+       "      <td>0.99952</td>\n",
+       "      <td>0.99774</td>\n",
+       "      <td>0.983509</td>\n",
+       "      <td>0.934046</td>\n",
+       "      <td>0.713573</td>\n",
+       "      <td>0.432616</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>l1 + l1_scaled</th>\n",
+       "      <td>0.99955</td>\n",
+       "      <td>0.99885</td>\n",
+       "      <td>0.989499</td>\n",
+       "      <td>0.954597</td>\n",
+       "      <td>0.726214</td>\n",
+       "      <td>0.429426</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>l1 + l2_scaled</th>\n",
+       "      <td>0.99951</td>\n",
+       "      <td>0.99895</td>\n",
+       "      <td>0.990019</td>\n",
+       "      <td>0.953557</td>\n",
+       "      <td>0.749705</td>\n",
+       "      <td>0.444157</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>l2 + l1_scaled</th>\n",
+       "      <td>0.99952</td>\n",
+       "      <td>0.99828</td>\n",
+       "      <td>0.983419</td>\n",
+       "      <td>0.934626</td>\n",
+       "      <td>0.712913</td>\n",
+       "      <td>0.433526</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>l2 + l2_scaled</th>\n",
+       "      <td>0.99963</td>\n",
+       "      <td>0.99802</td>\n",
+       "      <td>0.982799</td>\n",
+       "      <td>0.934766</td>\n",
+       "      <td>0.714173</td>\n",
+       "      <td>0.432906</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>l3 + l1_scaled</th>\n",
+       "      <td>0.99948</td>\n",
+       "      <td>0.99330</td>\n",
+       "      <td>0.957717</td>\n",
+       "      <td>0.873892</td>\n",
+       "      <td>0.597736</td>\n",
+       "      <td>0.406634</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>l3 + l2_scaled</th>\n",
+       "      <td>0.99928</td>\n",
+       "      <td>0.99451</td>\n",
+       "      <td>0.965738</td>\n",
+       "      <td>0.891143</td>\n",
+       "      <td>0.632448</td>\n",
+       "      <td>0.398214</td>\n",
+       "    </tr>\n",
+       "  </tbody>\n",
+       "</table>\n",
+       "</div>"
+      ],
+      "text/plain": [
+       "                                   100       50        30        20        10  \\\n",
+       "name                                                                            \n",
+       "Pbigrams                       0.99981  0.99978  0.999680  0.998370  0.953287   \n",
+       "Pletters                       0.99958  0.99943  0.996890  0.979419  0.816019   \n",
+       "Ptrigrams                      0.99997  1.00000  0.999960  0.999500  0.979999   \n",
+       "cosine_similarity + l1_scaled  0.99954  0.99770  0.983639  0.933516  0.711873   \n",
+       "cosine_similarity + l2_scaled  0.99952  0.99774  0.983509  0.934046  0.713573   \n",
+       "l1 + l1_scaled                 0.99955  0.99885  0.989499  0.954597  0.726214   \n",
+       "l1 + l2_scaled                 0.99951  0.99895  0.990019  0.953557  0.749705   \n",
+       "l2 + l1_scaled                 0.99952  0.99828  0.983419  0.934626  0.712913   \n",
+       "l2 + l2_scaled                 0.99963  0.99802  0.982799  0.934766  0.714173   \n",
+       "l3 + l1_scaled                 0.99948  0.99330  0.957717  0.873892  0.597736   \n",
+       "l3 + l2_scaled                 0.99928  0.99451  0.965738  0.891143  0.632448   \n",
+       "\n",
+       "                                      5  \n",
+       "name                                     \n",
+       "Pbigrams                       0.672810  \n",
+       "Pletters                       0.477609  \n",
+       "Ptrigrams                      0.749265  \n",
+       "cosine_similarity + l1_scaled  0.431956  \n",
+       "cosine_similarity + l2_scaled  0.432616  \n",
+       "l1 + l1_scaled                 0.429426  \n",
+       "l1 + l2_scaled                 0.444157  \n",
+       "l2 + l1_scaled                 0.433526  \n",
+       "l2 + l2_scaled                 0.432906  \n",
+       "l3 + l1_scaled                 0.406634  \n",
+       "l3 + l2_scaled                 0.398214  "
+      ]
+     },
+     "execution_count": 38,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "results / results.max().max()"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": []
+  }
+ ],
+ "metadata": {
+  "kernelspec": {
+   "display_name": "Python 3",
+   "language": "python",
+   "name": "python3"
+  },
+  "language_info": {
+   "codemirror_mode": {
+    "name": "ipython",
+    "version": 3
+   },
+   "file_extension": ".py",
+   "mimetype": "text/x-python",
+   "name": "python",
+   "nbconvert_exporter": "python",
+   "pygments_lexer": "ipython3",
+   "version": "3.6.3"
+  }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 2
+}
diff --git a/caesar_break_parameter_trials.py b/caesar_break_parameter_trials.py
new file mode 100644 (file)
index 0000000..490c258
--- /dev/null
@@ -0,0 +1,89 @@
+import random
+import csv
+from support.utilities import *
+from support.language_models import *
+from support.norms import *
+from cipher.caesar import *
+
+trials = 100
+
+corpus = sanitise(cat([
+    open('support/shakespeare.txt').read(), 
+    open('support/sherlock-holmes.txt').read(), 
+    open('support/war-and-peace.txt').read()
+    ]))
+corpus_length = len(corpus)
+
+euclidean_scaled_english_counts = euclidean_scale(english_counts)
+
+metrics = [{'func': l1, 'invert': True, 'name': 'l1'}, 
+    {'func': l2, 'invert': True, 'name': 'l2'},
+    {'func': l3, 'invert': True, 'name': 'l3'},
+    {'func': cosine_similarity, 'invert': False, 'name': 'cosine_similarity'}]
+
+scalings = [{'corpus_frequency': normalised_english_counts, 
+         'scaling': normalise,
+         'name': 'normalised'},
+        {'corpus_frequency': euclidean_scaled_english_counts, 
+         'scaling': euclidean_scale,
+         'name': 'euclidean_scaled'}]
+
+message_lengths = [100, 50, 30, 20, 10, 5]
+
+def make_frequency_compare_function(
+        target_frequency, frequency_scaling, metric, invert):
+    def frequency_compare(text):
+        counts = frequency_scaling(frequencies(text))
+        if invert:
+            score = -1 * metric(target_frequency, counts)
+        else:
+            score = metric(target_frequency, counts)
+        return score
+    return frequency_compare
+
+models = (
+    [ {'func': make_frequency_compare_function(
+            s['corpus_frequency'], s['scaling'], 
+            m['func'], m['invert']),
+       'name': '{} + {}'.format(m['name'], s['name'])}
+        for m in metrics
+        for s in scalings ] 
+    + 
+    [{'func': Pletters, 'name': 'Pletters'}, 
+     {'func': Pbigrams, 'name': 'Pbigrams'},
+     {'func': Ptrigrams, 'name': 'Ptrigrams'}]
+)
+
+def random_ciphertext(message_length):
+    sample_start = random.randint(0, corpus_length - message_length)
+    sample = corpus[sample_start:(sample_start + message_length)]
+    key = random.randint(1, 25)
+    ciphertext = caesar_encipher(sample, key)
+    return key, ciphertext
+
+
+def eval_models():
+    return {m['name']: {l: eval_one_model(m, l) for l in message_lengths}
+               for m in models}
+
+def eval_one_model(model, message_length):
+    print(model['name'], message_length)
+    successes = 0
+    for _ in range(trials):
+        key, ciphertext = random_ciphertext(message_length)
+        found_key, _ = caesar_break(ciphertext, model['func'])
+        if found_key == key:
+            successes += 1 
+    return successes
+
+def write_results(scores):
+    with open('caesar_break_parameter_trials.csv', 'w') as f:
+        writer = csv.DictWriter(f, ['name'] + message_lengths, 
+            quoting=csv.QUOTE_NONNUMERIC)
+        writer.writeheader()
+        for scoring in sorted(scores):
+            scores[scoring]['name'] = scoring
+            writer.writerow(scores[scoring])
+
+scores = eval_models()
+write_results(scores)
diff --git a/find_best_caesar_break_parameters.py b/find_best_caesar_break_parameters.py
deleted file mode 100644 (file)
index 7a8ddc9..0000000
+++ /dev/null
@@ -1,80 +0,0 @@
-import random
-import collections
-from cipher import *
-from cipherbreak import *
-import itertools
-import csv
-
-corpus = sanitise(''.join([open('shakespeare.txt', 'r').read(), 
-    open('sherlock-holmes.txt', 'r').read(), 
-    open('war-and-peace.txt', 'r').read()]))
-corpus_length = len(corpus)
-
-euclidean_scaled_english_counts = norms.euclidean_scale(english_counts)
-
-metrics = [{'func': norms.l1, 'invert': True, 'name': 'l1'}, 
-    {'func': norms.l2, 'invert': True, 'name': 'l2'},
-    {'func': norms.l3, 'invert': True, 'name': 'l3'},
-    {'func': norms.cosine_similarity, 'invert': False, 'name': 'cosine_similarity'}]
-    # {'func': norms.harmonic_mean, 'invert': True, 'name': 'harmonic_mean'},
-    # {'func': norms.geometric_mean, 'invert': True, 'name': 'geometric_mean'}]
-scalings = [{'corpus_frequency': normalised_english_counts, 
-         'scaling': norms.normalise,
-         'name': 'normalised'},
-        {'corpus_frequency': euclidean_scaled_english_counts, 
-         'scaling': norms.euclidean_scale,
-         'name': 'euclidean_scaled'}]
-message_lengths = [100, 50, 30, 20, 10, 5]
-
-trials = 5000
-
-scores = {}
-
-
-def make_frequency_compare_function(target_frequency, frequency_scaling, metric, invert):
-    def frequency_compare(text):
-        counts = frequency_scaling(frequencies(text))
-        if invert:
-            score = -1 * metric(target_frequency, counts)
-        else:
-            score = metric(target_frequency, counts)
-        return score
-    return frequency_compare
-
-def scoring_functions():
-    return [{'func': make_frequency_compare_function(s['corpus_frequency'], 
-                s['scaling'], m['func'], m['invert']),
-            'name': '{} + {}'.format(m['name'], s['name'])}
-        for m in metrics
-        for s in scalings] + [{'func': Pletters, 'name': 'Pletters'}]
-
-def eval_scores():
-    [eval_one_score(f, l) 
-        for f in scoring_functions()
-        for l in message_lengths]
-
-def eval_one_score(scoring_function, message_length):
-    print(scoring_function['name'], message_length)
-    if scoring_function['name'] not in scores:
-        scores[scoring_function['name']] = collections.defaultdict(int)
-    for _ in range(trials):
-        sample_start = random.randint(0, corpus_length - message_length)
-        sample = corpus[sample_start:(sample_start + message_length)]
-        key = random.randint(1, 25)
-        ciphertext = caesar_encipher(sample, key)
-        found_key, _ = caesar_break(ciphertext, scoring_function['func'])
-        if found_key == key:
-            scores[scoring_function['name']][message_length] += 1 
-    return scores[scoring_function['name']][message_length]
-
-def show_results():
-    with open('caesar_break_parameter_trials.csv', 'w') as f:
-        writer = csv.DictWriter(f, ['name'] + message_lengths, 
-            quoting=csv.QUOTE_NONNUMERIC)
-        writer.writeheader()
-        for scoring in sorted(scores):
-            scores[scoring]['name'] = scoring
-            writer.writerow(scores[scoring])
-
-eval_scores()
-show_results()
diff --git a/letter-treemap.png b/letter-treemap.png
deleted file mode 100644 (file)
index 6cde8ed..0000000
Binary files a/letter-treemap.png and /dev/null differ
diff --git a/show-ngram-counts.ipynb b/show-ngram-counts.ipynb
new file mode 100644 (file)
index 0000000..aa4f289
--- /dev/null
@@ -0,0 +1,494 @@
+{
+ "cells": [
+  {
+   "cell_type": "code",
+   "execution_count": 28,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "import matplotlib as mpl\n",
+    "import matplotlib.pyplot as plt\n",
+    "%matplotlib inline\n",
+    "\n",
+    "import numpy as np\n",
+    "import pandas as pd\n",
+    "\n",
+    "from support.language_models import *\n",
+    "from support.norms import *"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 29,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "<matplotlib.axes._subplots.AxesSubplot at 0x7fecb2d1f780>"
+      ]
+     },
+     "execution_count": 29,
+     "metadata": {},
+     "output_type": "execute_result"
+    },
+    {
+     "data": {
+      "image/png": "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\n",
+      "text/plain": [
+       "<matplotlib.figure.Figure at 0x7fecb30d9e80>"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "pd.Series(scale(english_counts, linf)).sort_values(ascending=False).plot()"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 30,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "<matplotlib.axes._subplots.AxesSubplot at 0x7fecb2d45358>"
+      ]
+     },
+     "execution_count": 30,
+     "metadata": {},
+     "output_type": "execute_result"
+    },
+    {
+     "data": {
+      "image/png": "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\n",
+      "text/plain": [
+       "<matplotlib.figure.Figure at 0x7fecb2e03358>"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "pd.Series(scale(english_bigram_counts, linf)).sort_values(ascending=False).plot()"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 31,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "<matplotlib.axes._subplots.AxesSubplot at 0x7fecb42f5160>"
+      ]
+     },
+     "execution_count": 31,
+     "metadata": {},
+     "output_type": "execute_result"
+    },
+    {
+     "data": {
+      "image/png": "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\n",
+      "text/plain": [
+       "<matplotlib.figure.Figure at 0x7fecb527a908>"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "pd.Series(scale(english_trigram_counts, linf)).sort_values(ascending=False).plot()"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 32,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "RangeIndex(start=0, stop=26, step=1)"
+      ]
+     },
+     "execution_count": 32,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "ug = pd.Series(scale(english_counts, linf)).sort_values(ascending=False).reset_index()\n",
+    "ug.index"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 33,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "RangeIndex(start=0, stop=676, step=1)"
+      ]
+     },
+     "execution_count": 33,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "bg = pd.Series(scale(english_bigram_counts, linf)).sort_values(ascending=False).reset_index()\n",
+    "bg.index"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 34,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "RangeIndex(start=0, stop=17576, step=1)"
+      ]
+     },
+     "execution_count": 34,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "tg = pd.Series(scale(english_trigram_counts, linf)).sort_values(ascending=False).reset_index()\n",
+    "tg.index"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 35,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "RangeIndex(start=0, stop=17576, step=26)"
+      ]
+     },
+     "execution_count": 35,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "ugi = pd.RangeIndex(start=0, stop=26**3, step=26**2)\n",
+    "bgi = pd.RangeIndex(start=0, stop=26**3, step=26)\n",
+    "tgi = pd.RangeIndex(start=0, stop=26**3, step=1)\n",
+    "bgi"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 38,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/html": [
+       "<div>\n",
+       "<table border=\"1\" class=\"dataframe\">\n",
+       "  <thead>\n",
+       "    <tr style=\"text-align: right;\">\n",
+       "      <th></th>\n",
+       "      <th>index</th>\n",
+       "      <th>0</th>\n",
+       "    </tr>\n",
+       "  </thead>\n",
+       "  <tbody>\n",
+       "    <tr>\n",
+       "      <th>0</th>\n",
+       "      <td>the</td>\n",
+       "      <td>1.000000</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>1</th>\n",
+       "      <td>ing</td>\n",
+       "      <td>0.532595</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>2</th>\n",
+       "      <td>and</td>\n",
+       "      <td>0.529235</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>3</th>\n",
+       "      <td>ion</td>\n",
+       "      <td>0.486067</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>4</th>\n",
+       "      <td>tio</td>\n",
+       "      <td>0.398344</td>\n",
+       "    </tr>\n",
+       "  </tbody>\n",
+       "</table>\n",
+       "</div>"
+      ],
+      "text/plain": [
+       "  index         0\n",
+       "0   the  1.000000\n",
+       "1   ing  0.532595\n",
+       "2   and  0.529235\n",
+       "3   ion  0.486067\n",
+       "4   tio  0.398344"
+      ]
+     },
+     "execution_count": 38,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "ug.index = ugi\n",
+    "bg.index = bgi\n",
+    "tg.head()"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 46,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/html": [
+       "<div>\n",
+       "<table border=\"1\" class=\"dataframe\">\n",
+       "  <thead>\n",
+       "    <tr style=\"text-align: right;\">\n",
+       "      <th></th>\n",
+       "      <th>index</th>\n",
+       "      <th>0</th>\n",
+       "      <th>index</th>\n",
+       "      <th>0</th>\n",
+       "      <th>index</th>\n",
+       "      <th>0</th>\n",
+       "    </tr>\n",
+       "  </thead>\n",
+       "  <tbody>\n",
+       "    <tr>\n",
+       "      <th>0</th>\n",
+       "      <td>e</td>\n",
+       "      <td>1.0</td>\n",
+       "      <td>in</td>\n",
+       "      <td>1.0</td>\n",
+       "      <td>the</td>\n",
+       "      <td>1.000000</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>1</th>\n",
+       "      <td>e</td>\n",
+       "      <td>1.0</td>\n",
+       "      <td>in</td>\n",
+       "      <td>1.0</td>\n",
+       "      <td>ing</td>\n",
+       "      <td>0.532595</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>2</th>\n",
+       "      <td>e</td>\n",
+       "      <td>1.0</td>\n",
+       "      <td>in</td>\n",
+       "      <td>1.0</td>\n",
+       "      <td>and</td>\n",
+       "      <td>0.529235</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>3</th>\n",
+       "      <td>e</td>\n",
+       "      <td>1.0</td>\n",
+       "      <td>in</td>\n",
+       "      <td>1.0</td>\n",
+       "      <td>ion</td>\n",
+       "      <td>0.486067</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>4</th>\n",
+       "      <td>e</td>\n",
+       "      <td>1.0</td>\n",
+       "      <td>in</td>\n",
+       "      <td>1.0</td>\n",
+       "      <td>tio</td>\n",
+       "      <td>0.398344</td>\n",
+       "    </tr>\n",
+       "  </tbody>\n",
+       "</table>\n",
+       "</div>"
+      ],
+      "text/plain": [
+       "  index    0 index    0 index         0\n",
+       "0     e  1.0    in  1.0   the  1.000000\n",
+       "1     e  1.0    in  1.0   ing  0.532595\n",
+       "2     e  1.0    in  1.0   and  0.529235\n",
+       "3     e  1.0    in  1.0   ion  0.486067\n",
+       "4     e  1.0    in  1.0   tio  0.398344"
+      ]
+     },
+     "execution_count": 46,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "ubtg = pd.concat([ug, bg, tg], axis=1)\n",
+    "ubtg.fillna(method='pad', inplace=True)\n",
+    "ubtg.head()"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 49,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/html": [
+       "<div>\n",
+       "<table border=\"1\" class=\"dataframe\">\n",
+       "  <thead>\n",
+       "    <tr style=\"text-align: right;\">\n",
+       "      <th></th>\n",
+       "      <th>ug</th>\n",
+       "      <th>unigrams</th>\n",
+       "      <th>bg</th>\n",
+       "      <th>bigrams</th>\n",
+       "      <th>tg</th>\n",
+       "      <th>trigrams</th>\n",
+       "    </tr>\n",
+       "  </thead>\n",
+       "  <tbody>\n",
+       "    <tr>\n",
+       "      <th>0</th>\n",
+       "      <td>e</td>\n",
+       "      <td>1.0</td>\n",
+       "      <td>in</td>\n",
+       "      <td>1.0</td>\n",
+       "      <td>the</td>\n",
+       "      <td>1.000000</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>1</th>\n",
+       "      <td>e</td>\n",
+       "      <td>1.0</td>\n",
+       "      <td>in</td>\n",
+       "      <td>1.0</td>\n",
+       "      <td>ing</td>\n",
+       "      <td>0.532595</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>2</th>\n",
+       "      <td>e</td>\n",
+       "      <td>1.0</td>\n",
+       "      <td>in</td>\n",
+       "      <td>1.0</td>\n",
+       "      <td>and</td>\n",
+       "      <td>0.529235</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>3</th>\n",
+       "      <td>e</td>\n",
+       "      <td>1.0</td>\n",
+       "      <td>in</td>\n",
+       "      <td>1.0</td>\n",
+       "      <td>ion</td>\n",
+       "      <td>0.486067</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>4</th>\n",
+       "      <td>e</td>\n",
+       "      <td>1.0</td>\n",
+       "      <td>in</td>\n",
+       "      <td>1.0</td>\n",
+       "      <td>tio</td>\n",
+       "      <td>0.398344</td>\n",
+       "    </tr>\n",
+       "  </tbody>\n",
+       "</table>\n",
+       "</div>"
+      ],
+      "text/plain": [
+       "  ug  unigrams  bg  bigrams   tg  trigrams\n",
+       "0  e       1.0  in      1.0  the  1.000000\n",
+       "1  e       1.0  in      1.0  ing  0.532595\n",
+       "2  e       1.0  in      1.0  and  0.529235\n",
+       "3  e       1.0  in      1.0  ion  0.486067\n",
+       "4  e       1.0  in      1.0  tio  0.398344"
+      ]
+     },
+     "execution_count": 49,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "ubtg.columns = ['ug', 'unigrams', 'bg', 'bigrams', 'tg', 'trigrams']\n",
+    "ubtg.head()"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 60,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "image/png": "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\n",
+      "text/plain": [
+       "<matplotlib.figure.Figure at 0x7fecb2ac4eb8>"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "ubtg[['unigrams', 'bigrams', 'trigrams']].plot(figsize=(8, 6), ylim=(0, 1.1))\n",
+    "plt.savefig('blog-images/ubtgram-relative-counts.png')"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": []
+  }
+ ],
+ "metadata": {
+  "kernelspec": {
+   "display_name": "Python 3",
+   "language": "python",
+   "name": "python3"
+  },
+  "language_info": {
+   "codemirror_mode": {
+    "name": "ipython",
+    "version": 3
+   },
+   "file_extension": ".py",
+   "mimetype": "text/x-python",
+   "name": "python",
+   "nbconvert_exporter": "python",
+   "pygments_lexer": "ipython3",
+   "version": "3.6.3"
+  }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 2
+}
index eb436c3b8163141a3ada1f1f02f8be741d6f47fb..f131ad597035bbb905a1ec0b875291a49dca8aea 100644 (file)
@@ -1,43 +1,35 @@
 import collections
 from math import log10
 
-def normalise(frequencies):
-    """Scale a set of frequencies so they sum to one
-    
-    >>> sorted(normalise({1: 1, 2: 0}).items())
-    [(1, 1.0), (2, 0.0)]
-    >>> sorted(normalise({1: 1, 2: 1}).items())
-    [(1, 0.5), (2, 0.5)]
-    >>> sorted(normalise({1: 1, 2: 1, 3: 1}).items()) # doctest: +ELLIPSIS
-    [(1, 0.333...), (2, 0.333...), (3, 0.333...)]
-    >>> sorted(normalise({1: 1, 2: 2, 3: 1}).items())
-    [(1, 0.25), (2, 0.5), (3, 0.25)]
-    """
-    length = sum(f for f in frequencies.values())
-    return collections.defaultdict(int, ((k, v / length) 
-        for (k, v) in frequencies.items()))
 
-def euclidean_scale(frequencies):
-    """Scale a set of frequencies so they have a unit euclidean length
-    
-    >>> sorted(euclidean_scale({1: 1, 2: 0}).items())
-    [(1, 1.0), (2, 0.0)]
-    >>> sorted(euclidean_scale({1: 1, 2: 1}).items()) # doctest: +ELLIPSIS
-    [(1, 0.7071067...), (2, 0.7071067...)]
-    >>> sorted(euclidean_scale({1: 1, 2: 1, 3: 1}).items()) # doctest: +ELLIPSIS
-    [(1, 0.577350...), (2, 0.577350...), (3, 0.577350...)]
-    >>> sorted(euclidean_scale({1: 1, 2: 2, 3: 1}).items()) # doctest: +ELLIPSIS
-    [(1, 0.408248...), (2, 0.81649658...), (3, 0.408248...)]
+def lp(v1, v2=None, p=2):
+    """Find the L_p norm. If passed one vector, find the length of that vector.
+    If passed two vectors, find the length of the difference between them.
     """
-    length = sum([f ** 2 for f in frequencies.values()]) ** 0.5
-    return collections.defaultdict(int, ((k, v / length) 
-        for (k, v) in frequencies.items()))
+    if v2:
+        vec = {k: abs(v1[k] - v2[k]) for k in (v1.keys() | v2.keys())}
+    else:
+        vec = v1
+    return sum(v ** p for v in vec.values()) ** (1.0 / p)
 
-def identity_scale(frequencies):
-    return frequencies
-        
+def l1(v1, v2=None):
+    """Finds the distances between two frequency profiles, expressed as 
+    dictionaries. Assumes every key in frequencies1 is also in frequencies2
+
+    >>> l1({'a':1, 'b':1, 'c':1}, {'a':1, 'b':1, 'c':1})
+    0.0
+    >>> l1({'a':2, 'b':2, 'c':2}, {'a':1, 'b':1, 'c':1})
+    3.0
+    >>> l1(normalise({'a':2, 'b':2, 'c':2}), normalise({'a':1, 'b':1, 'c':1}))
+    0.0
+    >>> l1({'a':0, 'b':2, 'c':0}, {'a':1, 'b':1, 'c':1})
+    3.0
+    >>> l1({'a':0, 'b':1}, {'a':1, 'b':1})
+    1.0
+    """    
+    return lp(v1, v2, 1)
 
-def l2(frequencies1, frequencies2):
+def l2(v1, v2=None):
     """Finds the distances between two frequency profiles, expressed as dictionaries.
     Assumes every key in frequencies1 is also in frequencies2
     
@@ -55,33 +47,9 @@ def l2(frequencies1, frequencies2):
     >>> l2({'a':0, 'b':1}, {'a':1, 'b':1})
     1.0
     """
-    total = 0
-    for k in frequencies1:
-        total += (frequencies1[k] - frequencies2[k]) ** 2
-    return total ** 0.5
-euclidean_distance = l2
-
-def l1(frequencies1, frequencies2):
-    """Finds the distances between two frequency profiles, expressed as 
-    dictionaries. Assumes every key in frequencies1 is also in frequencies2
-
-    >>> l1({'a':1, 'b':1, 'c':1}, {'a':1, 'b':1, 'c':1})
-    0
-    >>> l1({'a':2, 'b':2, 'c':2}, {'a':1, 'b':1, 'c':1})
-    3
-    >>> l1(normalise({'a':2, 'b':2, 'c':2}), normalise({'a':1, 'b':1, 'c':1}))
-    0.0
-    >>> l1({'a':0, 'b':2, 'c':0}, {'a':1, 'b':1, 'c':1})
-    3
-    >>> l1({'a':0, 'b':1}, {'a':1, 'b':1})
-    1
-    """
-    total = 0
-    for k in frequencies1:
-        total += abs(frequencies1[k] - frequencies2[k])
-    return total
+    return lp(v1, v2, 2)
 
-def l3(frequencies1, frequencies2):
+def l3(v1, v2=None):
     """Finds the distances between two frequency profiles, expressed as 
     dictionaries. Assumes every key in frequencies1 is also in frequencies2
 
@@ -99,10 +67,53 @@ def l3(frequencies1, frequencies2):
     >>> l3(normalise({'a':0, 'b':1}), normalise({'a':1, 'b':1})) # doctest: +ELLIPSIS
     0.6299605249...
     """
-    total = 0
-    for k in frequencies1:
-        total += abs(frequencies1[k] - frequencies2[k]) ** 3
-    return total ** (1/3)
+    return lp(v1, v2, 3)
+
+def linf(v1, v2=None):    
+    if v2:
+        vec = {k: abs(v1[k] - v2[k]) for k in (v1.keys() | v2.keys())}
+    else:
+        vec = v1
+    return max(v for v in vec.values())
+
+
+def scale(frequencies, norm=l2):
+    length = norm(frequencies)
+    return collections.defaultdict(int, 
+        {k: v / length for k, v in frequencies.items()})
+
+def l2_scale(f):
+    """Scale a set of frequencies so they have a unit euclidean length
+    
+    >>> sorted(euclidean_scale({1: 1, 2: 0}).items())
+    [(1, 1.0), (2, 0.0)]
+    >>> sorted(euclidean_scale({1: 1, 2: 1}).items()) # doctest: +ELLIPSIS
+    [(1, 0.7071067...), (2, 0.7071067...)]
+    >>> sorted(euclidean_scale({1: 1, 2: 1, 3: 1}).items()) # doctest: +ELLIPSIS
+    [(1, 0.577350...), (2, 0.577350...), (3, 0.577350...)]
+    >>> sorted(euclidean_scale({1: 1, 2: 2, 3: 1}).items()) # doctest: +ELLIPSIS
+    [(1, 0.408248...), (2, 0.81649658...), (3, 0.408248...)]
+    """
+    return scale(f, l2)
+
+def l1_scale(f):
+    """Scale a set of frequencies so they sum to one
+    
+    >>> sorted(normalise({1: 1, 2: 0}).items())
+    [(1, 1.0), (2, 0.0)]
+    >>> sorted(normalise({1: 1, 2: 1}).items())
+    [(1, 0.5), (2, 0.5)]
+    >>> sorted(normalise({1: 1, 2: 1, 3: 1}).items()) # doctest: +ELLIPSIS
+    [(1, 0.333...), (2, 0.333...), (3, 0.333...)]
+    >>> sorted(normalise({1: 1, 2: 2, 3: 1}).items())
+    [(1, 0.25), (2, 0.5), (3, 0.25)]
+    """    
+    return scale(f, l1)
+
+normalise = l1_scale
+euclidean_distance = l2
+euclidean_scale = l2_scale
+
 
 def geometric_mean(frequencies1, frequencies2):
     """Finds the geometric mean of the absolute differences between two frequency profiles, 
@@ -110,11 +121,11 @@ def geometric_mean(frequencies1, frequencies2):
     Assumes every key in frequencies1 is also in frequencies2
     
     >>> geometric_mean({'a':2, 'b':2, 'c':2}, {'a':1, 'b':1, 'c':1})
-    1
+    1.0
     >>> geometric_mean({'a':2, 'b':2, 'c':2}, {'a':1, 'b':1, 'c':1})
-    1
+    1.0
     >>> geometric_mean({'a':2, 'b':2, 'c':2}, {'a':1, 'b':5, 'c':1})
-    3
+    3.0
     >>> geometric_mean(normalise({'a':2, 'b':2, 'c':2}), \
                        normalise({'a':1, 'b':5, 'c':1})) # doctest: +ELLIPSIS
     0.01382140...
@@ -125,7 +136,7 @@ def geometric_mean(frequencies1, frequencies2):
                        normalise({'a':1, 'b':1, 'c':0})) # doctest: +ELLIPSIS
     0.009259259...
     """
-    total = 1
+    total = 1.0
     for k in frequencies1:
         total *= abs(frequencies1[k] - frequencies2[k])
     return total
@@ -146,16 +157,16 @@ def harmonic_mean(frequencies1, frequencies2):
     0.228571428571...
     >>> harmonic_mean(normalise({'a':2, 'b':2, 'c':2}), \
                       normalise({'a':1, 'b':1, 'c':1})) # doctest: +ELLIPSIS
-    0
+    0.0
     >>> harmonic_mean(normalise({'a':2, 'b':2, 'c':2}), \
                       normalise({'a':1, 'b':1, 'c':0})) # doctest: +ELLIPSIS
     0.2
     """
-    total = 0
+    total = 0.0
     for k in frequencies1:
         if abs(frequencies1[k] - frequencies2[k]) == 0:
-            return 0
-        total += 1 / abs(frequencies1[k] - frequencies2[k])
+            return 0.0
+        total += 1.0 / abs(frequencies1[k] - frequencies2[k])
     return len(frequencies1) / total