Compare commits
No commits in common. "master" and "from-wordpress" have entirely different histories.
master
...
from-wordp
3
.gitattributes
vendored
@ -1,3 +0,0 @@
|
||||
*.mp4 filter=lfs diff=lfs merge=lfs -text
|
||||
*.gif filter=lfs diff=lfs merge=lfs -text
|
||||
*.png filter=lfs diff=lfs merge=lfs -text
|
||||
8
.gitignore
vendored
@ -1,6 +1,2 @@
|
||||
_site/
|
||||
/.quarto/
|
||||
index_files/
|
||||
.jupyter_cache/
|
||||
*.quarto_ipynb
|
||||
__pycache__/
|
||||
**/*_files
|
||||
*.html
|
||||
|
||||
@ -1,334 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
|
||||
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg xmlns:xlink="http://www.w3.org/1999/xlink" width="460.8pt" height="345.6pt" viewBox="0 0 460.8 345.6" xmlns="http://www.w3.org/2000/svg" version="1.1">
|
||||
<metadata>
|
||||
<rdf:RDF xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
|
||||
<cc:Work>
|
||||
<dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
|
||||
<dc:date>2025-08-03T22:53:53.738594</dc:date>
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:creator>
|
||||
<cc:Agent>
|
||||
<dc:title>Matplotlib v3.10.3, https://matplotlib.org/</dc:title>
|
||||
</cc:Agent>
|
||||
</dc:creator>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<defs>
|
||||
<style type="text/css">*{stroke-linejoin: round; stroke-linecap: butt}</style>
|
||||
</defs>
|
||||
<g id="figure_1">
|
||||
<g id="patch_1">
|
||||
<path d="M 0 345.6
|
||||
L 460.8 345.6
|
||||
L 460.8 0
|
||||
L 0 0
|
||||
z
|
||||
" style="fill: #ffffff"/>
|
||||
</g>
|
||||
<g id="axes_1">
|
||||
<g id="patch_2">
|
||||
<path d="M 57.6 307.584
|
||||
L 414.72 307.584
|
||||
L 414.72 41.472
|
||||
L 57.6 41.472
|
||||
z
|
||||
" style="fill: #ffffff"/>
|
||||
</g>
|
||||
<g id="patch_3">
|
||||
<path d="M 390.514075 187.957836
|
||||
Q 236.158737 122.454172 82.832593 57.387266
|
||||
" clip-path="url(#p8fa51a7528)" style="fill: none; stroke: #000000; stroke-linecap: round"/>
|
||||
<path d="M 85.733454 60.790941
|
||||
L 82.832593 57.387266
|
||||
L 87.29605 57.108782
|
||||
z
|
||||
" clip-path="url(#p8fa51a7528)" style="stroke: #000000; stroke-linecap: round"/>
|
||||
</g>
|
||||
<g id="patch_4">
|
||||
<path d="M 279.499516 173.899003
|
||||
Q 334.710372 181.992361 388.815017 189.92356
|
||||
" clip-path="url(#p8fa51a7528)" style="fill: none; stroke: #000000; stroke-linecap: round"/>
|
||||
<path d="M 385.147394 187.364549
|
||||
L 388.815017 189.92356
|
||||
L 384.567234 191.322252
|
||||
z
|
||||
" clip-path="url(#p8fa51a7528)" style="stroke: #000000; stroke-linecap: round"/>
|
||||
</g>
|
||||
<g id="patch_5">
|
||||
<path d="M 263.518245 168.164289
|
||||
Q 172.381729 113.105228 82.202167 58.624299
|
||||
" clip-path="url(#p8fa51a7528)" style="fill: none; stroke: #000000; stroke-linecap: round"/>
|
||||
<path d="M 84.591676 62.404543
|
||||
L 82.202167 58.624299
|
||||
L 86.660068 58.980838
|
||||
z
|
||||
" clip-path="url(#p8fa51a7528)" style="stroke: #000000; stroke-linecap: round"/>
|
||||
</g>
|
||||
<g id="patch_6">
|
||||
<path d="M 267.221177 180.467066
|
||||
Q 241.802173 234.06546 216.862251 286.653664
|
||||
" clip-path="url(#p8fa51a7528)" style="fill: none; stroke: #000000; stroke-linecap: round"/>
|
||||
<path d="M 220.383344 283.89651
|
||||
L 216.862251 286.653664
|
||||
L 216.769184 282.182497
|
||||
z
|
||||
" clip-path="url(#p8fa51a7528)" style="stroke: #000000; stroke-linecap: round"/>
|
||||
</g>
|
||||
<g id="patch_7">
|
||||
<path d="M 220.228666 291.252913
|
||||
Q 305.581235 243.413972 389.958514 196.121668
|
||||
" clip-path="url(#p8fa51a7528)" style="fill: none; stroke: #000000; stroke-linecap: round"/>
|
||||
<path d="M 385.491361 196.332723
|
||||
L 389.958514 196.121668
|
||||
L 387.447066 199.822023
|
||||
z
|
||||
" clip-path="url(#p8fa51a7528)" style="stroke: #000000; stroke-linecap: round"/>
|
||||
</g>
|
||||
<g id="patch_8">
|
||||
<path d="M 208.361368 287.975988
|
||||
Q 143.251403 174.525827 78.697949 62.045353
|
||||
" clip-path="url(#p8fa51a7528)" style="fill: none; stroke: #000000; stroke-linecap: round"/>
|
||||
<path d="M 78.954355 66.510133
|
||||
L 78.697949 62.045353
|
||||
L 82.423616 64.519096
|
||||
z
|
||||
" clip-path="url(#p8fa51a7528)" style="stroke: #000000; stroke-linecap: round"/>
|
||||
</g>
|
||||
<g id="patch_9">
|
||||
<path d="M 216.383108 287.663982
|
||||
Q 241.802112 234.065589 266.742034 181.477385
|
||||
" clip-path="url(#p8fa51a7528)" style="fill: none; stroke: #000000; stroke-linecap: round"/>
|
||||
<path d="M 263.22094 184.234539
|
||||
L 266.742034 181.477385
|
||||
L 266.835101 185.948552
|
||||
z
|
||||
" clip-path="url(#p8fa51a7528)" style="stroke: #000000; stroke-linecap: round"/>
|
||||
</g>
|
||||
<g id="matplotlib.axis_1">
|
||||
<g id="xtick_1"/>
|
||||
<g id="xtick_2"/>
|
||||
<g id="xtick_3"/>
|
||||
<g id="xtick_4"/>
|
||||
<g id="xtick_5"/>
|
||||
<g id="xtick_6"/>
|
||||
<g id="xtick_7"/>
|
||||
<g id="xtick_8"/>
|
||||
<g id="xtick_9"/>
|
||||
</g>
|
||||
<g id="matplotlib.axis_2">
|
||||
<g id="ytick_1"/>
|
||||
<g id="ytick_2"/>
|
||||
<g id="ytick_3"/>
|
||||
<g id="ytick_4"/>
|
||||
<g id="ytick_5"/>
|
||||
<g id="ytick_6"/>
|
||||
<g id="ytick_7"/>
|
||||
</g>
|
||||
<g id="PathCollection_1">
|
||||
<path d="M 398.487273 200.00167
|
||||
C 400.783999 200.00167 402.986966 199.089171 404.610997 197.465141
|
||||
C 406.235028 195.84111 407.147527 193.638142 407.147527 191.341416
|
||||
C 407.147527 189.04469 406.235028 186.841722 404.610997 185.217692
|
||||
C 402.986966 183.593661 400.783999 182.681162 398.487273 182.681162
|
||||
C 396.190547 182.681162 393.987579 183.593661 392.363548 185.217692
|
||||
C 390.739518 186.841722 389.827019 189.04469 389.827019 191.341416
|
||||
C 389.827019 193.638142 390.739518 195.84111 392.363548 197.465141
|
||||
C 393.987579 199.089171 396.190547 200.00167 398.487273 200.00167
|
||||
z
|
||||
" clip-path="url(#p8fa51a7528)" style="fill: #1f78b4; stroke: #1f78b4"/>
|
||||
<path d="M 73.832727 62.228254
|
||||
C 76.129453 62.228254 78.332421 61.315755 79.956452 59.691724
|
||||
C 81.580482 58.067694 82.492981 55.864726 82.492981 53.568
|
||||
C 82.492981 51.271274 81.580482 49.068306 79.956452 47.444276
|
||||
C 78.332421 45.820245 76.129453 44.907746 73.832727 44.907746
|
||||
C 71.536001 44.907746 69.333034 45.820245 67.709003 47.444276
|
||||
C 66.084972 49.068306 65.172473 51.271274 65.172473 53.568
|
||||
C 65.172473 55.864726 66.084972 58.067694 67.709003 59.691724
|
||||
C 69.333034 61.315755 71.536001 62.228254 73.832727 62.228254
|
||||
z
|
||||
" clip-path="url(#p8fa51a7528)" style="fill: #1f78b4; stroke: #1f78b4"/>
|
||||
<path d="M 270.931712 181.303303
|
||||
C 273.228439 181.303303 275.431406 180.390804 277.055437 178.766773
|
||||
C 278.679467 177.142742 279.591966 174.939775 279.591966 172.643049
|
||||
C 279.591966 170.346322 278.679467 168.143355 277.055437 166.519324
|
||||
C 275.431406 164.895294 273.228439 163.982795 270.931712 163.982795
|
||||
C 268.634986 163.982795 266.432019 164.895294 264.807988 166.519324
|
||||
C 263.183957 168.143355 262.271458 170.346322 262.271458 172.643049
|
||||
C 262.271458 174.939775 263.183957 177.142742 264.807988 178.766773
|
||||
C 266.432019 180.390804 268.634986 181.303303 270.931712 181.303303
|
||||
z
|
||||
" clip-path="url(#p8fa51a7528)" style="fill: #1f78b4; stroke: #1f78b4"/>
|
||||
<path d="M 212.672572 304.148254
|
||||
C 214.969299 304.148254 217.172266 303.235755 218.796297 301.611724
|
||||
C 220.420327 299.987694 221.332826 297.784726 221.332826 295.488
|
||||
C 221.332826 293.191274 220.420327 290.988306 218.796297 289.364276
|
||||
C 217.172266 287.740245 214.969299 286.827746 212.672572 286.827746
|
||||
C 210.375846 286.827746 208.172879 287.740245 206.548848 289.364276
|
||||
C 204.924817 290.988306 204.012318 293.191274 204.012318 295.488
|
||||
C 204.012318 297.784726 204.924817 299.987694 206.548848 301.611724
|
||||
C 208.172879 303.235755 210.375846 304.148254 212.672572 304.148254
|
||||
z
|
||||
" clip-path="url(#p8fa51a7528)" style="fill: #1f78b4; stroke: #1f78b4"/>
|
||||
</g>
|
||||
<g id="patch_10">
|
||||
<path d="M 57.6 307.584
|
||||
L 57.6 41.472
|
||||
" style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/>
|
||||
</g>
|
||||
<g id="patch_11">
|
||||
<path d="M 414.72 307.584
|
||||
L 414.72 41.472
|
||||
" style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/>
|
||||
</g>
|
||||
<g id="patch_12">
|
||||
<path d="M 57.6 307.584
|
||||
L 414.72 307.584
|
||||
" style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/>
|
||||
</g>
|
||||
<g id="patch_13">
|
||||
<path d="M 57.6 41.472
|
||||
L 414.72 41.472
|
||||
" style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/>
|
||||
</g>
|
||||
<g id="text_1">
|
||||
<!-- 10 -->
|
||||
<g transform="translate(390.852273 194.652666) scale(0.12 -0.12)">
|
||||
<defs>
|
||||
<path id="DejaVuSans-31" d="M 794 531
|
||||
L 1825 531
|
||||
L 1825 4091
|
||||
L 703 3866
|
||||
L 703 4441
|
||||
L 1819 4666
|
||||
L 2450 4666
|
||||
L 2450 531
|
||||
L 3481 531
|
||||
L 3481 0
|
||||
L 794 0
|
||||
L 794 531
|
||||
z
|
||||
" transform="scale(0.015625)"/>
|
||||
<path id="DejaVuSans-30" d="M 2034 4250
|
||||
Q 1547 4250 1301 3770
|
||||
Q 1056 3291 1056 2328
|
||||
Q 1056 1369 1301 889
|
||||
Q 1547 409 2034 409
|
||||
Q 2525 409 2770 889
|
||||
Q 3016 1369 3016 2328
|
||||
Q 3016 3291 2770 3770
|
||||
Q 2525 4250 2034 4250
|
||||
z
|
||||
M 2034 4750
|
||||
Q 2819 4750 3233 4129
|
||||
Q 3647 3509 3647 2328
|
||||
Q 3647 1150 3233 529
|
||||
Q 2819 -91 2034 -91
|
||||
Q 1250 -91 836 529
|
||||
Q 422 1150 422 2328
|
||||
Q 422 3509 836 4129
|
||||
Q 1250 4750 2034 4750
|
||||
z
|
||||
" transform="scale(0.015625)"/>
|
||||
</defs>
|
||||
<use xlink:href="#DejaVuSans-31"/>
|
||||
<use xlink:href="#DejaVuSans-30" transform="translate(63.623047 0)"/>
|
||||
</g>
|
||||
</g>
|
||||
<g id="text_2">
|
||||
<!-- 16 -->
|
||||
<g transform="translate(66.197727 56.87925) scale(0.12 -0.12)">
|
||||
<defs>
|
||||
<path id="DejaVuSans-36" d="M 2113 2584
|
||||
Q 1688 2584 1439 2293
|
||||
Q 1191 2003 1191 1497
|
||||
Q 1191 994 1439 701
|
||||
Q 1688 409 2113 409
|
||||
Q 2538 409 2786 701
|
||||
Q 3034 994 3034 1497
|
||||
Q 3034 2003 2786 2293
|
||||
Q 2538 2584 2113 2584
|
||||
z
|
||||
M 3366 4563
|
||||
L 3366 3988
|
||||
Q 3128 4100 2886 4159
|
||||
Q 2644 4219 2406 4219
|
||||
Q 1781 4219 1451 3797
|
||||
Q 1122 3375 1075 2522
|
||||
Q 1259 2794 1537 2939
|
||||
Q 1816 3084 2150 3084
|
||||
Q 2853 3084 3261 2657
|
||||
Q 3669 2231 3669 1497
|
||||
Q 3669 778 3244 343
|
||||
Q 2819 -91 2113 -91
|
||||
Q 1303 -91 875 529
|
||||
Q 447 1150 447 2328
|
||||
Q 447 3434 972 4092
|
||||
Q 1497 4750 2381 4750
|
||||
Q 2619 4750 2861 4703
|
||||
Q 3103 4656 3366 4563
|
||||
z
|
||||
" transform="scale(0.015625)"/>
|
||||
</defs>
|
||||
<use xlink:href="#DejaVuSans-31"/>
|
||||
<use xlink:href="#DejaVuSans-36" transform="translate(63.623047 0)"/>
|
||||
</g>
|
||||
</g>
|
||||
<g id="text_3">
|
||||
<!-- 14 -->
|
||||
<g transform="translate(263.296712 175.954299) scale(0.12 -0.12)">
|
||||
<defs>
|
||||
<path id="DejaVuSans-34" d="M 2419 4116
|
||||
L 825 1625
|
||||
L 2419 1625
|
||||
L 2419 4116
|
||||
z
|
||||
M 2253 4666
|
||||
L 3047 4666
|
||||
L 3047 1625
|
||||
L 3713 1625
|
||||
L 3713 1100
|
||||
L 3047 1100
|
||||
L 3047 0
|
||||
L 2419 0
|
||||
L 2419 1100
|
||||
L 313 1100
|
||||
L 313 1709
|
||||
L 2253 4666
|
||||
z
|
||||
" transform="scale(0.015625)"/>
|
||||
</defs>
|
||||
<use xlink:href="#DejaVuSans-31"/>
|
||||
<use xlink:href="#DejaVuSans-34" transform="translate(63.623047 0)"/>
|
||||
</g>
|
||||
</g>
|
||||
<g id="text_4">
|
||||
<!-- 17 -->
|
||||
<g transform="translate(205.037572 298.79925) scale(0.12 -0.12)">
|
||||
<defs>
|
||||
<path id="DejaVuSans-37" d="M 525 4666
|
||||
L 3525 4666
|
||||
L 3525 4397
|
||||
L 1831 0
|
||||
L 1172 0
|
||||
L 2766 4134
|
||||
L 525 4134
|
||||
L 525 4666
|
||||
z
|
||||
" transform="scale(0.015625)"/>
|
||||
</defs>
|
||||
<use xlink:href="#DejaVuSans-31"/>
|
||||
<use xlink:href="#DejaVuSans-37" transform="translate(63.623047 0)"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<defs>
|
||||
<clipPath id="p8fa51a7528">
|
||||
<rect x="57.6" y="41.472" width="357.12" height="266.112"/>
|
||||
</clipPath>
|
||||
</defs>
|
||||
</svg>
|
||||
|
||||
|
Before Width: | Height: | Size: 10 KiB |
@ -1,744 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
|
||||
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg xmlns:xlink="http://www.w3.org/1999/xlink" width="460.8pt" height="345.6pt" viewBox="0 0 460.8 345.6" xmlns="http://www.w3.org/2000/svg" version="1.1">
|
||||
<metadata>
|
||||
<rdf:RDF xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
|
||||
<cc:Work>
|
||||
<dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
|
||||
<dc:date>2025-07-30T17:57:28.746680</dc:date>
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:creator>
|
||||
<cc:Agent>
|
||||
<dc:title>Matplotlib v3.10.3, https://matplotlib.org/</dc:title>
|
||||
</cc:Agent>
|
||||
</dc:creator>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<defs>
|
||||
<style type="text/css">*{stroke-linejoin: round; stroke-linecap: butt}</style>
|
||||
</defs>
|
||||
<g id="figure_1">
|
||||
<g id="patch_1">
|
||||
<path d="M 0 345.6
|
||||
L 460.8 345.6
|
||||
L 460.8 0
|
||||
L 0 0
|
||||
z
|
||||
" style="fill: #ffffff"/>
|
||||
</g>
|
||||
<g id="axes_1">
|
||||
<g id="patch_2">
|
||||
<path d="M 33.73 317.72
|
||||
L 442.035 317.72
|
||||
L 442.035 14.76
|
||||
L 33.73 14.76
|
||||
z
|
||||
" style="fill: #ffffff"/>
|
||||
</g>
|
||||
<g id="matplotlib.axis_1">
|
||||
<g id="xtick_1">
|
||||
<g id="line2d_1">
|
||||
<defs>
|
||||
<path id="m704ac02017" d="M 0 0
|
||||
L 0 3.5
|
||||
" style="stroke: #000000; stroke-width: 0.8"/>
|
||||
</defs>
|
||||
<g>
|
||||
<use xlink:href="#m704ac02017" x="50.822178" y="317.72" style="stroke: #000000; stroke-width: 0.8"/>
|
||||
</g>
|
||||
</g>
|
||||
<g id="text_1">
|
||||
<!-- 0.0 -->
|
||||
<g transform="translate(42.870616 332.318437) scale(0.1 -0.1)">
|
||||
<defs>
|
||||
<path id="DejaVuSans-30" d="M 2034 4250
|
||||
Q 1547 4250 1301 3770
|
||||
Q 1056 3291 1056 2328
|
||||
Q 1056 1369 1301 889
|
||||
Q 1547 409 2034 409
|
||||
Q 2525 409 2770 889
|
||||
Q 3016 1369 3016 2328
|
||||
Q 3016 3291 2770 3770
|
||||
Q 2525 4250 2034 4250
|
||||
z
|
||||
M 2034 4750
|
||||
Q 2819 4750 3233 4129
|
||||
Q 3647 3509 3647 2328
|
||||
Q 3647 1150 3233 529
|
||||
Q 2819 -91 2034 -91
|
||||
Q 1250 -91 836 529
|
||||
Q 422 1150 422 2328
|
||||
Q 422 3509 836 4129
|
||||
Q 1250 4750 2034 4750
|
||||
z
|
||||
" transform="scale(0.015625)"/>
|
||||
<path id="DejaVuSans-2e" d="M 684 794
|
||||
L 1344 794
|
||||
L 1344 0
|
||||
L 684 0
|
||||
L 684 794
|
||||
z
|
||||
" transform="scale(0.015625)"/>
|
||||
</defs>
|
||||
<use xlink:href="#DejaVuSans-30"/>
|
||||
<use xlink:href="#DejaVuSans-2e" transform="translate(63.623047 0)"/>
|
||||
<use xlink:href="#DejaVuSans-30" transform="translate(95.410156 0)"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g id="xtick_2">
|
||||
<g id="line2d_2">
|
||||
<g>
|
||||
<use xlink:href="#m704ac02017" x="125.939735" y="317.72" style="stroke: #000000; stroke-width: 0.8"/>
|
||||
</g>
|
||||
</g>
|
||||
<g id="text_2">
|
||||
<!-- 0.2 -->
|
||||
<g transform="translate(117.988172 332.318437) scale(0.1 -0.1)">
|
||||
<defs>
|
||||
<path id="DejaVuSans-32" d="M 1228 531
|
||||
L 3431 531
|
||||
L 3431 0
|
||||
L 469 0
|
||||
L 469 531
|
||||
Q 828 903 1448 1529
|
||||
Q 2069 2156 2228 2338
|
||||
Q 2531 2678 2651 2914
|
||||
Q 2772 3150 2772 3378
|
||||
Q 2772 3750 2511 3984
|
||||
Q 2250 4219 1831 4219
|
||||
Q 1534 4219 1204 4116
|
||||
Q 875 4013 500 3803
|
||||
L 500 4441
|
||||
Q 881 4594 1212 4672
|
||||
Q 1544 4750 1819 4750
|
||||
Q 2544 4750 2975 4387
|
||||
Q 3406 4025 3406 3419
|
||||
Q 3406 3131 3298 2873
|
||||
Q 3191 2616 2906 2266
|
||||
Q 2828 2175 2409 1742
|
||||
Q 1991 1309 1228 531
|
||||
z
|
||||
" transform="scale(0.015625)"/>
|
||||
</defs>
|
||||
<use xlink:href="#DejaVuSans-30"/>
|
||||
<use xlink:href="#DejaVuSans-2e" transform="translate(63.623047 0)"/>
|
||||
<use xlink:href="#DejaVuSans-32" transform="translate(95.410156 0)"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g id="xtick_3">
|
||||
<g id="line2d_3">
|
||||
<g>
|
||||
<use xlink:href="#m704ac02017" x="201.057292" y="317.72" style="stroke: #000000; stroke-width: 0.8"/>
|
||||
</g>
|
||||
</g>
|
||||
<g id="text_3">
|
||||
<!-- 0.4 -->
|
||||
<g transform="translate(193.105729 332.318437) scale(0.1 -0.1)">
|
||||
<defs>
|
||||
<path id="DejaVuSans-34" d="M 2419 4116
|
||||
L 825 1625
|
||||
L 2419 1625
|
||||
L 2419 4116
|
||||
z
|
||||
M 2253 4666
|
||||
L 3047 4666
|
||||
L 3047 1625
|
||||
L 3713 1625
|
||||
L 3713 1100
|
||||
L 3047 1100
|
||||
L 3047 0
|
||||
L 2419 0
|
||||
L 2419 1100
|
||||
L 313 1100
|
||||
L 313 1709
|
||||
L 2253 4666
|
||||
z
|
||||
" transform="scale(0.015625)"/>
|
||||
</defs>
|
||||
<use xlink:href="#DejaVuSans-30"/>
|
||||
<use xlink:href="#DejaVuSans-2e" transform="translate(63.623047 0)"/>
|
||||
<use xlink:href="#DejaVuSans-34" transform="translate(95.410156 0)"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g id="xtick_4">
|
||||
<g id="line2d_4">
|
||||
<g>
|
||||
<use xlink:href="#m704ac02017" x="276.174848" y="317.72" style="stroke: #000000; stroke-width: 0.8"/>
|
||||
</g>
|
||||
</g>
|
||||
<g id="text_4">
|
||||
<!-- 0.6 -->
|
||||
<g transform="translate(268.223286 332.318437) scale(0.1 -0.1)">
|
||||
<defs>
|
||||
<path id="DejaVuSans-36" d="M 2113 2584
|
||||
Q 1688 2584 1439 2293
|
||||
Q 1191 2003 1191 1497
|
||||
Q 1191 994 1439 701
|
||||
Q 1688 409 2113 409
|
||||
Q 2538 409 2786 701
|
||||
Q 3034 994 3034 1497
|
||||
Q 3034 2003 2786 2293
|
||||
Q 2538 2584 2113 2584
|
||||
z
|
||||
M 3366 4563
|
||||
L 3366 3988
|
||||
Q 3128 4100 2886 4159
|
||||
Q 2644 4219 2406 4219
|
||||
Q 1781 4219 1451 3797
|
||||
Q 1122 3375 1075 2522
|
||||
Q 1259 2794 1537 2939
|
||||
Q 1816 3084 2150 3084
|
||||
Q 2853 3084 3261 2657
|
||||
Q 3669 2231 3669 1497
|
||||
Q 3669 778 3244 343
|
||||
Q 2819 -91 2113 -91
|
||||
Q 1303 -91 875 529
|
||||
Q 447 1150 447 2328
|
||||
Q 447 3434 972 4092
|
||||
Q 1497 4750 2381 4750
|
||||
Q 2619 4750 2861 4703
|
||||
Q 3103 4656 3366 4563
|
||||
z
|
||||
" transform="scale(0.015625)"/>
|
||||
</defs>
|
||||
<use xlink:href="#DejaVuSans-30"/>
|
||||
<use xlink:href="#DejaVuSans-2e" transform="translate(63.623047 0)"/>
|
||||
<use xlink:href="#DejaVuSans-36" transform="translate(95.410156 0)"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g id="xtick_5">
|
||||
<g id="line2d_5">
|
||||
<g>
|
||||
<use xlink:href="#m704ac02017" x="351.292405" y="317.72" style="stroke: #000000; stroke-width: 0.8"/>
|
||||
</g>
|
||||
</g>
|
||||
<g id="text_5">
|
||||
<!-- 0.8 -->
|
||||
<g transform="translate(343.340842 332.318437) scale(0.1 -0.1)">
|
||||
<defs>
|
||||
<path id="DejaVuSans-38" d="M 2034 2216
|
||||
Q 1584 2216 1326 1975
|
||||
Q 1069 1734 1069 1313
|
||||
Q 1069 891 1326 650
|
||||
Q 1584 409 2034 409
|
||||
Q 2484 409 2743 651
|
||||
Q 3003 894 3003 1313
|
||||
Q 3003 1734 2745 1975
|
||||
Q 2488 2216 2034 2216
|
||||
z
|
||||
M 1403 2484
|
||||
Q 997 2584 770 2862
|
||||
Q 544 3141 544 3541
|
||||
Q 544 4100 942 4425
|
||||
Q 1341 4750 2034 4750
|
||||
Q 2731 4750 3128 4425
|
||||
Q 3525 4100 3525 3541
|
||||
Q 3525 3141 3298 2862
|
||||
Q 3072 2584 2669 2484
|
||||
Q 3125 2378 3379 2068
|
||||
Q 3634 1759 3634 1313
|
||||
Q 3634 634 3220 271
|
||||
Q 2806 -91 2034 -91
|
||||
Q 1263 -91 848 271
|
||||
Q 434 634 434 1313
|
||||
Q 434 1759 690 2068
|
||||
Q 947 2378 1403 2484
|
||||
z
|
||||
M 1172 3481
|
||||
Q 1172 3119 1398 2916
|
||||
Q 1625 2713 2034 2713
|
||||
Q 2441 2713 2670 2916
|
||||
Q 2900 3119 2900 3481
|
||||
Q 2900 3844 2670 4047
|
||||
Q 2441 4250 2034 4250
|
||||
Q 1625 4250 1398 4047
|
||||
Q 1172 3844 1172 3481
|
||||
z
|
||||
" transform="scale(0.015625)"/>
|
||||
</defs>
|
||||
<use xlink:href="#DejaVuSans-30"/>
|
||||
<use xlink:href="#DejaVuSans-2e" transform="translate(63.623047 0)"/>
|
||||
<use xlink:href="#DejaVuSans-38" transform="translate(95.410156 0)"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g id="xtick_6">
|
||||
<g id="line2d_6">
|
||||
<g>
|
||||
<use xlink:href="#m704ac02017" x="426.409961" y="317.72" style="stroke: #000000; stroke-width: 0.8"/>
|
||||
</g>
|
||||
</g>
|
||||
<g id="text_6">
|
||||
<!-- 1.0 -->
|
||||
<g transform="translate(418.458399 332.318437) scale(0.1 -0.1)">
|
||||
<defs>
|
||||
<path id="DejaVuSans-31" d="M 794 531
|
||||
L 1825 531
|
||||
L 1825 4091
|
||||
L 703 3866
|
||||
L 703 4441
|
||||
L 1819 4666
|
||||
L 2450 4666
|
||||
L 2450 531
|
||||
L 3481 531
|
||||
L 3481 0
|
||||
L 794 0
|
||||
L 794 531
|
||||
z
|
||||
" transform="scale(0.015625)"/>
|
||||
</defs>
|
||||
<use xlink:href="#DejaVuSans-31"/>
|
||||
<use xlink:href="#DejaVuSans-2e" transform="translate(63.623047 0)"/>
|
||||
<use xlink:href="#DejaVuSans-30" transform="translate(95.410156 0)"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g id="matplotlib.axis_2">
|
||||
<g id="ytick_1">
|
||||
<g id="line2d_7">
|
||||
<defs>
|
||||
<path id="m3fb0ce5ed4" d="M 0 0
|
||||
L -3.5 0
|
||||
" style="stroke: #000000; stroke-width: 0.8"/>
|
||||
</defs>
|
||||
<g>
|
||||
<use xlink:href="#m3fb0ce5ed4" x="33.73" y="307.955174" style="stroke: #000000; stroke-width: 0.8"/>
|
||||
</g>
|
||||
</g>
|
||||
<g id="text_7">
|
||||
<!-- 0.1 -->
|
||||
<g transform="translate(10.826875 311.754392) scale(0.1 -0.1)">
|
||||
<use xlink:href="#DejaVuSans-30"/>
|
||||
<use xlink:href="#DejaVuSans-2e" transform="translate(63.623047 0)"/>
|
||||
<use xlink:href="#DejaVuSans-31" transform="translate(95.410156 0)"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g id="ytick_2">
|
||||
<g id="line2d_8">
|
||||
<g>
|
||||
<use xlink:href="#m3fb0ce5ed4" x="33.73" y="271.90043" style="stroke: #000000; stroke-width: 0.8"/>
|
||||
</g>
|
||||
</g>
|
||||
<g id="text_8">
|
||||
<!-- 0.2 -->
|
||||
<g transform="translate(10.826875 275.699649) scale(0.1 -0.1)">
|
||||
<use xlink:href="#DejaVuSans-30"/>
|
||||
<use xlink:href="#DejaVuSans-2e" transform="translate(63.623047 0)"/>
|
||||
<use xlink:href="#DejaVuSans-32" transform="translate(95.410156 0)"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g id="ytick_3">
|
||||
<g id="line2d_9">
|
||||
<g>
|
||||
<use xlink:href="#m3fb0ce5ed4" x="33.73" y="235.845686" style="stroke: #000000; stroke-width: 0.8"/>
|
||||
</g>
|
||||
</g>
|
||||
<g id="text_9">
|
||||
<!-- 0.3 -->
|
||||
<g transform="translate(10.826875 239.644905) scale(0.1 -0.1)">
|
||||
<defs>
|
||||
<path id="DejaVuSans-33" d="M 2597 2516
|
||||
Q 3050 2419 3304 2112
|
||||
Q 3559 1806 3559 1356
|
||||
Q 3559 666 3084 287
|
||||
Q 2609 -91 1734 -91
|
||||
Q 1441 -91 1130 -33
|
||||
Q 819 25 488 141
|
||||
L 488 750
|
||||
Q 750 597 1062 519
|
||||
Q 1375 441 1716 441
|
||||
Q 2309 441 2620 675
|
||||
Q 2931 909 2931 1356
|
||||
Q 2931 1769 2642 2001
|
||||
Q 2353 2234 1838 2234
|
||||
L 1294 2234
|
||||
L 1294 2753
|
||||
L 1863 2753
|
||||
Q 2328 2753 2575 2939
|
||||
Q 2822 3125 2822 3475
|
||||
Q 2822 3834 2567 4026
|
||||
Q 2313 4219 1838 4219
|
||||
Q 1578 4219 1281 4162
|
||||
Q 984 4106 628 3988
|
||||
L 628 4550
|
||||
Q 988 4650 1302 4700
|
||||
Q 1616 4750 1894 4750
|
||||
Q 2613 4750 3031 4423
|
||||
Q 3450 4097 3450 3541
|
||||
Q 3450 3153 3228 2886
|
||||
Q 3006 2619 2597 2516
|
||||
z
|
||||
" transform="scale(0.015625)"/>
|
||||
</defs>
|
||||
<use xlink:href="#DejaVuSans-30"/>
|
||||
<use xlink:href="#DejaVuSans-2e" transform="translate(63.623047 0)"/>
|
||||
<use xlink:href="#DejaVuSans-33" transform="translate(95.410156 0)"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g id="ytick_4">
|
||||
<g id="line2d_10">
|
||||
<g>
|
||||
<use xlink:href="#m3fb0ce5ed4" x="33.73" y="199.790942" style="stroke: #000000; stroke-width: 0.8"/>
|
||||
</g>
|
||||
</g>
|
||||
<g id="text_10">
|
||||
<!-- 0.4 -->
|
||||
<g transform="translate(10.826875 203.590161) scale(0.1 -0.1)">
|
||||
<use xlink:href="#DejaVuSans-30"/>
|
||||
<use xlink:href="#DejaVuSans-2e" transform="translate(63.623047 0)"/>
|
||||
<use xlink:href="#DejaVuSans-34" transform="translate(95.410156 0)"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g id="ytick_5">
|
||||
<g id="line2d_11">
|
||||
<g>
|
||||
<use xlink:href="#m3fb0ce5ed4" x="33.73" y="163.736198" style="stroke: #000000; stroke-width: 0.8"/>
|
||||
</g>
|
||||
</g>
|
||||
<g id="text_11">
|
||||
<!-- 0.5 -->
|
||||
<g transform="translate(10.826875 167.535417) scale(0.1 -0.1)">
|
||||
<defs>
|
||||
<path id="DejaVuSans-35" d="M 691 4666
|
||||
L 3169 4666
|
||||
L 3169 4134
|
||||
L 1269 4134
|
||||
L 1269 2991
|
||||
Q 1406 3038 1543 3061
|
||||
Q 1681 3084 1819 3084
|
||||
Q 2600 3084 3056 2656
|
||||
Q 3513 2228 3513 1497
|
||||
Q 3513 744 3044 326
|
||||
Q 2575 -91 1722 -91
|
||||
Q 1428 -91 1123 -41
|
||||
Q 819 9 494 109
|
||||
L 494 744
|
||||
Q 775 591 1075 516
|
||||
Q 1375 441 1709 441
|
||||
Q 2250 441 2565 725
|
||||
Q 2881 1009 2881 1497
|
||||
Q 2881 1984 2565 2268
|
||||
Q 2250 2553 1709 2553
|
||||
Q 1456 2553 1204 2497
|
||||
Q 953 2441 691 2322
|
||||
L 691 4666
|
||||
z
|
||||
" transform="scale(0.015625)"/>
|
||||
</defs>
|
||||
<use xlink:href="#DejaVuSans-30"/>
|
||||
<use xlink:href="#DejaVuSans-2e" transform="translate(63.623047 0)"/>
|
||||
<use xlink:href="#DejaVuSans-35" transform="translate(95.410156 0)"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g id="ytick_6">
|
||||
<g id="line2d_12">
|
||||
<g>
|
||||
<use xlink:href="#m3fb0ce5ed4" x="33.73" y="127.681455" style="stroke: #000000; stroke-width: 0.8"/>
|
||||
</g>
|
||||
</g>
|
||||
<g id="text_12">
|
||||
<!-- 0.6 -->
|
||||
<g transform="translate(10.826875 131.480673) scale(0.1 -0.1)">
|
||||
<use xlink:href="#DejaVuSans-30"/>
|
||||
<use xlink:href="#DejaVuSans-2e" transform="translate(63.623047 0)"/>
|
||||
<use xlink:href="#DejaVuSans-36" transform="translate(95.410156 0)"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g id="ytick_7">
|
||||
<g id="line2d_13">
|
||||
<g>
|
||||
<use xlink:href="#m3fb0ce5ed4" x="33.73" y="91.626711" style="stroke: #000000; stroke-width: 0.8"/>
|
||||
</g>
|
||||
</g>
|
||||
<g id="text_13">
|
||||
<!-- 0.7 -->
|
||||
<g transform="translate(10.826875 95.425929) scale(0.1 -0.1)">
|
||||
<defs>
|
||||
<path id="DejaVuSans-37" d="M 525 4666
|
||||
L 3525 4666
|
||||
L 3525 4397
|
||||
L 1831 0
|
||||
L 1172 0
|
||||
L 2766 4134
|
||||
L 525 4134
|
||||
L 525 4666
|
||||
z
|
||||
" transform="scale(0.015625)"/>
|
||||
</defs>
|
||||
<use xlink:href="#DejaVuSans-30"/>
|
||||
<use xlink:href="#DejaVuSans-2e" transform="translate(63.623047 0)"/>
|
||||
<use xlink:href="#DejaVuSans-37" transform="translate(95.410156 0)"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g id="ytick_8">
|
||||
<g id="line2d_14">
|
||||
<g>
|
||||
<use xlink:href="#m3fb0ce5ed4" x="33.73" y="55.571967" style="stroke: #000000; stroke-width: 0.8"/>
|
||||
</g>
|
||||
</g>
|
||||
<g id="text_14">
|
||||
<!-- 0.8 -->
|
||||
<g transform="translate(10.826875 59.371186) scale(0.1 -0.1)">
|
||||
<use xlink:href="#DejaVuSans-30"/>
|
||||
<use xlink:href="#DejaVuSans-2e" transform="translate(63.623047 0)"/>
|
||||
<use xlink:href="#DejaVuSans-38" transform="translate(95.410156 0)"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g id="ytick_9">
|
||||
<g id="line2d_15">
|
||||
<g>
|
||||
<use xlink:href="#m3fb0ce5ed4" x="33.73" y="19.517223" style="stroke: #000000; stroke-width: 0.8"/>
|
||||
</g>
|
||||
</g>
|
||||
<g id="text_15">
|
||||
<!-- 0.9 -->
|
||||
<g transform="translate(10.826875 23.316442) scale(0.1 -0.1)">
|
||||
<defs>
|
||||
<path id="DejaVuSans-39" d="M 703 97
|
||||
L 703 672
|
||||
Q 941 559 1184 500
|
||||
Q 1428 441 1663 441
|
||||
Q 2288 441 2617 861
|
||||
Q 2947 1281 2994 2138
|
||||
Q 2813 1869 2534 1725
|
||||
Q 2256 1581 1919 1581
|
||||
Q 1219 1581 811 2004
|
||||
Q 403 2428 403 3163
|
||||
Q 403 3881 828 4315
|
||||
Q 1253 4750 1959 4750
|
||||
Q 2769 4750 3195 4129
|
||||
Q 3622 3509 3622 2328
|
||||
Q 3622 1225 3098 567
|
||||
Q 2575 -91 1691 -91
|
||||
Q 1453 -91 1209 -44
|
||||
Q 966 3 703 97
|
||||
z
|
||||
M 1959 2075
|
||||
Q 2384 2075 2632 2365
|
||||
Q 2881 2656 2881 3163
|
||||
Q 2881 3666 2632 3958
|
||||
Q 2384 4250 1959 4250
|
||||
Q 1534 4250 1286 3958
|
||||
Q 1038 3666 1038 3163
|
||||
Q 1038 2656 1286 2365
|
||||
Q 1534 2075 1959 2075
|
||||
z
|
||||
" transform="scale(0.015625)"/>
|
||||
</defs>
|
||||
<use xlink:href="#DejaVuSans-30"/>
|
||||
<use xlink:href="#DejaVuSans-2e" transform="translate(63.623047 0)"/>
|
||||
<use xlink:href="#DejaVuSans-39" transform="translate(95.410156 0)"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g id="line2d_16">
|
||||
<path d="M 52.289318 303.949091
|
||||
L 53.756458 298.941488
|
||||
L 55.223598 295.936926
|
||||
L 56.690738 292.50314
|
||||
L 58.157877 289.927802
|
||||
L 61.092157 287.081375
|
||||
L 62.559297 283.918678
|
||||
L 64.026436 281.306015
|
||||
L 65.493576 280.383899
|
||||
L 66.960716 279.626446
|
||||
L 69.894996 277.241873
|
||||
L 71.362135 276.407273
|
||||
L 72.829275 275.334215
|
||||
L 74.296415 271.90043
|
||||
L 75.763555 268.895868
|
||||
L 77.230694 268.105194
|
||||
L 78.697834 267.530158
|
||||
L 81.632114 266.053715
|
||||
L 84.566393 265.140165
|
||||
L 87.500673 262.59598
|
||||
L 90.434952 261.599074
|
||||
L 91.902092 260.806662
|
||||
L 93.369232 259.882182
|
||||
L 94.836372 259.175226
|
||||
L 96.303511 258.165289
|
||||
L 97.770651 253.873058
|
||||
L 99.237791 249.954064
|
||||
L 100.704931 249.129013
|
||||
L 102.172071 248.57089
|
||||
L 105.10635 247.277678
|
||||
L 108.04063 246.564664
|
||||
L 110.974909 244.859372
|
||||
L 115.376329 243.857851
|
||||
L 116.843468 243.392028
|
||||
L 118.310608 243.056635
|
||||
L 119.777748 242.60595
|
||||
L 122.712027 239.334855
|
||||
L 124.179167 238.850248
|
||||
L 125.646307 238.483838
|
||||
L 128.580587 237.484538
|
||||
L 131.514866 236.820138
|
||||
L 134.449146 234.753118
|
||||
L 137.383425 233.842645
|
||||
L 138.850565 233.072244
|
||||
L 140.317705 232.115885
|
||||
L 141.784845 231.338843
|
||||
L 143.251984 230.152832
|
||||
L 146.186264 217.818314
|
||||
L 147.653404 216.75788
|
||||
L 149.120543 216.07373
|
||||
L 150.587683 215.242975
|
||||
L 152.054823 214.582632
|
||||
L 154.989103 213.812231
|
||||
L 157.923382 212.102318
|
||||
L 162.324801 211.176651
|
||||
L 163.791941 210.764125
|
||||
L 166.726221 210.092298
|
||||
L 169.6605 207.586562
|
||||
L 175.529059 206.34635
|
||||
L 178.463339 205.92792
|
||||
L 181.397619 204.707498
|
||||
L 184.331898 204.205809
|
||||
L 188.733317 202.926137
|
||||
L 190.200457 202.366281
|
||||
L 193.134737 197.12022
|
||||
L 194.601877 196.513238
|
||||
L 196.069016 196.09302
|
||||
L 199.003296 195.088149
|
||||
L 201.937575 194.514638
|
||||
L 204.871855 193.083083
|
||||
L 209.273274 192.20047
|
||||
L 213.674694 191.050398
|
||||
L 216.608973 187.772694
|
||||
L 218.076113 187.250162
|
||||
L 219.543253 186.848214
|
||||
L 222.477532 185.720798
|
||||
L 225.411812 184.944871
|
||||
L 226.878952 183.766612
|
||||
L 228.346091 182.385204
|
||||
L 231.280371 181.182042
|
||||
L 232.747511 180.124718
|
||||
L 234.214651 178.759008
|
||||
L 235.68179 177.603408
|
||||
L 237.14893 175.754446
|
||||
L 240.08321 151.71795
|
||||
L 241.550349 149.868989
|
||||
L 243.017489 148.713388
|
||||
L 244.484629 147.347678
|
||||
L 245.951769 146.290355
|
||||
L 248.886048 145.087193
|
||||
L 250.353188 143.705785
|
||||
L 251.820328 142.527526
|
||||
L 256.221747 141.201983
|
||||
L 257.688887 140.624183
|
||||
L 259.156027 140.222235
|
||||
L 260.623167 139.699702
|
||||
L 263.557446 136.421998
|
||||
L 267.958865 135.271927
|
||||
L 269.426005 134.892403
|
||||
L 272.360285 134.389314
|
||||
L 275.294564 132.957759
|
||||
L 278.228844 132.384247
|
||||
L 282.630263 130.959159
|
||||
L 284.097403 130.352176
|
||||
L 287.031683 125.106116
|
||||
L 288.498822 124.546259
|
||||
L 291.433102 123.675372
|
||||
L 292.900242 123.266588
|
||||
L 295.834521 122.764899
|
||||
L 298.768801 121.544477
|
||||
L 303.17022 120.813884
|
||||
L 307.571639 119.885834
|
||||
L 310.505919 117.380099
|
||||
L 316.374478 115.908477
|
||||
L 319.308758 115.370079
|
||||
L 322.243037 113.660165
|
||||
L 325.177317 112.889765
|
||||
L 326.644457 112.229421
|
||||
L 328.111596 111.398667
|
||||
L 329.578736 110.714516
|
||||
L 331.045876 109.654083
|
||||
L 333.980155 97.319565
|
||||
L 335.447295 96.133554
|
||||
L 336.914435 95.356512
|
||||
L 338.381575 94.400153
|
||||
L 339.848715 93.629752
|
||||
L 342.782994 92.719279
|
||||
L 345.717274 90.652258
|
||||
L 350.118693 89.505843
|
||||
L 351.585833 88.988559
|
||||
L 353.052973 88.622149
|
||||
L 354.520112 88.137542
|
||||
L 357.454392 84.866446
|
||||
L 361.855811 83.614545
|
||||
L 363.322951 83.188366
|
||||
L 366.257231 82.613025
|
||||
L 369.19151 80.907733
|
||||
L 372.12579 80.194719
|
||||
L 373.592929 79.608463
|
||||
L 375.060069 78.901507
|
||||
L 376.527209 78.343384
|
||||
L 377.994349 77.518333
|
||||
L 379.461489 73.599339
|
||||
L 380.928628 69.307107
|
||||
L 382.395768 68.297171
|
||||
L 383.862908 67.590215
|
||||
L 385.330048 66.665734
|
||||
L 386.797187 65.873322
|
||||
L 389.731467 64.876417
|
||||
L 392.665746 62.332231
|
||||
L 395.600026 61.418682
|
||||
L 401.468585 58.576529
|
||||
L 402.935725 55.571967
|
||||
L 404.402865 52.138182
|
||||
L 405.870004 51.065124
|
||||
L 407.337144 50.230523
|
||||
L 410.271424 47.84595
|
||||
L 411.738564 47.088498
|
||||
L 414.672843 43.553719
|
||||
L 417.607123 38.931316
|
||||
L 420.541402 34.969256
|
||||
L 423.475682 28.530909
|
||||
L 423.475682 28.530909
|
||||
" clip-path="url(#p6dddd11e9f)" style="fill: none; stroke: #1f77b4; stroke-width: 1.5; stroke-linecap: square"/>
|
||||
</g>
|
||||
<g id="patch_3">
|
||||
<path d="M 33.73 317.72
|
||||
L 33.73 14.76
|
||||
" style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/>
|
||||
</g>
|
||||
<g id="patch_4">
|
||||
<path d="M 442.035 317.72
|
||||
L 442.035 14.76
|
||||
" style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/>
|
||||
</g>
|
||||
<g id="patch_5">
|
||||
<path d="M 33.73 317.72
|
||||
L 442.035 317.72
|
||||
" style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/>
|
||||
</g>
|
||||
<g id="patch_6">
|
||||
<path d="M 33.73 14.76
|
||||
L 442.035 14.76
|
||||
" style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<defs>
|
||||
<clipPath id="p6dddd11e9f">
|
||||
<rect x="33.73" y="14.76" width="408.305" height="302.96"/>
|
||||
</clipPath>
|
||||
</defs>
|
||||
</svg>
|
||||
|
||||
|
Before Width: | Height: | Size: 19 KiB |
@ -1,751 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
|
||||
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg xmlns:xlink="http://www.w3.org/1999/xlink" width="460.8pt" height="345.6pt" viewBox="0 0 460.8 345.6" xmlns="http://www.w3.org/2000/svg" version="1.1">
|
||||
<metadata>
|
||||
<rdf:RDF xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
|
||||
<cc:Work>
|
||||
<dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
|
||||
<dc:date>2025-07-30T17:57:30.086732</dc:date>
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:creator>
|
||||
<cc:Agent>
|
||||
<dc:title>Matplotlib v3.10.3, https://matplotlib.org/</dc:title>
|
||||
</cc:Agent>
|
||||
</dc:creator>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<defs>
|
||||
<style type="text/css">*{stroke-linejoin: round; stroke-linecap: butt}</style>
|
||||
</defs>
|
||||
<g id="figure_1">
|
||||
<g id="patch_1">
|
||||
<path d="M 0 345.6
|
||||
L 460.8 345.6
|
||||
L 460.8 0
|
||||
L 0 0
|
||||
z
|
||||
" style="fill: #ffffff"/>
|
||||
</g>
|
||||
<g id="axes_1">
|
||||
<g id="patch_2">
|
||||
<path d="M 33.73 317.72
|
||||
L 442.035 317.72
|
||||
L 442.035 14.76
|
||||
L 33.73 14.76
|
||||
z
|
||||
" style="fill: #ffffff"/>
|
||||
</g>
|
||||
<g id="matplotlib.axis_1">
|
||||
<g id="xtick_1">
|
||||
<g id="line2d_1">
|
||||
<defs>
|
||||
<path id="m82b750d18c" d="M 0 0
|
||||
L 0 3.5
|
||||
" style="stroke: #000000; stroke-width: 0.8"/>
|
||||
</defs>
|
||||
<g>
|
||||
<use xlink:href="#m82b750d18c" x="46.890244" y="317.72" style="stroke: #000000; stroke-width: 0.8"/>
|
||||
</g>
|
||||
</g>
|
||||
<g id="text_1">
|
||||
<!-- 0.1 -->
|
||||
<g transform="translate(38.938681 332.318437) scale(0.1 -0.1)">
|
||||
<defs>
|
||||
<path id="DejaVuSans-30" d="M 2034 4250
|
||||
Q 1547 4250 1301 3770
|
||||
Q 1056 3291 1056 2328
|
||||
Q 1056 1369 1301 889
|
||||
Q 1547 409 2034 409
|
||||
Q 2525 409 2770 889
|
||||
Q 3016 1369 3016 2328
|
||||
Q 3016 3291 2770 3770
|
||||
Q 2525 4250 2034 4250
|
||||
z
|
||||
M 2034 4750
|
||||
Q 2819 4750 3233 4129
|
||||
Q 3647 3509 3647 2328
|
||||
Q 3647 1150 3233 529
|
||||
Q 2819 -91 2034 -91
|
||||
Q 1250 -91 836 529
|
||||
Q 422 1150 422 2328
|
||||
Q 422 3509 836 4129
|
||||
Q 1250 4750 2034 4750
|
||||
z
|
||||
" transform="scale(0.015625)"/>
|
||||
<path id="DejaVuSans-2e" d="M 684 794
|
||||
L 1344 794
|
||||
L 1344 0
|
||||
L 684 0
|
||||
L 684 794
|
||||
z
|
||||
" transform="scale(0.015625)"/>
|
||||
<path id="DejaVuSans-31" d="M 794 531
|
||||
L 1825 531
|
||||
L 1825 4091
|
||||
L 703 3866
|
||||
L 703 4441
|
||||
L 1819 4666
|
||||
L 2450 4666
|
||||
L 2450 531
|
||||
L 3481 531
|
||||
L 3481 0
|
||||
L 794 0
|
||||
L 794 531
|
||||
z
|
||||
" transform="scale(0.015625)"/>
|
||||
</defs>
|
||||
<use xlink:href="#DejaVuSans-30"/>
|
||||
<use xlink:href="#DejaVuSans-2e" transform="translate(63.623047 0)"/>
|
||||
<use xlink:href="#DejaVuSans-31" transform="translate(95.410156 0)"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g id="xtick_2">
|
||||
<g id="line2d_2">
|
||||
<g>
|
||||
<use xlink:href="#m82b750d18c" x="95.481913" y="317.72" style="stroke: #000000; stroke-width: 0.8"/>
|
||||
</g>
|
||||
</g>
|
||||
<g id="text_2">
|
||||
<!-- 0.2 -->
|
||||
<g transform="translate(87.530351 332.318437) scale(0.1 -0.1)">
|
||||
<defs>
|
||||
<path id="DejaVuSans-32" d="M 1228 531
|
||||
L 3431 531
|
||||
L 3431 0
|
||||
L 469 0
|
||||
L 469 531
|
||||
Q 828 903 1448 1529
|
||||
Q 2069 2156 2228 2338
|
||||
Q 2531 2678 2651 2914
|
||||
Q 2772 3150 2772 3378
|
||||
Q 2772 3750 2511 3984
|
||||
Q 2250 4219 1831 4219
|
||||
Q 1534 4219 1204 4116
|
||||
Q 875 4013 500 3803
|
||||
L 500 4441
|
||||
Q 881 4594 1212 4672
|
||||
Q 1544 4750 1819 4750
|
||||
Q 2544 4750 2975 4387
|
||||
Q 3406 4025 3406 3419
|
||||
Q 3406 3131 3298 2873
|
||||
Q 3191 2616 2906 2266
|
||||
Q 2828 2175 2409 1742
|
||||
Q 1991 1309 1228 531
|
||||
z
|
||||
" transform="scale(0.015625)"/>
|
||||
</defs>
|
||||
<use xlink:href="#DejaVuSans-30"/>
|
||||
<use xlink:href="#DejaVuSans-2e" transform="translate(63.623047 0)"/>
|
||||
<use xlink:href="#DejaVuSans-32" transform="translate(95.410156 0)"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g id="xtick_3">
|
||||
<g id="line2d_3">
|
||||
<g>
|
||||
<use xlink:href="#m82b750d18c" x="144.073583" y="317.72" style="stroke: #000000; stroke-width: 0.8"/>
|
||||
</g>
|
||||
</g>
|
||||
<g id="text_3">
|
||||
<!-- 0.3 -->
|
||||
<g transform="translate(136.12202 332.318437) scale(0.1 -0.1)">
|
||||
<defs>
|
||||
<path id="DejaVuSans-33" d="M 2597 2516
|
||||
Q 3050 2419 3304 2112
|
||||
Q 3559 1806 3559 1356
|
||||
Q 3559 666 3084 287
|
||||
Q 2609 -91 1734 -91
|
||||
Q 1441 -91 1130 -33
|
||||
Q 819 25 488 141
|
||||
L 488 750
|
||||
Q 750 597 1062 519
|
||||
Q 1375 441 1716 441
|
||||
Q 2309 441 2620 675
|
||||
Q 2931 909 2931 1356
|
||||
Q 2931 1769 2642 2001
|
||||
Q 2353 2234 1838 2234
|
||||
L 1294 2234
|
||||
L 1294 2753
|
||||
L 1863 2753
|
||||
Q 2328 2753 2575 2939
|
||||
Q 2822 3125 2822 3475
|
||||
Q 2822 3834 2567 4026
|
||||
Q 2313 4219 1838 4219
|
||||
Q 1578 4219 1281 4162
|
||||
Q 984 4106 628 3988
|
||||
L 628 4550
|
||||
Q 988 4650 1302 4700
|
||||
Q 1616 4750 1894 4750
|
||||
Q 2613 4750 3031 4423
|
||||
Q 3450 4097 3450 3541
|
||||
Q 3450 3153 3228 2886
|
||||
Q 3006 2619 2597 2516
|
||||
z
|
||||
" transform="scale(0.015625)"/>
|
||||
</defs>
|
||||
<use xlink:href="#DejaVuSans-30"/>
|
||||
<use xlink:href="#DejaVuSans-2e" transform="translate(63.623047 0)"/>
|
||||
<use xlink:href="#DejaVuSans-33" transform="translate(95.410156 0)"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g id="xtick_4">
|
||||
<g id="line2d_4">
|
||||
<g>
|
||||
<use xlink:href="#m82b750d18c" x="192.665252" y="317.72" style="stroke: #000000; stroke-width: 0.8"/>
|
||||
</g>
|
||||
</g>
|
||||
<g id="text_4">
|
||||
<!-- 0.4 -->
|
||||
<g transform="translate(184.71369 332.318437) scale(0.1 -0.1)">
|
||||
<defs>
|
||||
<path id="DejaVuSans-34" d="M 2419 4116
|
||||
L 825 1625
|
||||
L 2419 1625
|
||||
L 2419 4116
|
||||
z
|
||||
M 2253 4666
|
||||
L 3047 4666
|
||||
L 3047 1625
|
||||
L 3713 1625
|
||||
L 3713 1100
|
||||
L 3047 1100
|
||||
L 3047 0
|
||||
L 2419 0
|
||||
L 2419 1100
|
||||
L 313 1100
|
||||
L 313 1709
|
||||
L 2253 4666
|
||||
z
|
||||
" transform="scale(0.015625)"/>
|
||||
</defs>
|
||||
<use xlink:href="#DejaVuSans-30"/>
|
||||
<use xlink:href="#DejaVuSans-2e" transform="translate(63.623047 0)"/>
|
||||
<use xlink:href="#DejaVuSans-34" transform="translate(95.410156 0)"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g id="xtick_5">
|
||||
<g id="line2d_5">
|
||||
<g>
|
||||
<use xlink:href="#m82b750d18c" x="241.256921" y="317.72" style="stroke: #000000; stroke-width: 0.8"/>
|
||||
</g>
|
||||
</g>
|
||||
<g id="text_5">
|
||||
<!-- 0.5 -->
|
||||
<g transform="translate(233.305359 332.318437) scale(0.1 -0.1)">
|
||||
<defs>
|
||||
<path id="DejaVuSans-35" d="M 691 4666
|
||||
L 3169 4666
|
||||
L 3169 4134
|
||||
L 1269 4134
|
||||
L 1269 2991
|
||||
Q 1406 3038 1543 3061
|
||||
Q 1681 3084 1819 3084
|
||||
Q 2600 3084 3056 2656
|
||||
Q 3513 2228 3513 1497
|
||||
Q 3513 744 3044 326
|
||||
Q 2575 -91 1722 -91
|
||||
Q 1428 -91 1123 -41
|
||||
Q 819 9 494 109
|
||||
L 494 744
|
||||
Q 775 591 1075 516
|
||||
Q 1375 441 1709 441
|
||||
Q 2250 441 2565 725
|
||||
Q 2881 1009 2881 1497
|
||||
Q 2881 1984 2565 2268
|
||||
Q 2250 2553 1709 2553
|
||||
Q 1456 2553 1204 2497
|
||||
Q 953 2441 691 2322
|
||||
L 691 4666
|
||||
z
|
||||
" transform="scale(0.015625)"/>
|
||||
</defs>
|
||||
<use xlink:href="#DejaVuSans-30"/>
|
||||
<use xlink:href="#DejaVuSans-2e" transform="translate(63.623047 0)"/>
|
||||
<use xlink:href="#DejaVuSans-35" transform="translate(95.410156 0)"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g id="xtick_6">
|
||||
<g id="line2d_6">
|
||||
<g>
|
||||
<use xlink:href="#m82b750d18c" x="289.848591" y="317.72" style="stroke: #000000; stroke-width: 0.8"/>
|
||||
</g>
|
||||
</g>
|
||||
<g id="text_6">
|
||||
<!-- 0.6 -->
|
||||
<g transform="translate(281.897028 332.318437) scale(0.1 -0.1)">
|
||||
<defs>
|
||||
<path id="DejaVuSans-36" d="M 2113 2584
|
||||
Q 1688 2584 1439 2293
|
||||
Q 1191 2003 1191 1497
|
||||
Q 1191 994 1439 701
|
||||
Q 1688 409 2113 409
|
||||
Q 2538 409 2786 701
|
||||
Q 3034 994 3034 1497
|
||||
Q 3034 2003 2786 2293
|
||||
Q 2538 2584 2113 2584
|
||||
z
|
||||
M 3366 4563
|
||||
L 3366 3988
|
||||
Q 3128 4100 2886 4159
|
||||
Q 2644 4219 2406 4219
|
||||
Q 1781 4219 1451 3797
|
||||
Q 1122 3375 1075 2522
|
||||
Q 1259 2794 1537 2939
|
||||
Q 1816 3084 2150 3084
|
||||
Q 2853 3084 3261 2657
|
||||
Q 3669 2231 3669 1497
|
||||
Q 3669 778 3244 343
|
||||
Q 2819 -91 2113 -91
|
||||
Q 1303 -91 875 529
|
||||
Q 447 1150 447 2328
|
||||
Q 447 3434 972 4092
|
||||
Q 1497 4750 2381 4750
|
||||
Q 2619 4750 2861 4703
|
||||
Q 3103 4656 3366 4563
|
||||
z
|
||||
" transform="scale(0.015625)"/>
|
||||
</defs>
|
||||
<use xlink:href="#DejaVuSans-30"/>
|
||||
<use xlink:href="#DejaVuSans-2e" transform="translate(63.623047 0)"/>
|
||||
<use xlink:href="#DejaVuSans-36" transform="translate(95.410156 0)"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g id="xtick_7">
|
||||
<g id="line2d_7">
|
||||
<g>
|
||||
<use xlink:href="#m82b750d18c" x="338.44026" y="317.72" style="stroke: #000000; stroke-width: 0.8"/>
|
||||
</g>
|
||||
</g>
|
||||
<g id="text_7">
|
||||
<!-- 0.7 -->
|
||||
<g transform="translate(330.488698 332.318437) scale(0.1 -0.1)">
|
||||
<defs>
|
||||
<path id="DejaVuSans-37" d="M 525 4666
|
||||
L 3525 4666
|
||||
L 3525 4397
|
||||
L 1831 0
|
||||
L 1172 0
|
||||
L 2766 4134
|
||||
L 525 4134
|
||||
L 525 4666
|
||||
z
|
||||
" transform="scale(0.015625)"/>
|
||||
</defs>
|
||||
<use xlink:href="#DejaVuSans-30"/>
|
||||
<use xlink:href="#DejaVuSans-2e" transform="translate(63.623047 0)"/>
|
||||
<use xlink:href="#DejaVuSans-37" transform="translate(95.410156 0)"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g id="xtick_8">
|
||||
<g id="line2d_8">
|
||||
<g>
|
||||
<use xlink:href="#m82b750d18c" x="387.03193" y="317.72" style="stroke: #000000; stroke-width: 0.8"/>
|
||||
</g>
|
||||
</g>
|
||||
<g id="text_8">
|
||||
<!-- 0.8 -->
|
||||
<g transform="translate(379.080367 332.318437) scale(0.1 -0.1)">
|
||||
<defs>
|
||||
<path id="DejaVuSans-38" d="M 2034 2216
|
||||
Q 1584 2216 1326 1975
|
||||
Q 1069 1734 1069 1313
|
||||
Q 1069 891 1326 650
|
||||
Q 1584 409 2034 409
|
||||
Q 2484 409 2743 651
|
||||
Q 3003 894 3003 1313
|
||||
Q 3003 1734 2745 1975
|
||||
Q 2488 2216 2034 2216
|
||||
z
|
||||
M 1403 2484
|
||||
Q 997 2584 770 2862
|
||||
Q 544 3141 544 3541
|
||||
Q 544 4100 942 4425
|
||||
Q 1341 4750 2034 4750
|
||||
Q 2731 4750 3128 4425
|
||||
Q 3525 4100 3525 3541
|
||||
Q 3525 3141 3298 2862
|
||||
Q 3072 2584 2669 2484
|
||||
Q 3125 2378 3379 2068
|
||||
Q 3634 1759 3634 1313
|
||||
Q 3634 634 3220 271
|
||||
Q 2806 -91 2034 -91
|
||||
Q 1263 -91 848 271
|
||||
Q 434 634 434 1313
|
||||
Q 434 1759 690 2068
|
||||
Q 947 2378 1403 2484
|
||||
z
|
||||
M 1172 3481
|
||||
Q 1172 3119 1398 2916
|
||||
Q 1625 2713 2034 2713
|
||||
Q 2441 2713 2670 2916
|
||||
Q 2900 3119 2900 3481
|
||||
Q 2900 3844 2670 4047
|
||||
Q 2441 4250 2034 4250
|
||||
Q 1625 4250 1398 4047
|
||||
Q 1172 3844 1172 3481
|
||||
z
|
||||
" transform="scale(0.015625)"/>
|
||||
</defs>
|
||||
<use xlink:href="#DejaVuSans-30"/>
|
||||
<use xlink:href="#DejaVuSans-2e" transform="translate(63.623047 0)"/>
|
||||
<use xlink:href="#DejaVuSans-38" transform="translate(95.410156 0)"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g id="xtick_9">
|
||||
<g id="line2d_9">
|
||||
<g>
|
||||
<use xlink:href="#m82b750d18c" x="435.623599" y="317.72" style="stroke: #000000; stroke-width: 0.8"/>
|
||||
</g>
|
||||
</g>
|
||||
<g id="text_9">
|
||||
<!-- 0.9 -->
|
||||
<g transform="translate(427.672037 332.318437) scale(0.1 -0.1)">
|
||||
<defs>
|
||||
<path id="DejaVuSans-39" d="M 703 97
|
||||
L 703 672
|
||||
Q 941 559 1184 500
|
||||
Q 1428 441 1663 441
|
||||
Q 2288 441 2617 861
|
||||
Q 2947 1281 2994 2138
|
||||
Q 2813 1869 2534 1725
|
||||
Q 2256 1581 1919 1581
|
||||
Q 1219 1581 811 2004
|
||||
Q 403 2428 403 3163
|
||||
Q 403 3881 828 4315
|
||||
Q 1253 4750 1959 4750
|
||||
Q 2769 4750 3195 4129
|
||||
Q 3622 3509 3622 2328
|
||||
Q 3622 1225 3098 567
|
||||
Q 2575 -91 1691 -91
|
||||
Q 1453 -91 1209 -44
|
||||
Q 966 3 703 97
|
||||
z
|
||||
M 1959 2075
|
||||
Q 2384 2075 2632 2365
|
||||
Q 2881 2656 2881 3163
|
||||
Q 2881 3666 2632 3958
|
||||
Q 2384 4250 1959 4250
|
||||
Q 1534 4250 1286 3958
|
||||
Q 1038 3666 1038 3163
|
||||
Q 1038 2656 1286 2365
|
||||
Q 1534 2075 1959 2075
|
||||
z
|
||||
" transform="scale(0.015625)"/>
|
||||
</defs>
|
||||
<use xlink:href="#DejaVuSans-30"/>
|
||||
<use xlink:href="#DejaVuSans-2e" transform="translate(63.623047 0)"/>
|
||||
<use xlink:href="#DejaVuSans-39" transform="translate(95.410156 0)"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g id="matplotlib.axis_2">
|
||||
<g id="ytick_1">
|
||||
<g id="line2d_10">
|
||||
<defs>
|
||||
<path id="me91bacd9d9" d="M 0 0
|
||||
L -3.5 0
|
||||
" style="stroke: #000000; stroke-width: 0.8"/>
|
||||
</defs>
|
||||
<g>
|
||||
<use xlink:href="#me91bacd9d9" x="33.73" y="305.0377" style="stroke: #000000; stroke-width: 0.8"/>
|
||||
</g>
|
||||
</g>
|
||||
<g id="text_10">
|
||||
<!-- 0.0 -->
|
||||
<g transform="translate(10.826875 308.836919) scale(0.1 -0.1)">
|
||||
<use xlink:href="#DejaVuSans-30"/>
|
||||
<use xlink:href="#DejaVuSans-2e" transform="translate(63.623047 0)"/>
|
||||
<use xlink:href="#DejaVuSans-30" transform="translate(95.410156 0)"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g id="ytick_2">
|
||||
<g id="line2d_11">
|
||||
<g>
|
||||
<use xlink:href="#me91bacd9d9" x="33.73" y="249.300898" style="stroke: #000000; stroke-width: 0.8"/>
|
||||
</g>
|
||||
</g>
|
||||
<g id="text_11">
|
||||
<!-- 0.2 -->
|
||||
<g transform="translate(10.826875 253.100117) scale(0.1 -0.1)">
|
||||
<use xlink:href="#DejaVuSans-30"/>
|
||||
<use xlink:href="#DejaVuSans-2e" transform="translate(63.623047 0)"/>
|
||||
<use xlink:href="#DejaVuSans-32" transform="translate(95.410156 0)"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g id="ytick_3">
|
||||
<g id="line2d_12">
|
||||
<g>
|
||||
<use xlink:href="#me91bacd9d9" x="33.73" y="193.564096" style="stroke: #000000; stroke-width: 0.8"/>
|
||||
</g>
|
||||
</g>
|
||||
<g id="text_12">
|
||||
<!-- 0.4 -->
|
||||
<g transform="translate(10.826875 197.363315) scale(0.1 -0.1)">
|
||||
<use xlink:href="#DejaVuSans-30"/>
|
||||
<use xlink:href="#DejaVuSans-2e" transform="translate(63.623047 0)"/>
|
||||
<use xlink:href="#DejaVuSans-34" transform="translate(95.410156 0)"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g id="ytick_4">
|
||||
<g id="line2d_13">
|
||||
<g>
|
||||
<use xlink:href="#me91bacd9d9" x="33.73" y="137.827294" style="stroke: #000000; stroke-width: 0.8"/>
|
||||
</g>
|
||||
</g>
|
||||
<g id="text_13">
|
||||
<!-- 0.6 -->
|
||||
<g transform="translate(10.826875 141.626513) scale(0.1 -0.1)">
|
||||
<use xlink:href="#DejaVuSans-30"/>
|
||||
<use xlink:href="#DejaVuSans-2e" transform="translate(63.623047 0)"/>
|
||||
<use xlink:href="#DejaVuSans-36" transform="translate(95.410156 0)"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g id="ytick_5">
|
||||
<g id="line2d_14">
|
||||
<g>
|
||||
<use xlink:href="#me91bacd9d9" x="33.73" y="82.090492" style="stroke: #000000; stroke-width: 0.8"/>
|
||||
</g>
|
||||
</g>
|
||||
<g id="text_14">
|
||||
<!-- 0.8 -->
|
||||
<g transform="translate(10.826875 85.889711) scale(0.1 -0.1)">
|
||||
<use xlink:href="#DejaVuSans-30"/>
|
||||
<use xlink:href="#DejaVuSans-2e" transform="translate(63.623047 0)"/>
|
||||
<use xlink:href="#DejaVuSans-38" transform="translate(95.410156 0)"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g id="ytick_6">
|
||||
<g id="line2d_15">
|
||||
<g>
|
||||
<use xlink:href="#me91bacd9d9" x="33.73" y="26.35369" style="stroke: #000000; stroke-width: 0.8"/>
|
||||
</g>
|
||||
</g>
|
||||
<g id="text_15">
|
||||
<!-- 1.0 -->
|
||||
<g transform="translate(10.826875 30.152909) scale(0.1 -0.1)">
|
||||
<use xlink:href="#DejaVuSans-31"/>
|
||||
<use xlink:href="#DejaVuSans-2e" transform="translate(63.623047 0)"/>
|
||||
<use xlink:href="#DejaVuSans-30" transform="translate(95.410156 0)"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g id="line2d_16">
|
||||
<path d="M 52.289318 303.949091
|
||||
L 59.038161 302.860481
|
||||
L 63.087467 301.771872
|
||||
L 67.715245 300.683263
|
||||
L 71.186079 299.594653
|
||||
L 75.022263 297.417434
|
||||
L 79.28469 296.328825
|
||||
L 82.805826 295.240216
|
||||
L 84.048579 294.151606
|
||||
L 85.069413 293.062997
|
||||
L 88.283147 290.885778
|
||||
L 89.407955 289.797169
|
||||
L 90.854135 288.708559
|
||||
L 95.481913 287.61995
|
||||
L 99.531219 286.53134
|
||||
L 100.596826 285.442731
|
||||
L 101.371813 284.354121
|
||||
L 103.361643 282.176903
|
||||
L 104.592851 279.999684
|
||||
L 108.021699 277.822465
|
||||
L 109.365247 275.645246
|
||||
L 110.433196 274.556637
|
||||
L 111.679136 273.468027
|
||||
L 112.631914 272.379418
|
||||
L 113.993025 271.290808
|
||||
L 125.059451 269.11359
|
||||
L 126.171389 268.02498
|
||||
L 126.923582 266.936371
|
||||
L 127.87636 265.847761
|
||||
L 128.666468 264.759152
|
||||
L 129.627411 262.581933
|
||||
L 131.925665 260.404714
|
||||
L 133.275434 257.138886
|
||||
L 133.903233 256.050277
|
||||
L 134.355249 254.961667
|
||||
L 134.962645 253.873058
|
||||
L 139.371163 251.695839
|
||||
L 140.024277 250.60723
|
||||
L 140.518095 249.51862
|
||||
L 141.86487 247.341401
|
||||
L 142.760294 245.164183
|
||||
L 145.546057 242.986964
|
||||
L 146.77312 240.809745
|
||||
L 147.811403 239.721135
|
||||
L 149.100307 238.632526
|
||||
L 150.147541 237.543917
|
||||
L 151.745952 236.455307
|
||||
L 168.369417 234.278088
|
||||
L 169.798584 233.189479
|
||||
L 170.720627 232.10087
|
||||
L 171.840251 231.01226
|
||||
L 172.730208 229.923651
|
||||
L 173.768492 227.746432
|
||||
L 176.072975 225.569213
|
||||
L 177.320514 222.303385
|
||||
L 177.876483 221.214775
|
||||
L 178.26772 220.126166
|
||||
L 178.781918 219.037557
|
||||
L 182.158945 216.860338
|
||||
L 183.409696 213.59451
|
||||
L 183.830403 212.5059
|
||||
L 184.39433 210.328681
|
||||
L 186.039115 208.151462
|
||||
L 186.715252 205.974244
|
||||
L 188.43989 202.708415
|
||||
L 189.194419 201.619806
|
||||
L 196.264635 199.442587
|
||||
L 197.082677 198.353978
|
||||
L 197.649013 197.265368
|
||||
L 199.003296 195.088149
|
||||
L 199.776228 192.910931
|
||||
L 201.705563 190.733712
|
||||
L 202.895077 187.467884
|
||||
L 203.463401 186.379274
|
||||
L 203.878714 185.290665
|
||||
L 204.445051 184.202055
|
||||
L 208.862475 182.024837
|
||||
L 209.566702 180.936227
|
||||
L 210.108415 179.847618
|
||||
L 211.627855 177.670399
|
||||
L 212.673587 175.49318
|
||||
L 214.26155 174.404571
|
||||
L 216.123299 173.315961
|
||||
L 217.744823 171.138742
|
||||
L 219.169799 170.050133
|
||||
L 221.010393 168.961524
|
||||
L 222.567818 167.872914
|
||||
L 225.059698 166.784305
|
||||
L 257.454145 164.607086
|
||||
L 259.946025 163.518476
|
||||
L 261.50345 162.429867
|
||||
L 263.344044 161.341258
|
||||
L 264.76902 160.252648
|
||||
L 266.390544 158.075429
|
||||
L 268.252293 156.98682
|
||||
L 269.840256 155.898211
|
||||
L 271.626715 152.632382
|
||||
L 272.405428 151.543773
|
||||
L 272.947141 150.455163
|
||||
L 273.651368 149.366554
|
||||
L 278.068792 147.189335
|
||||
L 278.635129 146.100726
|
||||
L 279.050442 145.012116
|
||||
L 280.130257 142.834898
|
||||
L 280.80828 140.657679
|
||||
L 282.737615 138.48046
|
||||
L 283.510547 136.303241
|
||||
L 285.431166 133.037413
|
||||
L 286.249208 131.948803
|
||||
L 293.319424 129.771585
|
||||
L 294.073953 128.682975
|
||||
L 294.589242 127.594366
|
||||
L 295.798591 125.417147
|
||||
L 296.474728 123.239928
|
||||
L 298.119513 121.062709
|
||||
L 299.104147 117.796881
|
||||
L 299.566925 116.708272
|
||||
L 299.90204 115.619662
|
||||
L 300.354898 114.531053
|
||||
L 303.731925 112.353834
|
||||
L 304.246123 111.265225
|
||||
L 304.63736 110.176615
|
||||
L 305.715258 107.999396
|
||||
L 306.440868 105.822178
|
||||
L 308.745351 103.644959
|
||||
L 309.783635 101.46774
|
||||
L 310.673592 100.37913
|
||||
L 311.793216 99.290521
|
||||
L 312.715259 98.201912
|
||||
L 314.144426 97.113302
|
||||
L 330.767891 94.936083
|
||||
L 332.366302 93.847474
|
||||
L 333.413536 92.758865
|
||||
L 334.70244 91.670255
|
||||
L 335.740723 90.581646
|
||||
L 336.967785 88.404427
|
||||
L 339.753549 86.227208
|
||||
L 341.298594 82.96138
|
||||
L 341.995748 81.87277
|
||||
L 342.489566 80.784161
|
||||
L 343.14268 79.695552
|
||||
L 347.551198 77.518333
|
||||
L 348.158594 76.429723
|
||||
L 348.61061 75.341114
|
||||
L 349.812779 73.163895
|
||||
L 350.588178 70.986676
|
||||
L 352.886432 68.809457
|
||||
L 353.847375 66.632239
|
||||
L 354.637483 65.543629
|
||||
L 355.590261 64.45502
|
||||
L 356.342454 63.36641
|
||||
L 357.454392 62.277801
|
||||
L 368.520818 60.100582
|
||||
L 369.881929 59.011973
|
||||
L 370.834707 57.923363
|
||||
L 372.080647 56.834754
|
||||
L 373.148596 55.746144
|
||||
L 374.492144 53.568926
|
||||
L 377.920992 51.391707
|
||||
L 379.1522 49.214488
|
||||
L 382.982624 44.86005
|
||||
L 387.03193 43.771441
|
||||
L 391.659708 42.682831
|
||||
L 393.105888 41.594222
|
||||
L 394.230696 40.505613
|
||||
L 397.44443 38.328394
|
||||
L 398.465264 37.239784
|
||||
L 403.229153 35.062566
|
||||
L 409.458854 32.885347
|
||||
L 414.798598 30.708128
|
||||
L 423.475682 28.530909
|
||||
L 423.475682 28.530909
|
||||
" clip-path="url(#p34cae5d2d5)" style="fill: none; stroke: #1f77b4; stroke-width: 1.5; stroke-linecap: square"/>
|
||||
</g>
|
||||
<g id="patch_3">
|
||||
<path d="M 33.73 317.72
|
||||
L 33.73 14.76
|
||||
" style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/>
|
||||
</g>
|
||||
<g id="patch_4">
|
||||
<path d="M 442.035 317.72
|
||||
L 442.035 14.76
|
||||
" style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/>
|
||||
</g>
|
||||
<g id="patch_5">
|
||||
<path d="M 33.73 317.72
|
||||
L 442.035 317.72
|
||||
" style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/>
|
||||
</g>
|
||||
<g id="patch_6">
|
||||
<path d="M 33.73 14.76
|
||||
L 442.035 14.76
|
||||
" style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<defs>
|
||||
<clipPath id="p34cae5d2d5">
|
||||
<rect x="33.73" y="14.76" width="408.305" height="302.96"/>
|
||||
</clipPath>
|
||||
</defs>
|
||||
</svg>
|
||||
|
||||
|
Before Width: | Height: | Size: 19 KiB |
@ -1,618 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
|
||||
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg xmlns:xlink="http://www.w3.org/1999/xlink" width="460.8pt" height="345.6pt" viewBox="0 0 460.8 345.6" xmlns="http://www.w3.org/2000/svg" version="1.1">
|
||||
<metadata>
|
||||
<rdf:RDF xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
|
||||
<cc:Work>
|
||||
<dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
|
||||
<dc:date>2025-07-30T17:57:32.094511</dc:date>
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:creator>
|
||||
<cc:Agent>
|
||||
<dc:title>Matplotlib v3.10.3, https://matplotlib.org/</dc:title>
|
||||
</cc:Agent>
|
||||
</dc:creator>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<defs>
|
||||
<style type="text/css">*{stroke-linejoin: round; stroke-linecap: butt}</style>
|
||||
</defs>
|
||||
<g id="figure_1">
|
||||
<g id="patch_1">
|
||||
<path d="M 0 345.6
|
||||
L 460.8 345.6
|
||||
L 460.8 0
|
||||
L 0 0
|
||||
z
|
||||
" style="fill: #ffffff"/>
|
||||
</g>
|
||||
<g id="axes_1">
|
||||
<g id="patch_2">
|
||||
<path d="M 33.73 317.72
|
||||
L 442.035 317.72
|
||||
L 442.035 14.76
|
||||
L 33.73 14.76
|
||||
z
|
||||
" style="fill: #ffffff"/>
|
||||
</g>
|
||||
<g id="matplotlib.axis_1">
|
||||
<g id="xtick_1">
|
||||
<g id="line2d_1">
|
||||
<defs>
|
||||
<path id="m89e3a504e2" d="M 0 0
|
||||
L 0 3.5
|
||||
" style="stroke: #000000; stroke-width: 0.8"/>
|
||||
</defs>
|
||||
<g>
|
||||
<use xlink:href="#m89e3a504e2" x="52.289318" y="317.72" style="stroke: #000000; stroke-width: 0.8"/>
|
||||
</g>
|
||||
</g>
|
||||
<g id="text_1">
|
||||
<!-- 0.0 -->
|
||||
<g transform="translate(44.337756 332.318437) scale(0.1 -0.1)">
|
||||
<defs>
|
||||
<path id="DejaVuSans-30" d="M 2034 4250
|
||||
Q 1547 4250 1301 3770
|
||||
Q 1056 3291 1056 2328
|
||||
Q 1056 1369 1301 889
|
||||
Q 1547 409 2034 409
|
||||
Q 2525 409 2770 889
|
||||
Q 3016 1369 3016 2328
|
||||
Q 3016 3291 2770 3770
|
||||
Q 2525 4250 2034 4250
|
||||
z
|
||||
M 2034 4750
|
||||
Q 2819 4750 3233 4129
|
||||
Q 3647 3509 3647 2328
|
||||
Q 3647 1150 3233 529
|
||||
Q 2819 -91 2034 -91
|
||||
Q 1250 -91 836 529
|
||||
Q 422 1150 422 2328
|
||||
Q 422 3509 836 4129
|
||||
Q 1250 4750 2034 4750
|
||||
z
|
||||
" transform="scale(0.015625)"/>
|
||||
<path id="DejaVuSans-2e" d="M 684 794
|
||||
L 1344 794
|
||||
L 1344 0
|
||||
L 684 0
|
||||
L 684 794
|
||||
z
|
||||
" transform="scale(0.015625)"/>
|
||||
</defs>
|
||||
<use xlink:href="#DejaVuSans-30"/>
|
||||
<use xlink:href="#DejaVuSans-2e" transform="translate(63.623047 0)"/>
|
||||
<use xlink:href="#DejaVuSans-30" transform="translate(95.410156 0)"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g id="xtick_2">
|
||||
<g id="line2d_2">
|
||||
<g>
|
||||
<use xlink:href="#m89e3a504e2" x="101.129629" y="317.72" style="stroke: #000000; stroke-width: 0.8"/>
|
||||
</g>
|
||||
</g>
|
||||
<g id="text_2">
|
||||
<!-- 2.5 -->
|
||||
<g transform="translate(93.178067 332.318437) scale(0.1 -0.1)">
|
||||
<defs>
|
||||
<path id="DejaVuSans-32" d="M 1228 531
|
||||
L 3431 531
|
||||
L 3431 0
|
||||
L 469 0
|
||||
L 469 531
|
||||
Q 828 903 1448 1529
|
||||
Q 2069 2156 2228 2338
|
||||
Q 2531 2678 2651 2914
|
||||
Q 2772 3150 2772 3378
|
||||
Q 2772 3750 2511 3984
|
||||
Q 2250 4219 1831 4219
|
||||
Q 1534 4219 1204 4116
|
||||
Q 875 4013 500 3803
|
||||
L 500 4441
|
||||
Q 881 4594 1212 4672
|
||||
Q 1544 4750 1819 4750
|
||||
Q 2544 4750 2975 4387
|
||||
Q 3406 4025 3406 3419
|
||||
Q 3406 3131 3298 2873
|
||||
Q 3191 2616 2906 2266
|
||||
Q 2828 2175 2409 1742
|
||||
Q 1991 1309 1228 531
|
||||
z
|
||||
" transform="scale(0.015625)"/>
|
||||
<path id="DejaVuSans-35" d="M 691 4666
|
||||
L 3169 4666
|
||||
L 3169 4134
|
||||
L 1269 4134
|
||||
L 1269 2991
|
||||
Q 1406 3038 1543 3061
|
||||
Q 1681 3084 1819 3084
|
||||
Q 2600 3084 3056 2656
|
||||
Q 3513 2228 3513 1497
|
||||
Q 3513 744 3044 326
|
||||
Q 2575 -91 1722 -91
|
||||
Q 1428 -91 1123 -41
|
||||
Q 819 9 494 109
|
||||
L 494 744
|
||||
Q 775 591 1075 516
|
||||
Q 1375 441 1709 441
|
||||
Q 2250 441 2565 725
|
||||
Q 2881 1009 2881 1497
|
||||
Q 2881 1984 2565 2268
|
||||
Q 2250 2553 1709 2553
|
||||
Q 1456 2553 1204 2497
|
||||
Q 953 2441 691 2322
|
||||
L 691 4666
|
||||
z
|
||||
" transform="scale(0.015625)"/>
|
||||
</defs>
|
||||
<use xlink:href="#DejaVuSans-32"/>
|
||||
<use xlink:href="#DejaVuSans-2e" transform="translate(63.623047 0)"/>
|
||||
<use xlink:href="#DejaVuSans-35" transform="translate(95.410156 0)"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g id="xtick_3">
|
||||
<g id="line2d_3">
|
||||
<g>
|
||||
<use xlink:href="#m89e3a504e2" x="149.96994" y="317.72" style="stroke: #000000; stroke-width: 0.8"/>
|
||||
</g>
|
||||
</g>
|
||||
<g id="text_3">
|
||||
<!-- 5.0 -->
|
||||
<g transform="translate(142.018378 332.318437) scale(0.1 -0.1)">
|
||||
<use xlink:href="#DejaVuSans-35"/>
|
||||
<use xlink:href="#DejaVuSans-2e" transform="translate(63.623047 0)"/>
|
||||
<use xlink:href="#DejaVuSans-30" transform="translate(95.410156 0)"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g id="xtick_4">
|
||||
<g id="line2d_4">
|
||||
<g>
|
||||
<use xlink:href="#m89e3a504e2" x="198.810251" y="317.72" style="stroke: #000000; stroke-width: 0.8"/>
|
||||
</g>
|
||||
</g>
|
||||
<g id="text_4">
|
||||
<!-- 7.5 -->
|
||||
<g transform="translate(190.858689 332.318437) scale(0.1 -0.1)">
|
||||
<defs>
|
||||
<path id="DejaVuSans-37" d="M 525 4666
|
||||
L 3525 4666
|
||||
L 3525 4397
|
||||
L 1831 0
|
||||
L 1172 0
|
||||
L 2766 4134
|
||||
L 525 4134
|
||||
L 525 4666
|
||||
z
|
||||
" transform="scale(0.015625)"/>
|
||||
</defs>
|
||||
<use xlink:href="#DejaVuSans-37"/>
|
||||
<use xlink:href="#DejaVuSans-2e" transform="translate(63.623047 0)"/>
|
||||
<use xlink:href="#DejaVuSans-35" transform="translate(95.410156 0)"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g id="xtick_5">
|
||||
<g id="line2d_5">
|
||||
<g>
|
||||
<use xlink:href="#m89e3a504e2" x="247.650562" y="317.72" style="stroke: #000000; stroke-width: 0.8"/>
|
||||
</g>
|
||||
</g>
|
||||
<g id="text_5">
|
||||
<!-- 10.0 -->
|
||||
<g transform="translate(236.51775 332.318437) scale(0.1 -0.1)">
|
||||
<defs>
|
||||
<path id="DejaVuSans-31" d="M 794 531
|
||||
L 1825 531
|
||||
L 1825 4091
|
||||
L 703 3866
|
||||
L 703 4441
|
||||
L 1819 4666
|
||||
L 2450 4666
|
||||
L 2450 531
|
||||
L 3481 531
|
||||
L 3481 0
|
||||
L 794 0
|
||||
L 794 531
|
||||
z
|
||||
" transform="scale(0.015625)"/>
|
||||
</defs>
|
||||
<use xlink:href="#DejaVuSans-31"/>
|
||||
<use xlink:href="#DejaVuSans-30" transform="translate(63.623047 0)"/>
|
||||
<use xlink:href="#DejaVuSans-2e" transform="translate(127.246094 0)"/>
|
||||
<use xlink:href="#DejaVuSans-30" transform="translate(159.033203 0)"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g id="xtick_6">
|
||||
<g id="line2d_6">
|
||||
<g>
|
||||
<use xlink:href="#m89e3a504e2" x="296.490873" y="317.72" style="stroke: #000000; stroke-width: 0.8"/>
|
||||
</g>
|
||||
</g>
|
||||
<g id="text_6">
|
||||
<!-- 12.5 -->
|
||||
<g transform="translate(285.358061 332.318437) scale(0.1 -0.1)">
|
||||
<use xlink:href="#DejaVuSans-31"/>
|
||||
<use xlink:href="#DejaVuSans-32" transform="translate(63.623047 0)"/>
|
||||
<use xlink:href="#DejaVuSans-2e" transform="translate(127.246094 0)"/>
|
||||
<use xlink:href="#DejaVuSans-35" transform="translate(159.033203 0)"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g id="xtick_7">
|
||||
<g id="line2d_7">
|
||||
<g>
|
||||
<use xlink:href="#m89e3a504e2" x="345.331184" y="317.72" style="stroke: #000000; stroke-width: 0.8"/>
|
||||
</g>
|
||||
</g>
|
||||
<g id="text_7">
|
||||
<!-- 15.0 -->
|
||||
<g transform="translate(334.198372 332.318437) scale(0.1 -0.1)">
|
||||
<use xlink:href="#DejaVuSans-31"/>
|
||||
<use xlink:href="#DejaVuSans-35" transform="translate(63.623047 0)"/>
|
||||
<use xlink:href="#DejaVuSans-2e" transform="translate(127.246094 0)"/>
|
||||
<use xlink:href="#DejaVuSans-30" transform="translate(159.033203 0)"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g id="xtick_8">
|
||||
<g id="line2d_8">
|
||||
<g>
|
||||
<use xlink:href="#m89e3a504e2" x="394.171495" y="317.72" style="stroke: #000000; stroke-width: 0.8"/>
|
||||
</g>
|
||||
</g>
|
||||
<g id="text_8">
|
||||
<!-- 17.5 -->
|
||||
<g transform="translate(383.038683 332.318437) scale(0.1 -0.1)">
|
||||
<use xlink:href="#DejaVuSans-31"/>
|
||||
<use xlink:href="#DejaVuSans-37" transform="translate(63.623047 0)"/>
|
||||
<use xlink:href="#DejaVuSans-2e" transform="translate(127.246094 0)"/>
|
||||
<use xlink:href="#DejaVuSans-35" transform="translate(159.033203 0)"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g id="matplotlib.axis_2">
|
||||
<g id="ytick_1">
|
||||
<g id="line2d_9">
|
||||
<defs>
|
||||
<path id="ma9be8e3392" d="M 0 0
|
||||
L -3.5 0
|
||||
" style="stroke: #000000; stroke-width: 0.8"/>
|
||||
</defs>
|
||||
<g>
|
||||
<use xlink:href="#ma9be8e3392" x="33.73" y="285.587879" style="stroke: #000000; stroke-width: 0.8"/>
|
||||
</g>
|
||||
</g>
|
||||
<g id="text_9">
|
||||
<!-- 0.3 -->
|
||||
<g transform="translate(10.826875 289.387098) scale(0.1 -0.1)">
|
||||
<defs>
|
||||
<path id="DejaVuSans-33" d="M 2597 2516
|
||||
Q 3050 2419 3304 2112
|
||||
Q 3559 1806 3559 1356
|
||||
Q 3559 666 3084 287
|
||||
Q 2609 -91 1734 -91
|
||||
Q 1441 -91 1130 -33
|
||||
Q 819 25 488 141
|
||||
L 488 750
|
||||
Q 750 597 1062 519
|
||||
Q 1375 441 1716 441
|
||||
Q 2309 441 2620 675
|
||||
Q 2931 909 2931 1356
|
||||
Q 2931 1769 2642 2001
|
||||
Q 2353 2234 1838 2234
|
||||
L 1294 2234
|
||||
L 1294 2753
|
||||
L 1863 2753
|
||||
Q 2328 2753 2575 2939
|
||||
Q 2822 3125 2822 3475
|
||||
Q 2822 3834 2567 4026
|
||||
Q 2313 4219 1838 4219
|
||||
Q 1578 4219 1281 4162
|
||||
Q 984 4106 628 3988
|
||||
L 628 4550
|
||||
Q 988 4650 1302 4700
|
||||
Q 1616 4750 1894 4750
|
||||
Q 2613 4750 3031 4423
|
||||
Q 3450 4097 3450 3541
|
||||
Q 3450 3153 3228 2886
|
||||
Q 3006 2619 2597 2516
|
||||
z
|
||||
" transform="scale(0.015625)"/>
|
||||
</defs>
|
||||
<use xlink:href="#DejaVuSans-30"/>
|
||||
<use xlink:href="#DejaVuSans-2e" transform="translate(63.623047 0)"/>
|
||||
<use xlink:href="#DejaVuSans-33" transform="translate(95.410156 0)"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g id="ytick_2">
|
||||
<g id="line2d_10">
|
||||
<g>
|
||||
<use xlink:href="#ma9be8e3392" x="33.73" y="248.865455" style="stroke: #000000; stroke-width: 0.8"/>
|
||||
</g>
|
||||
</g>
|
||||
<g id="text_10">
|
||||
<!-- 0.4 -->
|
||||
<g transform="translate(10.826875 252.664673) scale(0.1 -0.1)">
|
||||
<defs>
|
||||
<path id="DejaVuSans-34" d="M 2419 4116
|
||||
L 825 1625
|
||||
L 2419 1625
|
||||
L 2419 4116
|
||||
z
|
||||
M 2253 4666
|
||||
L 3047 4666
|
||||
L 3047 1625
|
||||
L 3713 1625
|
||||
L 3713 1100
|
||||
L 3047 1100
|
||||
L 3047 0
|
||||
L 2419 0
|
||||
L 2419 1100
|
||||
L 313 1100
|
||||
L 313 1709
|
||||
L 2253 4666
|
||||
z
|
||||
" transform="scale(0.015625)"/>
|
||||
</defs>
|
||||
<use xlink:href="#DejaVuSans-30"/>
|
||||
<use xlink:href="#DejaVuSans-2e" transform="translate(63.623047 0)"/>
|
||||
<use xlink:href="#DejaVuSans-34" transform="translate(95.410156 0)"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g id="ytick_3">
|
||||
<g id="line2d_11">
|
||||
<g>
|
||||
<use xlink:href="#ma9be8e3392" x="33.73" y="212.14303" style="stroke: #000000; stroke-width: 0.8"/>
|
||||
</g>
|
||||
</g>
|
||||
<g id="text_11">
|
||||
<!-- 0.5 -->
|
||||
<g transform="translate(10.826875 215.942249) scale(0.1 -0.1)">
|
||||
<use xlink:href="#DejaVuSans-30"/>
|
||||
<use xlink:href="#DejaVuSans-2e" transform="translate(63.623047 0)"/>
|
||||
<use xlink:href="#DejaVuSans-35" transform="translate(95.410156 0)"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g id="ytick_4">
|
||||
<g id="line2d_12">
|
||||
<g>
|
||||
<use xlink:href="#ma9be8e3392" x="33.73" y="175.420606" style="stroke: #000000; stroke-width: 0.8"/>
|
||||
</g>
|
||||
</g>
|
||||
<g id="text_12">
|
||||
<!-- 0.6 -->
|
||||
<g transform="translate(10.826875 179.219825) scale(0.1 -0.1)">
|
||||
<defs>
|
||||
<path id="DejaVuSans-36" d="M 2113 2584
|
||||
Q 1688 2584 1439 2293
|
||||
Q 1191 2003 1191 1497
|
||||
Q 1191 994 1439 701
|
||||
Q 1688 409 2113 409
|
||||
Q 2538 409 2786 701
|
||||
Q 3034 994 3034 1497
|
||||
Q 3034 2003 2786 2293
|
||||
Q 2538 2584 2113 2584
|
||||
z
|
||||
M 3366 4563
|
||||
L 3366 3988
|
||||
Q 3128 4100 2886 4159
|
||||
Q 2644 4219 2406 4219
|
||||
Q 1781 4219 1451 3797
|
||||
Q 1122 3375 1075 2522
|
||||
Q 1259 2794 1537 2939
|
||||
Q 1816 3084 2150 3084
|
||||
Q 2853 3084 3261 2657
|
||||
Q 3669 2231 3669 1497
|
||||
Q 3669 778 3244 343
|
||||
Q 2819 -91 2113 -91
|
||||
Q 1303 -91 875 529
|
||||
Q 447 1150 447 2328
|
||||
Q 447 3434 972 4092
|
||||
Q 1497 4750 2381 4750
|
||||
Q 2619 4750 2861 4703
|
||||
Q 3103 4656 3366 4563
|
||||
z
|
||||
" transform="scale(0.015625)"/>
|
||||
</defs>
|
||||
<use xlink:href="#DejaVuSans-30"/>
|
||||
<use xlink:href="#DejaVuSans-2e" transform="translate(63.623047 0)"/>
|
||||
<use xlink:href="#DejaVuSans-36" transform="translate(95.410156 0)"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g id="ytick_5">
|
||||
<g id="line2d_13">
|
||||
<g>
|
||||
<use xlink:href="#ma9be8e3392" x="33.73" y="138.698182" style="stroke: #000000; stroke-width: 0.8"/>
|
||||
</g>
|
||||
</g>
|
||||
<g id="text_13">
|
||||
<!-- 0.7 -->
|
||||
<g transform="translate(10.826875 142.497401) scale(0.1 -0.1)">
|
||||
<use xlink:href="#DejaVuSans-30"/>
|
||||
<use xlink:href="#DejaVuSans-2e" transform="translate(63.623047 0)"/>
|
||||
<use xlink:href="#DejaVuSans-37" transform="translate(95.410156 0)"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g id="ytick_6">
|
||||
<g id="line2d_14">
|
||||
<g>
|
||||
<use xlink:href="#ma9be8e3392" x="33.73" y="101.975758" style="stroke: #000000; stroke-width: 0.8"/>
|
||||
</g>
|
||||
</g>
|
||||
<g id="text_14">
|
||||
<!-- 0.8 -->
|
||||
<g transform="translate(10.826875 105.774976) scale(0.1 -0.1)">
|
||||
<defs>
|
||||
<path id="DejaVuSans-38" d="M 2034 2216
|
||||
Q 1584 2216 1326 1975
|
||||
Q 1069 1734 1069 1313
|
||||
Q 1069 891 1326 650
|
||||
Q 1584 409 2034 409
|
||||
Q 2484 409 2743 651
|
||||
Q 3003 894 3003 1313
|
||||
Q 3003 1734 2745 1975
|
||||
Q 2488 2216 2034 2216
|
||||
z
|
||||
M 1403 2484
|
||||
Q 997 2584 770 2862
|
||||
Q 544 3141 544 3541
|
||||
Q 544 4100 942 4425
|
||||
Q 1341 4750 2034 4750
|
||||
Q 2731 4750 3128 4425
|
||||
Q 3525 4100 3525 3541
|
||||
Q 3525 3141 3298 2862
|
||||
Q 3072 2584 2669 2484
|
||||
Q 3125 2378 3379 2068
|
||||
Q 3634 1759 3634 1313
|
||||
Q 3634 634 3220 271
|
||||
Q 2806 -91 2034 -91
|
||||
Q 1263 -91 848 271
|
||||
Q 434 634 434 1313
|
||||
Q 434 1759 690 2068
|
||||
Q 947 2378 1403 2484
|
||||
z
|
||||
M 1172 3481
|
||||
Q 1172 3119 1398 2916
|
||||
Q 1625 2713 2034 2713
|
||||
Q 2441 2713 2670 2916
|
||||
Q 2900 3119 2900 3481
|
||||
Q 2900 3844 2670 4047
|
||||
Q 2441 4250 2034 4250
|
||||
Q 1625 4250 1398 4047
|
||||
Q 1172 3844 1172 3481
|
||||
z
|
||||
" transform="scale(0.015625)"/>
|
||||
</defs>
|
||||
<use xlink:href="#DejaVuSans-30"/>
|
||||
<use xlink:href="#DejaVuSans-2e" transform="translate(63.623047 0)"/>
|
||||
<use xlink:href="#DejaVuSans-38" transform="translate(95.410156 0)"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g id="ytick_7">
|
||||
<g id="line2d_15">
|
||||
<g>
|
||||
<use xlink:href="#ma9be8e3392" x="33.73" y="65.253333" style="stroke: #000000; stroke-width: 0.8"/>
|
||||
</g>
|
||||
</g>
|
||||
<g id="text_15">
|
||||
<!-- 0.9 -->
|
||||
<g transform="translate(10.826875 69.052552) scale(0.1 -0.1)">
|
||||
<defs>
|
||||
<path id="DejaVuSans-39" d="M 703 97
|
||||
L 703 672
|
||||
Q 941 559 1184 500
|
||||
Q 1428 441 1663 441
|
||||
Q 2288 441 2617 861
|
||||
Q 2947 1281 2994 2138
|
||||
Q 2813 1869 2534 1725
|
||||
Q 2256 1581 1919 1581
|
||||
Q 1219 1581 811 2004
|
||||
Q 403 2428 403 3163
|
||||
Q 403 3881 828 4315
|
||||
Q 1253 4750 1959 4750
|
||||
Q 2769 4750 3195 4129
|
||||
Q 3622 3509 3622 2328
|
||||
Q 3622 1225 3098 567
|
||||
Q 2575 -91 1691 -91
|
||||
Q 1453 -91 1209 -44
|
||||
Q 966 3 703 97
|
||||
z
|
||||
M 1959 2075
|
||||
Q 2384 2075 2632 2365
|
||||
Q 2881 2656 2881 3163
|
||||
Q 2881 3666 2632 3958
|
||||
Q 2384 4250 1959 4250
|
||||
Q 1534 4250 1286 3958
|
||||
Q 1038 3666 1038 3163
|
||||
Q 1038 2656 1286 2365
|
||||
Q 1534 2075 1959 2075
|
||||
z
|
||||
" transform="scale(0.015625)"/>
|
||||
</defs>
|
||||
<use xlink:href="#DejaVuSans-30"/>
|
||||
<use xlink:href="#DejaVuSans-2e" transform="translate(63.623047 0)"/>
|
||||
<use xlink:href="#DejaVuSans-39" transform="translate(95.410156 0)"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g id="ytick_8">
|
||||
<g id="line2d_16">
|
||||
<g>
|
||||
<use xlink:href="#ma9be8e3392" x="33.73" y="28.530909" style="stroke: #000000; stroke-width: 0.8"/>
|
||||
</g>
|
||||
</g>
|
||||
<g id="text_16">
|
||||
<!-- 1.0 -->
|
||||
<g transform="translate(10.826875 32.330128) scale(0.1 -0.1)">
|
||||
<use xlink:href="#DejaVuSans-31"/>
|
||||
<use xlink:href="#DejaVuSans-2e" transform="translate(63.623047 0)"/>
|
||||
<use xlink:href="#DejaVuSans-30" transform="translate(95.410156 0)"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g id="line2d_17">
|
||||
<path d="M 52.289318 28.530909
|
||||
L 71.825443 212.14303
|
||||
L 91.361567 303.949091
|
||||
L 110.897691 258.046061
|
||||
L 130.433816 280.997576
|
||||
L 149.96994 269.521818
|
||||
L 169.506065 275.259697
|
||||
L 189.042189 272.390758
|
||||
L 208.578313 273.825227
|
||||
L 228.114438 273.107992
|
||||
L 247.650562 273.46661
|
||||
L 267.186687 273.287301
|
||||
L 286.722811 273.376955
|
||||
L 306.258935 273.332128
|
||||
L 325.79506 273.354542
|
||||
L 345.331184 273.343335
|
||||
L 364.867309 273.348939
|
||||
L 384.403433 273.346137
|
||||
L 403.939557 273.347538
|
||||
L 423.475682 273.346837
|
||||
" clip-path="url(#pe6fd9f8a67)" style="fill: none; stroke: #1f77b4; stroke-width: 1.5; stroke-linecap: square"/>
|
||||
</g>
|
||||
<g id="patch_3">
|
||||
<path d="M 33.73 317.72
|
||||
L 33.73 14.76
|
||||
" style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/>
|
||||
</g>
|
||||
<g id="patch_4">
|
||||
<path d="M 442.035 317.72
|
||||
L 442.035 14.76
|
||||
" style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/>
|
||||
</g>
|
||||
<g id="patch_5">
|
||||
<path d="M 33.73 317.72
|
||||
L 442.035 317.72
|
||||
" style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/>
|
||||
</g>
|
||||
<g id="patch_6">
|
||||
<path d="M 33.73 14.76
|
||||
L 442.035 14.76
|
||||
" style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<defs>
|
||||
<clipPath id="pe6fd9f8a67">
|
||||
<rect x="33.73" y="14.76" width="408.305" height="302.96"/>
|
||||
</clipPath>
|
||||
</defs>
|
||||
</svg>
|
||||
|
||||
|
Before Width: | Height: | Size: 17 KiB |
@ -1,618 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
|
||||
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg xmlns:xlink="http://www.w3.org/1999/xlink" width="460.8pt" height="345.6pt" viewBox="0 0 460.8 345.6" xmlns="http://www.w3.org/2000/svg" version="1.1">
|
||||
<metadata>
|
||||
<rdf:RDF xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
|
||||
<cc:Work>
|
||||
<dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
|
||||
<dc:date>2025-07-30T17:57:33.434057</dc:date>
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:creator>
|
||||
<cc:Agent>
|
||||
<dc:title>Matplotlib v3.10.3, https://matplotlib.org/</dc:title>
|
||||
</cc:Agent>
|
||||
</dc:creator>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<defs>
|
||||
<style type="text/css">*{stroke-linejoin: round; stroke-linecap: butt}</style>
|
||||
</defs>
|
||||
<g id="figure_1">
|
||||
<g id="patch_1">
|
||||
<path d="M 0 345.6
|
||||
L 460.8 345.6
|
||||
L 460.8 0
|
||||
L 0 0
|
||||
z
|
||||
" style="fill: #ffffff"/>
|
||||
</g>
|
||||
<g id="axes_1">
|
||||
<g id="patch_2">
|
||||
<path d="M 33.73 317.72
|
||||
L 442.035 317.72
|
||||
L 442.035 14.76
|
||||
L 33.73 14.76
|
||||
z
|
||||
" style="fill: #ffffff"/>
|
||||
</g>
|
||||
<g id="matplotlib.axis_1">
|
||||
<g id="xtick_1">
|
||||
<g id="line2d_1">
|
||||
<defs>
|
||||
<path id="m833a6f6579" d="M 0 0
|
||||
L 0 3.5
|
||||
" style="stroke: #000000; stroke-width: 0.8"/>
|
||||
</defs>
|
||||
<g>
|
||||
<use xlink:href="#m833a6f6579" x="52.289318" y="317.72" style="stroke: #000000; stroke-width: 0.8"/>
|
||||
</g>
|
||||
</g>
|
||||
<g id="text_1">
|
||||
<!-- 0.0 -->
|
||||
<g transform="translate(44.337756 332.318437) scale(0.1 -0.1)">
|
||||
<defs>
|
||||
<path id="DejaVuSans-30" d="M 2034 4250
|
||||
Q 1547 4250 1301 3770
|
||||
Q 1056 3291 1056 2328
|
||||
Q 1056 1369 1301 889
|
||||
Q 1547 409 2034 409
|
||||
Q 2525 409 2770 889
|
||||
Q 3016 1369 3016 2328
|
||||
Q 3016 3291 2770 3770
|
||||
Q 2525 4250 2034 4250
|
||||
z
|
||||
M 2034 4750
|
||||
Q 2819 4750 3233 4129
|
||||
Q 3647 3509 3647 2328
|
||||
Q 3647 1150 3233 529
|
||||
Q 2819 -91 2034 -91
|
||||
Q 1250 -91 836 529
|
||||
Q 422 1150 422 2328
|
||||
Q 422 3509 836 4129
|
||||
Q 1250 4750 2034 4750
|
||||
z
|
||||
" transform="scale(0.015625)"/>
|
||||
<path id="DejaVuSans-2e" d="M 684 794
|
||||
L 1344 794
|
||||
L 1344 0
|
||||
L 684 0
|
||||
L 684 794
|
||||
z
|
||||
" transform="scale(0.015625)"/>
|
||||
</defs>
|
||||
<use xlink:href="#DejaVuSans-30"/>
|
||||
<use xlink:href="#DejaVuSans-2e" transform="translate(63.623047 0)"/>
|
||||
<use xlink:href="#DejaVuSans-30" transform="translate(95.410156 0)"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g id="xtick_2">
|
||||
<g id="line2d_2">
|
||||
<g>
|
||||
<use xlink:href="#m833a6f6579" x="101.129629" y="317.72" style="stroke: #000000; stroke-width: 0.8"/>
|
||||
</g>
|
||||
</g>
|
||||
<g id="text_2">
|
||||
<!-- 2.5 -->
|
||||
<g transform="translate(93.178067 332.318437) scale(0.1 -0.1)">
|
||||
<defs>
|
||||
<path id="DejaVuSans-32" d="M 1228 531
|
||||
L 3431 531
|
||||
L 3431 0
|
||||
L 469 0
|
||||
L 469 531
|
||||
Q 828 903 1448 1529
|
||||
Q 2069 2156 2228 2338
|
||||
Q 2531 2678 2651 2914
|
||||
Q 2772 3150 2772 3378
|
||||
Q 2772 3750 2511 3984
|
||||
Q 2250 4219 1831 4219
|
||||
Q 1534 4219 1204 4116
|
||||
Q 875 4013 500 3803
|
||||
L 500 4441
|
||||
Q 881 4594 1212 4672
|
||||
Q 1544 4750 1819 4750
|
||||
Q 2544 4750 2975 4387
|
||||
Q 3406 4025 3406 3419
|
||||
Q 3406 3131 3298 2873
|
||||
Q 3191 2616 2906 2266
|
||||
Q 2828 2175 2409 1742
|
||||
Q 1991 1309 1228 531
|
||||
z
|
||||
" transform="scale(0.015625)"/>
|
||||
<path id="DejaVuSans-35" d="M 691 4666
|
||||
L 3169 4666
|
||||
L 3169 4134
|
||||
L 1269 4134
|
||||
L 1269 2991
|
||||
Q 1406 3038 1543 3061
|
||||
Q 1681 3084 1819 3084
|
||||
Q 2600 3084 3056 2656
|
||||
Q 3513 2228 3513 1497
|
||||
Q 3513 744 3044 326
|
||||
Q 2575 -91 1722 -91
|
||||
Q 1428 -91 1123 -41
|
||||
Q 819 9 494 109
|
||||
L 494 744
|
||||
Q 775 591 1075 516
|
||||
Q 1375 441 1709 441
|
||||
Q 2250 441 2565 725
|
||||
Q 2881 1009 2881 1497
|
||||
Q 2881 1984 2565 2268
|
||||
Q 2250 2553 1709 2553
|
||||
Q 1456 2553 1204 2497
|
||||
Q 953 2441 691 2322
|
||||
L 691 4666
|
||||
z
|
||||
" transform="scale(0.015625)"/>
|
||||
</defs>
|
||||
<use xlink:href="#DejaVuSans-32"/>
|
||||
<use xlink:href="#DejaVuSans-2e" transform="translate(63.623047 0)"/>
|
||||
<use xlink:href="#DejaVuSans-35" transform="translate(95.410156 0)"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g id="xtick_3">
|
||||
<g id="line2d_3">
|
||||
<g>
|
||||
<use xlink:href="#m833a6f6579" x="149.96994" y="317.72" style="stroke: #000000; stroke-width: 0.8"/>
|
||||
</g>
|
||||
</g>
|
||||
<g id="text_3">
|
||||
<!-- 5.0 -->
|
||||
<g transform="translate(142.018378 332.318437) scale(0.1 -0.1)">
|
||||
<use xlink:href="#DejaVuSans-35"/>
|
||||
<use xlink:href="#DejaVuSans-2e" transform="translate(63.623047 0)"/>
|
||||
<use xlink:href="#DejaVuSans-30" transform="translate(95.410156 0)"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g id="xtick_4">
|
||||
<g id="line2d_4">
|
||||
<g>
|
||||
<use xlink:href="#m833a6f6579" x="198.810251" y="317.72" style="stroke: #000000; stroke-width: 0.8"/>
|
||||
</g>
|
||||
</g>
|
||||
<g id="text_4">
|
||||
<!-- 7.5 -->
|
||||
<g transform="translate(190.858689 332.318437) scale(0.1 -0.1)">
|
||||
<defs>
|
||||
<path id="DejaVuSans-37" d="M 525 4666
|
||||
L 3525 4666
|
||||
L 3525 4397
|
||||
L 1831 0
|
||||
L 1172 0
|
||||
L 2766 4134
|
||||
L 525 4134
|
||||
L 525 4666
|
||||
z
|
||||
" transform="scale(0.015625)"/>
|
||||
</defs>
|
||||
<use xlink:href="#DejaVuSans-37"/>
|
||||
<use xlink:href="#DejaVuSans-2e" transform="translate(63.623047 0)"/>
|
||||
<use xlink:href="#DejaVuSans-35" transform="translate(95.410156 0)"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g id="xtick_5">
|
||||
<g id="line2d_5">
|
||||
<g>
|
||||
<use xlink:href="#m833a6f6579" x="247.650562" y="317.72" style="stroke: #000000; stroke-width: 0.8"/>
|
||||
</g>
|
||||
</g>
|
||||
<g id="text_5">
|
||||
<!-- 10.0 -->
|
||||
<g transform="translate(236.51775 332.318437) scale(0.1 -0.1)">
|
||||
<defs>
|
||||
<path id="DejaVuSans-31" d="M 794 531
|
||||
L 1825 531
|
||||
L 1825 4091
|
||||
L 703 3866
|
||||
L 703 4441
|
||||
L 1819 4666
|
||||
L 2450 4666
|
||||
L 2450 531
|
||||
L 3481 531
|
||||
L 3481 0
|
||||
L 794 0
|
||||
L 794 531
|
||||
z
|
||||
" transform="scale(0.015625)"/>
|
||||
</defs>
|
||||
<use xlink:href="#DejaVuSans-31"/>
|
||||
<use xlink:href="#DejaVuSans-30" transform="translate(63.623047 0)"/>
|
||||
<use xlink:href="#DejaVuSans-2e" transform="translate(127.246094 0)"/>
|
||||
<use xlink:href="#DejaVuSans-30" transform="translate(159.033203 0)"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g id="xtick_6">
|
||||
<g id="line2d_6">
|
||||
<g>
|
||||
<use xlink:href="#m833a6f6579" x="296.490873" y="317.72" style="stroke: #000000; stroke-width: 0.8"/>
|
||||
</g>
|
||||
</g>
|
||||
<g id="text_6">
|
||||
<!-- 12.5 -->
|
||||
<g transform="translate(285.358061 332.318437) scale(0.1 -0.1)">
|
||||
<use xlink:href="#DejaVuSans-31"/>
|
||||
<use xlink:href="#DejaVuSans-32" transform="translate(63.623047 0)"/>
|
||||
<use xlink:href="#DejaVuSans-2e" transform="translate(127.246094 0)"/>
|
||||
<use xlink:href="#DejaVuSans-35" transform="translate(159.033203 0)"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g id="xtick_7">
|
||||
<g id="line2d_7">
|
||||
<g>
|
||||
<use xlink:href="#m833a6f6579" x="345.331184" y="317.72" style="stroke: #000000; stroke-width: 0.8"/>
|
||||
</g>
|
||||
</g>
|
||||
<g id="text_7">
|
||||
<!-- 15.0 -->
|
||||
<g transform="translate(334.198372 332.318437) scale(0.1 -0.1)">
|
||||
<use xlink:href="#DejaVuSans-31"/>
|
||||
<use xlink:href="#DejaVuSans-35" transform="translate(63.623047 0)"/>
|
||||
<use xlink:href="#DejaVuSans-2e" transform="translate(127.246094 0)"/>
|
||||
<use xlink:href="#DejaVuSans-30" transform="translate(159.033203 0)"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g id="xtick_8">
|
||||
<g id="line2d_8">
|
||||
<g>
|
||||
<use xlink:href="#m833a6f6579" x="394.171495" y="317.72" style="stroke: #000000; stroke-width: 0.8"/>
|
||||
</g>
|
||||
</g>
|
||||
<g id="text_8">
|
||||
<!-- 17.5 -->
|
||||
<g transform="translate(383.038683 332.318437) scale(0.1 -0.1)">
|
||||
<use xlink:href="#DejaVuSans-31"/>
|
||||
<use xlink:href="#DejaVuSans-37" transform="translate(63.623047 0)"/>
|
||||
<use xlink:href="#DejaVuSans-2e" transform="translate(127.246094 0)"/>
|
||||
<use xlink:href="#DejaVuSans-35" transform="translate(159.033203 0)"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g id="matplotlib.axis_2">
|
||||
<g id="ytick_1">
|
||||
<g id="line2d_9">
|
||||
<defs>
|
||||
<path id="ma722f2b5b1" d="M 0 0
|
||||
L -3.5 0
|
||||
" style="stroke: #000000; stroke-width: 0.8"/>
|
||||
</defs>
|
||||
<g>
|
||||
<use xlink:href="#ma722f2b5b1" x="33.73" y="317.72" style="stroke: #000000; stroke-width: 0.8"/>
|
||||
</g>
|
||||
</g>
|
||||
<g id="text_9">
|
||||
<!-- 0.3 -->
|
||||
<g transform="translate(10.826875 321.519219) scale(0.1 -0.1)">
|
||||
<defs>
|
||||
<path id="DejaVuSans-33" d="M 2597 2516
|
||||
Q 3050 2419 3304 2112
|
||||
Q 3559 1806 3559 1356
|
||||
Q 3559 666 3084 287
|
||||
Q 2609 -91 1734 -91
|
||||
Q 1441 -91 1130 -33
|
||||
Q 819 25 488 141
|
||||
L 488 750
|
||||
Q 750 597 1062 519
|
||||
Q 1375 441 1716 441
|
||||
Q 2309 441 2620 675
|
||||
Q 2931 909 2931 1356
|
||||
Q 2931 1769 2642 2001
|
||||
Q 2353 2234 1838 2234
|
||||
L 1294 2234
|
||||
L 1294 2753
|
||||
L 1863 2753
|
||||
Q 2328 2753 2575 2939
|
||||
Q 2822 3125 2822 3475
|
||||
Q 2822 3834 2567 4026
|
||||
Q 2313 4219 1838 4219
|
||||
Q 1578 4219 1281 4162
|
||||
Q 984 4106 628 3988
|
||||
L 628 4550
|
||||
Q 988 4650 1302 4700
|
||||
Q 1616 4750 1894 4750
|
||||
Q 2613 4750 3031 4423
|
||||
Q 3450 4097 3450 3541
|
||||
Q 3450 3153 3228 2886
|
||||
Q 3006 2619 2597 2516
|
||||
z
|
||||
" transform="scale(0.015625)"/>
|
||||
</defs>
|
||||
<use xlink:href="#DejaVuSans-30"/>
|
||||
<use xlink:href="#DejaVuSans-2e" transform="translate(63.623047 0)"/>
|
||||
<use xlink:href="#DejaVuSans-33" transform="translate(95.410156 0)"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g id="ytick_2">
|
||||
<g id="line2d_10">
|
||||
<g>
|
||||
<use xlink:href="#ma722f2b5b1" x="33.73" y="276.407273" style="stroke: #000000; stroke-width: 0.8"/>
|
||||
</g>
|
||||
</g>
|
||||
<g id="text_10">
|
||||
<!-- 0.4 -->
|
||||
<g transform="translate(10.826875 280.206491) scale(0.1 -0.1)">
|
||||
<defs>
|
||||
<path id="DejaVuSans-34" d="M 2419 4116
|
||||
L 825 1625
|
||||
L 2419 1625
|
||||
L 2419 4116
|
||||
z
|
||||
M 2253 4666
|
||||
L 3047 4666
|
||||
L 3047 1625
|
||||
L 3713 1625
|
||||
L 3713 1100
|
||||
L 3047 1100
|
||||
L 3047 0
|
||||
L 2419 0
|
||||
L 2419 1100
|
||||
L 313 1100
|
||||
L 313 1709
|
||||
L 2253 4666
|
||||
z
|
||||
" transform="scale(0.015625)"/>
|
||||
</defs>
|
||||
<use xlink:href="#DejaVuSans-30"/>
|
||||
<use xlink:href="#DejaVuSans-2e" transform="translate(63.623047 0)"/>
|
||||
<use xlink:href="#DejaVuSans-34" transform="translate(95.410156 0)"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g id="ytick_3">
|
||||
<g id="line2d_11">
|
||||
<g>
|
||||
<use xlink:href="#ma722f2b5b1" x="33.73" y="235.094545" style="stroke: #000000; stroke-width: 0.8"/>
|
||||
</g>
|
||||
</g>
|
||||
<g id="text_11">
|
||||
<!-- 0.5 -->
|
||||
<g transform="translate(10.826875 238.893764) scale(0.1 -0.1)">
|
||||
<use xlink:href="#DejaVuSans-30"/>
|
||||
<use xlink:href="#DejaVuSans-2e" transform="translate(63.623047 0)"/>
|
||||
<use xlink:href="#DejaVuSans-35" transform="translate(95.410156 0)"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g id="ytick_4">
|
||||
<g id="line2d_12">
|
||||
<g>
|
||||
<use xlink:href="#ma722f2b5b1" x="33.73" y="193.781818" style="stroke: #000000; stroke-width: 0.8"/>
|
||||
</g>
|
||||
</g>
|
||||
<g id="text_12">
|
||||
<!-- 0.6 -->
|
||||
<g transform="translate(10.826875 197.581037) scale(0.1 -0.1)">
|
||||
<defs>
|
||||
<path id="DejaVuSans-36" d="M 2113 2584
|
||||
Q 1688 2584 1439 2293
|
||||
Q 1191 2003 1191 1497
|
||||
Q 1191 994 1439 701
|
||||
Q 1688 409 2113 409
|
||||
Q 2538 409 2786 701
|
||||
Q 3034 994 3034 1497
|
||||
Q 3034 2003 2786 2293
|
||||
Q 2538 2584 2113 2584
|
||||
z
|
||||
M 3366 4563
|
||||
L 3366 3988
|
||||
Q 3128 4100 2886 4159
|
||||
Q 2644 4219 2406 4219
|
||||
Q 1781 4219 1451 3797
|
||||
Q 1122 3375 1075 2522
|
||||
Q 1259 2794 1537 2939
|
||||
Q 1816 3084 2150 3084
|
||||
Q 2853 3084 3261 2657
|
||||
Q 3669 2231 3669 1497
|
||||
Q 3669 778 3244 343
|
||||
Q 2819 -91 2113 -91
|
||||
Q 1303 -91 875 529
|
||||
Q 447 1150 447 2328
|
||||
Q 447 3434 972 4092
|
||||
Q 1497 4750 2381 4750
|
||||
Q 2619 4750 2861 4703
|
||||
Q 3103 4656 3366 4563
|
||||
z
|
||||
" transform="scale(0.015625)"/>
|
||||
</defs>
|
||||
<use xlink:href="#DejaVuSans-30"/>
|
||||
<use xlink:href="#DejaVuSans-2e" transform="translate(63.623047 0)"/>
|
||||
<use xlink:href="#DejaVuSans-36" transform="translate(95.410156 0)"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g id="ytick_5">
|
||||
<g id="line2d_13">
|
||||
<g>
|
||||
<use xlink:href="#ma722f2b5b1" x="33.73" y="152.469091" style="stroke: #000000; stroke-width: 0.8"/>
|
||||
</g>
|
||||
</g>
|
||||
<g id="text_13">
|
||||
<!-- 0.7 -->
|
||||
<g transform="translate(10.826875 156.26831) scale(0.1 -0.1)">
|
||||
<use xlink:href="#DejaVuSans-30"/>
|
||||
<use xlink:href="#DejaVuSans-2e" transform="translate(63.623047 0)"/>
|
||||
<use xlink:href="#DejaVuSans-37" transform="translate(95.410156 0)"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g id="ytick_6">
|
||||
<g id="line2d_14">
|
||||
<g>
|
||||
<use xlink:href="#ma722f2b5b1" x="33.73" y="111.156364" style="stroke: #000000; stroke-width: 0.8"/>
|
||||
</g>
|
||||
</g>
|
||||
<g id="text_14">
|
||||
<!-- 0.8 -->
|
||||
<g transform="translate(10.826875 114.955582) scale(0.1 -0.1)">
|
||||
<defs>
|
||||
<path id="DejaVuSans-38" d="M 2034 2216
|
||||
Q 1584 2216 1326 1975
|
||||
Q 1069 1734 1069 1313
|
||||
Q 1069 891 1326 650
|
||||
Q 1584 409 2034 409
|
||||
Q 2484 409 2743 651
|
||||
Q 3003 894 3003 1313
|
||||
Q 3003 1734 2745 1975
|
||||
Q 2488 2216 2034 2216
|
||||
z
|
||||
M 1403 2484
|
||||
Q 997 2584 770 2862
|
||||
Q 544 3141 544 3541
|
||||
Q 544 4100 942 4425
|
||||
Q 1341 4750 2034 4750
|
||||
Q 2731 4750 3128 4425
|
||||
Q 3525 4100 3525 3541
|
||||
Q 3525 3141 3298 2862
|
||||
Q 3072 2584 2669 2484
|
||||
Q 3125 2378 3379 2068
|
||||
Q 3634 1759 3634 1313
|
||||
Q 3634 634 3220 271
|
||||
Q 2806 -91 2034 -91
|
||||
Q 1263 -91 848 271
|
||||
Q 434 634 434 1313
|
||||
Q 434 1759 690 2068
|
||||
Q 947 2378 1403 2484
|
||||
z
|
||||
M 1172 3481
|
||||
Q 1172 3119 1398 2916
|
||||
Q 1625 2713 2034 2713
|
||||
Q 2441 2713 2670 2916
|
||||
Q 2900 3119 2900 3481
|
||||
Q 2900 3844 2670 4047
|
||||
Q 2441 4250 2034 4250
|
||||
Q 1625 4250 1398 4047
|
||||
Q 1172 3844 1172 3481
|
||||
z
|
||||
" transform="scale(0.015625)"/>
|
||||
</defs>
|
||||
<use xlink:href="#DejaVuSans-30"/>
|
||||
<use xlink:href="#DejaVuSans-2e" transform="translate(63.623047 0)"/>
|
||||
<use xlink:href="#DejaVuSans-38" transform="translate(95.410156 0)"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g id="ytick_7">
|
||||
<g id="line2d_15">
|
||||
<g>
|
||||
<use xlink:href="#ma722f2b5b1" x="33.73" y="69.843636" style="stroke: #000000; stroke-width: 0.8"/>
|
||||
</g>
|
||||
</g>
|
||||
<g id="text_15">
|
||||
<!-- 0.9 -->
|
||||
<g transform="translate(10.826875 73.642855) scale(0.1 -0.1)">
|
||||
<defs>
|
||||
<path id="DejaVuSans-39" d="M 703 97
|
||||
L 703 672
|
||||
Q 941 559 1184 500
|
||||
Q 1428 441 1663 441
|
||||
Q 2288 441 2617 861
|
||||
Q 2947 1281 2994 2138
|
||||
Q 2813 1869 2534 1725
|
||||
Q 2256 1581 1919 1581
|
||||
Q 1219 1581 811 2004
|
||||
Q 403 2428 403 3163
|
||||
Q 403 3881 828 4315
|
||||
Q 1253 4750 1959 4750
|
||||
Q 2769 4750 3195 4129
|
||||
Q 3622 3509 3622 2328
|
||||
Q 3622 1225 3098 567
|
||||
Q 2575 -91 1691 -91
|
||||
Q 1453 -91 1209 -44
|
||||
Q 966 3 703 97
|
||||
z
|
||||
M 1959 2075
|
||||
Q 2384 2075 2632 2365
|
||||
Q 2881 2656 2881 3163
|
||||
Q 2881 3666 2632 3958
|
||||
Q 2384 4250 1959 4250
|
||||
Q 1534 4250 1286 3958
|
||||
Q 1038 3666 1038 3163
|
||||
Q 1038 2656 1286 2365
|
||||
Q 1534 2075 1959 2075
|
||||
z
|
||||
" transform="scale(0.015625)"/>
|
||||
</defs>
|
||||
<use xlink:href="#DejaVuSans-30"/>
|
||||
<use xlink:href="#DejaVuSans-2e" transform="translate(63.623047 0)"/>
|
||||
<use xlink:href="#DejaVuSans-39" transform="translate(95.410156 0)"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g id="ytick_8">
|
||||
<g id="line2d_16">
|
||||
<g>
|
||||
<use xlink:href="#ma722f2b5b1" x="33.73" y="28.530909" style="stroke: #000000; stroke-width: 0.8"/>
|
||||
</g>
|
||||
</g>
|
||||
<g id="text_16">
|
||||
<!-- 1.0 -->
|
||||
<g transform="translate(10.826875 32.330128) scale(0.1 -0.1)">
|
||||
<use xlink:href="#DejaVuSans-31"/>
|
||||
<use xlink:href="#DejaVuSans-2e" transform="translate(63.623047 0)"/>
|
||||
<use xlink:href="#DejaVuSans-30" transform="translate(95.410156 0)"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g id="line2d_17">
|
||||
<path d="M 52.289318 28.530909
|
||||
L 71.825443 235.094545
|
||||
L 91.361567 303.949091
|
||||
L 110.897691 276.407273
|
||||
L 130.433816 286.735455
|
||||
L 149.96994 282.763077
|
||||
L 169.506065 284.276364
|
||||
L 189.042189 283.697754
|
||||
L 208.578313 283.918678
|
||||
L 228.114438 283.83428
|
||||
L 247.650562 283.866515
|
||||
L 267.186687 283.854202
|
||||
L 286.722811 283.858905
|
||||
L 306.258935 283.857109
|
||||
L 325.79506 283.857795
|
||||
L 345.331184 283.857533
|
||||
L 364.867309 283.857633
|
||||
L 384.403433 283.857595
|
||||
L 403.939557 283.857609
|
||||
L 423.475682 283.857604
|
||||
" clip-path="url(#p415d5a15a1)" style="fill: none; stroke: #1f77b4; stroke-width: 1.5; stroke-linecap: square"/>
|
||||
</g>
|
||||
<g id="patch_3">
|
||||
<path d="M 33.73 317.72
|
||||
L 33.73 14.76
|
||||
" style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/>
|
||||
</g>
|
||||
<g id="patch_4">
|
||||
<path d="M 442.035 317.72
|
||||
L 442.035 14.76
|
||||
" style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/>
|
||||
</g>
|
||||
<g id="patch_5">
|
||||
<path d="M 33.73 317.72
|
||||
L 442.035 317.72
|
||||
" style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/>
|
||||
</g>
|
||||
<g id="patch_6">
|
||||
<path d="M 33.73 14.76
|
||||
L 442.035 14.76
|
||||
" style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<defs>
|
||||
<clipPath id="p415d5a15a1">
|
||||
<rect x="33.73" y="14.76" width="408.305" height="302.96"/>
|
||||
</clipPath>
|
||||
</defs>
|
||||
</svg>
|
||||
|
||||
|
Before Width: | Height: | Size: 17 KiB |
@ -1,668 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
|
||||
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg xmlns:xlink="http://www.w3.org/1999/xlink" width="460.8pt" height="345.6pt" viewBox="0 0 460.8 345.6" xmlns="http://www.w3.org/2000/svg" version="1.1">
|
||||
<metadata>
|
||||
<rdf:RDF xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
|
||||
<cc:Work>
|
||||
<dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
|
||||
<dc:date>2025-07-30T17:57:34.918996</dc:date>
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:creator>
|
||||
<cc:Agent>
|
||||
<dc:title>Matplotlib v3.10.3, https://matplotlib.org/</dc:title>
|
||||
</cc:Agent>
|
||||
</dc:creator>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<defs>
|
||||
<style type="text/css">*{stroke-linejoin: round; stroke-linecap: butt}</style>
|
||||
</defs>
|
||||
<g id="figure_1">
|
||||
<g id="patch_1">
|
||||
<path d="M 0 345.6
|
||||
L 460.8 345.6
|
||||
L 460.8 0
|
||||
L 0 0
|
||||
z
|
||||
" style="fill: #ffffff"/>
|
||||
</g>
|
||||
<g id="axes_1">
|
||||
<g id="patch_2">
|
||||
<path d="M 33.73 317.72
|
||||
L 442.035 317.72
|
||||
L 442.035 14.76
|
||||
L 33.73 14.76
|
||||
z
|
||||
" style="fill: #ffffff"/>
|
||||
</g>
|
||||
<g id="matplotlib.axis_1">
|
||||
<g id="xtick_1">
|
||||
<g id="line2d_1">
|
||||
<defs>
|
||||
<path id="m6d98df33d4" d="M 0 0
|
||||
L 0 3.5
|
||||
" style="stroke: #000000; stroke-width: 0.8"/>
|
||||
</defs>
|
||||
<g>
|
||||
<use xlink:href="#m6d98df33d4" x="45.540475" y="317.72" style="stroke: #000000; stroke-width: 0.8"/>
|
||||
</g>
|
||||
</g>
|
||||
<g id="text_1">
|
||||
<!-- 0 -->
|
||||
<g transform="translate(42.359225 332.318437) scale(0.1 -0.1)">
|
||||
<defs>
|
||||
<path id="DejaVuSans-30" d="M 2034 4250
|
||||
Q 1547 4250 1301 3770
|
||||
Q 1056 3291 1056 2328
|
||||
Q 1056 1369 1301 889
|
||||
Q 1547 409 2034 409
|
||||
Q 2525 409 2770 889
|
||||
Q 3016 1369 3016 2328
|
||||
Q 3016 3291 2770 3770
|
||||
Q 2525 4250 2034 4250
|
||||
z
|
||||
M 2034 4750
|
||||
Q 2819 4750 3233 4129
|
||||
Q 3647 3509 3647 2328
|
||||
Q 3647 1150 3233 529
|
||||
Q 2819 -91 2034 -91
|
||||
Q 1250 -91 836 529
|
||||
Q 422 1150 422 2328
|
||||
Q 422 3509 836 4129
|
||||
Q 1250 4750 2034 4750
|
||||
z
|
||||
" transform="scale(0.015625)"/>
|
||||
</defs>
|
||||
<use xlink:href="#DejaVuSans-30"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g id="xtick_2">
|
||||
<g id="line2d_2">
|
||||
<g>
|
||||
<use xlink:href="#m6d98df33d4" x="99.531219" y="317.72" style="stroke: #000000; stroke-width: 0.8"/>
|
||||
</g>
|
||||
</g>
|
||||
<g id="text_2">
|
||||
<!-- 1 -->
|
||||
<g transform="translate(96.349969 332.318437) scale(0.1 -0.1)">
|
||||
<defs>
|
||||
<path id="DejaVuSans-31" d="M 794 531
|
||||
L 1825 531
|
||||
L 1825 4091
|
||||
L 703 3866
|
||||
L 703 4441
|
||||
L 1819 4666
|
||||
L 2450 4666
|
||||
L 2450 531
|
||||
L 3481 531
|
||||
L 3481 0
|
||||
L 794 0
|
||||
L 794 531
|
||||
z
|
||||
" transform="scale(0.015625)"/>
|
||||
</defs>
|
||||
<use xlink:href="#DejaVuSans-31"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g id="xtick_3">
|
||||
<g id="line2d_3">
|
||||
<g>
|
||||
<use xlink:href="#m6d98df33d4" x="153.521963" y="317.72" style="stroke: #000000; stroke-width: 0.8"/>
|
||||
</g>
|
||||
</g>
|
||||
<g id="text_3">
|
||||
<!-- 2 -->
|
||||
<g transform="translate(150.340713 332.318437) scale(0.1 -0.1)">
|
||||
<defs>
|
||||
<path id="DejaVuSans-32" d="M 1228 531
|
||||
L 3431 531
|
||||
L 3431 0
|
||||
L 469 0
|
||||
L 469 531
|
||||
Q 828 903 1448 1529
|
||||
Q 2069 2156 2228 2338
|
||||
Q 2531 2678 2651 2914
|
||||
Q 2772 3150 2772 3378
|
||||
Q 2772 3750 2511 3984
|
||||
Q 2250 4219 1831 4219
|
||||
Q 1534 4219 1204 4116
|
||||
Q 875 4013 500 3803
|
||||
L 500 4441
|
||||
Q 881 4594 1212 4672
|
||||
Q 1544 4750 1819 4750
|
||||
Q 2544 4750 2975 4387
|
||||
Q 3406 4025 3406 3419
|
||||
Q 3406 3131 3298 2873
|
||||
Q 3191 2616 2906 2266
|
||||
Q 2828 2175 2409 1742
|
||||
Q 1991 1309 1228 531
|
||||
z
|
||||
" transform="scale(0.015625)"/>
|
||||
</defs>
|
||||
<use xlink:href="#DejaVuSans-32"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g id="xtick_4">
|
||||
<g id="line2d_4">
|
||||
<g>
|
||||
<use xlink:href="#m6d98df33d4" x="207.512707" y="317.72" style="stroke: #000000; stroke-width: 0.8"/>
|
||||
</g>
|
||||
</g>
|
||||
<g id="text_4">
|
||||
<!-- 3 -->
|
||||
<g transform="translate(204.331457 332.318437) scale(0.1 -0.1)">
|
||||
<defs>
|
||||
<path id="DejaVuSans-33" d="M 2597 2516
|
||||
Q 3050 2419 3304 2112
|
||||
Q 3559 1806 3559 1356
|
||||
Q 3559 666 3084 287
|
||||
Q 2609 -91 1734 -91
|
||||
Q 1441 -91 1130 -33
|
||||
Q 819 25 488 141
|
||||
L 488 750
|
||||
Q 750 597 1062 519
|
||||
Q 1375 441 1716 441
|
||||
Q 2309 441 2620 675
|
||||
Q 2931 909 2931 1356
|
||||
Q 2931 1769 2642 2001
|
||||
Q 2353 2234 1838 2234
|
||||
L 1294 2234
|
||||
L 1294 2753
|
||||
L 1863 2753
|
||||
Q 2328 2753 2575 2939
|
||||
Q 2822 3125 2822 3475
|
||||
Q 2822 3834 2567 4026
|
||||
Q 2313 4219 1838 4219
|
||||
Q 1578 4219 1281 4162
|
||||
Q 984 4106 628 3988
|
||||
L 628 4550
|
||||
Q 988 4650 1302 4700
|
||||
Q 1616 4750 1894 4750
|
||||
Q 2613 4750 3031 4423
|
||||
Q 3450 4097 3450 3541
|
||||
Q 3450 3153 3228 2886
|
||||
Q 3006 2619 2597 2516
|
||||
z
|
||||
" transform="scale(0.015625)"/>
|
||||
</defs>
|
||||
<use xlink:href="#DejaVuSans-33"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g id="xtick_5">
|
||||
<g id="line2d_5">
|
||||
<g>
|
||||
<use xlink:href="#m6d98df33d4" x="261.50345" y="317.72" style="stroke: #000000; stroke-width: 0.8"/>
|
||||
</g>
|
||||
</g>
|
||||
<g id="text_5">
|
||||
<!-- 4 -->
|
||||
<g transform="translate(258.3222 332.318437) scale(0.1 -0.1)">
|
||||
<defs>
|
||||
<path id="DejaVuSans-34" d="M 2419 4116
|
||||
L 825 1625
|
||||
L 2419 1625
|
||||
L 2419 4116
|
||||
z
|
||||
M 2253 4666
|
||||
L 3047 4666
|
||||
L 3047 1625
|
||||
L 3713 1625
|
||||
L 3713 1100
|
||||
L 3047 1100
|
||||
L 3047 0
|
||||
L 2419 0
|
||||
L 2419 1100
|
||||
L 313 1100
|
||||
L 313 1709
|
||||
L 2253 4666
|
||||
z
|
||||
" transform="scale(0.015625)"/>
|
||||
</defs>
|
||||
<use xlink:href="#DejaVuSans-34"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g id="xtick_6">
|
||||
<g id="line2d_6">
|
||||
<g>
|
||||
<use xlink:href="#m6d98df33d4" x="315.494194" y="317.72" style="stroke: #000000; stroke-width: 0.8"/>
|
||||
</g>
|
||||
</g>
|
||||
<g id="text_6">
|
||||
<!-- 5 -->
|
||||
<g transform="translate(312.312944 332.318437) scale(0.1 -0.1)">
|
||||
<defs>
|
||||
<path id="DejaVuSans-35" d="M 691 4666
|
||||
L 3169 4666
|
||||
L 3169 4134
|
||||
L 1269 4134
|
||||
L 1269 2991
|
||||
Q 1406 3038 1543 3061
|
||||
Q 1681 3084 1819 3084
|
||||
Q 2600 3084 3056 2656
|
||||
Q 3513 2228 3513 1497
|
||||
Q 3513 744 3044 326
|
||||
Q 2575 -91 1722 -91
|
||||
Q 1428 -91 1123 -41
|
||||
Q 819 9 494 109
|
||||
L 494 744
|
||||
Q 775 591 1075 516
|
||||
Q 1375 441 1709 441
|
||||
Q 2250 441 2565 725
|
||||
Q 2881 1009 2881 1497
|
||||
Q 2881 1984 2565 2268
|
||||
Q 2250 2553 1709 2553
|
||||
Q 1456 2553 1204 2497
|
||||
Q 953 2441 691 2322
|
||||
L 691 4666
|
||||
z
|
||||
" transform="scale(0.015625)"/>
|
||||
</defs>
|
||||
<use xlink:href="#DejaVuSans-35"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g id="xtick_7">
|
||||
<g id="line2d_7">
|
||||
<g>
|
||||
<use xlink:href="#m6d98df33d4" x="369.484938" y="317.72" style="stroke: #000000; stroke-width: 0.8"/>
|
||||
</g>
|
||||
</g>
|
||||
<g id="text_7">
|
||||
<!-- 6 -->
|
||||
<g transform="translate(366.303688 332.318437) scale(0.1 -0.1)">
|
||||
<defs>
|
||||
<path id="DejaVuSans-36" d="M 2113 2584
|
||||
Q 1688 2584 1439 2293
|
||||
Q 1191 2003 1191 1497
|
||||
Q 1191 994 1439 701
|
||||
Q 1688 409 2113 409
|
||||
Q 2538 409 2786 701
|
||||
Q 3034 994 3034 1497
|
||||
Q 3034 2003 2786 2293
|
||||
Q 2538 2584 2113 2584
|
||||
z
|
||||
M 3366 4563
|
||||
L 3366 3988
|
||||
Q 3128 4100 2886 4159
|
||||
Q 2644 4219 2406 4219
|
||||
Q 1781 4219 1451 3797
|
||||
Q 1122 3375 1075 2522
|
||||
Q 1259 2794 1537 2939
|
||||
Q 1816 3084 2150 3084
|
||||
Q 2853 3084 3261 2657
|
||||
Q 3669 2231 3669 1497
|
||||
Q 3669 778 3244 343
|
||||
Q 2819 -91 2113 -91
|
||||
Q 1303 -91 875 529
|
||||
Q 447 1150 447 2328
|
||||
Q 447 3434 972 4092
|
||||
Q 1497 4750 2381 4750
|
||||
Q 2619 4750 2861 4703
|
||||
Q 3103 4656 3366 4563
|
||||
z
|
||||
" transform="scale(0.015625)"/>
|
||||
</defs>
|
||||
<use xlink:href="#DejaVuSans-36"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g id="xtick_8">
|
||||
<g id="line2d_8">
|
||||
<g>
|
||||
<use xlink:href="#m6d98df33d4" x="423.475682" y="317.72" style="stroke: #000000; stroke-width: 0.8"/>
|
||||
</g>
|
||||
</g>
|
||||
<g id="text_8">
|
||||
<!-- 7 -->
|
||||
<g transform="translate(420.294432 332.318437) scale(0.1 -0.1)">
|
||||
<defs>
|
||||
<path id="DejaVuSans-37" d="M 525 4666
|
||||
L 3525 4666
|
||||
L 3525 4397
|
||||
L 1831 0
|
||||
L 1172 0
|
||||
L 2766 4134
|
||||
L 525 4134
|
||||
L 525 4666
|
||||
z
|
||||
" transform="scale(0.015625)"/>
|
||||
</defs>
|
||||
<use xlink:href="#DejaVuSans-37"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g id="matplotlib.axis_2">
|
||||
<g id="ytick_1">
|
||||
<g id="line2d_9">
|
||||
<defs>
|
||||
<path id="mba0142a176" d="M 0 0
|
||||
L -3.5 0
|
||||
" style="stroke: #000000; stroke-width: 0.8"/>
|
||||
</defs>
|
||||
<g>
|
||||
<use xlink:href="#mba0142a176" x="33.73" y="305.0377" style="stroke: #000000; stroke-width: 0.8"/>
|
||||
</g>
|
||||
</g>
|
||||
<g id="text_9">
|
||||
<!-- 0.00 -->
|
||||
<g transform="translate(4.464375 308.836919) scale(0.1 -0.1)">
|
||||
<defs>
|
||||
<path id="DejaVuSans-2e" d="M 684 794
|
||||
L 1344 794
|
||||
L 1344 0
|
||||
L 684 0
|
||||
L 684 794
|
||||
z
|
||||
" transform="scale(0.015625)"/>
|
||||
</defs>
|
||||
<use xlink:href="#DejaVuSans-30"/>
|
||||
<use xlink:href="#DejaVuSans-2e" transform="translate(63.623047 0)"/>
|
||||
<use xlink:href="#DejaVuSans-30" transform="translate(95.410156 0)"/>
|
||||
<use xlink:href="#DejaVuSans-30" transform="translate(159.033203 0)"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g id="ytick_2">
|
||||
<g id="line2d_10">
|
||||
<g>
|
||||
<use xlink:href="#mba0142a176" x="33.73" y="270.202199" style="stroke: #000000; stroke-width: 0.8"/>
|
||||
</g>
|
||||
</g>
|
||||
<g id="text_10">
|
||||
<!-- 0.25 -->
|
||||
<g transform="translate(4.464375 274.001418) scale(0.1 -0.1)">
|
||||
<use xlink:href="#DejaVuSans-30"/>
|
||||
<use xlink:href="#DejaVuSans-2e" transform="translate(63.623047 0)"/>
|
||||
<use xlink:href="#DejaVuSans-32" transform="translate(95.410156 0)"/>
|
||||
<use xlink:href="#DejaVuSans-35" transform="translate(159.033203 0)"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g id="ytick_3">
|
||||
<g id="line2d_11">
|
||||
<g>
|
||||
<use xlink:href="#mba0142a176" x="33.73" y="235.366698" style="stroke: #000000; stroke-width: 0.8"/>
|
||||
</g>
|
||||
</g>
|
||||
<g id="text_11">
|
||||
<!-- 0.50 -->
|
||||
<g transform="translate(4.464375 239.165917) scale(0.1 -0.1)">
|
||||
<use xlink:href="#DejaVuSans-30"/>
|
||||
<use xlink:href="#DejaVuSans-2e" transform="translate(63.623047 0)"/>
|
||||
<use xlink:href="#DejaVuSans-35" transform="translate(95.410156 0)"/>
|
||||
<use xlink:href="#DejaVuSans-30" transform="translate(159.033203 0)"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g id="ytick_4">
|
||||
<g id="line2d_12">
|
||||
<g>
|
||||
<use xlink:href="#mba0142a176" x="33.73" y="200.531197" style="stroke: #000000; stroke-width: 0.8"/>
|
||||
</g>
|
||||
</g>
|
||||
<g id="text_12">
|
||||
<!-- 0.75 -->
|
||||
<g transform="translate(4.464375 204.330415) scale(0.1 -0.1)">
|
||||
<use xlink:href="#DejaVuSans-30"/>
|
||||
<use xlink:href="#DejaVuSans-2e" transform="translate(63.623047 0)"/>
|
||||
<use xlink:href="#DejaVuSans-37" transform="translate(95.410156 0)"/>
|
||||
<use xlink:href="#DejaVuSans-35" transform="translate(159.033203 0)"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g id="ytick_5">
|
||||
<g id="line2d_13">
|
||||
<g>
|
||||
<use xlink:href="#mba0142a176" x="33.73" y="165.695695" style="stroke: #000000; stroke-width: 0.8"/>
|
||||
</g>
|
||||
</g>
|
||||
<g id="text_13">
|
||||
<!-- 1.00 -->
|
||||
<g transform="translate(4.464375 169.494914) scale(0.1 -0.1)">
|
||||
<use xlink:href="#DejaVuSans-31"/>
|
||||
<use xlink:href="#DejaVuSans-2e" transform="translate(63.623047 0)"/>
|
||||
<use xlink:href="#DejaVuSans-30" transform="translate(95.410156 0)"/>
|
||||
<use xlink:href="#DejaVuSans-30" transform="translate(159.033203 0)"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g id="ytick_6">
|
||||
<g id="line2d_14">
|
||||
<g>
|
||||
<use xlink:href="#mba0142a176" x="33.73" y="130.860194" style="stroke: #000000; stroke-width: 0.8"/>
|
||||
</g>
|
||||
</g>
|
||||
<g id="text_14">
|
||||
<!-- 1.25 -->
|
||||
<g transform="translate(4.464375 134.659413) scale(0.1 -0.1)">
|
||||
<use xlink:href="#DejaVuSans-31"/>
|
||||
<use xlink:href="#DejaVuSans-2e" transform="translate(63.623047 0)"/>
|
||||
<use xlink:href="#DejaVuSans-32" transform="translate(95.410156 0)"/>
|
||||
<use xlink:href="#DejaVuSans-35" transform="translate(159.033203 0)"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g id="ytick_7">
|
||||
<g id="line2d_15">
|
||||
<g>
|
||||
<use xlink:href="#mba0142a176" x="33.73" y="96.024693" style="stroke: #000000; stroke-width: 0.8"/>
|
||||
</g>
|
||||
</g>
|
||||
<g id="text_15">
|
||||
<!-- 1.50 -->
|
||||
<g transform="translate(4.464375 99.823912) scale(0.1 -0.1)">
|
||||
<use xlink:href="#DejaVuSans-31"/>
|
||||
<use xlink:href="#DejaVuSans-2e" transform="translate(63.623047 0)"/>
|
||||
<use xlink:href="#DejaVuSans-35" transform="translate(95.410156 0)"/>
|
||||
<use xlink:href="#DejaVuSans-30" transform="translate(159.033203 0)"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g id="ytick_8">
|
||||
<g id="line2d_16">
|
||||
<g>
|
||||
<use xlink:href="#mba0142a176" x="33.73" y="61.189192" style="stroke: #000000; stroke-width: 0.8"/>
|
||||
</g>
|
||||
</g>
|
||||
<g id="text_16">
|
||||
<!-- 1.75 -->
|
||||
<g transform="translate(4.464375 64.98841) scale(0.1 -0.1)">
|
||||
<use xlink:href="#DejaVuSans-31"/>
|
||||
<use xlink:href="#DejaVuSans-2e" transform="translate(63.623047 0)"/>
|
||||
<use xlink:href="#DejaVuSans-37" transform="translate(95.410156 0)"/>
|
||||
<use xlink:href="#DejaVuSans-35" transform="translate(159.033203 0)"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g id="ytick_9">
|
||||
<g id="line2d_17">
|
||||
<g>
|
||||
<use xlink:href="#mba0142a176" x="33.73" y="26.35369" style="stroke: #000000; stroke-width: 0.8"/>
|
||||
</g>
|
||||
</g>
|
||||
<g id="text_17">
|
||||
<!-- 2.00 -->
|
||||
<g transform="translate(4.464375 30.152909) scale(0.1 -0.1)">
|
||||
<use xlink:href="#DejaVuSans-32"/>
|
||||
<use xlink:href="#DejaVuSans-2e" transform="translate(63.623047 0)"/>
|
||||
<use xlink:href="#DejaVuSans-30" transform="translate(95.410156 0)"/>
|
||||
<use xlink:href="#DejaVuSans-30" transform="translate(159.033203 0)"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g id="line2d_18">
|
||||
<path d="M 52.289318 303.949091
|
||||
L 53.253439 302.860481
|
||||
L 55.068254 299.594653
|
||||
L 55.66374 297.417434
|
||||
L 56.906948 295.240216
|
||||
L 57.999878 289.797169
|
||||
L 58.24418 288.708559
|
||||
L 59.748566 286.53134
|
||||
L 60.434473 282.176903
|
||||
L 60.657883 279.999684
|
||||
L 61.287775 277.822465
|
||||
L 61.737698 274.556637
|
||||
L 62.412583 271.290808
|
||||
L 64.596032 269.11359
|
||||
L 65.173473 265.847761
|
||||
L 65.431802 263.670543
|
||||
L 65.537047 262.581933
|
||||
L 66.019723 260.404714
|
||||
L 66.536876 254.961667
|
||||
L 66.667288 253.873058
|
||||
L 67.627598 251.695839
|
||||
L 68.679365 244.075573
|
||||
L 69.014712 242.986964
|
||||
L 69.536361 239.721135
|
||||
L 70.45928 236.455307
|
||||
L 74.612414 234.278088
|
||||
L 74.989972 233.189479
|
||||
L 75.910269 228.835041
|
||||
L 76.056983 227.746432
|
||||
L 76.688981 225.569213
|
||||
L 77.444097 219.037557
|
||||
L 78.404406 216.860338
|
||||
L 78.963317 211.417291
|
||||
L 79.051971 210.328681
|
||||
L 79.639892 207.062853
|
||||
L 79.898221 204.885634
|
||||
L 80.475662 201.619806
|
||||
L 82.659112 199.442587
|
||||
L 83.333996 196.176759
|
||||
L 83.651588 193.99954
|
||||
L 83.783919 192.910931
|
||||
L 84.413811 190.733712
|
||||
L 84.99525 186.379274
|
||||
L 85.323129 184.202055
|
||||
L 86.827515 182.024837
|
||||
L 87.961774 176.581789
|
||||
L 88.164747 175.49318
|
||||
L 89.407955 173.315961
|
||||
L 90.003441 171.138742
|
||||
L 90.532762 170.050133
|
||||
L 91.818256 167.872914
|
||||
L 92.782376 166.784305
|
||||
L 99.531219 165.695695
|
||||
L 107.244182 164.607086
|
||||
L 108.529676 163.518476
|
||||
L 109.347718 162.429867
|
||||
L 110.329368 161.341258
|
||||
L 111.100664 160.252648
|
||||
L 111.990621 158.075429
|
||||
L 113.928751 155.898211
|
||||
L 114.957146 152.632382
|
||||
L 115.41085 151.543773
|
||||
L 116.143756 149.366554
|
||||
L 118.813628 147.189335
|
||||
L 119.777748 143.923507
|
||||
L 120.099121 142.834898
|
||||
L 120.527619 140.657679
|
||||
L 121.762702 138.48046
|
||||
L 122.670109 135.214632
|
||||
L 124.072466 131.948803
|
||||
L 128.980716 129.771585
|
||||
L 129.526077 128.682975
|
||||
L 130.383073 126.505756
|
||||
L 130.789018 125.417147
|
||||
L 131.29048 123.239928
|
||||
L 132.525562 121.062709
|
||||
L 133.275434 117.796881
|
||||
L 134.239554 114.531053
|
||||
L 136.909426 112.353834
|
||||
L 138.524534 107.999396
|
||||
L 139.124431 105.822178
|
||||
L 141.06256 103.644959
|
||||
L 141.952518 101.46774
|
||||
L 142.723814 100.37913
|
||||
L 143.705464 99.290521
|
||||
L 144.523506 98.201912
|
||||
L 145.808999 97.113302
|
||||
L 153.521963 96.024693
|
||||
L 162.52042 94.936083
|
||||
L 164.320112 93.847474
|
||||
L 165.519906 92.758865
|
||||
L 167.019649 91.670255
|
||||
L 168.246711 90.581646
|
||||
L 169.719186 88.404427
|
||||
L 173.154961 86.227208
|
||||
L 175.11826 82.96138
|
||||
L 176.018106 81.87277
|
||||
L 176.660853 80.784161
|
||||
L 177.517849 79.695552
|
||||
L 183.51682 77.518333
|
||||
L 184.373816 76.429723
|
||||
L 185.016563 75.341114
|
||||
L 186.747036 73.163895
|
||||
L 187.879709 70.986676
|
||||
L 191.315483 68.809457
|
||||
L 192.787958 66.632239
|
||||
L 194.015021 65.543629
|
||||
L 195.514764 64.45502
|
||||
L 196.714558 63.36641
|
||||
L 198.514249 62.277801
|
||||
L 207.512707 61.189192
|
||||
L 218.310855 60.100582
|
||||
L 221.010393 59.011973
|
||||
L 222.938633 57.923363
|
||||
L 225.509621 56.834754
|
||||
L 227.759236 55.746144
|
||||
L 229.109004 54.657535
|
||||
L 230.651597 53.568926
|
||||
L 238.36456 51.391707
|
||||
L 239.907153 50.303097
|
||||
L 241.256921 49.214488
|
||||
L 243.506536 48.125879
|
||||
L 246.077524 47.037269
|
||||
L 248.005764 45.94866
|
||||
L 250.705302 44.86005
|
||||
L 261.50345 43.771441
|
||||
L 275.001136 42.682831
|
||||
L 279.500365 41.594222
|
||||
L 283.099748 40.505613
|
||||
L 293.897897 38.328394
|
||||
L 297.49728 37.239784
|
||||
L 315.494194 35.062566
|
||||
L 369.484938 30.708128
|
||||
L 423.475682 28.530909
|
||||
L 423.475682 28.530909
|
||||
" clip-path="url(#p3e78a3e766)" style="fill: none; stroke: #1f77b4; stroke-width: 1.5; stroke-linecap: square"/>
|
||||
</g>
|
||||
<g id="patch_3">
|
||||
<path d="M 33.73 317.72
|
||||
L 33.73 14.76
|
||||
" style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/>
|
||||
</g>
|
||||
<g id="patch_4">
|
||||
<path d="M 442.035 317.72
|
||||
L 442.035 14.76
|
||||
" style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/>
|
||||
</g>
|
||||
<g id="patch_5">
|
||||
<path d="M 33.73 317.72
|
||||
L 442.035 317.72
|
||||
" style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/>
|
||||
</g>
|
||||
<g id="patch_6">
|
||||
<path d="M 33.73 14.76
|
||||
L 442.035 14.76
|
||||
" style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<defs>
|
||||
<clipPath id="p3e78a3e766">
|
||||
<rect x="33.73" y="14.76" width="408.305" height="302.96"/>
|
||||
</clipPath>
|
||||
</defs>
|
||||
</svg>
|
||||
|
||||
|
Before Width: | Height: | Size: 18 KiB |
@ -1,647 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
|
||||
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg xmlns:xlink="http://www.w3.org/1999/xlink" width="460.8pt" height="345.6pt" viewBox="0 0 460.8 345.6" xmlns="http://www.w3.org/2000/svg" version="1.1">
|
||||
<metadata>
|
||||
<rdf:RDF xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
|
||||
<cc:Work>
|
||||
<dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
|
||||
<dc:date>2025-07-30T17:57:36.284432</dc:date>
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:creator>
|
||||
<cc:Agent>
|
||||
<dc:title>Matplotlib v3.10.3, https://matplotlib.org/</dc:title>
|
||||
</cc:Agent>
|
||||
</dc:creator>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<defs>
|
||||
<style type="text/css">*{stroke-linejoin: round; stroke-linecap: butt}</style>
|
||||
</defs>
|
||||
<g id="figure_1">
|
||||
<g id="patch_1">
|
||||
<path d="M 0 345.6
|
||||
L 460.8 345.6
|
||||
L 460.8 0
|
||||
L 0 0
|
||||
z
|
||||
" style="fill: #ffffff"/>
|
||||
</g>
|
||||
<g id="axes_1">
|
||||
<g id="patch_2">
|
||||
<path d="M 33.73 317.72
|
||||
L 442.035 317.72
|
||||
L 442.035 14.76
|
||||
L 33.73 14.76
|
||||
z
|
||||
" style="fill: #ffffff"/>
|
||||
</g>
|
||||
<g id="matplotlib.axis_1">
|
||||
<g id="xtick_1">
|
||||
<g id="line2d_1">
|
||||
<defs>
|
||||
<path id="m0e596f21b4" d="M 0 0
|
||||
L 0 3.5
|
||||
" style="stroke: #000000; stroke-width: 0.8"/>
|
||||
</defs>
|
||||
<g>
|
||||
<use xlink:href="#m0e596f21b4" x="59.614794" y="317.72" style="stroke: #000000; stroke-width: 0.8"/>
|
||||
</g>
|
||||
</g>
|
||||
<g id="text_1">
|
||||
<!-- −2.0 -->
|
||||
<g transform="translate(47.473388 332.318437) scale(0.1 -0.1)">
|
||||
<defs>
|
||||
<path id="DejaVuSans-2212" d="M 678 2272
|
||||
L 4684 2272
|
||||
L 4684 1741
|
||||
L 678 1741
|
||||
L 678 2272
|
||||
z
|
||||
" transform="scale(0.015625)"/>
|
||||
<path id="DejaVuSans-32" d="M 1228 531
|
||||
L 3431 531
|
||||
L 3431 0
|
||||
L 469 0
|
||||
L 469 531
|
||||
Q 828 903 1448 1529
|
||||
Q 2069 2156 2228 2338
|
||||
Q 2531 2678 2651 2914
|
||||
Q 2772 3150 2772 3378
|
||||
Q 2772 3750 2511 3984
|
||||
Q 2250 4219 1831 4219
|
||||
Q 1534 4219 1204 4116
|
||||
Q 875 4013 500 3803
|
||||
L 500 4441
|
||||
Q 881 4594 1212 4672
|
||||
Q 1544 4750 1819 4750
|
||||
Q 2544 4750 2975 4387
|
||||
Q 3406 4025 3406 3419
|
||||
Q 3406 3131 3298 2873
|
||||
Q 3191 2616 2906 2266
|
||||
Q 2828 2175 2409 1742
|
||||
Q 1991 1309 1228 531
|
||||
z
|
||||
" transform="scale(0.015625)"/>
|
||||
<path id="DejaVuSans-2e" d="M 684 794
|
||||
L 1344 794
|
||||
L 1344 0
|
||||
L 684 0
|
||||
L 684 794
|
||||
z
|
||||
" transform="scale(0.015625)"/>
|
||||
<path id="DejaVuSans-30" d="M 2034 4250
|
||||
Q 1547 4250 1301 3770
|
||||
Q 1056 3291 1056 2328
|
||||
Q 1056 1369 1301 889
|
||||
Q 1547 409 2034 409
|
||||
Q 2525 409 2770 889
|
||||
Q 3016 1369 3016 2328
|
||||
Q 3016 3291 2770 3770
|
||||
Q 2525 4250 2034 4250
|
||||
z
|
||||
M 2034 4750
|
||||
Q 2819 4750 3233 4129
|
||||
Q 3647 3509 3647 2328
|
||||
Q 3647 1150 3233 529
|
||||
Q 2819 -91 2034 -91
|
||||
Q 1250 -91 836 529
|
||||
Q 422 1150 422 2328
|
||||
Q 422 3509 836 4129
|
||||
Q 1250 4750 2034 4750
|
||||
z
|
||||
" transform="scale(0.015625)"/>
|
||||
</defs>
|
||||
<use xlink:href="#DejaVuSans-2212"/>
|
||||
<use xlink:href="#DejaVuSans-32" transform="translate(83.789062 0)"/>
|
||||
<use xlink:href="#DejaVuSans-2e" transform="translate(147.412109 0)"/>
|
||||
<use xlink:href="#DejaVuSans-30" transform="translate(179.199219 0)"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g id="xtick_2">
|
||||
<g id="line2d_2">
|
||||
<g>
|
||||
<use xlink:href="#m0e596f21b4" x="105.720873" y="317.72" style="stroke: #000000; stroke-width: 0.8"/>
|
||||
</g>
|
||||
</g>
|
||||
<g id="text_2">
|
||||
<!-- −1.5 -->
|
||||
<g transform="translate(93.579467 332.318437) scale(0.1 -0.1)">
|
||||
<defs>
|
||||
<path id="DejaVuSans-31" d="M 794 531
|
||||
L 1825 531
|
||||
L 1825 4091
|
||||
L 703 3866
|
||||
L 703 4441
|
||||
L 1819 4666
|
||||
L 2450 4666
|
||||
L 2450 531
|
||||
L 3481 531
|
||||
L 3481 0
|
||||
L 794 0
|
||||
L 794 531
|
||||
z
|
||||
" transform="scale(0.015625)"/>
|
||||
<path id="DejaVuSans-35" d="M 691 4666
|
||||
L 3169 4666
|
||||
L 3169 4134
|
||||
L 1269 4134
|
||||
L 1269 2991
|
||||
Q 1406 3038 1543 3061
|
||||
Q 1681 3084 1819 3084
|
||||
Q 2600 3084 3056 2656
|
||||
Q 3513 2228 3513 1497
|
||||
Q 3513 744 3044 326
|
||||
Q 2575 -91 1722 -91
|
||||
Q 1428 -91 1123 -41
|
||||
Q 819 9 494 109
|
||||
L 494 744
|
||||
Q 775 591 1075 516
|
||||
Q 1375 441 1709 441
|
||||
Q 2250 441 2565 725
|
||||
Q 2881 1009 2881 1497
|
||||
Q 2881 1984 2565 2268
|
||||
Q 2250 2553 1709 2553
|
||||
Q 1456 2553 1204 2497
|
||||
Q 953 2441 691 2322
|
||||
L 691 4666
|
||||
z
|
||||
" transform="scale(0.015625)"/>
|
||||
</defs>
|
||||
<use xlink:href="#DejaVuSans-2212"/>
|
||||
<use xlink:href="#DejaVuSans-31" transform="translate(83.789062 0)"/>
|
||||
<use xlink:href="#DejaVuSans-2e" transform="translate(147.412109 0)"/>
|
||||
<use xlink:href="#DejaVuSans-35" transform="translate(179.199219 0)"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g id="xtick_3">
|
||||
<g id="line2d_3">
|
||||
<g>
|
||||
<use xlink:href="#m0e596f21b4" x="151.826952" y="317.72" style="stroke: #000000; stroke-width: 0.8"/>
|
||||
</g>
|
||||
</g>
|
||||
<g id="text_3">
|
||||
<!-- −1.0 -->
|
||||
<g transform="translate(139.685545 332.318437) scale(0.1 -0.1)">
|
||||
<use xlink:href="#DejaVuSans-2212"/>
|
||||
<use xlink:href="#DejaVuSans-31" transform="translate(83.789062 0)"/>
|
||||
<use xlink:href="#DejaVuSans-2e" transform="translate(147.412109 0)"/>
|
||||
<use xlink:href="#DejaVuSans-30" transform="translate(179.199219 0)"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g id="xtick_4">
|
||||
<g id="line2d_4">
|
||||
<g>
|
||||
<use xlink:href="#m0e596f21b4" x="197.93303" y="317.72" style="stroke: #000000; stroke-width: 0.8"/>
|
||||
</g>
|
||||
</g>
|
||||
<g id="text_4">
|
||||
<!-- −0.5 -->
|
||||
<g transform="translate(185.791624 332.318437) scale(0.1 -0.1)">
|
||||
<use xlink:href="#DejaVuSans-2212"/>
|
||||
<use xlink:href="#DejaVuSans-30" transform="translate(83.789062 0)"/>
|
||||
<use xlink:href="#DejaVuSans-2e" transform="translate(147.412109 0)"/>
|
||||
<use xlink:href="#DejaVuSans-35" transform="translate(179.199219 0)"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g id="xtick_5">
|
||||
<g id="line2d_5">
|
||||
<g>
|
||||
<use xlink:href="#m0e596f21b4" x="244.039109" y="317.72" style="stroke: #000000; stroke-width: 0.8"/>
|
||||
</g>
|
||||
</g>
|
||||
<g id="text_5">
|
||||
<!-- 0.0 -->
|
||||
<g transform="translate(236.087546 332.318437) scale(0.1 -0.1)">
|
||||
<use xlink:href="#DejaVuSans-30"/>
|
||||
<use xlink:href="#DejaVuSans-2e" transform="translate(63.623047 0)"/>
|
||||
<use xlink:href="#DejaVuSans-30" transform="translate(95.410156 0)"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g id="xtick_6">
|
||||
<g id="line2d_6">
|
||||
<g>
|
||||
<use xlink:href="#m0e596f21b4" x="290.145188" y="317.72" style="stroke: #000000; stroke-width: 0.8"/>
|
||||
</g>
|
||||
</g>
|
||||
<g id="text_6">
|
||||
<!-- 0.5 -->
|
||||
<g transform="translate(282.193625 332.318437) scale(0.1 -0.1)">
|
||||
<use xlink:href="#DejaVuSans-30"/>
|
||||
<use xlink:href="#DejaVuSans-2e" transform="translate(63.623047 0)"/>
|
||||
<use xlink:href="#DejaVuSans-35" transform="translate(95.410156 0)"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g id="xtick_7">
|
||||
<g id="line2d_7">
|
||||
<g>
|
||||
<use xlink:href="#m0e596f21b4" x="336.251266" y="317.72" style="stroke: #000000; stroke-width: 0.8"/>
|
||||
</g>
|
||||
</g>
|
||||
<g id="text_7">
|
||||
<!-- 1.0 -->
|
||||
<g transform="translate(328.299704 332.318437) scale(0.1 -0.1)">
|
||||
<use xlink:href="#DejaVuSans-31"/>
|
||||
<use xlink:href="#DejaVuSans-2e" transform="translate(63.623047 0)"/>
|
||||
<use xlink:href="#DejaVuSans-30" transform="translate(95.410156 0)"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g id="xtick_8">
|
||||
<g id="line2d_8">
|
||||
<g>
|
||||
<use xlink:href="#m0e596f21b4" x="382.357345" y="317.72" style="stroke: #000000; stroke-width: 0.8"/>
|
||||
</g>
|
||||
</g>
|
||||
<g id="text_8">
|
||||
<!-- 1.5 -->
|
||||
<g transform="translate(374.405782 332.318437) scale(0.1 -0.1)">
|
||||
<use xlink:href="#DejaVuSans-31"/>
|
||||
<use xlink:href="#DejaVuSans-2e" transform="translate(63.623047 0)"/>
|
||||
<use xlink:href="#DejaVuSans-35" transform="translate(95.410156 0)"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g id="xtick_9">
|
||||
<g id="line2d_9">
|
||||
<g>
|
||||
<use xlink:href="#m0e596f21b4" x="428.463424" y="317.72" style="stroke: #000000; stroke-width: 0.8"/>
|
||||
</g>
|
||||
</g>
|
||||
<g id="text_9">
|
||||
<!-- 2.0 -->
|
||||
<g transform="translate(420.511861 332.318437) scale(0.1 -0.1)">
|
||||
<use xlink:href="#DejaVuSans-32"/>
|
||||
<use xlink:href="#DejaVuSans-2e" transform="translate(63.623047 0)"/>
|
||||
<use xlink:href="#DejaVuSans-30" transform="translate(95.410156 0)"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g id="matplotlib.axis_2">
|
||||
<g id="ytick_1">
|
||||
<g id="line2d_10">
|
||||
<defs>
|
||||
<path id="m82b563dc58" d="M 0 0
|
||||
L -3.5 0
|
||||
" style="stroke: #000000; stroke-width: 0.8"/>
|
||||
</defs>
|
||||
<g>
|
||||
<use xlink:href="#m82b563dc58" x="33.73" y="305.0377" style="stroke: #000000; stroke-width: 0.8"/>
|
||||
</g>
|
||||
</g>
|
||||
<g id="text_10">
|
||||
<!-- 0.00 -->
|
||||
<g transform="translate(4.464375 308.836919) scale(0.1 -0.1)">
|
||||
<use xlink:href="#DejaVuSans-30"/>
|
||||
<use xlink:href="#DejaVuSans-2e" transform="translate(63.623047 0)"/>
|
||||
<use xlink:href="#DejaVuSans-30" transform="translate(95.410156 0)"/>
|
||||
<use xlink:href="#DejaVuSans-30" transform="translate(159.033203 0)"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g id="ytick_2">
|
||||
<g id="line2d_11">
|
||||
<g>
|
||||
<use xlink:href="#m82b563dc58" x="33.73" y="270.202199" style="stroke: #000000; stroke-width: 0.8"/>
|
||||
</g>
|
||||
</g>
|
||||
<g id="text_11">
|
||||
<!-- 0.25 -->
|
||||
<g transform="translate(4.464375 274.001418) scale(0.1 -0.1)">
|
||||
<use xlink:href="#DejaVuSans-30"/>
|
||||
<use xlink:href="#DejaVuSans-2e" transform="translate(63.623047 0)"/>
|
||||
<use xlink:href="#DejaVuSans-32" transform="translate(95.410156 0)"/>
|
||||
<use xlink:href="#DejaVuSans-35" transform="translate(159.033203 0)"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g id="ytick_3">
|
||||
<g id="line2d_12">
|
||||
<g>
|
||||
<use xlink:href="#m82b563dc58" x="33.73" y="235.366698" style="stroke: #000000; stroke-width: 0.8"/>
|
||||
</g>
|
||||
</g>
|
||||
<g id="text_12">
|
||||
<!-- 0.50 -->
|
||||
<g transform="translate(4.464375 239.165917) scale(0.1 -0.1)">
|
||||
<use xlink:href="#DejaVuSans-30"/>
|
||||
<use xlink:href="#DejaVuSans-2e" transform="translate(63.623047 0)"/>
|
||||
<use xlink:href="#DejaVuSans-35" transform="translate(95.410156 0)"/>
|
||||
<use xlink:href="#DejaVuSans-30" transform="translate(159.033203 0)"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g id="ytick_4">
|
||||
<g id="line2d_13">
|
||||
<g>
|
||||
<use xlink:href="#m82b563dc58" x="33.73" y="200.531197" style="stroke: #000000; stroke-width: 0.8"/>
|
||||
</g>
|
||||
</g>
|
||||
<g id="text_13">
|
||||
<!-- 0.75 -->
|
||||
<g transform="translate(4.464375 204.330415) scale(0.1 -0.1)">
|
||||
<defs>
|
||||
<path id="DejaVuSans-37" d="M 525 4666
|
||||
L 3525 4666
|
||||
L 3525 4397
|
||||
L 1831 0
|
||||
L 1172 0
|
||||
L 2766 4134
|
||||
L 525 4134
|
||||
L 525 4666
|
||||
z
|
||||
" transform="scale(0.015625)"/>
|
||||
</defs>
|
||||
<use xlink:href="#DejaVuSans-30"/>
|
||||
<use xlink:href="#DejaVuSans-2e" transform="translate(63.623047 0)"/>
|
||||
<use xlink:href="#DejaVuSans-37" transform="translate(95.410156 0)"/>
|
||||
<use xlink:href="#DejaVuSans-35" transform="translate(159.033203 0)"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g id="ytick_5">
|
||||
<g id="line2d_14">
|
||||
<g>
|
||||
<use xlink:href="#m82b563dc58" x="33.73" y="165.695695" style="stroke: #000000; stroke-width: 0.8"/>
|
||||
</g>
|
||||
</g>
|
||||
<g id="text_14">
|
||||
<!-- 1.00 -->
|
||||
<g transform="translate(4.464375 169.494914) scale(0.1 -0.1)">
|
||||
<use xlink:href="#DejaVuSans-31"/>
|
||||
<use xlink:href="#DejaVuSans-2e" transform="translate(63.623047 0)"/>
|
||||
<use xlink:href="#DejaVuSans-30" transform="translate(95.410156 0)"/>
|
||||
<use xlink:href="#DejaVuSans-30" transform="translate(159.033203 0)"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g id="ytick_6">
|
||||
<g id="line2d_15">
|
||||
<g>
|
||||
<use xlink:href="#m82b563dc58" x="33.73" y="130.860194" style="stroke: #000000; stroke-width: 0.8"/>
|
||||
</g>
|
||||
</g>
|
||||
<g id="text_15">
|
||||
<!-- 1.25 -->
|
||||
<g transform="translate(4.464375 134.659413) scale(0.1 -0.1)">
|
||||
<use xlink:href="#DejaVuSans-31"/>
|
||||
<use xlink:href="#DejaVuSans-2e" transform="translate(63.623047 0)"/>
|
||||
<use xlink:href="#DejaVuSans-32" transform="translate(95.410156 0)"/>
|
||||
<use xlink:href="#DejaVuSans-35" transform="translate(159.033203 0)"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g id="ytick_7">
|
||||
<g id="line2d_16">
|
||||
<g>
|
||||
<use xlink:href="#m82b563dc58" x="33.73" y="96.024693" style="stroke: #000000; stroke-width: 0.8"/>
|
||||
</g>
|
||||
</g>
|
||||
<g id="text_16">
|
||||
<!-- 1.50 -->
|
||||
<g transform="translate(4.464375 99.823912) scale(0.1 -0.1)">
|
||||
<use xlink:href="#DejaVuSans-31"/>
|
||||
<use xlink:href="#DejaVuSans-2e" transform="translate(63.623047 0)"/>
|
||||
<use xlink:href="#DejaVuSans-35" transform="translate(95.410156 0)"/>
|
||||
<use xlink:href="#DejaVuSans-30" transform="translate(159.033203 0)"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g id="ytick_8">
|
||||
<g id="line2d_17">
|
||||
<g>
|
||||
<use xlink:href="#m82b563dc58" x="33.73" y="61.189192" style="stroke: #000000; stroke-width: 0.8"/>
|
||||
</g>
|
||||
</g>
|
||||
<g id="text_17">
|
||||
<!-- 1.75 -->
|
||||
<g transform="translate(4.464375 64.98841) scale(0.1 -0.1)">
|
||||
<use xlink:href="#DejaVuSans-31"/>
|
||||
<use xlink:href="#DejaVuSans-2e" transform="translate(63.623047 0)"/>
|
||||
<use xlink:href="#DejaVuSans-37" transform="translate(95.410156 0)"/>
|
||||
<use xlink:href="#DejaVuSans-35" transform="translate(159.033203 0)"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g id="ytick_9">
|
||||
<g id="line2d_18">
|
||||
<g>
|
||||
<use xlink:href="#m82b563dc58" x="33.73" y="26.35369" style="stroke: #000000; stroke-width: 0.8"/>
|
||||
</g>
|
||||
</g>
|
||||
<g id="text_18">
|
||||
<!-- 2.00 -->
|
||||
<g transform="translate(4.464375 30.152909) scale(0.1 -0.1)">
|
||||
<use xlink:href="#DejaVuSans-32"/>
|
||||
<use xlink:href="#DejaVuSans-2e" transform="translate(63.623047 0)"/>
|
||||
<use xlink:href="#DejaVuSans-30" transform="translate(95.410156 0)"/>
|
||||
<use xlink:href="#DejaVuSans-30" transform="translate(159.033203 0)"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g id="line2d_19">
|
||||
<path d="M 52.289318 303.949091
|
||||
L 64.602536 302.860481
|
||||
L 78.817103 300.683263
|
||||
L 84.087803 299.594653
|
||||
L 89.678131 297.417434
|
||||
L 95.629367 296.328825
|
||||
L 100.359232 295.240216
|
||||
L 101.991348 294.151606
|
||||
L 103.318165 293.062997
|
||||
L 107.417158 290.885778
|
||||
L 108.825004 289.797169
|
||||
L 110.615588 288.708559
|
||||
L 116.205915 287.61995
|
||||
L 120.93578 286.53134
|
||||
L 122.157151 285.442731
|
||||
L 123.039571 284.354121
|
||||
L 125.283287 282.176903
|
||||
L 126.656198 279.999684
|
||||
L 130.420482 277.822465
|
||||
L 131.872672 275.645246
|
||||
L 133.018179 274.556637
|
||||
L 134.344996 273.468027
|
||||
L 135.352789 272.379418
|
||||
L 136.782463 271.290808
|
||||
L 142.7337 270.202199
|
||||
L 148.0044 269.11359
|
||||
L 149.095681 268.02498
|
||||
L 149.830443 266.936371
|
||||
L 150.757206 265.847761
|
||||
L 151.522457 264.759152
|
||||
L 152.44922 262.581933
|
||||
L 154.648592 260.404714
|
||||
L 155.929337 257.138886
|
||||
L 156.522343 256.050277
|
||||
L 156.948266 254.961667
|
||||
L 157.519241 253.873058
|
||||
L 161.618234 251.695839
|
||||
L 162.218967 250.60723
|
||||
L 162.672099 249.51862
|
||||
L 163.903254 247.341401
|
||||
L 164.718094 245.164183
|
||||
L 167.234762 242.986964
|
||||
L 168.334721 240.809745
|
||||
L 169.261484 239.721135
|
||||
L 170.406992 238.632526
|
||||
L 171.333755 237.543917
|
||||
L 172.741601 236.455307
|
||||
L 186.956168 234.278088
|
||||
L 188.146019 233.189479
|
||||
L 188.911269 232.10087
|
||||
L 189.838032 231.01226
|
||||
L 190.572795 229.923651
|
||||
L 191.427937 227.746432
|
||||
L 193.31815 225.569213
|
||||
L 194.337079 222.303385
|
||||
L 194.790211 221.214775
|
||||
L 195.52693 219.037557
|
||||
L 198.261593 216.860338
|
||||
L 199.607779 212.5059
|
||||
L 200.060911 210.328681
|
||||
L 201.379596 208.151462
|
||||
L 201.920431 205.974244
|
||||
L 203.296758 202.708415
|
||||
L 203.89749 201.619806
|
||||
L 209.487818 199.442587
|
||||
L 210.130414 198.353978
|
||||
L 210.57481 197.265368
|
||||
L 211.635952 195.088149
|
||||
L 212.240624 192.910931
|
||||
L 213.74704 190.733712
|
||||
L 214.673803 187.467884
|
||||
L 215.439054 185.290665
|
||||
L 215.879208 184.202055
|
||||
L 219.301908 182.024837
|
||||
L 219.845934 180.936227
|
||||
L 220.26413 179.847618
|
||||
L 221.435838 177.670399
|
||||
L 222.24119 175.49318
|
||||
L 223.462561 174.404571
|
||||
L 224.892235 173.315961
|
||||
L 226.135564 171.138742
|
||||
L 227.226845 170.050133
|
||||
L 228.634691 168.961524
|
||||
L 229.824542 167.872914
|
||||
L 231.725891 166.784305
|
||||
L 256.352327 164.607086
|
||||
L 258.253676 163.518476
|
||||
L 259.443526 162.429867
|
||||
L 260.851373 161.341258
|
||||
L 261.942654 160.252648
|
||||
L 263.185983 158.075429
|
||||
L 264.615657 156.98682
|
||||
L 265.837028 155.898211
|
||||
L 267.213355 152.632382
|
||||
L 267.814087 151.543773
|
||||
L 268.232284 150.455163
|
||||
L 268.77631 149.366554
|
||||
L 272.19901 147.189335
|
||||
L 273.404414 143.923507
|
||||
L 273.80274 142.834898
|
||||
L 274.331178 140.657679
|
||||
L 275.837594 138.48046
|
||||
L 276.442266 136.303241
|
||||
L 277.947804 133.037413
|
||||
L 278.5904 131.948803
|
||||
L 284.180727 129.771585
|
||||
L 284.78146 128.682975
|
||||
L 285.717632 126.505756
|
||||
L 286.157787 125.417147
|
||||
L 286.698622 123.239928
|
||||
L 288.017306 121.062709
|
||||
L 288.808832 117.796881
|
||||
L 289.816625 114.531053
|
||||
L 292.551288 112.353834
|
||||
L 294.167062 107.999396
|
||||
L 294.760068 105.822178
|
||||
L 296.650281 103.644959
|
||||
L 297.505423 101.46774
|
||||
L 298.240185 100.37913
|
||||
L 299.166949 99.290521
|
||||
L 299.932199 98.201912
|
||||
L 301.12205 97.113302
|
||||
L 315.336617 94.936083
|
||||
L 316.744463 93.847474
|
||||
L 317.671226 92.758865
|
||||
L 318.816734 91.670255
|
||||
L 319.743497 90.581646
|
||||
L 320.843456 88.404427
|
||||
L 323.360123 86.227208
|
||||
L 324.76797 82.96138
|
||||
L 325.406119 81.87277
|
||||
L 325.859251 80.784161
|
||||
L 326.459984 79.695552
|
||||
L 330.558976 77.518333
|
||||
L 331.129951 76.429723
|
||||
L 331.555874 75.341114
|
||||
L 332.692907 73.163895
|
||||
L 333.429626 70.986676
|
||||
L 335.628998 68.809457
|
||||
L 336.555761 66.632239
|
||||
L 337.321011 65.543629
|
||||
L 338.247775 64.45502
|
||||
L 338.982537 63.36641
|
||||
L 340.073818 62.277801
|
||||
L 345.344518 61.189192
|
||||
L 351.295754 60.100582
|
||||
L 352.725429 59.011973
|
||||
L 353.733222 57.923363
|
||||
L 355.060039 56.834754
|
||||
L 356.205546 55.746144
|
||||
L 357.657736 53.568926
|
||||
L 361.42202 51.391707
|
||||
L 362.794931 49.214488
|
||||
L 367.142437 44.86005
|
||||
L 371.872303 43.771441
|
||||
L 377.46263 42.682831
|
||||
L 379.253213 41.594222
|
||||
L 380.66106 40.505613
|
||||
L 384.760053 38.328394
|
||||
L 386.086869 37.239784
|
||||
L 392.448851 35.062566
|
||||
L 401.237608 32.885347
|
||||
L 409.261115 30.708128
|
||||
L 423.475682 28.530909
|
||||
L 423.475682 28.530909
|
||||
" clip-path="url(#pde11ae1218)" style="fill: none; stroke: #1f77b4; stroke-width: 1.5; stroke-linecap: square"/>
|
||||
</g>
|
||||
<g id="patch_3">
|
||||
<path d="M 33.73 317.72
|
||||
L 33.73 14.76
|
||||
" style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/>
|
||||
</g>
|
||||
<g id="patch_4">
|
||||
<path d="M 442.035 317.72
|
||||
L 442.035 14.76
|
||||
" style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/>
|
||||
</g>
|
||||
<g id="patch_5">
|
||||
<path d="M 33.73 317.72
|
||||
L 442.035 317.72
|
||||
" style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/>
|
||||
</g>
|
||||
<g id="patch_6">
|
||||
<path d="M 33.73 14.76
|
||||
L 442.035 14.76
|
||||
" style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<defs>
|
||||
<clipPath id="pde11ae1218">
|
||||
<rect x="33.73" y="14.76" width="408.305" height="302.96"/>
|
||||
</clipPath>
|
||||
</defs>
|
||||
</svg>
|
||||
|
||||
|
Before Width: | Height: | Size: 19 KiB |
BIN
_freeze/posts/math/pentagons/1/index/figure-html/cell-3-output-1.png
(Stored with Git LFS)
BIN
_freeze/posts/math/pentagons/1/index/figure-html/cell-3-output-2.png
(Stored with Git LFS)
BIN
_freeze/posts/math/pentagons/1/index/figure-html/cell-4-output-1.png
(Stored with Git LFS)
BIN
_freeze/posts/math/pentagons/1/index/figure-html/cell-4-output-2.png
(Stored with Git LFS)
BIN
_freeze/posts/math/pentagons/1/index/figure-html/cell-5-output-1.png
(Stored with Git LFS)
BIN
_freeze/posts/math/pentagons/1/index/figure-html/cell-6-output-1.png
(Stored with Git LFS)
BIN
_freeze/posts/math/pentagons/1/index/figure-html/cell-7-output-1.png
(Stored with Git LFS)
BIN
_freeze/posts/math/pentagons/1/index/figure-html/cell-7-output-2.png
(Stored with Git LFS)
BIN
_freeze/posts/math/pentagons/1/index/figure-html/cell-7-output-3.png
(Stored with Git LFS)
BIN
_freeze/posts/math/pentagons/2/index/figure-html/cell-3-output-1.png
(Stored with Git LFS)
BIN
_freeze/posts/math/polycount/3/index/figure-html/cell-7-output-1.png
(Stored with Git LFS)
BIN
_freeze/posts/math/polycount/4/index/figure-html/cell-2-output-1.png
(Stored with Git LFS)
BIN
_freeze/posts/math/polycount/4/index/figure-html/cell-3-output-1.png
(Stored with Git LFS)
BIN
_freeze/posts/math/polycount/4/index/figure-html/cell-4-output-1.png
(Stored with Git LFS)
BIN
_freeze/posts/math/polycount/4/index/figure-html/cell-5-output-1.png
(Stored with Git LFS)
BIN
_freeze/posts/math/polycount/4/index/figure-html/cell-6-output-1.png
(Stored with Git LFS)
BIN
_freeze/posts/math/polycount/sand-1/index/figure-html/cell-10-output-1.png
(Stored with Git LFS)
BIN
_freeze/posts/math/polycount/sand-1/index/figure-html/cell-5-output-1.png
(Stored with Git LFS)
BIN
_freeze/posts/math/polycount/sand-1/index/figure-html/cell-5-output-2.png
(Stored with Git LFS)
BIN
_freeze/posts/math/polycount/sand-1/index/figure-html/cell-5-output-3.png
(Stored with Git LFS)
BIN
_freeze/posts/math/polycount/sand-1/index/figure-html/cell-5-output-4.png
(Stored with Git LFS)
BIN
_freeze/posts/math/polycount/sand-1/index/figure-html/cell-5-output-5.png
(Stored with Git LFS)
BIN
_freeze/posts/math/polycount/sand-1/index/figure-html/cell-8-output-1.png
(Stored with Git LFS)
BIN
_freeze/posts/math/polycount/sand-1/index/figure-html/cell-8-output-2.png
(Stored with Git LFS)
BIN
_freeze/posts/math/polycount/sand-1/index/figure-html/cell-8-output-3.png
(Stored with Git LFS)
BIN
_freeze/posts/math/polycount/sand-1/index/figure-html/cell-8-output-4.png
(Stored with Git LFS)
BIN
_freeze/posts/math/polycount/sand-2/index/figure-html/cell-5-output-1.png
(Stored with Git LFS)
BIN
_freeze/posts/math/stereo/1/index/figure-html/cell-3-output-1.png
(Stored with Git LFS)
BIN
_freeze/posts/math/stereo/1/index/figure-html/cell-3-output-2.png
(Stored with Git LFS)
BIN
_freeze/posts/math/stereo/1/index/figure-html/cell-4-output-1.png
(Stored with Git LFS)
BIN
_freeze/posts/math/stereo/1/index/figure-html/cell-4-output-2.png
(Stored with Git LFS)
BIN
_freeze/posts/math/stereo/2/index/figure-html/cell-5-output-1.png
(Stored with Git LFS)
BIN
_freeze/posts/math/stereo/2/index/figure-html/cell-6-output-1.png
(Stored with Git LFS)
BIN
_freeze/posts/math/stereo/2/index/figure-html/cell-7-output-1.png
(Stored with Git LFS)
7
_freeze/site_libs/clipboard/clipboard.min.js
vendored
2
_freeze/site_libs/quarto-listing/list.min.js
vendored
@ -1,254 +0,0 @@
|
||||
const kProgressiveAttr = "data-src";
|
||||
let categoriesLoaded = false;
|
||||
|
||||
window.quartoListingCategory = (category) => {
|
||||
// category is URI encoded in EJS template for UTF-8 support
|
||||
category = decodeURIComponent(atob(category));
|
||||
if (categoriesLoaded) {
|
||||
activateCategory(category);
|
||||
setCategoryHash(category);
|
||||
}
|
||||
};
|
||||
|
||||
window["quarto-listing-loaded"] = () => {
|
||||
// Process any existing hash
|
||||
const hash = getHash();
|
||||
|
||||
if (hash) {
|
||||
// If there is a category, switch to that
|
||||
if (hash.category) {
|
||||
// category hash are URI encoded so we need to decode it before processing
|
||||
// so that we can match it with the category element processed in JS
|
||||
activateCategory(decodeURIComponent(hash.category));
|
||||
}
|
||||
// Paginate a specific listing
|
||||
const listingIds = Object.keys(window["quarto-listings"]);
|
||||
for (const listingId of listingIds) {
|
||||
const page = hash[getListingPageKey(listingId)];
|
||||
if (page) {
|
||||
showPage(listingId, page);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
const listingIds = Object.keys(window["quarto-listings"]);
|
||||
for (const listingId of listingIds) {
|
||||
// The actual list
|
||||
const list = window["quarto-listings"][listingId];
|
||||
|
||||
// Update the handlers for pagination events
|
||||
refreshPaginationHandlers(listingId);
|
||||
|
||||
// Render any visible items that need it
|
||||
renderVisibleProgressiveImages(list);
|
||||
|
||||
// Whenever the list is updated, we also need to
|
||||
// attach handlers to the new pagination elements
|
||||
// and refresh any newly visible items.
|
||||
list.on("updated", function () {
|
||||
renderVisibleProgressiveImages(list);
|
||||
setTimeout(() => refreshPaginationHandlers(listingId));
|
||||
|
||||
// Show or hide the no matching message
|
||||
toggleNoMatchingMessage(list);
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
window.document.addEventListener("DOMContentLoaded", function (_event) {
|
||||
// Attach click handlers to categories
|
||||
const categoryEls = window.document.querySelectorAll(
|
||||
".quarto-listing-category .category"
|
||||
);
|
||||
|
||||
for (const categoryEl of categoryEls) {
|
||||
// category needs to support non ASCII characters
|
||||
const category = decodeURIComponent(
|
||||
atob(categoryEl.getAttribute("data-category"))
|
||||
);
|
||||
categoryEl.onclick = () => {
|
||||
activateCategory(category);
|
||||
setCategoryHash(category);
|
||||
};
|
||||
}
|
||||
|
||||
// Attach a click handler to the category title
|
||||
// (there should be only one, but since it is a class name, handle N)
|
||||
const categoryTitleEls = window.document.querySelectorAll(
|
||||
".quarto-listing-category-title"
|
||||
);
|
||||
for (const categoryTitleEl of categoryTitleEls) {
|
||||
categoryTitleEl.onclick = () => {
|
||||
activateCategory("");
|
||||
setCategoryHash("");
|
||||
};
|
||||
}
|
||||
|
||||
categoriesLoaded = true;
|
||||
});
|
||||
|
||||
function toggleNoMatchingMessage(list) {
|
||||
const selector = `#${list.listContainer.id} .listing-no-matching`;
|
||||
const noMatchingEl = window.document.querySelector(selector);
|
||||
if (noMatchingEl) {
|
||||
if (list.visibleItems.length === 0) {
|
||||
noMatchingEl.classList.remove("d-none");
|
||||
} else {
|
||||
if (!noMatchingEl.classList.contains("d-none")) {
|
||||
noMatchingEl.classList.add("d-none");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function setCategoryHash(category) {
|
||||
setHash({ category });
|
||||
}
|
||||
|
||||
function setPageHash(listingId, page) {
|
||||
const currentHash = getHash() || {};
|
||||
currentHash[getListingPageKey(listingId)] = page;
|
||||
setHash(currentHash);
|
||||
}
|
||||
|
||||
function getListingPageKey(listingId) {
|
||||
return `${listingId}-page`;
|
||||
}
|
||||
|
||||
function refreshPaginationHandlers(listingId) {
|
||||
const listingEl = window.document.getElementById(listingId);
|
||||
const paginationEls = listingEl.querySelectorAll(
|
||||
".pagination li.page-item:not(.disabled) .page.page-link"
|
||||
);
|
||||
for (const paginationEl of paginationEls) {
|
||||
paginationEl.onclick = (sender) => {
|
||||
setPageHash(listingId, sender.target.getAttribute("data-i"));
|
||||
showPage(listingId, sender.target.getAttribute("data-i"));
|
||||
return false;
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
function renderVisibleProgressiveImages(list) {
|
||||
// Run through the visible items and render any progressive images
|
||||
for (const item of list.visibleItems) {
|
||||
const itemEl = item.elm;
|
||||
if (itemEl) {
|
||||
const progressiveImgs = itemEl.querySelectorAll(
|
||||
`img[${kProgressiveAttr}]`
|
||||
);
|
||||
for (const progressiveImg of progressiveImgs) {
|
||||
const srcValue = progressiveImg.getAttribute(kProgressiveAttr);
|
||||
if (srcValue) {
|
||||
progressiveImg.setAttribute("src", srcValue);
|
||||
}
|
||||
progressiveImg.removeAttribute(kProgressiveAttr);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function getHash() {
|
||||
// Hashes are of the form
|
||||
// #name:value|name1:value1|name2:value2
|
||||
const currentUrl = new URL(window.location);
|
||||
const hashRaw = currentUrl.hash ? currentUrl.hash.slice(1) : undefined;
|
||||
return parseHash(hashRaw);
|
||||
}
|
||||
|
||||
const kAnd = "&";
|
||||
const kEquals = "=";
|
||||
|
||||
function parseHash(hash) {
|
||||
if (!hash) {
|
||||
return undefined;
|
||||
}
|
||||
const hasValuesStrs = hash.split(kAnd);
|
||||
const hashValues = hasValuesStrs
|
||||
.map((hashValueStr) => {
|
||||
const vals = hashValueStr.split(kEquals);
|
||||
if (vals.length === 2) {
|
||||
return { name: vals[0], value: vals[1] };
|
||||
} else {
|
||||
return undefined;
|
||||
}
|
||||
})
|
||||
.filter((value) => {
|
||||
return value !== undefined;
|
||||
});
|
||||
|
||||
const hashObj = {};
|
||||
hashValues.forEach((hashValue) => {
|
||||
hashObj[hashValue.name] = decodeURIComponent(hashValue.value);
|
||||
});
|
||||
return hashObj;
|
||||
}
|
||||
|
||||
function makeHash(obj) {
|
||||
return Object.keys(obj)
|
||||
.map((key) => {
|
||||
return `${key}${kEquals}${obj[key]}`;
|
||||
})
|
||||
.join(kAnd);
|
||||
}
|
||||
|
||||
function setHash(obj) {
|
||||
const hash = makeHash(obj);
|
||||
window.history.pushState(null, null, `#${hash}`);
|
||||
}
|
||||
|
||||
function showPage(listingId, page) {
|
||||
const list = window["quarto-listings"][listingId];
|
||||
if (list) {
|
||||
list.show((page - 1) * list.page + 1, list.page);
|
||||
}
|
||||
}
|
||||
|
||||
function activateCategory(category) {
|
||||
// Deactivate existing categories
|
||||
const activeEls = window.document.querySelectorAll(
|
||||
".quarto-listing-category .category.active"
|
||||
);
|
||||
for (const activeEl of activeEls) {
|
||||
activeEl.classList.remove("active");
|
||||
}
|
||||
|
||||
// Activate this category
|
||||
const categoryEl = window.document.querySelector(
|
||||
`.quarto-listing-category .category[data-category='${btoa(
|
||||
encodeURIComponent(category)
|
||||
)}']`
|
||||
);
|
||||
if (categoryEl) {
|
||||
categoryEl.classList.add("active");
|
||||
}
|
||||
|
||||
// Filter the listings to this category
|
||||
filterListingCategory(category);
|
||||
}
|
||||
|
||||
function filterListingCategory(category) {
|
||||
const listingIds = Object.keys(window["quarto-listings"]);
|
||||
for (const listingId of listingIds) {
|
||||
const list = window["quarto-listings"][listingId];
|
||||
if (list) {
|
||||
if (category === "") {
|
||||
// resets the filter
|
||||
list.filter();
|
||||
} else {
|
||||
// filter to this category
|
||||
list.filter(function (item) {
|
||||
const itemValues = item.values();
|
||||
if (itemValues.categories !== null) {
|
||||
const categories = decodeURIComponent(
|
||||
atob(itemValues.categories)
|
||||
).split(",");
|
||||
return categories.includes(category);
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
188
_quarto.yml
@ -1,188 +0,0 @@
|
||||
project:
|
||||
type: website
|
||||
|
||||
website:
|
||||
favicon: "./logo-favicon.png"
|
||||
title: "zenzicubi.co"
|
||||
|
||||
repo-url: https://git.zenzicubi.co/cube/zenzicubi.co
|
||||
repo-branch: master
|
||||
repo-actions: [source]
|
||||
repo-link-target: "_blank"
|
||||
|
||||
navbar:
|
||||
logo: "./logo-vector.svg"
|
||||
left:
|
||||
- text: "Math"
|
||||
menu:
|
||||
- ./posts/math/polycount/index.qmd
|
||||
- ./posts/math/pentagons/index.qmd
|
||||
- ./posts/math/chebyshev/index.qmd
|
||||
- ./posts/math/stereo/index.qmd
|
||||
- ./posts/math/permutations/index.qmd
|
||||
- ./posts/math/type-algebra/index.qmd
|
||||
- ./posts/math/number-number/index.qmd
|
||||
- ./posts/math/finite-field/index.qmd
|
||||
- ./posts/math/misc/index.qmd
|
||||
right:
|
||||
- ./about/index.qmd
|
||||
- icon: git
|
||||
href: https://git.zenzicubi.co/cube/zenzicubi.co
|
||||
- icon: github
|
||||
href: https://github.com/queue-miscreant
|
||||
background: primary
|
||||
search: true
|
||||
draft-mode: unlinked
|
||||
|
||||
sidebar:
|
||||
- id: topic-sidebar
|
||||
style: "floating"
|
||||
contents:
|
||||
- section: "Topics"
|
||||
contents:
|
||||
- ./posts/math/polycount/index.qmd
|
||||
- ./posts/math/pentagons/index.qmd
|
||||
- ./posts/math/chebyshev/index.qmd
|
||||
- ./posts/math/stereo/index.qmd
|
||||
- ./posts/math/permutations/index.qmd
|
||||
- ./posts/math/type-algebra/index.qmd
|
||||
- ./posts/math/number-number/index.qmd
|
||||
- ./posts/math/finite-field/index.qmd
|
||||
- ./posts/math/misc/index.qmd
|
||||
|
||||
- id: misc-sidebar
|
||||
style: "floating"
|
||||
contents:
|
||||
- section: "Miscellaneous"
|
||||
contents:
|
||||
- ./posts/math/misc/platonic-volume/index.qmd
|
||||
- ./posts/math/misc/infinitesimals/index.qmd
|
||||
|
||||
- id: polycount-sidebar
|
||||
style: "floating"
|
||||
contents:
|
||||
- section: "Polynomial Counting"
|
||||
href: ./posts/math/polycount/index.qmd
|
||||
contents:
|
||||
- text: "Part 1: A primer"
|
||||
href: ./posts/math/polycount/1/index.qmd
|
||||
- text: "Part 2: Binary and beyond"
|
||||
href: ./posts/math/polycount/2/index.qmd
|
||||
- text: "Part 3: The third degree"
|
||||
href: ./posts/math/polycount/3/index.qmd
|
||||
- text: "Part 4: Two twos"
|
||||
href: ./posts/math/polycount/4/index.qmd
|
||||
contents:
|
||||
- text: "Appendix"
|
||||
href: ./posts/math/polycount/4/appendix/index.qmd
|
||||
- text: "Part 5: Pentamerous multiplication"
|
||||
href: ./posts/math/polycount/5/index.qmd
|
||||
- section: 2D
|
||||
contents:
|
||||
- text: "Part 1: Lines, leaves, and sand"
|
||||
href: ./posts/math/polycount/sand-1/index.qmd
|
||||
- text: "Part 2: Reorienting Polynomials"
|
||||
href: ./posts/math/polycount/sand-2/index.qmd
|
||||
|
||||
- id: pentagons-sidebar
|
||||
style: "floating"
|
||||
contents:
|
||||
- section: "12 Pentagons"
|
||||
href: ./posts/math/pentagons/index.qmd
|
||||
contents:
|
||||
- text: "Part 1"
|
||||
href: ./posts/math/pentagons/1/index.qmd
|
||||
- text: "Part 2"
|
||||
href: ./posts/math/pentagons/2/index.qmd
|
||||
- text: "Part 3"
|
||||
href: ./posts/math/pentagons/3/index.qmd
|
||||
|
||||
- id: chebyshev-sidebar
|
||||
style: "floating"
|
||||
contents:
|
||||
- section: "Generating Polynomials"
|
||||
href: ./posts/math/chebyshev/index.qmd
|
||||
contents:
|
||||
- text: "Part 1: Regular Constructability"
|
||||
href: ./posts/math/chebyshev/1/index.qmd
|
||||
- text: "Part 2: Ghostly Chains"
|
||||
href: ./posts/math/chebyshev/2/index.qmd
|
||||
- text: "Extra: Legendary"
|
||||
href: ./posts/math/chebyshev/extra/index.qmd
|
||||
|
||||
- id: stereography-sidebar
|
||||
style: "floating"
|
||||
contents:
|
||||
- section: "Algebraic Stereography"
|
||||
href: ./posts/math/stereo/index.qmd
|
||||
contents:
|
||||
- ./posts/math/stereo/1/index.qmd
|
||||
- ./posts/math/stereo/2/index.qmd
|
||||
|
||||
- id: permutations-sidebar
|
||||
style: "floating"
|
||||
contents:
|
||||
- section: "A Game of Permutations"
|
||||
href: ./posts/math/permutations/index.qmd
|
||||
contents:
|
||||
- text: "Part 1"
|
||||
href: ./posts/math/permutations/1/index.qmd
|
||||
- text: "Part 2"
|
||||
href: ./posts/math/permutations/2/index.qmd
|
||||
- text: "Part 3"
|
||||
href: ./posts/math/permutations/3/index.qmd
|
||||
- text: "Appendix"
|
||||
href: ./posts/math/permutations/appendix/index.qmd
|
||||
|
||||
- id: type-algebra-sidebar
|
||||
style: "floating"
|
||||
contents:
|
||||
- section: "Type Algebra and You"
|
||||
href: ./posts/math/type-algebra/index.qmd
|
||||
contents:
|
||||
- text: "Part 1: Basics"
|
||||
href: ./posts/math/type-algebra/1/index.qmd
|
||||
- text: "Part 2: A Fixer-upper"
|
||||
href: ./posts/math/type-algebra/2/index.qmd
|
||||
- text: "Part 3: Combinatorial Types"
|
||||
href: ./posts/math/type-algebra/3/index.qmd
|
||||
|
||||
- id: number-number-sidebar
|
||||
style: "floating"
|
||||
contents:
|
||||
- section: "Numbering Numbers"
|
||||
href: ./posts/math/number-number/index.qmd
|
||||
contents:
|
||||
- text: "From 0 to ∞"
|
||||
href: ./posts/math/number-number/1/index.qmd
|
||||
- text: "Ordering Obliquely"
|
||||
href: ./posts/math/number-number/2/index.qmd
|
||||
|
||||
- id: finite-field-sidebar
|
||||
style: "floating"
|
||||
contents:
|
||||
- section: "Exploring Finite Fields"
|
||||
href: ./posts/math/finite-field/index.qmd
|
||||
contents:
|
||||
- text: "Part 1: Preliminaries"
|
||||
href: ./posts/math/finite-field/1/index.qmd
|
||||
- text: "Part 2: Matrix Boogaloo"
|
||||
href: ./posts/math/finite-field/2/index.qmd
|
||||
contents:
|
||||
- text: "Appendix"
|
||||
href: ./posts/math/finite-field/2/extra/index.qmd
|
||||
- text: "Part 3: Roll a d20"
|
||||
href: ./posts/math/finite-field/2/index.qmd
|
||||
- text: "Part 5: The Power of Forgetting"
|
||||
href: ./posts/math/finite-field/2/index.qmd
|
||||
|
||||
format:
|
||||
html:
|
||||
theme:
|
||||
light:
|
||||
- flatly
|
||||
dark:
|
||||
- darkly
|
||||
|
||||
execute:
|
||||
cache: true
|
||||
@ -1,63 +0,0 @@
|
||||
---
|
||||
title: "About"
|
||||
---
|
||||
|
||||
This is my personal website (and the third iteration thereof).
|
||||
|
||||
The first version used Wordpress since it was quite easy to get into,
|
||||
didn't require much research, and web hosting services made it easy to set up.
|
||||
It lasted around three months near the end of 2020, after which I lost my posts because of
|
||||
hosting troubles and because I wasn't using proper backups.
|
||||
|
||||
The second version also used Wordpress, and lasted until the start of 2025
|
||||
(though the last post I had written up to that point was from the start of 2024).
|
||||
|
||||
This version uses [Quarto](https://quarto.org/), an open-source publishing platform that has
|
||||
some nice features like text-based configuration and Jupyter integration.
|
||||
As a bonus, it also produces static web pages.
|
||||
|
||||
|
||||
Why Quarto?
|
||||
-----------
|
||||
|
||||
I had a couple of reasons for switching platforms:
|
||||
|
||||
- Wordpress is either overkill or not enough.
|
||||
I don't need a block editor or multiple users, and I don't want to make custom content
|
||||
just for it to be specific to Wordpress.
|
||||
- I write a lot of code and LaTeX, which Wordpress relies on plugins for.
|
||||
Quarto uses (primarily) Pandoc-style Markdown, which allows for inlining of both out of the box.
|
||||
- Also, because of Jupyter integration, code cells can generate output for the page they're in.
|
||||
- Since pages are written in Markdown, everything can be edited locally and version-controlled in Git.
|
||||
|
||||
The last two are particularly nice in ensuring that the site is reproducibile,
|
||||
technically even without Quarto.
|
||||
Instead of articles that live in a Wordpress database or as scattered random files,
|
||||
I have the complete documents in a structure 1:1 with how the website is organized.
|
||||
|
||||
|
||||
Mathematics
|
||||
-----------
|
||||
|
||||
As of writing, all posts on this site are about math.
|
||||
In particular, they are dedicated to certain non-obvious insights I choose to investigate.
|
||||
Typically, although information about these subjects may exist online, it does not exist in a single,
|
||||
easily-accessible source.
|
||||
|
||||
I find writing math posts to be an excellent motivator when it comes to researching things.
|
||||
It also gives me a chance to learn new tools that otherwise I would not have a reason to use,
|
||||
not to mention being a good exercise in writing and diagram creation.
|
||||
|
||||
An example of this (and one that relates to the creation of the site) is when I was writing code
|
||||
for what would become the contents of [this post](/posts/polycount/5/).
|
||||
It was easy enough to learn a library for rendering images (or GIFs),
|
||||
but I didn't have a gallery to host them, nor a means to share the rationale which produced them.
|
||||
In a frenzy, I tried gathering my notes in a single text file before eventually putting them on a website.
|
||||
Along the way, I learned LaTeX to typeset the relevant equations.
|
||||
|
||||
I do my best to attribute the programs I use and direct sources I consult along the way,
|
||||
but extra information is frequently available on Wikipedia,
|
||||
which I may link to in order to give my explanation some grounding.
|
||||
|
||||
Unless otherwise stated, the figures and articles in this category are available under
|
||||
[CC BY-SA](https://creativecommons.org/licenses/by-sa/4.0/).
|
||||
353
assorted/infinitesimals/index.qmd
Normal file
@ -0,0 +1,353 @@
|
||||
---
|
||||
format:
|
||||
html:
|
||||
html-math-method: katex
|
||||
---
|
||||
|
||||
|
||||
Of Infinitesimals and Exponents
|
||||
===============================
|
||||
|
||||
Infinitesimal quantities, useful as they were to the development of calculus, have been deprecated in favor of limits. However, it is not the case that their existence is completely unjustified. In fact, it is rather easy to devise matrices whose powers "die off" at different rates:
|
||||
|
||||
$$
|
||||
\epsilon_2 = \begin{pmatrix}
|
||||
0 & 1 \\ 0 & 0
|
||||
\end{pmatrix}, ~~
|
||||
\epsilon_3 = \begin{pmatrix}
|
||||
0 & 1 & 0 \\ 0 & 0 & 1 \\ 0 & 0 & 0
|
||||
\end{pmatrix}, ~~
|
||||
\epsilon_3^2 = \begin{pmatrix}
|
||||
0 & 0 & 1 \\ 0 & 0 & 0 \\ 0 & 0 & 0
|
||||
\end{pmatrix} \\
|
||||
\epsilon_2^2 = \bf{0},~~ \epsilon_3^3 = \bf{0}
|
||||
$$
|
||||
|
||||
For the purposes of this post, I wish to narrow the kind of infinitesimal under consideration strictly to $\varepsilon = \epsilon_2$.
|
||||
|
||||
Their role in justifying calculus is at this point spent, but attempting to devise new "numbers" to see how they interact with preexisting structures is often interesting. For example, what does it mean to take a number to an infinitesimal power (or more generally, a matrix power)?
|
||||
|
||||
|
||||
A Frank Evaluation
|
||||
------------------
|
||||
|
||||
It is understood that exponentials and logarithms are inverses, therefore it might make sense to argue:
|
||||
|
||||
$$
|
||||
x^\varepsilon =
|
||||
e^{\ln{x^\varepsilon}} =
|
||||
e^{\varepsilon \ln{x}}
|
||||
$$
|
||||
|
||||
Since $e^x$ has a very nice power series, we can try plugging this expression in:
|
||||
|
||||
$$
|
||||
\begin{align*}
|
||||
e^x &= \sum_{n=0}^\infty {x^n \over n!}
|
||||
= 1 + x + {x^2 \over 2!} + {x^3 \over 3!} + ... \\
|
||||
e^{\varepsilon x} &= \sum_{n=0}^\infty {(\varepsilon x)^n \over n!}
|
||||
= 1 + {\varepsilon x} + {(\varepsilon x)^2 \over 2!} + {(\varepsilon x)^3 \over 3!} + ... \\
|
||||
&= 1 + {\varepsilon x} \\
|
||||
e^{\varepsilon \ln x} &= 1 + {\varepsilon \ln x}
|
||||
\end{align*}
|
||||
$$
|
||||
|
||||
As an infinitesimal, $\varepsilon$ very naturally transforms an infinite sum into a finite one. $\varepsilon$ is realized as a square matrix (since otherwise powers could not exist), so evaluating the exponential more directly:
|
||||
|
||||
$$
|
||||
\begin{align*}
|
||||
&\phantom{=\ }
|
||||
e^{\varepsilon \ln{x}} = \exp{\begin{pmatrix}0 & \ln{x} \\ 0 & 0\end{pmatrix}} \\
|
||||
\exp{\begin{pmatrix}0 & \ln{x} \\ 0 & 0 \end{pmatrix} } &=
|
||||
\begin{pmatrix}0 & \ln{x} \\ 0 & 0 \end{pmatrix}^0 +
|
||||
\begin{pmatrix}0 & \ln{x} \\ 0 & 0 \end{pmatrix}^1 +
|
||||
{1 \over 2}\begin{pmatrix}0 & \ln{x} \\ 0 & 0\end{pmatrix}^2 + ... \\ &=
|
||||
\begin{pmatrix}1 & 0 \\ 0 & 1\end{pmatrix} +
|
||||
\begin{pmatrix}0 & \ln{x} \\ 0 & 0\end{pmatrix} +
|
||||
{1 \over 2}
|
||||
\begin{pmatrix}0 & \ln{x} \\ 0 & 0\end{pmatrix}
|
||||
\begin{pmatrix}0 & \ln{x} \\ 0 & 0\end{pmatrix} + ... \\ &=
|
||||
\begin{pmatrix}1 & \ln{x} \\ 0 & 1\end{pmatrix} = 1 + \varepsilon \ln x
|
||||
\end{align*}
|
||||
$$
|
||||
|
||||
Of course, since $\varepsilon$ and its matrix form are equivalent, the answer is the same as before.
|
||||
|
||||
There are multiple problems with this argument, which are signified by reexamining the earlier equation:
|
||||
|
||||
$$
|
||||
x^\varepsilon \stackrel{?_1}{=}
|
||||
e^{\ln{x^\varepsilon}} \stackrel{?_2}{=}
|
||||
e^{\varepsilon \ln{x}}
|
||||
$$
|
||||
|
||||
1. It is not obvious that $x^\varepsilon$ is reconcilable with $e^x$ and the natural logarithm, i.e., that composing them is still an identity with respect to $\varepsilon$
|
||||
2. The power identity for logarithms may not be obeyed by $\varepsilon$
|
||||
|
||||
Additionally, there were only two terms used in the series for $e^x$; there are many more power series that begin with terms $1, 1...$, and the natural logarithm('s series) is simply the one that corresponds to the inverse of $e^x$. Are there other compositions of a series and its inverse that can be considered?
|
||||
|
||||
|
||||
Teeming with a lot of News
|
||||
--------------------------
|
||||
|
||||
Fortunately, there is not precisely one way to identify the value of $x^\varepsilon$, and one in particular has much less handwaving. The binomial theorem is a very useful tool for writing the power of a sum of numbers:
|
||||
|
||||
$$
|
||||
(x + 1)^n = \sum_{r=0}^n {n \choose r}x^r = \sum_{r=0}^n {n! \over {r!(n-r)!}}x^k
|
||||
$$
|
||||
|
||||
If the binomial coefficient is asserted to be 0 for $r > n$, then the binomial theorem can also be written as an infinite sum. However, the denominator of ${n! \over (n-r)!}$ doesn't make sense, since it will be a negative factorial in this circumstance. On the other hand, multiplying *n* with the r numbers immediately below it can be assigned a new symbol $(n)_r$ (named the [Pochhammer symbol](https://en.wikipedia.org/wiki/Falling_and_rising_factorials)). This falling factorial satisfies the 0 rule since if *n* is an integer smaller than *r*, then the product will include 0, annihilating all other terms.
|
||||
|
||||
$$
|
||||
(n)_0 = 1,~ (n)_r = (n -\ r + 1)(n)_{r-1} \\
|
||||
(x + 1)^n = \sum_{r=0}^\infty {(n)_r \over r!} x^r
|
||||
$$
|
||||
|
||||
However, if *n* is not an integer, then the series will miss 0, and continue indefinitely. This directly gives the series for square root:
|
||||
|
||||
$$
|
||||
\begin{align*}
|
||||
\sqrt{x + 1} &= (x + 1)^{1/2} =
|
||||
\sum_{r=0}^\infty {(1/2)_r \over r!} x^r \\ &=
|
||||
1 + {1 \over 2}x
|
||||
+ \left({1 \over 2!}\right)
|
||||
\left({1 \over 2}\right)
|
||||
\left({1 \over 2} -\ 1\right)x^2 + ... \\ &=
|
||||
1 + {1 \over 2}x + \left({1 \over 2!}\right)
|
||||
\left(-{1 \over 4}\right)x^2 +
|
||||
\left({1 \over 3!}\right)
|
||||
\left(-{1 \over 4} \right)
|
||||
\left({1 \over 2} -\ 2 \right)x^3 + ...\\ &=
|
||||
1 + {1 \over 2}x -\ {1 \over 8}x^2 +
|
||||
\left({1 \over 3!}\right)
|
||||
\left({3 \over 8} \right)x^3 +
|
||||
\left({1 \over 4!}\right)
|
||||
\left({3 \over 8} \right)
|
||||
\left({1 \over 2} -\ 3 \right)x^4 + ...\\ &=
|
||||
1 + {1 \over 2}x -\ {1 \over 8}x^2 +
|
||||
{1 \over 16}x^3 -\ {5 \over 128}x^4 + ...
|
||||
\end{align*}
|
||||
$$
|
||||
|
||||
|
||||
Tumbling down Infinitesimals
|
||||
----------------------------
|
||||
|
||||
Since this definition works for rational numbers as well as integers, is it possible to assign a value to $(\varepsilon)_r$? Indeed it is, since this symbol's definition only requires that integers can be subtracted from it and that it can multiply with other numbers. In other words, it works in any integer ring, a property which the matrices underlying $\varepsilon$ very fortunately have.
|
||||
|
||||
$$
|
||||
\begin{align*}
|
||||
(\varepsilon)_0 &= 1,~ (\varepsilon)_r = (\varepsilon -\ r + 1)(\varepsilon)_{r-1} \\
|
||||
(\varepsilon)_1 &= (\varepsilon -\ 0)(1) = \varepsilon\\
|
||||
(\varepsilon)_2 &= (\varepsilon -\ 1)(\varepsilon)
|
||||
= \varepsilon^2 -\ \varepsilon = -\varepsilon \\
|
||||
(\varepsilon)_3 &= (\varepsilon -\ 2)(-\varepsilon)
|
||||
= -\varepsilon^2 + 2\varepsilon = 2\varepsilon \\
|
||||
(\varepsilon)_4 &= (\varepsilon -\ 3)(2\varepsilon)
|
||||
= 2\varepsilon^2 -\ 6\varepsilon = -6\varepsilon \\
|
||||
& ... \\
|
||||
(\varepsilon)_r &= (-1)^{r-1}(r-1)!\varepsilon,~ r > 0
|
||||
\end{align*}
|
||||
$$
|
||||
|
||||
It is easy to check that this can also be directly computed from the matrix underlying $\varepsilon$. With this expression in mind, it can now be plugged into the binomial formula:
|
||||
|
||||
$$
|
||||
\begin{align*}
|
||||
(x + 1)^\varepsilon &= \sum_{r=0}^\infty {(\varepsilon)_r \over r!} x^r
|
||||
= 1 + \sum_{r=1}^\infty {(\varepsilon)_r \over r!} x^r \\ &=
|
||||
1 + \sum_{r=1}^\infty {(-1)^{r-1}(r-1)!\varepsilon \over r!} x^r \\ &=
|
||||
1 + \varepsilon \sum_{r=1}^\infty {(-1)^{r-1} \over r} x^r
|
||||
\end{align*}
|
||||
$$
|
||||
|
||||
The final sum may be familiar, but let's hold off from hastily cross-referencing a table. The term inside the sum looks a lot like an integral, so simplifying:
|
||||
|
||||
$$
|
||||
\begin{align*}
|
||||
\sum_{r=1}^\infty {(-1)^{r-1} \over r} x^r &=
|
||||
\sum_{r=1}^\infty \int {(-1)^{r-1}} x^{r-1} =
|
||||
\int \sum_{r=0}^\infty {(-1)^{r}} x^{r} \\ &=
|
||||
\int \sum_{r=0}^\infty (-x)^{r} =
|
||||
\int {1 \over 1 + x}
|
||||
\end{align*}
|
||||
$$
|
||||
|
||||
This is looking very promising! Substituting this expression for the previous sum, we can now conclude:
|
||||
|
||||
$$
|
||||
\begin{align*}
|
||||
(x + 1)^\varepsilon &= 1 + \varepsilon \int {1 \over 1 + x} \\
|
||||
x^\varepsilon &= 1 + \varepsilon \int {1 \over x} \\
|
||||
&= 1 + \varepsilon \ln x
|
||||
\end{align*}
|
||||
$$
|
||||
|
||||
Fortunately, this slightly more grounded approach agrees with the initial result.
|
||||
|
||||
|
||||
Other Elementary Algebraic Powers
|
||||
---------------------------------
|
||||
|
||||
|
||||
### Complex
|
||||
|
||||
Extending the Pochhammer symbol to other algebraic objects works in an analogous way. For example, the original approach with the imaginary unit *i* yields:
|
||||
|
||||
$$
|
||||
x^i = e^{\ln{x^i}} = e^{i\ln x} = \cos(\ln x) + i\sin(\ln x)
|
||||
$$
|
||||
|
||||
Since sine is odd and cosine is even, taking the reciprocal of $x^i$ (conjugating the exponent) just conjugates the result of the exponentiation. To be slightly more rigorous, calculating the real and imaginary components of $(i)_r$ and tabulating the results:
|
||||
|
||||
| r | Real | Imaginary |
|
||||
|---|------|-----------|
|
||||
| 0 | 1 | 0 |
|
||||
| 1 | 0 | 1 |
|
||||
| 2 | -1 | -1 |
|
||||
| 3 | 3 | 1 |
|
||||
| 4 | -10 | 0 |
|
||||
| 5 | 40 | -10 |
|
||||
|
||||
The real component corresponds to [OEIS A003703](http://oeis.org/A003703), and the imaginary to [OEIS A009454](http://oeis.org/A009454), which state that they have exponential generating functions $\cos(\ln x)$ and $\sin(\ln x)$ respectively, agreeing with the intuitive series above. In fact, reexamining the binomial formula, it obviously produces exponential generating functions (in $x -\ 1$) based on the series given by the Pochhammer symbol.
|
||||
|
||||
$$
|
||||
(x + 1)^n = \sum_{r=0}^\infty {(n)_r \over r!} x^r \Leftrightarrow
|
||||
x^n = \sum_{r=0}^\infty {(n)_r \over r!} (x-1)^r \\
|
||||
(x -\ 1)^n = \sum_{r=0}^\infty {(-1)^r (n)_r \over r!} x^r \Leftrightarrow
|
||||
x^n = \sum_{r=0}^\infty {(-1)^r (n)_r \over r!} (x+1)^r
|
||||
$$
|
||||
|
||||
|
||||
### Split-complex
|
||||
|
||||
How about the hyperbolic analogue of the above circular approach? We want a series that equates to $\cosh(\ln x) + j\sinh(\ln x)$, for some algebraic element *j*. Unlike with *i*, the exponential series does not need to alternate, but merely be partitioned into even and odd components. Therefore, *j* has the property that $j^2 = 1,~ j \neq 1$. It has a very simple matrix presentation and Pochhammer sequence.
|
||||
|
||||
$$
|
||||
\begin{align*}
|
||||
j &= \begin{pmatrix} 0 & 1 \\ 1 & 0 \end{pmatrix} \\
|
||||
(j)_2 &= j(j -\ 1) = 1 -\ j \\ (j)_3 &= (1 -\ j)(j -\ 2) = -3 + 3j \\
|
||||
(j)_r &= f(r)(1 -\ j) \\
|
||||
(j)_{r+1} &= f(r+1)(1 -\ j) = f(r)(1 -\ j)(j -\ r) \\
|
||||
&= f(r) \left( (r+1)j - (r+1)^{\vphantom{2}} \right)
|
||||
= -f(r)(r+1)(1 -\ j) \\
|
||||
f(r) &= -rf(r -\ 1)(1 -\ j) \implies \text{$f$ alternates and contains $r!$} \\
|
||||
&= {r!(-1)^r \over 2}, r \ge 2
|
||||
\end{align*}
|
||||
$$
|
||||
|
||||
Since this Pochhammer sequence contains $r!$, it pleasingly cancels out with the denominator of the binomial coefficient.
|
||||
|
||||
$$
|
||||
\begin{align*}
|
||||
x^j &= \sum_{r=0}^\infty {(j)_r \over r!} (x-1)^r \\
|
||||
&= 1 + j(x-1) + (1-j)\sum_{r=2}^\infty {r!(-1)^r \over 2r!} (x -\ 1)^r \\
|
||||
&= \phantom{+ j} \left(1 + {1 \over 2}\sum_{r=2}^\infty (-1)^r (x -\ 1)^r \right) \\
|
||||
&\phantom{=} + j \left(x -\ 1 -\ {1 \over 2}\sum_{r=2}^\infty (-1)^r (x -\ 1)^r \right) \\
|
||||
\sum_{r=2}^\infty (-1)^r (x-1)^r &=
|
||||
\sum_{r=0}^\infty (-1)^r (x-1)^r ~-~ \sum_{r=0}^1 (-1)^r (x-1)^r \\
|
||||
&= {1 \over 1 -\ (x -\ 1)} -\ (1 -\ (x -\ 1)) = {1 \over x} + x -\ 2 \\
|
||||
&= {x^2 -\ 2x + 1 \over x} \\
|
||||
x^j &= \left(1 + {x^2 -\ 2x + 1 \over 2x} \right)
|
||||
+ j\left(x -\ 1 -\ {x^2 -\ 2x + 1 \over 2x} \right) \\
|
||||
&= {x^2 + 1 \over 2x} + j{x^2 -\ 1 \over 2x}
|
||||
\end{align*}
|
||||
$$
|
||||
|
||||
The final expression is equivalent to the expression in cosh and sinh after writing them in terms of the exponential function and simplifying the natural logarithm. Notably, the components of $t^j$ (switching variables to avoid confusion) parametrize the hyperbola $x^2 -\ y^2 = 1$. The components of $t^i$ also do so for the circle $x^2 + y^2 = 1$ (since the range of the natural logarithm is over all reals), but fail to do so rationally.
|
||||
|
||||
|
||||
### Golden
|
||||
|
||||
The golden ratio also has a very simple relationship with its square, in particular $\phi^2 = \phi + 1$. This minimal polynomial has degree 2, so numbers can be represented by 2-tuples of the form $a + b\phi$. The Pochhammer sequence of $\phi$ is:
|
||||
|
||||
| r | Real | Phi |
|
||||
|---|------|------|
|
||||
| 0 | 1 | 0 |
|
||||
| 1 | 0 | 1 |
|
||||
| 2 | 1 | 0 |
|
||||
| 3 | -2 | 1 |
|
||||
| 4 | 7 | -4 |
|
||||
| 5 | -32 | -19 |
|
||||
|
||||
Removing the alternation, both sequences can be located in the OEIS; the real component is [OEIS A265165](http://oeis.org/A265165), and the imaginary component is [OEIS A306183](http://oeis.org/A306183) (alternating at [A323620](http://oeis.org/A323620)).
|
||||
|
||||
|
||||
Infinitive
|
||||
----------
|
||||
|
||||
If we're working with exponential-type series, wouldn't it be nice if $x^\omega$ was an expression in $e^x$ to match $x^\varepsilon$ for some $\omega$? The simplest "solution" is by allowing some algebraic element all of whose Pochhammer symbols (besides the 0th) are itself. In this case, we obtain:
|
||||
|
||||
$$
|
||||
\sum_{r=0}^\infty {(\omega)_r \over r!} (x-1)^r =
|
||||
1 + \omega \sum_{r=1}^\infty {(x-1)^r \over r!} =
|
||||
1 + \omega (e^{x-1}-1)
|
||||
$$
|
||||
|
||||
But the representation of $\omega$ is a problem. If all but one of its Pochhammer symbols are 1, then it satisfies all of the following:
|
||||
|
||||
$$
|
||||
\begin{align*}
|
||||
(\omega)_2 &= (\omega -\ 1)\omega = \omega^2 -\ \omega = \omega \\
|
||||
(\omega)_3 &= (\omega -\ 2)\omega = \omega^2 -\ 2\omega = \omega \\
|
||||
(\omega)_4 &= (\omega -\ 3)\omega = \omega^2 -\ 3\omega = \omega \\
|
||||
... \\
|
||||
(\omega)_r &= (\omega -\ r)\omega = \omega^2 -\ r\omega = \omega \\
|
||||
&= \omega^2 -\ (r+1)\omega = 0,~ r \ge 1
|
||||
\end{align*}
|
||||
$$
|
||||
|
||||
The simplest element that satisfies these relationships is obviously 0. Trying a little harder, maybe it is more the case that $\omega$ is some sort of infinite fixed point, such that $\omega^2$ is "bigger" than $\omega$ such that subtraction by a multiple of the latter is still positive. In fact, it is so much bigger that is unchanged, similarly to $\omega$'s relationship to the natural numbers, and it makes sense to normalize it down to its square root. Whatever $\omega$ actually represents, it cannot be captured in a matrix.
|
||||
|
||||
|
||||
Infinitesimal Duality
|
||||
---------------------
|
||||
|
||||
Of course, there is another infinitesimal that we should not forget to consider: the transpose of $\epsilon_2$, denoted hence $\varepsilon'$. Notice that $\varepsilon + \varepsilon' = j$. However, these two quantities do not play nice with each other. For example, is it the case that $x^\varepsilon x^{\varepsilon'} \stackrel{?}{=} x^{\varepsilon + \varepsilon'} = x^j$? Surprisingly, no. Starting with converting the left hand side to a matrix product:
|
||||
|
||||
$$
|
||||
\begin{align*}
|
||||
\begin{pmatrix} 1 & \ln x \\ 0 & 1\end{pmatrix}
|
||||
\begin{pmatrix} 1 & 0 \\ \ln x & 1\end{pmatrix} &=
|
||||
\begin{pmatrix} (\ln x)^2 + 1 & \ln x \\ \ln x & 1 \end{pmatrix} = \\
|
||||
1 + j\ln x + \begin{pmatrix} (\ln x)^2 & 0 \\ 0 & 0 \end{pmatrix} &\neq
|
||||
1 + j\ln x + \begin{pmatrix} 0 & 0 \\ 0 & (\ln x)^2 \end{pmatrix} \\ =
|
||||
\begin{pmatrix} 1 & \ln x \\ \ln x & (\ln x)^2 + 1 \end{pmatrix} &=
|
||||
\begin{pmatrix} 1 & 0 \\ \ln x & 1 \end{pmatrix}
|
||||
\begin{pmatrix} 1 & \ln x \\ 0 & 1 \end{pmatrix}
|
||||
\end{align*}
|
||||
$$
|
||||
|
||||
Numbers of the form $a + b\varepsilon$ do not commute with numbers of the form $a + b\varepsilon'$; moreover, neither of these expressions are $x^j$. Since $\varepsilon = {i + j \over 2}$, but *i* and *j* do not commute, the main diagonal (where the identity occupies) becomes polluted. The placement of the $(\ln x)^2$ term is the phantom of another matrix *k* that obeys $k^2 = 1,~ k \neq j \neq 1$.
|
||||
|
||||
$$
|
||||
\begin{align*}
|
||||
k &= \begin{pmatrix} 1 & 0 \\ 0 & -1 \end{pmatrix} \\
|
||||
1 + j\ln x + \begin{pmatrix} (\ln x)^2 & 0 \\ 0 & 0 \end{pmatrix} &=
|
||||
1 + j\ln x + {(\ln x)^2 \over 2} + k{(\ln x)^2 \over 2} \\
|
||||
1 + j\ln x + \begin{pmatrix} 0 & 0 \\ 0 & (\ln x)^2 \end{pmatrix} &=
|
||||
1 + j\ln x + {(\ln x)^2 \over 2} -\ k{(\ln x)^2 \over 2}
|
||||
\end{align*}
|
||||
$$
|
||||
|
||||
What about 1 + *j* (or equivalently 1 + *k*)? In either case, the result has 0 determinant, and in *k*'s, it is a skew-infinitesimal along the main diagonal. The Pochhammer sequence terminates, which makes sense: the *x* term is cleared from the denominator, eliminating the need for a series.
|
||||
|
||||
$$
|
||||
\begin{align*}
|
||||
(j + 1)_1 &= (j + 1), ~ (j + 1)_2 = (j + 1), ~ (j + 1)_3 = 0 \\
|
||||
x(x^j) &= {x^2+1 \over 2} + j{x^2-1 \over 2} \\
|
||||
x^{1 + j} &= 1 + (1 + j)(x -\ 1) + {1 \over 2}(1 + j)(x -\ 1)^2 \\
|
||||
&= {(x -\ 1)^2 \over 2} + x + j\left({(x -1)^2 \over 2} + x -\ 1 \right) = x(x^j)
|
||||
\end{align*}
|
||||
$$
|
||||
|
||||
Fortunately, this implies that addition of exponents is preserved in some circumstances. This expression also has a square root (since 1 + *j* has all even components):
|
||||
|
||||
$$
|
||||
\sqrt{x^{j + 1}} = 1 + {j + 1 \over 2}(x -\ 1) =
|
||||
{x+1 \over 2} + j{x-1 \over 2}
|
||||
$$
|
||||
|
||||
It is good to remember that the natural logarithm of *x* grows slower than any positive power of *x*. Similarly, infinitesimals can be imagined as smaller than any positive rational number. In some way, taking a number to an infinitesimal power is related to a function that grows slower than all rational powers, albeit only within an infinitesimal "space".
|
||||
|
||||
Generalizing slightly, it becomes obvious that algebraic powers can be assigned a series, which can have an interesting representation in transcendental functions.
|
||||
371
assorted/platonic_volume/index.qmd
Normal file
@ -0,0 +1,371 @@
|
||||
---
|
||||
format:
|
||||
html:
|
||||
html-math-method: katex
|
||||
---
|
||||
|
||||
|
||||
On the Volume of the Platonic Solids
|
||||
====================================
|
||||
|
||||
|
||||
The Platonic solids have been known for millennia. They bear the name of Plato, who spoke of them in his dialogue *Timaeus*. He describes their "construction" (sans the dodecahedron) from the most basic "isosceles and scalene" triangles, or in modern parlance, the "45-45-90 and 30-60-90" triangles. However, the construction was not mathematical, and to my knowledge, each solid was first rigorously described from principles in Book XIII of Euclid's Elements.
|
||||
|
||||
In my teenage years, I recall viewing articles on the solids with their volumes so proudly displayed along with their surface area. While the latter quantity may be troublesome in the case of the dodecahedron (as the geometry of regular pentagons is not widely taught), it is easy for any student of trigonometry to calculate the surface area of the solids made of equilateral triangles, and easy for any child who knows of squares to do so for the cube. On the other hand, the volume is somewhat mystical.
|
||||
|
||||
There is only one free variable in a Platonic solid, its edge length, which means that their volumes are parametrized by this value alone. To be a true unitless value, a volume must be in a ratio with another volume. The cube has the simplest expression for its volume; it is simply the side length cubed. Therefore in the following post, I will derive the ratio of each solid's volume to the volume of the cube formed by any side.
|
||||
|
||||
This post will calculate the volume without using any trigonometric functions (sine, cosine tangent), opting instead for a more compass-and-straightedge approach. For this reason, *square* of the volume will be calculated initially to better cooperate with the Pythagorean theorem. Additionally, except for the octahedron, the edge length of every solid will be 2 to simplify the bisection of edges. This happens to coincide with Plato's description; two 30-60-90 triangles were used to make an equilateral triangle, meaning that its edge length was twice the "unit" length: the shortest side of the 30-60-90 triangle.
|
||||
|
||||
|
||||
A Recap of Geometry
|
||||
-------------------
|
||||
|
||||
For those with only a vague recollection (or perhaps none at all) of geometry, this section is intended as a refresher.
|
||||
|
||||
|
||||
### Planar Geometry
|
||||
|
||||
There are [many centers of a triangle](https://faculty.evansville.edu/ck6/encyclopedia/etc.html), but there are two of primary interest:
|
||||
|
||||
- The *circumcenter* is the center of the circle containing every vertex, meaning that it is equidistant from every vertex.
|
||||
- It is constructed by finding the intersection of the edges' perpendicular bisectors.
|
||||
- The distance from a vertex to the circumcenter is called the *circumradius* (*c*).
|
||||
- The *incenter* is equidistant from every edge, meaning that the length of the perpendicular segment connecting an edge and the incenter is the same for all edges.
|
||||
- It is constructed by finding the intersection of the lines which bisect each angle.
|
||||
- The perpendicular distance from an edge to the incenter is called the *inradius* (*a*).
|
||||
|
||||
::: {}
|
||||

|
||||
|
||||
Constructing the circumcenter and incenter. Angle bisectors in blue, perpendicular bisectors in red, in- and circumradii in green.
|
||||
:::
|
||||
|
||||
The inradius is special because it is also an altitude for a triangle formed by the inradius and an edge of the larger triangle. This means that the area of the larger triangle is the sum of these smaller triangles.
|
||||
|
||||

|
||||
|
||||
$$
|
||||
\begin{align*}
|
||||
A &= \left ({e_1 a \over 2} + {e_2 a \over 2} + {e_3 a \over 2} \right) =
|
||||
\left ({a \over 2} \right ) (e_1 + e_2 + e_3) \\
|
||||
&= {Pa \over 2}
|
||||
\end{align*}
|
||||
$$
|
||||
|
||||
This gives an expression for the area. For an equilateral triangle, these two centers coincide. This is because the perpendicular bisectors of the edges *are* the angle bisectors. In fact, the bisection of an angle involves constructing a rhombus, which is made up of two isosceles triangles (of which the equilateral triangle is a special case). In this case, the inradius is also called the *apothem*, and the difference between it and the circumradius is immediately apparent and called the *sagitta* (*s*).
|
||||
|
||||

|
||||
|
||||
This idea of incenters and circumcenters can be extended to other 2D figures such as the square and regular pentagon. For a square, the center is simply the intersection of the diagonals (i.e., the diagonals' common midpoint). The pentagon is trickier, and will be discussed later. Regardless, the expression for the area ${Pa \over 2}$ still works, since the polygon can be triangulated through the center in a similar way.
|
||||
|
||||

|
||||
|
||||
|
||||
### Cubes, Prisms, and Pyramids
|
||||
|
||||
Now we speak of 3D geometry. The volume of a prism is equal to the height times the area of the base, where the "height" is orthogonal to the plane of the base. Pyramids with the same height and base have one-third this area.
|
||||
|
||||
$$
|
||||
V_\text{prism} = Bh,~~ V_\text{pyramid} = {Bh \over 3}
|
||||
$$
|
||||
|
||||
This volume formula can be made more intuitive by considering the cube. The pyramid formed by one of the faces and an edge perpendicular to it will contain one square and two half-squares, or two squares in total. Therefore three pyramids are needed to recreate all six faces of the cube.
|
||||
|
||||
For a slightly more detailed explanation, consider a point inside the face on top of the cube. Its (perpendicular) distance from one edge is *x* and its distance to an edge adjacent to that is *y*. Connecting all other bases to this point produces five pyramids, whose bases all have the same area. Designate these pyramids as "bottom", "left", "right", "front", and "back", where left and right correspond to *x* and front and back correspond to *y*.
|
||||
|
||||

|
||||
|
||||
$$
|
||||
\begin{align*}
|
||||
V_\text{cube} &= Bh = V_\text{bottom} + V_\text{left} + V_\text{right}
|
||||
+ V_\text{front} + V_\text{back} \\
|
||||
&= rBh + rBx + rB(h-x) + rBy + rB(h-y) \\
|
||||
&= rBh + rBh + rBh \implies 1 = 3r \\
|
||||
r &= {1 \over 3}
|
||||
\end{align*}
|
||||
$$
|
||||
|
||||
This can be generalized to a pyramid based on any prism, where the top point lies in the plane of one of the bases. However, this is beyond the scope of this post.
|
||||
|
||||
|
||||
Simple Solids: the Octahedron and the Tetrahedron
|
||||
-------------------------------------------------
|
||||
|
||||
While "simple" is a bit of a misnomer, their volumes are easiest to appreciate, since they do not need regular pentagons.
|
||||
|
||||
|
||||
### Octahedron
|
||||
|
||||
The octahedron can be thought of as two square pyramids joined end-on-end, with uniform edge length throughout. Since the base is a square, its center is equidistant from the vertices of the base. An alternative, congruent square can be noticed by the symmetry of the octahedron, meaning the center is also equidistant from the top of the square pyramid, and that the segment connecting the two is an altitude of the pyramid.
|
||||
|
||||
::: {}
|
||||

|
||||
|
||||
Primary square in blue, secondary square in red. Diagonals of both squares shown.
|
||||
:::
|
||||
|
||||
The length of this altitude is simply half of the diagonal of the square. Therefore, the volume of an octahedron (calculated using edge length 1) is:
|
||||
|
||||
$$
|
||||
\begin{align*}
|
||||
B^2 &= (1^2)^2 \\
|
||||
(2h)^2 &= 4h^2 = 1^2 + 1^2 = 2 \\
|
||||
V_\text{sq.pyr.}^2 &= {B^2 h^2 \over 3^2} =
|
||||
{1 \cdot {2 / 4} \over 3^2} \\
|
||||
(1^3 \cdot V_\text{oct})^2 &= (2V_\text{sq.pyr})^2 = 4V_\text{sq.pyr}^2 =
|
||||
4 \cdot {2 / 4 \over 3^2} = {2 \over 3^2} \\ \\
|
||||
V_\text{oct} &= {\sqrt{2} \over 3}
|
||||
\end{align*}
|
||||
$$
|
||||
|
||||
|
||||
### Tetrahedron
|
||||
|
||||
The tetrahedron is itself a pyramid. First, the (square of the) area of the base of an equilateral triangle must be known. As a reminder, this and all future solids will have edge length 2.
|
||||
|
||||
:::: {layout-ncol="2"}
|
||||
::: {.column width="49%"}
|
||||

|
||||
:::
|
||||
|
||||
::: {.column width="49%"}
|
||||
$$
|
||||
\begin{align*}
|
||||
d_\text{altitude}^2 &=
|
||||
\textcolor{orange}{2}^2 -\ \textcolor{green}{1}^2 = 3 \\
|
||||
B^2 &= \left ( {2 \cdot d_\text{altitude} \over 2} \right )^2 = 3
|
||||
\end{align*}
|
||||
$$
|
||||
:::
|
||||
::::
|
||||
|
||||
Next, bisect the tetrahedron through one edge and the altitudes of two faces. The altitudes form the legs of an isosceles triangle, so bisecting the angle where they meet (perpendicularly) bisects the remaining edge.
|
||||
|
||||
:::: {layout-ncol="2"}
|
||||
::: {.column width="49%"}
|
||||

|
||||
:::
|
||||
|
||||
::: {.column width="49%"}
|
||||
$$
|
||||
\begin{align*}
|
||||
\textcolor{blue}{d_\text{length}}^2 &=
|
||||
d_\text{altitude}^2 -\ \textcolor{green}{1}^2 = 2 \\
|
||||
(2A_\text{center})^2 &= (2d_\text{length})^2 = (\textcolor{red}{h} d_\text{altitude})^2 \\
|
||||
&= 4 \cdot 2 = 3h^2 \\
|
||||
h^2 &= 8 / 3
|
||||
\end{align*}
|
||||
$$
|
||||
:::
|
||||
::::
|
||||
|
||||
Since *h* is known, we can calculate the volume. Note that the volume is multiplied by the cube of the side length to produce the correct ratio to a unit cube.
|
||||
|
||||
$$
|
||||
\begin{align*}
|
||||
({2^3 \cdot V_\text{tet}})^2 &= {B^2 h^2 \over 3^2} = {3 \cdot (8/3) \over 3^2} \\
|
||||
V_\text{tet}^2 &= {8 \over 2^6 \cdot 3^2} = {1 \over 2^3 \cdot 3^2} = {1 \over 2 \cdot 6^2} \\
|
||||
V_\text{tet} &= \sqrt{1 \over 6^2 \cdot 2} = {1 \over 6\sqrt 2}
|
||||
\end{align*}
|
||||
$$
|
||||
|
||||
|
||||
### Returning to 2D: Regular Pentagons
|
||||
|
||||
Both of the icosahedron and dodecahedron contain regular pentagons. Thus, it is necessary to examine them in detail.
|
||||
|
||||
The regular pentagon has five diagonals, which form a pentagram. Since all angles in a regular pentagon are equal, the trapezoid formed by three consecutive edges and one diagonal is isosceles. This means the diagonal is parallel to one of the edges, which applies to all diagonals by symmetry. Since the diagonal and side are parallel, this means that any two adjacent edges form a parallelogram with part of the diagonal. More specifically, it is a rhombus and those "parts of diagonals" have length equal to the side.
|
||||
|
||||
::: {}
|
||||

|
||||
|
||||
Left: Pentagram in regular pentagon; Middle: Isosceles trapezoid, with parallel lines marked in blue; Right: Rhombus in regular pentagon
|
||||
:::
|
||||
|
||||
Bisect the pentagon vertically and let the length of half of the diagonal of a pentagon be *d*, half the length of the other diagonal of a rhombus be *h*, and the remaining height of the pentagon be *g*.
|
||||
|
||||

|
||||
|
||||
$$
|
||||
\begin{align*}
|
||||
\textcolor{orange}{d}^2 + \textcolor{red}{h}^2 &= \textcolor{blue}{2}^2 \\
|
||||
2\textcolor{darkblue}{A_\text{blue}} &= 2\textcolor{green}{g} = h(\textcolor{magenta}{d -\ (2 -\ d)}) = h (2d -\ 2) \\
|
||||
\implies g &= {h(2d -\ 2) \over 2} = h(d -\ 1)
|
||||
\end{align*}
|
||||
$$
|
||||
|
||||
Notice that the center of a pentagram contains a regular pentagon. This means that the ratio of its height to the side is equal to the ratio of the larger pentagon's height to its side. This is enough information to deduce *d*:
|
||||
|
||||
\begin{align*}
|
||||
{\textcolor{red}{h} \over 2(\textcolor{brown}{2 -\ d})} &=
|
||||
{2\textcolor{red}{h} + \textcolor{green}{g} \over \textcolor{blue}{2}} =
|
||||
|
||||
{2h + h(d-1) \over 2} = {h(1 + d) \over 2 } \\
|
||||
2h &= 2h(1 + d)(2 -\ d) \\
|
||||
1 &= (1 + d)(2 -\ d) = 2 -\ d + 2d -\ d^2 \\
|
||||
0 &= d^2 -\ d -\ 1
|
||||
\end{align*}
|
||||
|
||||
This is the minimal polynomial of the golden ratio $\phi$; it is half the length of the diagonal, so the ratio of a diagonal to a side is also $\phi$. To make calculations easier, some conversions will be made to base $\phi$, or phinary. If you are not familiar already with phinary, I have already written at length about it [here](). Finally, the apothem *a* and height *l* can be calculated by similar triangles.
|
||||
|
||||
::: {}
|
||||

|
||||
:::
|
||||
|
||||
$$
|
||||
\begin{align*}
|
||||
\textcolor{blue}{c \over a} &= \textcolor{brown}{2 \over \phi},~
|
||||
a^2 + 1^2 = c^2 \implies 1 = c^2 -\ a^2 = (c + a)(c -\ a) \\
|
||||
l &= c + a = {2a \over \phi} + a = a{2 + \phi \over \phi} = a{12_\phi \over 10_\phi} =
|
||||
a{2\bar{1}0_\phi \over 10_\phi} = a(2\bar{1}_\phi) \\ \\
|
||||
s &= c -\ a = {2a \over \phi} -\ a = a{2 -\ \phi \over \phi} = a{\bar{1}2_\phi \over 10_\phi} =
|
||||
a{2\bar{3}0_\phi \over 10_\phi} = a(2\bar{3}_\phi) \\ \\ \\
|
||||
1 &= ls = a^2(2\bar{1}_\phi)(2\bar{3}_\phi) = a^2(4\bar{8}3_\phi) =
|
||||
a^2(\bar{4}7_\phi) = a^2(3.\bar{4}_\phi) \\
|
||||
a^2 &= {1 \over 3.\bar{4}_\phi} \cdot {43_\phi \over 43_\phi} =
|
||||
{43_\phi \over [12]\bar{7}.[\bar{12}]_\phi} = {3 + 4\phi \over 5} \\ \\
|
||||
\implies l^2 &= a^2(2\bar{1}_\phi)^2 = {3 + 4\phi \over 5} \cdot (4\bar{4}1_\phi)
|
||||
= {3 + 4\phi \over 5} \cdot 5 = 3 + 4\phi
|
||||
\end{align*}
|
||||
$$
|
||||
|
||||
The last few steps in solving for $a^2$ are somewhat tricky. The conjugate of $\phi$ is $-{1 \over \phi}$. Since the digit in the $\phi^{-1}$ place value is negative, its conjugate has a positive value in the $\phi$ place value; i.e., $3.\bar{4}_\phi^* = 43_\phi$. Multiplying a quadratic root by its conjugate produces an integer value, which means that the scary quantity $[12]\bar{7}.[\bar{12}]_\phi$ resolves cleanly to 5.
|
||||
|
||||
The division can also be done explicitly in phinary:
|
||||
|
||||
$$
|
||||
\begin{align*}
|
||||
{1 \over 3.\bar{4}_\phi} &= {1 \over 0.\bar{1}3_\phi} =
|
||||
{500_\phi \over 5 (\bar{1}3_\phi)} =
|
||||
{233_\phi + (0 = \textcolor{red}{4\bar{4}}\bar{4}0_\phi =
|
||||
\textcolor{red}{26\bar{2}}\bar{4}0_\phi) \over 5 (\bar{1}3_\phi)} \\
|
||||
&= {\bar{2}60\bar{1}3_\phi \over 5 (\bar{1}3_\phi)} =
|
||||
{2001_\phi \over 5} =
|
||||
{221_\phi \over 5} =
|
||||
{43_\phi \over 5} =
|
||||
{3 + 4\phi \over 5}
|
||||
\end{align*}
|
||||
$$
|
||||
|
||||
Finally, with the length and apothem of a regular pentagon in tow, the geometry of the final two solids may be explored.
|
||||
|
||||
|
||||
The Remaining Solids
|
||||
--------------------
|
||||
|
||||
The icosahedron and dodecahedron are easiest to dissect as many pyramids joined to a single center. This is reminiscent of the area formula which uses the triangulation of a polygon through the incenter.
|
||||
|
||||
The altitude (*h*) of any one pyramid is the radius of the *insphere* of the solid, which is tangent to the plane of every face. Similarly, the *circumsphere* (circumradius, *r*) contains all vertices, and the *midsphere* (midradius, $\rho$) is tangent to every edge. These will become important shortly.
|
||||
|
||||
|
||||
### The Icosahedron: an Antiprism in Profile
|
||||
|
||||
The icosahedron may also be thought of as two pentagonal pyramids connected to either base of a pentagonal *antiprism*. An antiprism is a figure similar to a prism, but with the one of the bases twisted relative to the other and with (equilateral) triangles joining them.
|
||||
|
||||
:::: {layout-ncol="2"}
|
||||
::: {.column width="49%"}
|
||||

|
||||
|
||||
Icosahedron with pentagonal antiprism in blue
|
||||
:::
|
||||
|
||||
::: {.column width="49%"}
|
||||

|
||||
|
||||
Construction showing $2a = c$
|
||||
:::
|
||||
::::
|
||||
|
||||
A segment connecting the centers of two antipodal faces is a diameter of the insphere. The altitude of one of these faces will be cut into circumradius and inradius. By similar triangles, the circumradius of an equilateral triangle is exactly twice the length of the inradius. This means the inradius is 1/3 of the altitude, or 1/9 of the square of the altitude. With edge length 2, the square of the altitude is 3, so the square of the inradius is ${3 \over 9} = {1 \over 3}$ .
|
||||
|
||||
The pentagonal antiprism may be bisected bisected along the plane containing the altitudes of two triangles opposite one another. This forms a parallelogram with side lengths of the altitude of an equilateral triangle and height of a pentagon.
|
||||
|
||||

|
||||
|
||||
$$
|
||||
\begin{align*}
|
||||
(\textcolor{green}{2h})^2 &= \textcolor{red}{l}^2 -\ {1 \over 3} = 3 + 4\phi -\ {1 \over 3} =
|
||||
{3(3 + 4\phi) -\ 1 \over 3} \\
|
||||
h^2 &= {8 + 12\phi \over 3 \cdot 4} = {2 + 3\phi \over 3} = {32_\phi \over 3} \\
|
||||
32_\phi &= 210_\phi = 1100_\phi = 10000_\phi = \phi^4 \\ \\
|
||||
(2^3 \cdot V_\text{ico})^2 &= \left ( 20 \cdot {Bh \over 3} \right )^2 =
|
||||
{20^2 B^2 h^2 \over 3^2} = {5^2 \cdot 4^2 \cdot 3 \cdot {\phi^4 \over 3} \over 3^2} =
|
||||
{5^2 \cdot 2^4 \cdot \phi^4 \over 3^2} \\
|
||||
V^2 &= {5^2 \cdot 2^4 \cdot \phi^4 \over 2^6 \cdot 3^2} =
|
||||
{5^2 \cdot \phi^4 \over 2^2 \cdot 3^2} \\
|
||||
V &= {5 \phi^2 \over 6}
|
||||
\end{align*}
|
||||
$$
|
||||
|
||||
|
||||
### The Dodecahedron
|
||||
|
||||
The dodecahedron is a bit trickier. It belongs to a class of polyhedra known as *truncated trapezohedra*. However, the bisection trick from the icosahedron still works. Begin by bisecting the solid through antipodal altitudes. This produces an oblong hexagon made up of four pentagon heights and two edges.
|
||||
|
||||

|
||||
|
||||
The segment connecting the antipodal midpoints bisects the hexagon into two (isosceles) trapezoids, and is a diameter of the midsphere. Additionally, it is parallel to the two edges. A second midradius is perpendicular to this one, bisecting the trapezoid.
|
||||
|
||||

|
||||
|
||||
The inradius is the altitude of a triangle formed by the length of a pentagon (its base), a midradius, and a circumradius. However, the altitude with respect to the midradius is another midradius. This means that the height can be found by equating areas and completing the square.
|
||||
|
||||
$$
|
||||
\begin{align*}
|
||||
a^2 + \textcolor{green}{h}^2 &= \textcolor{blue}{\rho}^2,~~
|
||||
\textcolor{orange}{l}\textcolor{green}{h} =
|
||||
\textcolor{blue}{\rho \rho} \implies \textcolor{orange}{l}^2\textcolor{green}{h}^2 =
|
||||
(\textcolor{orange}{(2\bar{1}_\phi) a})^2 h^2 = 5a^2h^2 = \textcolor{blue}{\rho}^4 \\
|
||||
5a^2h^2 &= (a^2 + h^2)^2 = a^4 + 2a^2h^2 + h^4 \\ \\
|
||||
0 &= a^4 -\ 3a^2h^2 + h^4 = (h^2 -\ x)^2 + y = h^4 -\ 2xh^2 + x^2 + y \\
|
||||
-2x &= -3a^2 \implies x = {3a^2 \over 2},~~
|
||||
x^2 + y = {9a^4 \over 4} + y = a^4 \\
|
||||
y &= {4a^4 \over 4} -\ {9a^4 \over 4} = -{5a^4 \over 4} =
|
||||
-{(2\bar{1}_\phi)^2 a^4 \over 4} = -\left ( {(2\bar{1}_\phi) a^2 \over 2} \right )^2
|
||||
\\ \\
|
||||
(h^2 -\ {3a^2 \over 2})^2 &= -y = \left ( {(2\bar{1}_\phi) a^2 \over 2} \right )^2 \\
|
||||
h^2 -\ {3a^2 \over 2} &= {(2\bar{1}_\phi) a^2 \over 2} \\
|
||||
h^2 &= {(2\bar{1}_\phi) a^2 \over 2} + {3a^2 \over 2} = {(22_\phi) a^2 \over 2} =
|
||||
(11_\phi) a^2 \\
|
||||
&= {(11_\phi)(43_\phi) \over 5} = {473_\phi \over 5} =
|
||||
{[11]7_\phi \over 5} = {7 + 11\phi \over 5}
|
||||
\end{align*}
|
||||
$$
|
||||
|
||||
With the square of the height known, all that is left to do is find the volume.
|
||||
|
||||
$$
|
||||
\begin{align*}
|
||||
B^2 &= \left( {Pa \over 2} \right)^2 = (5a)^2 = 25a^2 = 5(43_\phi) \\
|
||||
5h^2 &= [11]7_\phi = 740_\phi = 4300_\phi = (43_\phi)(100_\phi) \\
|
||||
(2^3 \cdot V_\text{dodec})^2 &= \left (12 \cdot {Bh \over 3} \right )^2 =
|
||||
4^2 B^2 h^2 = 2^4 \cdot 5(43_\phi) \cdot {(43_\phi)(100_\phi) \over 5} \\
|
||||
V^2 &= {2^4 \cdot (43_\phi)^2 \cdot (100_\phi) \over 2^6} =
|
||||
{(43_\phi)^2(10_\phi)^2 \over 2^2} \\
|
||||
V &= {(43_\phi)(10_\phi) \over 2} = {(430_\phi) \over 2} = {(74_\phi) \over 2} =
|
||||
{4 + 7\phi \over 2}
|
||||
\end{align*}
|
||||
$$
|
||||
|
||||
|
||||
Closing
|
||||
-------
|
||||
|
||||
Since each of these volumes has been calculated algebraically, there have been no approximate decimal forms. Ordered by size, the volumes of each of the solids are:
|
||||
|
||||
| Solid | Volume | Approximation | Length of Side with Unit Volume |
|
||||
|--------------|-----------------------|-----------------|---------------------------------|
|
||||
| Tetrahedron | ${1 \over 6\sqrt 2}$ | 0.1178511302... | 2.039648903... |
|
||||
| Octahedron | ${\sqrt{2} \over 3}$ | 0.4714045208... | 1.284898293... |
|
||||
| Cube | $1^3$ | 1 | 1 |
|
||||
| Icosahedron | ${5\phi^2 \over 6}$ | 2.181694991... | 0.7710253465... |
|
||||
| Dodecahedron | ${4 + 7\phi \over 2}$ | 7.663118961... |0.5072220724... |
|
||||
|
||||
The dodecahedron being so much larger than the icosahedron surprised me, to be honest. When one glances at a set of dice (as one does), it seems like the d20 is larger than the d12, albeit with smaller edges. However, at least in my set, the edges of the d20 are in fact about 1.5 times as long as those of the d12, implying their volumes are roughly equal.
|
||||
|
||||
***
|
||||
|
||||
I tried to use as much coordinate-free geometry as I could in producing these diagrams. GeoGebra lacks a tool for producing Platonic solids other than cubes and tetrahedra, so I ended up using approximations for the octahedron and icosahedron diagrams. On the other hand, the hexagon I described in the dodecahedron is of such importance to its construction that I ended up constructing it from scratch. I am rather proud of this because I did so without looking up someone else's. After having written this post, I feel much more competent with compass-and-straightedge constructions.
|
||||
|
||||
All diagrams made with GeoGebra.
|
||||
55
drafts/alg_homo/index.qmd
Normal file
@ -0,0 +1,55 @@
|
||||
---
|
||||
format:
|
||||
html:
|
||||
html-math-method: katex
|
||||
---
|
||||
|
||||
|
||||
Viewing Homology Geometrically
|
||||
==============================
|
||||
|
||||
Delta sets for the Klein bottle, torus, and projective plane.
|
||||
|
||||
Define the delta maps in the natural way.
|
||||
|
||||
$$
|
||||
0 \overset{\partial_3}{\longrightarrow}
|
||||
C_2 \overset{\partial_2}{\longrightarrow}
|
||||
C_1 \overset{\partial_1}{\longrightarrow}
|
||||
C_0
|
||||
$$
|
||||
|
||||
Note that multiplying d1 by d2
|
||||
|
||||
$$
|
||||
0 \overset{\delta_3}{\longleftarrow}
|
||||
C_2 \overset{\delta_2}{\longleftarrow}
|
||||
C_1 \overset{\delta_1}{\longleftarrow}
|
||||
C_0
|
||||
$$
|
||||
|
||||
Fortunately, defining these maps is easy; we can just transpose the matrices by letting $\delta_\bullet = \partial_\bullet {}^T$.
|
||||
|
||||
For the projective plane, we end up modding out the base space. But what does this actually look like?
|
||||
|
||||
$$
|
||||
\begin{pmatrix} 1 & 0 \\ 0 & 1 \end{pmatrix} \left/
|
||||
\begin{pmatrix} 1 & 1 \\ -1 & 1 \end{pmatrix}
|
||||
\right.
|
||||
$$
|
||||
|
||||
On the left is the integer lattice and on the right is the sublattice generated by (1, -1) and (1, 1). These can be overlaid to show that there are obviously twice as many points in the former as there are the latter. When we perform the action of "modding out", all of the points in the sublattice go to 0. So in the quotient space, we only have two types of points: ones which were on the sublattice (0) and points which were not (1). But this describes the exact same thing as $Z_2$, which happens to be the homology group under discussion.
|
||||
|
||||
The Klein bottle is a little more complicated. In this case, we end up modding a rank 3 space out by a rank 2 space.
|
||||
|
||||
$$
|
||||
\begin{pmatrix} 1 & 0 & 0\\ 0 & 1 & 0 \\ 0 & 0 & 1 \end{pmatrix} \left/
|
||||
\begin{pmatrix} 1 & -1 \\ 1 & 1 \\ -1 & 1 \end{pmatrix}
|
||||
\right.
|
||||
$$
|
||||
|
||||
The free component is the line normal to the plane described by the column space. But this is precisely the kernel of the map.
|
||||
|
||||
The torsion subgroup turns out to be identical to the one we already discussed for the Klein bottle, only we're in a plane that's slightly skewed with respect to the integer lattice.
|
||||
|
||||
![]()
|
||||
195
drafts/pseudo_taylor/index.qmd
Normal file
@ -0,0 +1,195 @@
|
||||
---
|
||||
format:
|
||||
html:
|
||||
html-math-method: katex
|
||||
---
|
||||
|
||||
|
||||
Notes on Pseudo-Taylor Series
|
||||
=============================
|
||||
|
||||
Whilst examining type algebra, I found that the geometric series, a cornerstone of calculus, could be derived by analyzing its definition as a rewrite rule. That is, $(1 - X)^{-1}$ is expressed similarly to an exponential object; when it is written as $-1 \rightarrow (1 - X)$, it can be interpreted thus:
|
||||
|
||||
$$
|
||||
(1 - X)^{-1} = -1 ~\rightarrow~ 1 - X \\ \\
|
||||
\begin{matrix}
|
||||
-1
|
||||
& \rightarrow&
|
||||
1 - X
|
||||
\\&&
|
||||
1 + (-1) \times X
|
||||
& \rightarrow &
|
||||
1 +(1 - X)X
|
||||
\\ & & & &
|
||||
1 + X + (- 1) \times X^2
|
||||
& \rightarrow &
|
||||
1 + X + (1-X)X^2
|
||||
\\ &&&&&& ...
|
||||
\end{matrix}
|
||||
$$
|
||||
|
||||
Which, in the limit, becomes the geometric series
|
||||
|
||||
$$
|
||||
1 + X + X^2 + X^3 + X^4 + ... = \sum_{n=0}^\infty X^n
|
||||
$$
|
||||
|
||||
I would like dedicate a bit more of my time to examining this apparent correspondence between Taylor series and rewrite rules, which as far as I can tell, appears to be new territory.
|
||||
|
||||
|
||||
Why is -1 Special?
|
||||
------------------
|
||||
|
||||
One of my first questions upon seeing this was why -1 is special. In type theory, integers can represent the number of values which occupy a type. Naturally (if you'll pardon the pun), this only makes sense for the positives and zero. But what is it that distinguishes -1 from any other negative number?
|
||||
|
||||
Naively, we can examine what happens when examining $-2 \rightarrow 1 - 2X$:
|
||||
|
||||
$$
|
||||
\textcolor{blue}{-2} \rightarrow 1 - 2X \\
|
||||
\begin{matrix}
|
||||
\textcolor{blue}{-2}
|
||||
& \stackrel{?}{\rightarrow} &
|
||||
1 - 2X
|
||||
\\&&
|
||||
1 + (\textcolor{blue}{-2}) \times X
|
||||
& \stackrel{?}{\rightarrow} &
|
||||
1 +(1 - 2X)X
|
||||
\\ & & & &
|
||||
1 + X + (\textcolor{blue}{-2}) \times X^2
|
||||
& \stackrel{?}{\rightarrow} &
|
||||
1 + X + (1-2X)X^2
|
||||
\\ &&&&&& ...
|
||||
\end{matrix}
|
||||
$$
|
||||
|
||||
But we know that this arrowed expression should evaluate to $(1-2X)^{-2}$
|
||||
|
||||
$$
|
||||
\textcolor{blue}{-2} \rightarrow 1 - 2X =
|
||||
(1 - 2X)^{-2} =
|
||||
(1 - 4X + 4X^2)^{-1} =
|
||||
\textcolor{red}{-1} \rightarrow 1 - 4X + 4X^2 \\ \ \\
|
||||
\begin{matrix}
|
||||
\textcolor{red}{-1}
|
||||
& \rightarrow &
|
||||
1 - 4X + 4X^2
|
||||
\\&&
|
||||
1 + (\textcolor{red}{-1}) \times 4X + 4X^2
|
||||
& \rightarrow &
|
||||
1 +(1 - 4X + 4X^2) \times 4X + 4X^2
|
||||
\\ & & & &
|
||||
1 + 4X - 12X^2 + 16X^3
|
||||
\\ & & & &
|
||||
1 + 4X + (\textcolor{red}{-1}) \times 12X^2 + 16X^3
|
||||
& \rightarrow & ...
|
||||
\end{matrix}
|
||||
$$
|
||||
|
||||
Continuing the rewrite rule gives coefficients of 12, 32, 80, 192... for $X^2$ onward. And indeed, the [Taylor series for the reciprocal](https://www.wolframalpha.com/input?i=taylor+series+%281+-+4X+%2B+4X%5E2%29%5E-1) of $1 - 4X + 4X^2$ is
|
||||
|
||||
This gives us a bit more information: -1 is special because it factors out of all other negatives. From there, we can evaluate the remaining positive exponent by the binomial theorem.
|
||||
|
||||
|
||||
Ordering
|
||||
--------
|
||||
|
||||
What happens when there are multiple negatives in the denominator? For example, the expression $(1 - X -X^2)^{-1}$ has the Fibonacci numbers as its Taylor series coefficients. If we try replacing all the -1s at once, we don't even come close past the first numbers:
|
||||
|
||||
$$
|
||||
{1 \over 1 - X -X^2} = \textcolor{red}{-1} \rightarrow 1 - X - X^2 \\ \ \\
|
||||
\begin{matrix}
|
||||
\textcolor{red}{-1}
|
||||
& \rightarrow &
|
||||
1 - X - X^2
|
||||
\\&&
|
||||
1 + (\textcolor{red}{-1}) \times X + (\textcolor{red}{-1}) \times X^2
|
||||
& \rightarrow &
|
||||
1 + (1 - X - X^2 )X + (1 - X - X^2 )X^2
|
||||
\\ & & & &
|
||||
1 + X - X^2 - X^3 + X^2 - X^3 - X^4
|
||||
\\ & & & &
|
||||
1 + X - 2X^3 - X^4
|
||||
\\ & & & &
|
||||
1 + X + (\textcolor{red}{-1}) \times 2X^3 + (\textcolor{red}{-1}) \times X^4
|
||||
\\ & & & & ...
|
||||
\end{matrix}
|
||||
$$
|
||||
|
||||
The [katex]X^2[/katex] terms cancel after the first iterated replacement. This is clearly not right; the Fibonacci number following two 1's is 2.
|
||||
|
||||
In fact, all is well if we replace less aggressively.
|
||||
|
||||
$$
|
||||
\begin{matrix}
|
||||
\textcolor{red}{-1}
|
||||
& \rightarrow &
|
||||
1 - X - X^2
|
||||
\\&&
|
||||
1 + (\textcolor{red}{-1}) \times X -X^2
|
||||
& \rightarrow &
|
||||
1 + (1 - X - X^2 ) \times X - X^2
|
||||
\\ & & & &
|
||||
1 + X - X^2 - X^3 -X^2
|
||||
\\ & & & &
|
||||
1 + X - 2X^3 - X^3
|
||||
\\ & &
|
||||
1 + X+ (1- X - X^2)\times2X^2 - X^3
|
||||
& \leftarrow &
|
||||
1 + X + (\textcolor{red}{-1}) \times 2X^2 - X^3
|
||||
\\ & &
|
||||
1 + X + 2X^2 - 2X^3 - 2X^4 - X^3
|
||||
\\ & &
|
||||
1 + X + 2X^2 - 3X^3 - 2X^4
|
||||
\\ & &
|
||||
1 + X + 2X^2 + (\textcolor{red}{-1})\times 3X^3 - 2X^4
|
||||
& \rightarrow & ...
|
||||
\end{matrix} \\ \ \\
|
||||
{1 \over 1 - X - X^2} = 1 + X + 2X^2 + 3X^3 + 5X^4 + 8X^5 + ...
|
||||
$$
|
||||
|
||||
This gives us another way of obtaining the generating function for the Fibonacci numbers.
|
||||
|
||||
$$
|
||||
{1 \over 1 - X -X^2} = \textcolor{red}{-1} \rightarrow 1 - X - X^2 \\ \ \\
|
||||
\begin{matrix}
|
||||
\textcolor{red}{-1}
|
||||
& \rightarrow &
|
||||
F_0 + F_1 X + F_2 X^2 + ... - F_{n-1} X^{n-1} - F_{n-2} X^n
|
||||
\\ & &
|
||||
... + (-1) \times F_{n-1} X^{n-1} - F_{n-2} X^n
|
||||
\\ & & \downarrow
|
||||
\\ & &
|
||||
... + (1 - X - X^2) \times F_{n-1} X^{n-1} - F_{n-2} X^n
|
||||
\\ & &
|
||||
... + F_{n-1} X^{n-1} - F_{n-1} X^n - F_{n-1} X^{n+1} - F_{n-2} X^n
|
||||
\\ & &
|
||||
... + F_{n-1} X^{n-1} - (F_{n-1} + F_{n-2}) X^n - F_{n-1} X^{n+1}
|
||||
\\ & &
|
||||
... + F_{n-1} X^{n-1} - F_n X^n - F_{n-1} X^{n+1}
|
||||
\end{matrix}
|
||||
$$
|
||||
|
||||
|
||||
Complex Roots
|
||||
-------------
|
||||
|
||||
Negatives?
|
||||
|
||||
Must have a pole?
|
||||
|
||||
|
||||
Continued Fractions
|
||||
-------------------
|
||||
|
||||
I am the most interested in generalizing rewrite rule-style types. The recursive equation for a forest is actually similar to the continued fraction for the Catalan numbers:
|
||||
|
||||
$$
|
||||
F(X) = {1 \over 1 - X \times F(X)} = {1 \over 1 - X \times {1 \over 1 - X \times F(X)}} =...= \cfrac{1}{1 - \cfrac{X}{1- \cfrac{X}{1- \cfrac{X}{_\ddots} }}}
|
||||
\\
|
||||
= 1 + X\times F(X) + X^2 \times F(X)^2 +X^3 \times F(X)^3 + ... \\
|
||||
= 1 + X + 2X^2 +5X^3 + 14X^4 + 42X^5+...
|
||||
$$
|
||||
|
||||
Successively replacing F(X) with itself will produce the desired series.
|
||||
|
||||
Access to -1 and exponentials implies access to fractions and all surds.
|
||||
513
finite/1/index.qmd
Normal file
@ -0,0 +1,513 @@
|
||||
---
|
||||
format:
|
||||
html:
|
||||
html-math-method: katex
|
||||
---
|
||||
|
||||
<style>
|
||||
.red {
|
||||
color: red;
|
||||
}
|
||||
.green {
|
||||
color: green;
|
||||
}
|
||||
</style>
|
||||
|
||||
|
||||
Exploring Finite Fields: Preliminaries
|
||||
======================================
|
||||
|
||||
[Fields](https://en.wikipedia.org/wiki/Field_%28mathematics%29) are one of the basic structures in abstract algebra. Roughly, a field is a collection of elements paired with two operations, addition and multiplication, along with particular rules about their interactions. The most important elements of a field are 0 (the additive identity), 1 (the multiplicative identity), and -1 (which forms additive inverses). Moreover, multiplicative inverses must exist.
|
||||
|
||||
Many people are already know about some fields such as the rational numbers $\mathbb{Q}$ and complex numbers $\mathbb{C}$. Finite fields also exist, the most familiar being $\mathbb{F_2} = \text{GF}(2)$, or the field with two elements. This field only contains the elements 0 and 1, with -1 being identical to 1. The addition and multiplication tables are consequently the simplest possible according to familiar rules.
|
||||
|
||||
| + | 0 | 1 |
|
||||
|---|---|---|
|
||||
| 0 | 0 | 1 |
|
||||
| 1 | 1 | 0 |
|
||||
|
||||
| × | 0 | 1 |
|
||||
|---|---|---|
|
||||
| 0 | 0 | 0 |
|
||||
| 1 | 0 | 1 |
|
||||
|
||||
This field expresses the parity of sums and products of two integers, since:
|
||||
|
||||
- even + even = even
|
||||
- even + odd = odd
|
||||
- odd + even = odd
|
||||
- odd + odd = even
|
||||
|
||||
And
|
||||
|
||||
- even × even = even
|
||||
- even × odd = even
|
||||
- odd × even = even
|
||||
- odd × odd = odd
|
||||
|
||||
|
||||
In One's Prime
|
||||
--------------
|
||||
|
||||
Two is not unique as the only possible order of a finite field -- all prime numbers are also candidates. In general, the field inherits the properties of integer arithmetic. The role of -1 taken up by *p* - 1, where *p* is the order of the field, and the field is referred to as GF(*p*).
|
||||
|
||||
The additive inverse of an element *x* can be viewed in two ways:
|
||||
|
||||
- Multiplying -1 in the field with x, (i.e., $(p - 1)x \mod p$)
|
||||
- Counting backwards from zero, which is equal to p (i.e., $p - x$)
|
||||
|
||||
The product of any two elements in the field cannot result in a multiple of *p*, which are all congruent to 0. If this were the case, then the order would share factors with one of the two terms. But the order is prime, so this is impossible. More strongly, multiplicative inverses [can be found algorithmically](https://en.wikipedia.org/wiki/Modular_multiplicative_inverse#Extended_Euclidean_algorithm), although it is a somewhat tricky task.
|
||||
|
||||
|
||||
Polynomials
|
||||
-----------
|
||||
|
||||
Before we look at other finite fields, we have to look at polynomials. For a given field *K*, we can also consider polynomials with coefficients from elements in the field, K\[*x*\]. The structure that polynomials fit into is called a [*ring*](https://en.wikipedia.org/wiki/Ring_%28mathematics%29). Rings are slightly weaker than a fields, since there are not generally multiplicative inverses. The zero polynomial and constant polynomial 1 are the additive and multiplicative identities, respectively.
|
||||
|
||||
Since GF(*p*) has a finite number of elements to consider, there are only so many choices for polynomial coefficients. Each degree has a finite number of polynomials, so it's much easier to list them out than it would be for the integers. Again, looking at polynomials over GF(2), we have:
|
||||
|
||||
Degree | Polynomial *q(x)* | List of coefficients of *q(x)* (ascending) | *q*(2) | *q*(2) (Binary)
|
||||
-------|-------------------|--------------------------------------------|--------|----------------
|
||||
1 | x | [0, 1] | 2 | 10
|
||||
1 | 1 + x | [1, 1] | 3 | 11
|
||||
2 | x^2 | [0, 0, 1] | 4 | 100
|
||||
2 | 1 + x^2 | [1, 0, 1] | 5 | 101
|
||||
2 | x + x^2 | [0, 1, 1] | 6 | 110
|
||||
2 | 1 + x + x^2 | [1, 1, 1] | 7 | 111
|
||||
3 | x^3 | [0, 0, 0, 1] | 8 | 1000
|
||||
3 | 1 + x^3 | [1, 0, 0, 1] | 9 | 1001
|
||||
3 | x + x^3 | [0, 1, 0, 1] | 10 | 1010
|
||||
3 | 1 + x + x^3 | [1, 1, 0, 1] | 11 | 1011
|
||||
... | ... | ... | ... | ...
|
||||
|
||||
|
||||
### The Base-ics
|
||||
|
||||
There is a very close correspondence between binary expansions and polynomials over GF(2). This is evident by comparing the list of coefficients in the polynomial (column 3) with the binary expansions of the polynomial evaluated at 2 (column 5). This gives a handy way of referring to polynomials (mod *p*) without having to write out each individual "x" or "+". In fact, this is commonly used to compactly compute with and refer to [polynomials used in cyclic redundancy checks](https://en.wikipedia.org/wiki/Mathematics_of_cyclic_redundancy_checks).
|
||||
|
||||
Again, 2 is not unique among primes. Polynomials over any prime field GF(*p*) can be expressed as integers in base *p*.
|
||||
|
||||
<details>
|
||||
<summary>
|
||||
Haskell implementation of duality between polynomials mod *p* and base *p* expansions of integers
|
||||
</summary>
|
||||
<br>
|
||||
This implementation actually works for any base *b*, which is not necessarily prime. The only difference is that the coefficients lose "field-ness" for composite *b*.
|
||||
|
||||
```{haskell}
|
||||
-- | eval: false
|
||||
|
||||
-- A polynomial is its ascending list of coefficients (of type a)
|
||||
data Polynomial a = Poly { coeffs :: [a] }
|
||||
|
||||
-- Interpret a number's base-b expansion as a polynomial
|
||||
asPoly :: Int -> Int -> Polynomial Int
|
||||
-- Build a list with f, which returns either Nothing
|
||||
-- or Just (next element of list, next argument to f)
|
||||
asPoly b = Poly . unfoldr f where
|
||||
-- Divide x by b. Emit the remainder and recurse with the quotient.
|
||||
f x | x /= 0 = Just $ swap $ divMod x b
|
||||
-- If there's nothing left to divide out, terminate
|
||||
| otherwise = Nothing
|
||||
|
||||
-- Horner evaluation of a polynomial at the integer b
|
||||
evalPoly :: Int -> Polynomial Int -> Int
|
||||
-- Start with the highest coefficient
|
||||
-- Multiply by b at each step and add the coefficient of the next term
|
||||
evalPoly b (Poly p) = foldr (\y acc -> acc*b + y) 0 p
|
||||
|
||||
-- evalPoly n . asPoly n = id :: Int -> Int
|
||||
```
|
||||
|
||||
An interesting detail here is that the duality is expressed through `foldr` using multiplication and addition and `unfoldr` using divMod.
|
||||
</details>
|
||||
|
||||
|
||||
### Mono, not Stereo
|
||||
|
||||
With respect to their roots (which will soon become of primary interest), polynomials are *projective*. More directly, any scalar multiple of the polynomial has the same roots. For GF(2), this is insignificant, but over GF(5) for example, the following polynomials have the same roots:
|
||||
|
||||
$$
|
||||
\begin{align*}
|
||||
x^2 + 2 \mod 5 \quad &\longleftrightarrow \quad {_5 27} \\
|
||||
2x^2 + 4 \mod 5 \quad &\longleftrightarrow \quad {_5 54} \\
|
||||
3x^2 + 1 \mod 5 \quad &\longleftrightarrow \quad {_5 76} \\
|
||||
4x^2 + 3 \mod 5 \quad &\longleftrightarrow \quad {_5 103}
|
||||
\end{align*}
|
||||
$$
|
||||
|
||||
Only the first polynomial has a leading coefficient of 1, a condition which makes it a *monic* polynomial. It is preferable to work with monic polynomials since the product of two monic polynomials is also monic.
|
||||
|
||||
An equivalent condition to this is that the integer the polynomial corresponds to corresponds to falls between 5^2 and 2×5^2 - 1 = 49. In general, monic polynomials mod *p* as integers obviously fall in the range *p*^2 and 2*p*^2 - 1.
|
||||
|
||||
<details>
|
||||
<summary>
|
||||
Haskell implementation of monic polynomials mod *p*
|
||||
</summary>
|
||||
|
||||
Again, nothing about this definition depends on the base being prime.
|
||||
|
||||
```{haskell}
|
||||
-- | eval: false
|
||||
|
||||
-- All monic polynomials of degree d with coefficients mod n
|
||||
monics :: Int -> Int -> [Polynomial Int]
|
||||
monics n d = map (asPoly n) [n^d..2*(n^d) - 1]
|
||||
|
||||
-- All monic polynomials with coefficients mod n, ordered by degree
|
||||
allMonics :: Int -> [Polynomial Int]
|
||||
allMonics n = concat [monics n d | d <- [1..]]
|
||||
```
|
||||
</details>
|
||||
|
||||
As an aside, one can also read out monics by counting normally by using the digit alphabet {1, 0, -1, ..., -*p* + 2}. Unfortunately, these base-*p* expansions are more difficult to obtain algorithmically, and I'll leave this as an exercise to the reader.
|
||||
|
||||
|
||||
### Irreducibles
|
||||
|
||||
Over the integers, we can factor a number into primes. To decide if a number is prime, we just divide it (using an algorithm like long division) by numbers less than it and see if we get a nonzero remainder.
|
||||
|
||||
Similarly, we can factor polynomials into *irreducible* polynomials, which have no "smaller" polynomial factors other than 1. More precisely, by "smaller", we mean those of lesser degree. For example, over the integers, the polynomial $x^2 - 1$ (degree 2) factors into $(x + 1)(x - 1)$ (both degree 1), but $x^2 + 1$ is irreducible.
|
||||
|
||||
In general, a factorization of a polynomial over the integers implies a factorization of one over GF(*p*), since the coefficients for each factor may be taken mod *p*. However, the converse does not hold. Over GF(2),
|
||||
|
||||
$$
|
||||
(x + 1)^2 = x^2 + 2x + 1 \equiv x^2 + 1 \mod 2
|
||||
$$
|
||||
|
||||
...but as just mentioned, the right-hand side is irreducible over the integers.
|
||||
|
||||
Since we can denote polynomials by numbers, it may be tempting to freely switch between primes and irreducibles. However, irreducibles depend on the chosen modulus and do not generally correspond to the base p expansion of a prime.
|
||||
|
||||
Irreducible over GF(2), *q(x)* | *q*(2) ([OEIS A014580](https://oeis.org/A014580)) | Prime
|
||||
-------------------------------|---------------------------------------------------|------
|
||||
$x$ | 2 | 2
|
||||
$x + 1$ | 3 | 3
|
||||
$x^2 + x + 1$ | 7 | <span class="green"> 5 </span>
|
||||
$x^3 + x + 1$ | 11 | 7
|
||||
$x^3 + x^2 + 1$ | 13 | 11
|
||||
$x^4 + x + 1$ | 19 | 13
|
||||
$x^4 + x^3 + 1$ | <span class="red"> 25 </span> | <span class="green"> 17 </span>
|
||||
$x^4 + x^3 + x^2 + x + 1$ | 31 | 19
|
||||
$x^5 + x^2 + 1$ | 37 | <span class="green"> 23 </span>
|
||||
$x^5 + x^3 + 1$ | 41 | <span class="green"> 29 </span>
|
||||
$x^5 + x^3 + x^2 + x + 1$ | 47 | 31
|
||||
|
||||
The red entry in column 2 is not prime. Dually, the green entries in column 3 do not have binary expansions which correspond to irreducible polynomials over GF(2).
|
||||
|
||||
|
||||
### Dividing and Sieving
|
||||
|
||||
Just like integers, we can use [polynomial long division](https://en.wikipedia.org/wiki/Polynomial_long_division) with these objects to decide if a polynomial is irreducible. [Synthetic division](https://en.wikipedia.org/wiki/Synthetic_division) is an alternative which is slightly easier to implement (especially mod 2, where it is, again, used in CRCs). It only works for monic polynomials, but this is all we need.
|
||||
|
||||
<details>
|
||||
<summary>
|
||||
Haskell implementation of synthetic division
|
||||
</summary>
|
||||
|
||||
The algorithm is similar to table-less algorithms for CRCs, but we don't have the luxury of working at the bit level with XOR for addition. We also have to watch out for negation and coefficients other than 1 for when not working mod 2.
|
||||
|
||||
```{haskell}
|
||||
-- | eval: false
|
||||
|
||||
-- Divide the polynomial ps by qs (coefficients in descending order by degree)
|
||||
synthDiv' :: (Eq a, Num a) => [a] -> [a] -> ([a], [a])
|
||||
synthDiv' ps qs
|
||||
| head qs /= 1 = error "Cannot divide by non-monic polynomial"
|
||||
| otherwise = splitAt deg $ doDiv ps deg
|
||||
where
|
||||
-- Negate the denominator and ignore leading term
|
||||
qNeg = map negate $ tail qs
|
||||
-- The degree of the result, based on the degrees of the numerator and denominator
|
||||
deg = max 0 (length ps - length qs + 1)
|
||||
-- Pluck off the head of the list and add a shifted and scaled version of
|
||||
-- qs to the tail of the list. Repeat this d times
|
||||
doDiv xs 0 = xs
|
||||
doDiv (x:xs) d = x:doDiv (zipAdd xs $ map (*x) qNeg) (d - 1)
|
||||
|
||||
-- Use Polynomial (coefficients in ascending degree order) instead of lists
|
||||
synthDiv :: (Eq a, Num a) => Polynomial a -> Polynomial a -> (Polynomial a, Polynomial a)
|
||||
synthDiv (Poly p) (Poly q) = (Poly $ reverse quot, Poly $ reverse rem) where
|
||||
(quot, rem) = synthDiv' (reverse p) (reverse q)
|
||||
```
|
||||
</details>
|
||||
|
||||
Then, using our list of monic polynomials, we can use the same strategy for sieving out primes to find (monic) irreducibles.
|
||||
|
||||
<details>
|
||||
<summary>
|
||||
Haskell implementation of an irreducible polynomial (mod *p*) sieve
|
||||
</summary>
|
||||
|
||||
```{haskell}
|
||||
-- | eval: false
|
||||
|
||||
-- All irreducible monic polynomials with coefficients mod n
|
||||
irreducibles :: Int -> [Polynomial Int]
|
||||
irreducibles n = go [] $ monics n where
|
||||
-- Divide the polynomial x by i, then take the remainder mod n
|
||||
remModN x i = fmap (`mod` n) $ snd $ synthDiv x i
|
||||
-- Find remainders of x divided by every irreducible in "is".
|
||||
-- If any give the zero polynomial, then x is a multiple of an irreducible
|
||||
notMultiple x is = and [not $ all (==0) $ coeffs $ remModN x i | i <- is]
|
||||
-- Sieve out by notMultiple
|
||||
go is (x:xs)
|
||||
| notMultiple x is = x:go (x:is) xs
|
||||
| otherwise = go is xs
|
||||
|
||||
print $ take 10 $ irreducibles 2
|
||||
```
|
||||
</details>
|
||||
|
||||
|
||||
Matrices
|
||||
--------
|
||||
|
||||
Just like polynomials over a finite field, we can also look at matrices. The most interesting matrices are square ones, since the product of two square matrices is another square matrix. Along with the zero matrix ($\bf 0_n$) as the additive identity and the identity matrix ($\bf 1_n$) as the multiplicative, square matrices also form a ring over the field K, denoted Kn×n.
|
||||
|
||||
Square matrices are associated to a [determinant](https://en.wikipedia.org/wiki/Determinant), which is an element from the underlying field. Determinants are nice, since the determinant of the product of two matrices is the product of the determinants. The determinant can be implemented using [Laplace expansion](https://en.wikipedia.org/wiki/Laplace_expansion), which is also useful for inductive proofs.
|
||||
|
||||
|
||||
<details>
|
||||
<summary>
|
||||
Haskell implementation of Laplace expansion
|
||||
</summary>
|
||||
|
||||
Laplace expansion is ludicrously inefficient compared to other algorithms, and is only shown here due to its "straightforward" implementation and use in proof. Numeric computation will not be used to keep the arithmetic exact.
|
||||
|
||||
```{haskell}
|
||||
-- | eval: false
|
||||
|
||||
newtype Matrix a = Mat { unMat :: Array (Int, Int) a }
|
||||
|
||||
determinant :: (Num a, Eq a) => Matrix a -> a
|
||||
determinant (Mat xs) = determinant' xs where
|
||||
-- Evaluate (-1)^i without repeated multiplication
|
||||
parity i = if even i then 1 else -1
|
||||
-- Map old array addresses to new ones when eliminating row 0, column i
|
||||
rowMap i (x,y) = (x+1, if y >= i then y+1 else y)
|
||||
-- Recursive determinant Array
|
||||
determinant' xs
|
||||
-- Base case: 1x1 matrix
|
||||
| n == 0 = xs!(0,0)
|
||||
-- Sum of cofactor expansions
|
||||
| otherwise = sum $ map cofactor [0..n] where
|
||||
-- Produce the cofactor of row 0, column i
|
||||
cofactor i
|
||||
| xs!(0,i) == 0 = 0
|
||||
| otherwise = (parity i) * xs!(0,i) * (determinant' $ minor i)
|
||||
-- Furthest extent of the bounds, i.e., the size of the matrix
|
||||
(_,(n,_)) = bounds xs
|
||||
-- Build a new Array by eliminating row 0 and column i
|
||||
minor i = ixmap ((0,0),(n-1,n-1)) (rowMap i) xs
|
||||
```
|
||||
</details>
|
||||
|
||||
|
||||
### Back to Polynomials
|
||||
|
||||
The [characteristic polynomial](https://en.wikipedia.org/wiki/Characteristic_polynomial) is a stronger invariant which follows from the determinant (and conveniently plays into the prior description of polynomials). It is defined as, for *λ* a scalar variable:
|
||||
|
||||
$$
|
||||
\text{charpoly}(A) = p_A(\lambda) = \left| \lambda I - A \right| \\ ~ \\
|
||||
= \left|
|
||||
\begin{matrix*}
|
||||
\lambda - a_{00} & -a_{01} & ... & -a_{0n} \\
|
||||
-a_{10} & \lambda - a_{11} & ... & -a_{1n} \\
|
||||
\vdots & \vdots & \ddots & \vdots \\
|
||||
-a_{n0} & -a_{n1} & ... & \lambda - a_{nn} \\
|
||||
\end{matrix*}
|
||||
\right|
|
||||
$$
|
||||
|
||||
Laplace expansion never gives *λ* a coefficient before recursing, so the characteristic polynomial is always monic.
|
||||
|
||||
<details>
|
||||
<summary>
|
||||
Haskell implementation of the characteristic polynomial
|
||||
</summary>
|
||||
Since `determinant` was defined for all `Num` and `Eq`, it can immediately be applied if these instances are defined for polynomials.
|
||||
|
||||
```{haskell}
|
||||
-- | eval: false
|
||||
-- Num instance for polynomials omitted
|
||||
-- instance (Num a, Eq a) => Num (Polynomial a) where
|
||||
-- ...
|
||||
|
||||
instance Eq a => Eq (Polynomial a) where
|
||||
(==) (Poly xs) (Poly ys) = xs == ys
|
||||
|
||||
charpoly :: Matrix Int -> Polynomial Int
|
||||
charpoly xs = determinant $ eyeLambda |+| negPolyXs where
|
||||
-- Furthest extent of the bounds, i.e., the size of the matrix
|
||||
(_,(n,_)) = bounds $ unMat xs
|
||||
-- Negative of input matrix, after being converted to polynomials
|
||||
negPolyXs :: Matrix (Polynomial Int)
|
||||
negPolyXs = fmap (\x -> Poly [-x]) xs
|
||||
-- Identity matrix times lambda (encoded as Poly [0, 1])
|
||||
eyeLambda :: Matrix (Polynomial Int)
|
||||
eyeLambda = fmap (\x -> (Poly [x] * Poly [0, 1])) $ eye (n+1)
|
||||
```
|
||||
</details>
|
||||
|
||||
Computation using this definition is only good for illustrative purposes. The [Faddeev-LeVerrier algorithm](https://en.wikipedia.org/wiki/Faddeev%E2%80%93LeVerrier_algorithm) circumvents Laplace expansion entirely and happens to generate the determinant along the way. However, it has some problems:
|
||||
|
||||
- It inverts the order in which the determinant and characteristic polynomial are defined
|
||||
- It introduces division, which makes it unsuitable over mod *p* matrices directly
|
||||
|
||||
Fortunately, we can just work with a mod *p* matrix over the integers and mod out at the end instead, as the following diagram conveys:
|
||||
|
||||
$$
|
||||
\begin{matrix}
|
||||
\mathbb{F}_p ^{n \times n} & \textcolor{green}{\hookrightarrow} &
|
||||
\normalsize \mathbb{Z}^{n \times n} &
|
||||
\overset{\mod p ~~}{\longrightarrow} &
|
||||
\mathbb{F}_p^{n \times n} & \scriptsize \phantom{text{charpoly}}
|
||||
\\ \\ &
|
||||
\scriptsize \textcolor{green}{\text{charpoly (FL)}} &
|
||||
\textcolor{green}{\downarrow} & &
|
||||
\textcolor{red}{\downarrow} & \scriptsize \textcolor{red}{\text{charpoly (LE)}}
|
||||
\\ \\ & &
|
||||
\mathbb{Z}[\lambda] &
|
||||
\textcolor{green}{\underset{\mod p ~~}{\longrightarrow}} &
|
||||
\mathbb{F}_p[\lambda] & \scriptsize \phantom{text{charpoly}}
|
||||
\end{matrix}
|
||||
$$
|
||||
|
||||
The top row are matrices and the bottom row are polynomials. To get to the bottom-right, which contains the characteristic polynomials mod *p* matrices, we can avoid the red arrow and follow the path in green instead.
|
||||
|
||||
|
||||
### Friends Among Matrices
|
||||
|
||||
In the reverse direction, a matrix with a specific characteristic polynomial can be constructed from a polynomal. The matrix is called the [companion matrix](https://en.wikipedia.org/wiki/Companion_matrix), and is defined as
|
||||
|
||||
$$
|
||||
p(\lambda) = \lambda^n + p_{n-1}\lambda^{n-1} + ... + p_1 \lambda + p_0 \\ ~ \\
|
||||
C_{p(\lambda)} = \left( \begin{matrix}
|
||||
0 & 1 & 0 & ... & 0 \\
|
||||
0 &0 & 1 & ... & 0 \\
|
||||
\vdots &\vdots & \vdots & \ddots & \vdots \\
|
||||
0 & 0 & 0 & ... & 1 \\
|
||||
-p_0 & -p_1 & -p_2 & ... & -p_{n-1}
|
||||
\end{matrix} \right) =
|
||||
\left( \begin{matrix}
|
||||
\overrightharpoon 0_{n-1} & \bold{1}_{n-1} \\
|
||||
-p_0& -(\overrightharpoon{p}_{1:n-1})^T
|
||||
\end{matrix} \right) \\ ~ \\
|
||||
\text{charpoly}(C_{p}) = p_{C_{p}}(\lambda) = p(\lambda)
|
||||
$$
|
||||
|
||||
The definition of the companion matrix only depends on elements having an additive inverse, which is always true in a field. Therefore, there are always matrices over a field that have a monic polynomial as their characteristic polynomial.
|
||||
|
||||
Proving that the companion matrix has the characteristic polynomial it was constructed from can be done via Laplace expansion:
|
||||
|
||||
$$
|
||||
p_{0:n-1}(\lambda) = \left| \begin{matrix}
|
||||
\textcolor{red}{\lambda} & -1 & 0 & ... & 0 \\
|
||||
0 & \lambda & -1 & ... & 0 \\
|
||||
\vdots &\vdots & \vdots & \ddots & \vdots \\
|
||||
0 & 0 & 0 & ... & -1 \\
|
||||
\textcolor{green}{p_0} & p_1 & p_2 & ... & \lambda + p_{n-1}
|
||||
\end{matrix} \right|
|
||||
\\ ~ \\ =
|
||||
\textcolor{green}{p_0} \cdot (-1)^{n-1}
|
||||
\left| \begin{matrix}
|
||||
-1 & 0 & ... & 0 \\
|
||||
\lambda & -1 & ... & 0 \\
|
||||
\vdots & \vdots & \ddots & \vdots \\
|
||||
0 & 0 & ... & -1
|
||||
\end{matrix} \right|
|
||||
+ \textcolor{red}{\lambda}
|
||||
\left| \begin{matrix}
|
||||
\lambda & -1 & ... & 0 \\
|
||||
\vdots & \vdots & \ddots & \vdots \\
|
||||
0 & 0 & ... & -1 \\
|
||||
p_1 & p_2 & ... & \lambda + p_{n-1}
|
||||
\end{matrix} \right|
|
||||
\\ ~ \\ =
|
||||
\textcolor{green}{p_0} \cdot (-1)^{n-1} \cdot (-1)^{n-1} +
|
||||
\textcolor{red}{\lambda} \cdot p_{1:n-1}(\lambda)
|
||||
\\ ~ \\ =
|
||||
p_0 + \lambda(p_1 + \lambda (...(p_{n-1} + \lambda )...)))
|
||||
$$
|
||||
|
||||
Pleasantly, this yields the Horner form, which was used above to evaluate polynomials.
|
||||
|
||||
<details>
|
||||
<summary>
|
||||
Haskell implementation of the companion matrix
|
||||
</summary>
|
||||
```{haskell}
|
||||
-- | eval: false
|
||||
|
||||
companion :: Polynomial Int -> Matrix Int
|
||||
companion (Poly ps)
|
||||
| last ps' /= 1 = error "Cannot find companion matrix of non-monic polynomial"
|
||||
| otherwise = Mat $ array ((0,0), (n-1,n-1)) $ lastRow ++ shiftI where
|
||||
-- The degree of the polynomial, as well as the size of the matrix
|
||||
n = length ps' - 1
|
||||
-- Remove trailing 0s from ps
|
||||
ps' = reverse $ dropWhile (==0) $ reverse ps
|
||||
-- Address/value tuples for a shifted identity matrix:
|
||||
-- 1s on the diagonal just above the main diagonal, 0s elsewhere
|
||||
shiftI = map (\p@(x,y) -> (p, if y == x + 1 then 1 else 0)) $ range ((0,0),(n-2,n-1))
|
||||
-- Address/value tuples for the last row of the companion matrix:
|
||||
-- ascending powers of the polynomial
|
||||
lastRow = zipWith (\x y -> ((n-1, x), y)) [0..n-1] $ map negate ps'
|
||||
|
||||
-- (charpoly . companion) = id :: Polynomial Int -> Polynomial Int
|
||||
```
|
||||
</details>
|
||||
|
||||
|
||||
Field Extensions
|
||||
----------------
|
||||
|
||||
Aside from those of degree 1, the irreducible polynomials over a field cannot be factored into monomials over the field. In other words, irreducibles have roots which do not exist as elements of the field. A *field extension* formalizes the notion by which one can make a larger field from another by adding the roots.
|
||||
|
||||
Using $x^2 + 1$ (over the integers) again, even over an actual field like $\mathbb{R}$, the polynomial is still irreducible. On the other hand, it can be factored into $(x + i)(x - i)$ over $\mathbb{C}$. We can construct the latter field from the from if an extra number i exists alongside everything in $\mathbb{R}$ such that *i*^2^ = -1. Then, form all possible products and sums by taking linear combinations of powers of i less than the degree (in this case, 0 and 1).
|
||||
|
||||
The equation that *i* obeys can be rewritten as $i^2 + 1 = 0$, which is the original polynomial, evaluated at *i*. In order to refer explicitly to the construction of the bigger field from the polynomial, we write $\mathbb{R}[x] / (x^2 + 1) \cong \mathbb{C}$. *Technically*, the left hand side refers to something else (cosets of polynomials, from which we extract the canonical member *i*), but this description is good enough.
|
||||
|
||||
|
||||
### The Power of Primes
|
||||
|
||||
We can extend a finite field in the same way. Over GF(2), the smallest irreducible of degree 2 is $x^2 + x + 1$. Using the same logic as before, we construct $\mathbb{F}_2[x] / (x^2 + x + 1) \cong \mathbb{F}_2[\alpha]$. The new element α is a root of the polynomial and obeys the relations:
|
||||
|
||||
$$
|
||||
\alpha^2 + \alpha + 1 = 0 \\
|
||||
\alpha^2 = -\alpha - 1 \equiv \alpha + 1 \mod 2 \\
|
||||
\alpha^3 = \alpha^2 + \alpha= (\alpha +1) + \alpha \equiv 1 \mod 2
|
||||
$$
|
||||
|
||||
Just like *i*, only powers of α less than 2 (again, 0 and 1) are necessary to express elements of the field. Skipping a few steps, we can accumulate all possible sums and products over this new field into two new tables:
|
||||
|
||||
| + | 0 | 1 | *α* | *α* + 1 |
|
||||
|---------|---------|---------|---------|---------|
|
||||
| 0 | 0 | 1 | *α* | *α* + 1 |
|
||||
| 1 | 1 | 0 | *α* + 1 | *α* |
|
||||
| *α* | *α* | *α* + 1 | 0 | 1 |
|
||||
| *α* + 1 | *α* + 1 | *α* | 1 | 0 |
|
||||
|
||||
| × | 0 | 1 | *α* | *α* + 1 |
|
||||
|---------|---------|---------|---------|---------|
|
||||
| 0 | 0 | 0 | 0 | 0 |
|
||||
| 1 | 0 | 1 | *α* | *α* + 1 |
|
||||
| *α* | 0 | *α* | *α* + 1 | 1 |
|
||||
| *α* + 1 | 0 | *α* + 1 | 1 | *α* |
|
||||
|
||||
As you might expect, the resulting field has 4 elements, so it's called $\mathbb{F}_4 = \text{GF}(4)$. In general, when adjoining an irreducible of degree d to GF(p), the resulting field has pd elements, naturally denoted $\mathbb{F}_{p^d} = \text{GF}(p^d)$. p is called the characteristic of the field, and denotes how many repeated additions are needed to get to 0. From the above table, it's clear that the characteristic is 2 since 1 + 1 = α + α = (α + 1) + (α + 1) = 0.
|
||||
|
||||
|
||||
### ...and beyond?
|
||||
|
||||
All of this is manageable when you're adjoining a root of a degree 2 polynomial like *α* or *i*, but things get difficult when you start to work with higher degrees. The powers of the root form the basis for a *d*-dimensional vector space over GF(*p*) (hence the order of the field being *p*^*d*^). Proceeding as before, we'd have to be able to:
|
||||
|
||||
- recognize equality in the new field based on sums of powers of roots (times elements of the field)
|
||||
- have a canonical method of expressing other elements after adjoining a root
|
||||
- ideally, handle both with an algorithm that gives canonical forms from noncanonical ones
|
||||
- know when we've found every element of the new field
|
||||
|
||||
These problems make it difficult to study prime power fields on a computer without the use of a CAS like Maple or Mathematica. They're capable of taking care of these issues symbolically, working with the expressions in the same way we have (or at least appearing to do so). As someone who likes to do things himself, implementing a CAS from scratch seemed a little too cumbersome. Furthermore, even a more direct approach using the previously-mentioned "canonical members of cosets of polynomials" was more annoying than I was willing to put up with.
|
||||
|
||||
Fortunately, there's a detour that makes it much easier to dodge all of these problems, and it has some interesting consequences. Join me in [the next post]() for an direct, non-symbolic way to work with prime power fields.
|
||||
709
finite/2/index.qmd
Normal file
@ -0,0 +1,709 @@
|
||||
---
|
||||
format:
|
||||
html:
|
||||
html-math-method: katex
|
||||
jupyter: python3
|
||||
---
|
||||
|
||||
<style>
|
||||
.red {
|
||||
color: red;
|
||||
}
|
||||
.green {
|
||||
color: green;
|
||||
}
|
||||
.blue {
|
||||
color: blue;
|
||||
}
|
||||
.orange {
|
||||
color: orange;
|
||||
}
|
||||
.yellow {
|
||||
color: yellow;
|
||||
}
|
||||
.purple {
|
||||
color: purple;
|
||||
}
|
||||
</style>
|
||||
|
||||
|
||||
Exploring Finite Fields, Part 2: Matrix Boogaloo
|
||||
================================================
|
||||
|
||||
In the [last post](), we discussed finite fields, polynomials and matrices over them, and the typical, symbolic way of extending fields with polynomials. This post will will focus on circumventing symbolic means with numeric ones.
|
||||
|
||||
|
||||
More about Matrices (and Polynomials)
|
||||
-------------------------------------
|
||||
|
||||
Recall the definition of polynomial evaluation. Since a polynomial is defined with respect to a certain structure (e.g., the integers), we expect to only be able to evaluate the polynomial within that structure.
|
||||
|
||||
$$
|
||||
K[x] \times K \overset{\text{eval}}{\longrightarrow} K
|
||||
$$
|
||||
|
||||
However, there's nothing wrong with evaluating polynomials with another polynomial, as long as they're defined over the same structure. After all, we can take powers of polynomials and scalar-multiply them with coefficients from *K*. The same holds for matrices, or any bigger structure *F* over *K* which has these properties.
|
||||
|
||||
$$
|
||||
\begin{align*}
|
||||
K[x] \times K[x] &\overset{\text{eval}_{poly}}{\longrightarrow} K[x] \\ ~ \\
|
||||
K[x] \times K^{n \times n} &\overset{\text{eval}_{mat}}{\longrightarrow} K^{n \times n} \\ ~ \\
|
||||
K[x] \times F(K) &\overset{\text{eval}_F}{\longrightarrow} F(K)
|
||||
\end{align*}
|
||||
$$
|
||||
|
||||
Essentially, this means we can extend a polynomial into new structures by evaluating it in certain ways:
|
||||
|
||||
$$
|
||||
\begin{align*}
|
||||
& \phantom{I} \begin{align*}
|
||||
p &: K[x] \\
|
||||
p(x) &= x^n + p_{n-1}x^{n-1} + ... + p_1 x + p_0 &
|
||||
\end{align*} &
|
||||
\text{$x$ is a scalar indeterminate} \\ ~ \\
|
||||
& \begin{align*}
|
||||
P &: (K[x])^{m \times m} \\
|
||||
P(x I) &= (x I)^n + (p_{n-1})(x I)^{n-1} + ... &
|
||||
\\
|
||||
\phantom{= p} & + p_1(x I)+ p_0 I
|
||||
\end{align*} &
|
||||
\begin{align*}
|
||||
\text{$x$ is a scalar indeterminate,} \\
|
||||
\text{$P(x I)= p(x) I$ is a } \\
|
||||
\text{matrix of polynomials in $x$}
|
||||
\end{align*} \\
|
||||
\\
|
||||
& \begin{align*}
|
||||
\hat P &: K^{m \times m}[X] \\
|
||||
\hat P(X) &= X^n + (p_{n-1}I)X^{n-1} + ... \\
|
||||
& + (p_1 I) X + (p_0 I)
|
||||
\end{align*} &
|
||||
\begin{align*}
|
||||
\text{$X$ is a matrix indeterminate} \\
|
||||
\hat P(X) \text{ is a polynomial over matrices}
|
||||
\end{align*}
|
||||
\end{align*}
|
||||
$$
|
||||
|
||||
Or by using types instead of the more abstract notation above, we can describe functions that convert p to P and $\hat P$.
|
||||
|
||||
```{.haskell}
|
||||
asPolynomialMatrix :: Polynomial Int -> Matrix (Polynomial Int)
|
||||
asMatrixPolynomial :: Polynomial Int -> Polynomial (Matrix Int)
|
||||
```
|
||||
|
||||
### Cayley-Hamilton Theorem
|
||||
|
||||
When evaluating the characteristic polynomial of a matrix *with* that matrix, something strange happens. Continuing from the previous article, using $x^2 + x + 1$ and its companion matrix, we have:
|
||||
|
||||
$$
|
||||
p(x) = x^2 + x + 1 \qquad C_{p} = C =
|
||||
\left( \begin{matrix}
|
||||
0 & 1 \\
|
||||
-1 & -1
|
||||
\end{matrix} \right) \\ ~ \\
|
||||
\hat P(C) = C^2 + C + (1 \cdot I) =
|
||||
\left( \begin{matrix}
|
||||
-1 & -1 \\
|
||||
1 & 0
|
||||
\end{matrix} \right) +
|
||||
\left( \begin{matrix}
|
||||
0 & 1 \\
|
||||
-1 & -1
|
||||
\end{matrix} \right) +
|
||||
\left( \begin{matrix}
|
||||
1 & 0 \\
|
||||
0 & 1
|
||||
\end{matrix} \right) \\ ~ \\
|
||||
= \left( \begin{matrix}
|
||||
0 & 0 \\
|
||||
0 & 0
|
||||
\end{matrix} \right)
|
||||
$$
|
||||
|
||||
The result is the zero matrix. This tells us that, at least in this case, the matrix *C* is a root of its own characteristic polynomial.
|
||||
|
||||
By the [Cayley-Hamilton theorem](https://en.wikipedia.org/wiki/Cayley%E2%80%93Hamilton_theorem), this is true in general, no matter the degree of *p*, no matter its coefficients, and importantly, no matter the choice of field. This is more powerful than it would otherwise seem. For one, factoring a polynomial "inside" a matrix turns out to give the same answer as factoring a polynomial over matrices.
|
||||
|
||||
:::: {layout-ncol = "2"}
|
||||
::: {}
|
||||
$$
|
||||
P(xI) = \left( \begin{matrix}
|
||||
x^2 + x + 1 & 0 \\
|
||||
0 & x^2 + x + 1
|
||||
\end{matrix}\right) \\ ~ \\ = (xI - C)(xI - C') \\ ~ \\
|
||||
=
|
||||
\left( \begin{matrix}
|
||||
x & -1 \\
|
||||
1 & x + 1
|
||||
\end{matrix} \right)
|
||||
\left( \begin{matrix}
|
||||
x - a & -b \\
|
||||
-c & x - d
|
||||
\end{matrix} \right) \\ ~ \\
|
||||
\begin{align*}
|
||||
x(x-a) + c &= x^2 + x + 1 \\
|
||||
\textcolor{green}{x(-b) - (x - d)} &\textcolor{green}{= 0} \\
|
||||
\textcolor{blue}{(x - a) + (x + 1)(-c)} &\textcolor{blue}{= 0} \\
|
||||
(-b) + (x + 1)(x - d) &= x^2 + x + 1 \\
|
||||
\end{align*}
|
||||
\\ ~ \\
|
||||
\textcolor{green}{(-b -1)x +d = 0} \implies b = -1, ~ d = 0 \\
|
||||
\textcolor{blue}{(1 - c)x - a - c = 0} \implies c = 1, ~ a = -1
|
||||
\\ ~ \\
|
||||
C' =
|
||||
\left( \begin{matrix}
|
||||
-1 &-1 \\
|
||||
1 & 0
|
||||
\end{matrix} \right)
|
||||
$$
|
||||
:::
|
||||
|
||||
::: {}
|
||||
$$
|
||||
\hat P(X) = X^2 + X + 1I \\ ~ \\
|
||||
= (X - C)(X - C') \\ ~ \\
|
||||
= X^2 - (C + C')X + CC'
|
||||
\\ ~ \\ \implies \\ ~\\
|
||||
C + C' = -I, ~ C' = -I - C \\ ~ \\
|
||||
CC' = I, ~ C^{-1} = C' \\ ~ \\
|
||||
C' = \left( \begin{matrix}
|
||||
-1 & -1 \\
|
||||
1 & 0
|
||||
\end{matrix} \right)
|
||||
$$
|
||||
:::
|
||||
::::
|
||||
|
||||
It's important to not that a matrix factorization is not unique. *Any* matrix with a given characteristic polynomial can be used as a root of that polynomial. Of course, choosing one root affects the other matrix roots.
|
||||
|
||||
|
||||
### Moving Roots
|
||||
|
||||
All matrices commute with the identity and zero matrices. A less obvious fact is that all of the matrix roots *also* commute with one another. By the Fundamental Theorem of Algebra, [Vieta's formulas](https://en.wikipedia.org/wiki/Vieta%27s_formulas) state:
|
||||
|
||||
$$
|
||||
\hat P(X) =
|
||||
\prod_{[i]_n} (X - \Xi_i) =
|
||||
(X - \Xi_0) (X - \Xi_1)...(X - \Xi_{n-1}) \\
|
||||
= \left\{ \begin{align*} &
|
||||
\phantom{+} X^n \\
|
||||
& - (\Xi_0 + \Xi_1 + ... + \Xi_{n-1}) X^{n-1} \\
|
||||
& + (\Xi_0 \Xi_1+ \Xi_0 \Xi_2 + ... + \Xi_0 \Xi_{n-1} + \Xi_1 \Xi_2 + ... \Xi_{n-2} \Xi_{n-1})X^{n-2} \\
|
||||
& \qquad \vdots \\
|
||||
& + (-1)^n \Xi_0 \Xi_1 \Xi_2...\Xi_n
|
||||
\end{align*} \right.
|
||||
\\
|
||||
= X^n -\sigma_1([\Xi]_n)X^{n-1} + \sigma_2([\Xi]_n)X^{n-2} + ... + (-1)^n \sigma_n([\Xi]_n)
|
||||
$$
|
||||
|
||||
The product range \[*i*\]~*n*~ means that the terms are ordered from 0 to *n* - 1 over the index given. On the bottom line, *σ* are [elementary symmetric polynomials](https://en.wikipedia.org/wiki/Elementary_symmetric_polynomial) and \[*Ξ*\]~*n*~ is the list of root matrices from *Ξ*~*0*~ to Ξ~*n-1*~.
|
||||
|
||||
By factoring the matrix with the roots in a different order, we get another factorization. It suffices to only focus on *σ*~2~, which has all pairwise products.
|
||||
|
||||
$$
|
||||
\pi \in S_n \\ \qquad
|
||||
\pi \circ \hat P(X) = \prod_{\pi ([i]_n)} (X - \Xi_i) \\ ~ \\
|
||||
= X^n
|
||||
- \sigma_1 \left(\pi ([\Xi]_n) \vphantom{^{1}} \right)X^{n-1} +
|
||||
+ \sigma_2 \left(\pi ([\Xi]_n) \vphantom{^{1}} \right)X^{n-2} + ...
|
||||
+ (-1)^n \sigma_n \left(\pi ([\Xi]_n) \vphantom{^{1}} \right)
|
||||
\\ ~ \\
|
||||
\\ ~ \\
|
||||
(0 ~ 1) \circ \hat P(X) = (X - \Xi_{1}) (X - \Xi_0)(X - \Xi_2)...(X - \Xi_{n-1})
|
||||
\\
|
||||
= X^n + ... + \sigma_2(\Xi_1, \Xi_0, \Xi_2, ...,\Xi_{n-1})X^{n-2} + ... \\
|
||||
\\ ~ \\ ~ \\
|
||||
\begin{array}{}
|
||||
e & (0 ~ 1) & (1 ~ 2) & ... & (n-2 ~~ n-1) \\ \hline
|
||||
\textcolor{red}{\Xi_0 \Xi_1} & \textcolor{red}{\Xi_1 \Xi_0} & \Xi_0 \Xi_1 & & \Xi_0 \Xi_1\\
|
||||
\Xi_0 \Xi_2 & \Xi_0 \Xi_2 & \Xi_0 \Xi_2 & & \Xi_0 \Xi_2 \\
|
||||
\Xi_0 \Xi_3 & \Xi_0 \Xi_3 & \Xi_0 \Xi_3 & & \Xi_0 \Xi_3 \\
|
||||
\vdots & \vdots & \vdots & & \vdots \\
|
||||
\Xi_0 \Xi_{n-1} & \Xi_0 \Xi_{n-1} & \Xi_{0} \Xi_{n-1} & & \Xi_{n-1} \Xi_0\\
|
||||
\textcolor{green}{\Xi_1 \Xi_2} & \Xi_1 \Xi_2 & \textcolor{green}{\Xi_2 \Xi_1} & & \Xi_1 \Xi_2 \\
|
||||
\vdots & \vdots & \vdots & & \vdots \\
|
||||
\textcolor{blue}{\Xi_{n-2} \Xi_{n-1}} & \Xi_{n-2} \Xi_{n-1} & \Xi_{n-2} \Xi_{n-1} & & \textcolor{blue}{\Xi_{n-1} \Xi_{n-2}} \\
|
||||
\end{array}
|
||||
$$
|
||||
|
||||
The "[path swaps]()" shown commute only the adjacent elements. By contrast, the permutation (0 2) commutes *Ξ*~0~ past both *Ξ*~1~ and *Ξ*~2~. But since we already know *Ξ*~0~ and *Ξ*~1~ commute by the above list, we learn at this step that *Ξ*~0~ and *Ξ*~2~ commute. This can be repeated until we reach the permutation (0 *n*-1) to prove commutativity between all pairs.
|
||||
|
||||
|
||||
### Matrix Fields?
|
||||
|
||||
The above arguments tell us that if *p* is irreducible, we can take its companion matrix *C*~*p*~ and work with its powers in the same way we would a typical root. Irreducible polynomials cannot have a constant term 0, otherwise *x* could be factored out. The constant term is equal to the determinant of the companion matrix (up to sign), so *C*~*p*~ is invertible. We get commutativity for free, since it follows from associativity that all powers of *C*~*p*~ commute.
|
||||
|
||||
This narrows the ring of matrices to a full-on field. Importantly, it absolves us from the need to symbolically render elements using a power of the root. Instead, they can be adjoined by going from scalars to matrices. We can also find every element in the field arithmetically. Starting with a root, every element, produce new elements taking its matrix powers. Then, scalar-multiply them and add them to elements of the field which are already known. For finite fields, we can repeat this process with the new matrices until we have all *p*^*d*^ elements.
|
||||
|
||||
|
||||
GF(8)
|
||||
-----
|
||||
|
||||
This is all rather abstract, so let's look at an example before we proceed any further. The next smallest field of characteristic 2 is GF(8). We can construct this field from the two irreducible polynomials of degree 3 over GF(2):
|
||||
|
||||
$$
|
||||
q(x) = x^3 + x + 1 = 1011_x \sim {}_2 11 \qquad
|
||||
C_q = \left( \begin{matrix}
|
||||
0 & 1 & 0 \\
|
||||
0 & 0 & 1 \\
|
||||
1 & 1 & 0
|
||||
\end{matrix} \right) \mod 2 \\ ~ \\
|
||||
r(x) = x^3 + x^2 + 1 =1101_x \sim {}_2 13 \qquad
|
||||
C_r = \left( \begin{matrix}
|
||||
0 & 1 & 0 \\
|
||||
0 & 0 & 1 \\
|
||||
1 & 0 & 1
|
||||
\end{matrix} \right) \mod 2 \\
|
||||
$$
|
||||
|
||||
Notice how the bit strings for either of these polynomials is the other, reversed. Arbitrarily, let's work with Cr. The powers of this matrix, mod 2, are as follows:
|
||||
|
||||
$$
|
||||
(C_r)^1 = \left( \begin{matrix}
|
||||
0 & 1 & 0 \\
|
||||
0 & 0 & 1 \\
|
||||
1 & 0 & 1
|
||||
\end{matrix} \right)
|
||||
\quad
|
||||
(C_r)^2 = \left( \begin{matrix}
|
||||
0 & 0 & 1 \\
|
||||
1 & 0 & 1 \\
|
||||
1 & 1 & 1
|
||||
\end{matrix} \right)
|
||||
\quad
|
||||
(C_r)^3 = \left( \begin{matrix}
|
||||
1 & 0 & 1 \\
|
||||
1 & 1 & 1 \\
|
||||
1 & 1 & 0
|
||||
\end{matrix} \right)
|
||||
\\
|
||||
(C_r)^4 = \left( \begin{matrix}
|
||||
1 & 1 & 1 \\
|
||||
1 & 1 & 0 \\
|
||||
0 & 1 & 1
|
||||
\end{matrix} \right) \quad
|
||||
(C_r)^5 = \left( \begin{matrix}
|
||||
1 & 1 & 0 \\
|
||||
0 & 1 & 1 \\
|
||||
1 & 0 & 0
|
||||
\end{matrix} \right) \quad
|
||||
(C_r)^6 = \left( \begin{matrix}
|
||||
0 & 1 & 1 \\
|
||||
1 & 0 & 0 \\
|
||||
0 & 1 & 0
|
||||
\end{matrix} \right)
|
||||
\\
|
||||
(C_r)^7 = \left( \begin{matrix}
|
||||
1 & 0 & 0 \\
|
||||
0 & 1 & 0 \\
|
||||
0 & 0 & 1
|
||||
\end{matrix} \right) = I = (C_r)^0 \quad
|
||||
(C_r)^8 = \left( \begin{matrix}
|
||||
0 & 1 & 0 \\
|
||||
0 & 0 & 1 \\
|
||||
1 & 0 & 1
|
||||
\end{matrix} \right) = C_r
|
||||
$$
|
||||
|
||||
As a reminder, these matrices are taken mod 2, so the elements can only be 0 or 1. The seventh power of *C*~*r*~ is just the identity matrix, meaning that the eighth power is the original matrix. This means that *C*~*r*~ is cyclic of order 7 with respect to self-multiplication mod 2. Along with the zero matrix, this fully characterizes GF(8).
|
||||
|
||||
If we picked *C*~*q*~ instead, we would have gotten different matrices. I'll omit writing them here, but we get the same result: *C*~*q*~ is also cyclic of order 7. Since every nonzero element of the field can be written as a power of the root, the root (and the polynomial) is termed [primitive](https://en.wikipedia.org/wiki/Primitive_polynomial_%28field_theory%29).
|
||||
|
||||
|
||||
### Condensing
|
||||
|
||||
Working with matrices directly, as a human, is very cumbersome. While it makes computation explicit, it makes presentation difficult. One of the things in which we know we should be interested is the characteristic polynomial, since it is central to the definition and behavior of the matrices. Let's focus only on the characteristic polynomial for successive powers of *C*~*r*~
|
||||
|
||||
$$
|
||||
C_r = \left( \begin{matrix}
|
||||
0 & 1 & 0 \\
|
||||
0 & 0 & 1 \\
|
||||
1 & 0 & 1
|
||||
\end{matrix} \right) \mod 2 \\ ~ \\
|
||||
\begin{array}{}
|
||||
\text{charpoly}((C_r)^1) &=& \color{blue} x^3 + x^2 + 1 &=& \color{blue} 1101_x \sim {}_2 13 = r
|
||||
\\
|
||||
\text{charpoly}((C_r)^2) &=& \color{blue} x^3 + x^2 + 1 &=& \color{blue} 1101_x \sim {}_2 13 = r
|
||||
\\
|
||||
\text{charpoly}((C_r)^3) &=& \color{red} x^3 + x + 1 &=& \color{red} 1011_x \sim {}_2 11 = q
|
||||
\\
|
||||
\text{charpoly}((C_r)^4) &=& \color{blue} x^3 + x^2 + 1 &=& \color{blue} 1101_x \sim {}_2 13 = r
|
||||
\\
|
||||
\text{charpoly}((C_r)^5) &=& \color{red} x^3 + x + 1 &=& \color{red} 1011_x \sim {}_2 11 = q
|
||||
\\
|
||||
\text{charpoly}((C_r)^6) &=& \color{red} x^3 + x + 1 &=& \color{red} 1011_x \sim {}_2 11 = q
|
||||
\\
|
||||
\text{charpoly}((C_r)^7) &=& x^3 + x^2 + x + 1 &=& 1111_x \sim {}_2 15 = (x+1)^3
|
||||
\end{array}
|
||||
$$
|
||||
|
||||
Somehow, even though we start with one characteristic polynomial, the other manages to work its way in here. Both polynomials are of degree 3 and have 3 matrix roots (distinguished in red and blue).
|
||||
|
||||
If we chose to use *C*~*q*~, we'd actually get the same sequence backwards (starting with ~2~11). It's beneficial to remember that 6, 5, and 3 can also be written as 7 - 1, 7 - 2, and 7 - 4. This makes it clear that the powers of 2 (the field characteristic) less than the 8 (the order of the field) play a role with respect to both the initial and terminal items.
|
||||
|
||||
|
||||
### Factoring
|
||||
|
||||
Intuitively, you may try using the roots to factor the matrix into powers of *C*~*r*~. This turns out to work:
|
||||
|
||||
$$
|
||||
\hat R(X) \overset?= (X - C_r)(X - (C_r)^2)(X - (C_r)^4) \\
|
||||
\hat Q(X) \overset?= (X - (C_r)^3)(X - (C_r)^5)(X - (C_r)^6) \\ ~ \\
|
||||
\textcolor{red}{ \sigma_1([(C_r)^i]_{i \in [1,2,4]}) } = C_r + (C_r)^2 + (C_r)^4 = \textcolor{red}I \\
|
||||
\textcolor{brown}{ \sigma_1([(C_r)^i]_{i \in [3,5,6]}) } = (C_r)^3 + (C_r)^5 + (C_r)^6 = \textcolor{brown}0 \\ ~ \\
|
||||
\begin{align*}
|
||||
\color{blue} \sigma_2([(C_r)^i]_{i \in [1,2,4]}) &= (C_r)(C_r)^2 + (C_r)(C_r)^4 + (C_r)^2(C_r)^4 \\
|
||||
&= (C_r)^3 + (C_r)^5 + (C_r)^6 = \color{blue}0 \\
|
||||
\color{cyan} \sigma_2([(C_r)^i]_{i \in [3,5,6]}) &= (C_r)^3(C_r)^5 + (C_r)^3(C_r)^6 + (C_r)^5(C_r)^6 \\
|
||||
&= (C_r)^8 + (C_r)^9 + (C_r)^{11} \\
|
||||
&= (C_r)^1 + (C_r)^2 + (C_r)^4 = \color{cyan} I \\
|
||||
\end{align*}
|
||||
\\ ~ \\
|
||||
\textcolor{green}{ \sigma_3([(C_r)^i]_{i \in [1,2,4]}) } = (C_r)(C_r)^2(C_r)^4 = \textcolor{green}I \\
|
||||
\textcolor{lightgreen}{ \sigma_3([(C_r)^i]_{i \in [3,5,6]}) }= (C_r)^3(C_r)^5(C_r)^6 = \textcolor{lightgreen}I
|
||||
\\ ~ \\
|
||||
\hat R(X) = X^3 + \textcolor{red}IX^2 + \textcolor{blue}0X + \textcolor{green}I \\
|
||||
\hat Q(X) = X^3 + \textcolor{brown}0X^2 + \textcolor{cyan}IX + \textcolor{lightgreen}I
|
||||
$$
|
||||
|
||||
We could have factored our polynomials differently if we used *C*~*q*~ instead. However, the effect of splitting both polynomials into monomial factors is the same.
|
||||
|
||||
|
||||
GF(16)
|
||||
------
|
||||
|
||||
GF(8) is simple to study, but too simple to study the sequence of characteristic polynomials alone. Let's widen our scope to GF(16). There are three irreducible polynomials of degree 3 over GF(2).
|
||||
|
||||
$$
|
||||
s(x) = x^4 + x + 1 = 10011_x \sim {}_2 19 \quad
|
||||
C_s = \left( \begin{matrix}
|
||||
0 & 1 & 0 & 0 \\
|
||||
0 & 0 & 1 & 0 \\
|
||||
0 & 0 & 0 & 1 \\
|
||||
1 & 1 & 0 & 0
|
||||
\end{matrix} \right) \mod 2
|
||||
\\
|
||||
t(x) = x^4 + x^3 + 1 = 11001_x \sim {}_2 25 \quad
|
||||
C_t = \left( \begin{matrix}
|
||||
0 & 1 & 0 & 0 \\
|
||||
0 & 0 & 1 & 0 \\
|
||||
0 & 0 & 0 & 1 \\
|
||||
1 & 0 & 0 & 1
|
||||
\end{matrix} \right) \mod 2
|
||||
\\
|
||||
u(x) = x^4 + x^3 + x^2 + x + 1 = 11111_x \sim {}_2 31 \quad
|
||||
C_u = \left( \begin{matrix}
|
||||
0 & 1 & 0 & 0 \\
|
||||
0 & 0 & 1 & 0 \\
|
||||
0 & 0 & 0 & 1 \\
|
||||
1 & 1 & 1 & 1
|
||||
\end{matrix} \right) \mod 2
|
||||
$$
|
||||
|
||||
Again, *s* and *t* form a pair under the reversal of their bit strings, while *u* is palindromic. Both *C*~*s*~ and *C*~*t*~ are cyclic of order 15, so *s* and *t* are primitive polynomials. Using *s* = ~2~19 to generate the field, the powers of its companion matrix *C*~*s*~ have the following characteristic polynomials:
|
||||
|
||||
```{python}
|
||||
#| echo: false
|
||||
|
||||
from IPython.display import Markdown
|
||||
from tabulate import tabulate
|
||||
|
||||
charpolys = [19, 19, 31, 19, 21, 31, 25, 19, 31, 21, 25, 31, 25, 25, 17]
|
||||
charpolyformat = lambda x: f"<span class=\"{'blue' if x == 19 else 'red' if x == 25 else ''}\">~2~{x}</span>"
|
||||
|
||||
Markdown(tabulate(
|
||||
[[
|
||||
"charpoly((*C*~*s*~)^*m*^)",
|
||||
*[charpolyformat(charpoly) for charpoly in charpolys]
|
||||
]],
|
||||
headers=["*m*", *[i + 1 for i in range(15)]],
|
||||
))
|
||||
```
|
||||
|
||||
The polynomial ~2~19 occurs at positions 1, 2, 4, and 8. These are obviously powers of 2, the characteristic of the field. Similarly, the polynomial *t* = ~2~25 occurs at positions 14 (= 15 - 1), 13 (= 15 - 2), 11 (= 15 - 4), and 7 (= 15 - 8). We'd get the same sequence backwards if we used *C*~*t*~ instead, just like in GF(8).
|
||||
|
||||
|
||||
### Non-primitive
|
||||
|
||||
The polynomial *u* = ~2~31 occurs at positions 3, 6, 9, and 12 -- multiples of 3, which is a factor of *15*. It follows that the roots of *u* are cyclic of order 5, so this polynomial is irreducible, but *not* primitive.
|
||||
|
||||
Naturally, $\hat U(X)$ can be factored as powers of (*C*~*s*~)^3^. We can also factor it more naively as powers of *C*~*u*~. Either way, we get the same sequence.
|
||||
|
||||
:::: {layout-ncol = "2"}
|
||||
::: {}
|
||||
```{python}
|
||||
#| echo: false
|
||||
upowers = [31, 31, 31, 31, 17]
|
||||
|
||||
Markdown(tabulate(
|
||||
[[
|
||||
"charpoly((*C*~*s*~)^*3m*^)",
|
||||
*[f"~2~{charpoly}" for charpoly in charpolys[2::3]]
|
||||
], [
|
||||
"charpoly((*C*~*u*~)^*m*^)",
|
||||
*[f"~2~{upower}" for upower in upowers]
|
||||
]],
|
||||
headers=["*m*", *[i + 1 for i in range(5)]],
|
||||
))
|
||||
```
|
||||
|
||||
Both of the matrices in column 5 happen to be the identity matrix. It follows that this root is only cyclic of order 5.
|
||||
|
||||
The polynomials ~2~19 and ~2~25 are reversals of one another and the sequences that their companion matrices generate end one with another -- in this regard, they are dual. However, ~2~31 = 11111~x~ is a palindrome and its sequence ends where it begins, so it is self-dual.
|
||||
:::
|
||||
|
||||
::: {width = "33%"}
|
||||
$$
|
||||
(C_u)^1 =\left( \begin{matrix}
|
||||
0 & 1 & 0 & 0 \\
|
||||
0 & 0 & 1 & 0 \\
|
||||
0 & 0 & 0 & 1 \\
|
||||
1 & 1 & 1 & 1
|
||||
\end{matrix} \right)
|
||||
\\ ~ \\
|
||||
(C_u)^2 =\left( \begin{matrix}
|
||||
0 & 0 & 1 & 0 \\
|
||||
0 & 0 & 0 & 1 \\
|
||||
1 & 1 & 1 & 1 \\
|
||||
1 & 0 & 0 & 0
|
||||
\end{matrix} \right)
|
||||
\\ ~ \\
|
||||
(C_u)^3 =\left( \begin{matrix}
|
||||
0 & 0 & 0 & 1 \\
|
||||
1 & 1 & 1 & 1 \\
|
||||
1 & 0 & 0 & 0 \\
|
||||
0 & 1 & 0 & 0
|
||||
\end{matrix} \right)
|
||||
\\ ~ \\
|
||||
(C_u)^4 =\left( \begin{matrix}
|
||||
1 & 1 & 1 & 1 \\
|
||||
1 & 0 & 0 & 0 \\
|
||||
0 & 1 & 0 & 0 \\
|
||||
0 & 0 & 1 & 0 \\
|
||||
\end{matrix} \right)
|
||||
\\ ~ \\
|
||||
(C_u)^5 =\left( \begin{matrix}
|
||||
1 & 0 & 0 & 0 \\
|
||||
0 & 1 & 0 & 0 \\
|
||||
0 & 0 & 1 & 0 \\
|
||||
0 & 0 & 0 & 1 \\
|
||||
\end{matrix} \right) \\
|
||||
= I = (C_u)^0
|
||||
$$
|
||||
:::
|
||||
::::
|
||||
|
||||
|
||||
### Non-irreducible
|
||||
|
||||
In addition to the three irreducibles, a fourth polynomial, ~2~21 = 10101~x~, also appears in the sequence on entries 5 and 10 -- multiples of 5, which is also a factor of 15. Like ~2~31, this polynomial is palindromic. This polynomial is *not* irreducible mod 2, and factors as:
|
||||
|
||||
$$
|
||||
{}_2 21 \sim 10101_x = x^4 + x^2 + 1 = (x^2 + x + 1)^2 \mod 2 \\ ~ \\
|
||||
(X - (C_s)^5)(X - (C_s)^{10}) = X^2 + ((C_s)^5 + (C_s)^{10})X + (C_s)^{15} \\
|
||||
= X^2 + IX + I
|
||||
$$
|
||||
|
||||
Just like how the fields we construct are powers of a prime, this extra element is a power of a smaller irreducible. This is unexpected, but perhaps not surprising.
|
||||
|
||||
Something a little more surprising is that the companion matrix is cyclic of degree *6*, rather than of degree 3 like the matrices encountered in GF(8). The powers of its companion matrix are:
|
||||
|
||||
<!--
|
||||
::: {}
|
||||
| *m* | 1 | 2 | 3 | 4 | 5 | 6 |
|
||||
|--------------------------|-------|-------|-------|-------|-------|-------|
|
||||
| charpoly((*C*~*s*~)^5m^) | ~2~21 | ~2~21 | ~2~17 ((*C*~*s*~)^15^ is the identity matrix) | ~2~21 | ~2~21 | ~2~17 (identity) |
|
||||
| charpoly((*C*~*21*~)^m^) | <span class="red">~2~21</span> | <span class="blue">~2~21</span> | ~2~17 ((*C*~*21*~)^3^ is the identity matrix) | <span class="blue">~2~21</span> | <span class="red">~2~21</span> | ~2~17 (identity) |
|
||||
:::
|
||||
-->
|
||||
|
||||
We can think of the repeated sequence as ensuring that there are enough roots of ~2~21. The Fundamental Theorem of Algebra states that there must be 4 roots. For *numbers*, we'd allow duplicate roots with multiplicities greater than 1, but the matrix roots are all distinct.
|
||||
|
||||
Basic group theory tells us that as a cyclic group, the matrix's first and fifth powers (in red) are pairs of inverses. The constant term of the characteristic polynomial is the product of all four roots and, as a polynomial over matrices, must be some nonzero multiple of the identity matrix. Since the red roots are a pair of inverses, the blue roots are, too.
|
||||
|
||||
|
||||
GF(32)
|
||||
------
|
||||
|
||||
GF(32) turns out to be special. There are six irreducible polynomials of degree 5 over GF(2). Picking one of them at random, ~2~37, and looking at the polynomial sequence it generates, we see:
|
||||
|
||||
```{python}
|
||||
#| echo: false
|
||||
gf32powers = [
|
||||
37, 37, 61, 37, 55, 61, 47, 37, 55, 55, 59, 61, 59, 47, 41,
|
||||
37, 61, 55, 47, 55, 59, 59, 41, 61, 47, 59, 41, 47, 41, 41, 51,
|
||||
]
|
||||
gf32colors = {
|
||||
37: "red",
|
||||
61: "blue",
|
||||
55: "yellow",
|
||||
47: "orange",
|
||||
59: "purple",
|
||||
41: "green",
|
||||
}
|
||||
gf32format = lambda x: f"<span class=\"{gf32colors.get(x, '')}\">~2~{x}</span>"
|
||||
|
||||
Markdown(tabulate(
|
||||
[[
|
||||
"charpoly((*C*~*u*~)^*m*^)",
|
||||
"-",
|
||||
*[gf32format(gf32power) for gf32power in gf32powers[:15]]
|
||||
]],
|
||||
headers=["*m*", *[i for i in range(16 + 1)]],
|
||||
))
|
||||
```
|
||||
```{python}
|
||||
#| echo: false
|
||||
Markdown(tabulate(
|
||||
[[
|
||||
"charpoly((*C*~*u*~)^*m*^)",
|
||||
*[gf32format(gf32power) for gf32power in gf32powers[:-17:-1]]
|
||||
]],
|
||||
headers=["*m*", *[i for i in reversed(range(16, 32))]],
|
||||
))
|
||||
```
|
||||
|
||||
31 is prime, so we don't have any sub-patterns that appear on multiples of factors. In fact, all six irreducible polynomials are present in this table. The pairs in complementary colors form pairs under reversing the polynomials:
|
||||
<span class="red">~2~37</span> and <span class="green">~2~41</span>,
|
||||
<span class="blue">~2~61</span> and <span class="orange">~2~47</span>,
|
||||
and <span class="yellow">~2~55</span> and <span class="purple">~2~59</span>.
|
||||
|
||||
Since their roots have order 31, these polynomials are actually the distinct factors of *x*^31^ - 1 mod 2:
|
||||
|
||||
$$
|
||||
x^{31} -1 = (x-1)(x^{30} +x^{29} + ... + x + 1) \\
|
||||
(x^{30} +x^{29} + ... + x + 1) = \left\{
|
||||
\begin{align*}
|
||||
&\phantom\cdot (x^5 + x^2 + 1) &\sim \quad {}_2 37 \\
|
||||
&\cdot (x^5 + x^3 + 1) &\sim \quad {}_2 41 \\
|
||||
&\cdot (x^5 + x^4 + x^3 + x^2 + 1) &\sim \quad {}_2 61 \\
|
||||
&\cdot (x^5 + x^3 + x^2 + x + 1) &\sim \quad {}_2 47 \\
|
||||
&\cdot (x^5 + x^4 + x^2 + x + 1) &\sim \quad {}_2 55 \\
|
||||
&\cdot (x^5 + x^4 + x^3 + x + 1) &\sim \quad {}_2 59
|
||||
\end{align*}
|
||||
\right.
|
||||
$$
|
||||
|
||||
This is a feature special to fields of characteristic 2. 2 is the only prime number whose powers can be one more than another prime, since all other prime powers are one more than even numbers. 31 is a [Mersenne prime](https://en.wikipedia.org/wiki/Mersenne_prime), so all integers less than 31 are coprime to it. Thus, there is no room for the "extra" entries we observed in GF(16) which that occurred on factors of 15 = 16 - 1. No entry can be irreducible (but not primitive) or the power of an irreducible of lower degree. In other words, *only primitive polynomials exist of degree* p *if 2^p^ - 1 is a Mersenne prime*.
|
||||
|
||||
|
||||
### Counting Irreducibles
|
||||
|
||||
The remark about coprimes to 31 may inspire you to think of the [totient function](https://en.wikipedia.org/wiki/Euler%27s_totient_function). We have *φ*(2^5^ - 1) = 30 = 5⋅6, where 5 is the degree and 6 is the number of primitive polynomials. We also have *φ*(24 - 1) = 8 = 4⋅2 and *φ*(23 - 1) = 6 = 3⋅2. In general, it is true that there are *φ*(*pm* - 1) / *m* primitive polynomials of degree m over GF(p).
|
||||
|
||||
|
||||
Polynomial Reversal
|
||||
-------------------
|
||||
|
||||
We've only been looking at fields of characteristic 2, where the meaning of "palindrome" and "reversed polynomial" is intuitive. Let's look at an example over characteristic 3. One primitive of degree 2 is ~3~14, which gives rise to the following sequence over GF(9):
|
||||
|
||||
```{python}
|
||||
#| echo: false
|
||||
gf9powers = [14, 10, 14, 16, 17, 10, 17, 13]
|
||||
gf9format = lambda x: f"<span class=\"{'red' if x == 14 else 'blue' if x == 17 else ''}\">~3~{x}</span>"
|
||||
|
||||
Markdown(tabulate(
|
||||
[[
|
||||
"charpoly((*C*~*14*~)^*m*^)",
|
||||
*[gf9format(gf9power) for gf9power in gf9powers]
|
||||
]],
|
||||
headers=["*m*", *[i + 1 for i in range(8)]],
|
||||
))
|
||||
```
|
||||
|
||||
The table suggests that ~3~14 = 112~x~ = x^2^ + x + 2 and ~3~17 = 122~x~ = x^2^ + 2x + 2 are reversals of one another. More naturally, you'd think that 112~x~ reversed is 211~x~. But remember that we prefer to work with monic polynomials. By multiplying the polynomial by the multiplicative inverse of the leading coefficient (in this case, 2), we get 422~x~ ≡ 122~x~ mod 3. This is a rule that applies over larger characteristics in general.
|
||||
|
||||
Note that ~3~16 is 121~x~ = x^2^ + 2x + 1 and ~3~13 = 111~x~ = x^2^ + x + 1 = x^2^ - 2x + 1, both of which have factors over GF(3).
|
||||
|
||||
|
||||
Power Graphs
|
||||
------------
|
||||
|
||||
We can study the interplay of primitives, irreducibles, and their powers by converting our sequences into (directed) graphs. Each node in the graph represents a characteristic polynomial that appears over the field; call the one under consideration *a*. If the sequence of polynomials generated by *C*~*a*~ contains contains another polynomial *b*, then there is an edge from *a* to *b*.
|
||||
|
||||
We can do this for every GF(*p*^*m*^). Let's start with the first few fields of characteristic 2. We get the following graphs:
|
||||
|
||||
![]()
|
||||
|
||||
All nodes connect to the node corresponding to the identity matrix, since all roots are cyclic. Also, since all primitive polynomials are interchangeable with one another, they are all interconnected and form a [complete](https://en.wikipedia.org/wiki/Complete_graph) clique. This means that, excluding the identity node, the graphs for fields of order one more than a Mersenne prime are just the complete graphs.
|
||||
|
||||
Since all of the graphs share the identity node as a feature -- a node with incoming edges from every other node -- its convenient to omit it. Here are a few more of these graphs after doing so, over fields of other characteristics:
|
||||
|
||||
:::: {}
|
||||
::: {}
|
||||
![]()
|
||||
GF(9)
|
||||
:::
|
||||
|
||||
::: {}
|
||||
![]()
|
||||
GF(25)
|
||||
:::
|
||||
|
||||
::: {}
|
||||
![]()
|
||||
GF(49)
|
||||
:::
|
||||
|
||||
::: {}
|
||||
![]()
|
||||
GF(121)
|
||||
:::
|
||||
|
||||
::: {}
|
||||
![]()
|
||||
GF(27)
|
||||
:::
|
||||
|
||||
::: {}
|
||||
![]()
|
||||
GF(125)
|
||||
:::
|
||||
|
||||
::: {}
|
||||
![]()
|
||||
GF(343)
|
||||
:::
|
||||
::::
|
||||
|
||||
|
||||
### Spectra
|
||||
|
||||
Again, since visually interpreting graphs is difficult, we can study an invariant. From these graphs of polynomials, we can compute *their* characteristic polynomials (to add another layer to this algebraic cake) and look at their spectra.
|
||||
|
||||
It turns out that a removing a fully-connected node (like the one for the identity matrix) has a simple effect on characteristic polynomial of a graph: it just removes a factor of *x*. Here are a few of the (identity-reduced) spectra, arranged into a table.
|
||||
|
||||
| Characteristic | Order | Spectrum | Remark
|
||||
| ---------------|-------|--------------------------------------|----------
|
||||
| 2 | 4 | 0 |
|
||||
| | 8 | -1, 1 | Mersenne
|
||||
| | 16 | 0^2^, -1, 1 |
|
||||
| | 32 | -1^5^, 5 | Mersenne
|
||||
| 3 | 9 | 0^2^, -1, 1 |
|
||||
| | 27 | 0, -1^6^, 3^2^ | Pseudo-Mersenne?
|
||||
| 5 | 25 | 0^3^, -1^6^, 1^3^, 3 |
|
||||
| | 125 | 0, -1^38^, 1, 9^2^, 19 | Prime power in spectrum
|
||||
| 7 | 49 | 0^2, -1^17^, 1^4^, 3^2^, 7 |
|
||||
| | 343 | 0, -1^106^, 1^4^, 5^2^, 11^2^, 35^2^ | Composite in spectrum
|
||||
| 11 | 121 | 0^4^, -1^49^, 1^2^, 3^6^, 7^2^, 15 | Composite in spectrum
|
||||
|
||||
Incredibly, all spectra shown are composed exclusively of integers, and thus, each of these graphs are integral graphs. Moreover, it does not appear that any integer sequences that one may try extracting from this table (for example, the multiplicity of -1) can be found in the [Online Encyclopedia of Integer Sequences](https://oeis.org/).
|
||||
|
||||
From what I was able to tell, the following subgraphs were *also* integral over the range I tested:
|
||||
|
||||
- the induced subgraph of vertices corresponding to non-primitives
|
||||
- the complement of the previous graph with respect to the whole graph
|
||||
- the induced subgraph of vertices corresponding only to irreducibles
|
||||
|
||||
Unfortunately, proving any such relationship is out of the scope of this post (and my abilities).
|
||||
|
||||
|
||||
Closing
|
||||
-------
|
||||
|
||||
This concludes the first foray into using matrices as elements of prime power fields. It is a subject which, using the tools of linear algebra, makes certain aspects of field theory more palatable and constructs some objects with fairly interesting properties.
|
||||
|
||||
One of the most intriguing parts to me is the sequence of polynomials generated by a companion matrix. Though I haven't proven it, I suspect that it suffices to study only the sequence generated by a primitive polynomial. It seems to be possible to get the non-primitive sequences by looking at the subsequences where the indices are multiples of a factor of the length of the sequence. But this means that the entire story about polynomials and finite fields can be foregone entirely, and the problem instead becomes one of number theory.
|
||||
|
||||
The [next post]() will focus on an "application" of matrix roots to other areas of abstract algebra. Diagrams made with Geogebra and NetworkX (GraphViz).
|
||||
900
finite/3/index.qmd
Normal file
@ -0,0 +1,900 @@
|
||||
---
|
||||
format:
|
||||
html:
|
||||
html-math-method: katex
|
||||
jupyter: python3
|
||||
---
|
||||
|
||||
<style>
|
||||
.red {
|
||||
color: red;
|
||||
}
|
||||
.green {
|
||||
color: green;
|
||||
}
|
||||
.blue {
|
||||
color: blue;
|
||||
}
|
||||
.orange {
|
||||
color: orange;
|
||||
}
|
||||
.yellow {
|
||||
color: yellow;
|
||||
}
|
||||
.purple {
|
||||
color: purple;
|
||||
}
|
||||
</style>
|
||||
|
||||
|
||||
Exploring Finite Fields, Part 3: Roll a d20
|
||||
===========================================
|
||||
|
||||
In the [previous post](), we focused on constructing finite fields using *n*×*n* matrices. These matrices came from from primitive polynomials of degree *n* over GF(*p*), and could be used to do explicit arithmetic over GF(*p*^*n*^). In this post, we'll look at a way to apply this in describing certain groups.
|
||||
|
||||
|
||||
Weakening the Field
|
||||
-------------------
|
||||
|
||||
Recall the way we defined GF(4) in the first post. We took the irreducible polynomial *p*(*x*) = *x*^2^ + *x* + 1, called its root *α*, and created addition and multiplication tables spanning the four elements. After the second post, we can do this more cleverly by mapping *α* to the companion matrix *C*~*p*~ over GF(2).
|
||||
|
||||
$$
|
||||
f : \mathbb{F_4} \longrightarrow \mathbb{F}_2 {}^{2 \times 2}
|
||||
\\ ~ \\
|
||||
0 \mapsto \left(\begin{matrix}
|
||||
0 & 0 \\ 0 & 0
|
||||
\end{matrix}\right)
|
||||
\quad
|
||||
1 \mapsto \left(\begin{matrix}
|
||||
1 & 0 \\ 0 & 1
|
||||
\end{matrix}\right) = I
|
||||
\quad
|
||||
\alpha \mapsto \left(\begin{matrix}
|
||||
0 & 1 \\ 1 & 1
|
||||
\end{matrix}\right) = C_p
|
||||
\\ ~ \\
|
||||
\textcolor{red}{\alpha} + \textcolor{blue}{1} = \alpha^2 \mapsto
|
||||
\left(\begin{matrix}
|
||||
1 & 1 \\ 1 & 0
|
||||
\end{matrix}\right) =
|
||||
\textcolor{red} {
|
||||
\left(\begin{matrix}
|
||||
0 & 1 \\ 1 & 1
|
||||
\end{matrix}\right)
|
||||
}
|
||||
+
|
||||
\textcolor{blue}{
|
||||
\left(\begin{matrix}
|
||||
1 & 0 \\ 0 & 1
|
||||
\end{matrix}\right)
|
||||
}\mod 2
|
||||
$$
|
||||
|
||||
In the images of *f*, the zero matrix has determinant 0 and all other elements have determinant 1. Therefore, the product of any two nonzero matrices always has determinant 1, and a nonzero determinant means the matrix is invertible. This means that the non-zero elements of the field form their own group with respect to multiplication. Here, they form a cyclic group of order 3, since *C*~*p*~^3^ = *I* mod 2. This is also true using symbols, and we've already agreed that *α*^3^ = 1.
|
||||
|
||||
|
||||
### Other Matrices
|
||||
|
||||
Essentially, this means we can extend a polynomial into new structures by evaluating it in certain ways:
|
||||
|
||||
However, there are more 2×2 matrices over GF(2) than just these. There are two possible values in four locations, so there are 24 = 16 matrices, or 12 more than we've identified.
|
||||
|
||||
$$
|
||||
\begin{array}{c|c}
|
||||
\#\{a_{ij} = 1\} & \det = 0 & \det = 1 \\
|
||||
\hline
|
||||
1 &
|
||||
\left(\begin{matrix}
|
||||
0 & 1 \\ 0 & 0
|
||||
\end{matrix}\right)
|
||||
\quad
|
||||
\left(\begin{matrix}
|
||||
1 & 0 \\ 0 & 0
|
||||
\end{matrix}\right)
|
||||
\quad
|
||||
\left(\begin{matrix}
|
||||
0 & 0 \\ 0 & 1
|
||||
\end{matrix}\right)
|
||||
\quad
|
||||
\left(\begin{matrix}
|
||||
0 & 0 \\ 1 & 0
|
||||
\end{matrix}\right)
|
||||
\\
|
||||
2 &
|
||||
\left(\begin{matrix}
|
||||
1 & 1 \\ 0 & 0
|
||||
\end{matrix}\right)
|
||||
\quad
|
||||
\left(\begin{matrix}
|
||||
0 & 0 \\ 1 & 1
|
||||
\end{matrix}\right)
|
||||
\quad
|
||||
\left(\begin{matrix}
|
||||
0 & 1 \\ 0 & 1
|
||||
\end{matrix}\right)
|
||||
\quad
|
||||
\left(\begin{matrix}
|
||||
1 & 1 \\ 0 & 0
|
||||
\end{matrix}\right)
|
||||
& \textcolor{red}{
|
||||
\left(\begin{matrix}
|
||||
0 & 1 \\ 1 & 0
|
||||
\end{matrix}\right)
|
||||
}
|
||||
\\
|
||||
3 & &
|
||||
\textcolor{red}{
|
||||
\left(\begin{matrix}
|
||||
1 & 1 \\ 0 & 1
|
||||
\end{matrix}\right)
|
||||
}
|
||||
\quad
|
||||
\textcolor{red}{
|
||||
\left(\begin{matrix}
|
||||
1 & 0 \\ 1 & 1
|
||||
\end{matrix}\right)
|
||||
}
|
||||
\\
|
||||
4 &
|
||||
\left(\begin{matrix}
|
||||
1 & 1 \\ 1 & 1
|
||||
\end{matrix}\right)
|
||||
\end{array}
|
||||
$$
|
||||
|
||||
The matrices in the right column (in red) have determinant 1, which means they can *also* multiply with our field-like elements without producing a singular matrix. This forms a larger group, of which our field's multiplication group is a subgroup. However, it is *not* commutative, since matrix multiplication is not commutative in general.
|
||||
|
||||
The group of all six matrices of determinant 1 is called the [*general linear group*](https://en.wikipedia.org/wiki/General_linear_group) of degree 2 over GF(2), written GL(2, 2). We can sort the elements into classes by their order, or the number of times we have to multiply them before getting to the identity matrix (mod 2):
|
||||
|
||||
$$
|
||||
\begin{array}{}
|
||||
\text{Order 1} & \text{Order 2} & \text{Order 3} \\
|
||||
\hline
|
||||
\left(\begin{matrix}
|
||||
1 & 0 \\
|
||||
0 & 1
|
||||
\end{matrix}\right)
|
||||
&
|
||||
\begin{align*}
|
||||
\left(\begin{matrix}
|
||||
1 & 1 \\
|
||||
0 & 1
|
||||
\end{matrix}\right)
|
||||
\\
|
||||
\left(\begin{matrix}
|
||||
1 & 0 \\
|
||||
1 & 1
|
||||
\end{matrix}\right)
|
||||
\\
|
||||
\left(\begin{matrix}
|
||||
0 & 1 \\
|
||||
1 & 0
|
||||
\end{matrix}\right)
|
||||
\end{align*}
|
||||
&
|
||||
\begin{align*}
|
||||
\left(\begin{matrix}
|
||||
0 & 1 \\
|
||||
1 & 1
|
||||
\end{matrix}\right)
|
||||
\\
|
||||
\left(\begin{matrix}
|
||||
1 & 1 \\
|
||||
1 & 0
|
||||
\end{matrix}\right)
|
||||
\end{align*}
|
||||
\end{array}
|
||||
$$
|
||||
|
||||
If you've studied enough group theory, you know that there are two groups of order 6: the cyclic group of order 6, *C*~6~, and the symmetric group on three elements, *S*~3~. Since the former group has order-6 elements, this group must be isomorphic to the latter. Since the group is small, it's not too difficult to construct an isomorphism between the two. Writing the elements of *S*~3~ in [cycle notation](), we have:
|
||||
|
||||
$$
|
||||
e \mapsto \left(\begin{matrix}
|
||||
1 & 0 \\
|
||||
0 & 1
|
||||
\end{matrix}\right)
|
||||
\\ ~ \\
|
||||
(1 ~ 2) \mapsto \left(\begin{matrix}
|
||||
1 & 1 \\
|
||||
0 & 1
|
||||
\end{matrix}\right)
|
||||
\qquad
|
||||
(1 ~ 3) \mapsto \left(\begin{matrix}
|
||||
1 & 0 \\
|
||||
1 & 1
|
||||
\end{matrix}\right)
|
||||
\qquad
|
||||
(2 ~ 3) \mapsto \left(\begin{matrix}
|
||||
0 & 1 \\
|
||||
1 & 0
|
||||
\end{matrix}\right)
|
||||
\\ ~ \\
|
||||
(1 ~ 2 ~ 3) \mapsto \left(\begin{matrix}
|
||||
0 & 1 \\
|
||||
1 & 1
|
||||
\end{matrix}\right)
|
||||
\qquad
|
||||
(3 ~ 2 ~ 1) \mapsto \left(\begin{matrix}
|
||||
1 & 1 \\
|
||||
1 & 0
|
||||
\end{matrix}\right)
|
||||
$$
|
||||
|
||||
|
||||
Bigger Linear Groups
|
||||
--------------------
|
||||
|
||||
Of course, there is nothing special about GF(2) in this definition. For any field *K*, the general linear group GL(*n*, *K*) is composed of invertible *n*×*n* matrices under matrix multiplication.
|
||||
|
||||
For fields other than GF(2), a matrix can have a determinant other than 1. Since the determinant is multiplicative, the product of two determinant 1 matrices also has determinant 1. Therefore, the general linear group has a subgroup, the [*special linear group*](https://en.wikipedia.org/wiki/Special_linear_group) SL(*n*, *K*), consisting of these matrices.
|
||||
|
||||
|
||||
<details>
|
||||
<summary>
|
||||
Haskell implementation of GL and SL for prime fields
|
||||
</summary>
|
||||
This implementation will be based on the `Matrix` type from the first post. Assume we have already defined matrix multiplication and addition.
|
||||
|
||||
```{.haskell}
|
||||
data Matrix a = Mat { unMat :: Array (Int, Int) a }
|
||||
|
||||
-- instance Functor Matrix
|
||||
-- instance Num a => Num (Matrix a)
|
||||
|
||||
-- Partition a list into lists of length n
|
||||
reshape :: Int -> [a] -> [[a]]
|
||||
reshape n = unfoldr (reshape' n) where
|
||||
reshape' n x = if null x then Nothing else Just $ splitAt n x
|
||||
|
||||
-- Convert list of lists to Matrix
|
||||
-- Abuses listArray working across rows, then columns
|
||||
toMatrix :: [[a]] -> Matrix a
|
||||
toMatrix l = Mat $ listArray ((0,0),(n-1,m-1)) $ concat l where
|
||||
m = length $ head l
|
||||
n = length l
|
||||
|
||||
-- Convert Matrix to list of lists
|
||||
fromMatrix :: Matrix a -> [[a]]
|
||||
fromMatrix (Mat m) = let (_,(_,n)) = bounds m in reshape (n+1) $ elems m
|
||||
```
|
||||
|
||||
With helper functions out of the way, we can move on to generating all matrices (mod *n*) before filtering for matrices with nonzero determinant (in the case of GL) and determinant 1 (in the case of SL).
|
||||
|
||||
```{.haskell}
|
||||
allMatrices :: Int -> Int -> Matrix Int
|
||||
-- All m x m matrices (mod n)
|
||||
allMatrices m n = map toMatrix $ sequence $ replicate m vectors where
|
||||
-- Construct all vectors mod n using base-n expansions and padding
|
||||
vectors = [pad $ coeffs $ asPoly n l | l <- [1..n^m-1]]
|
||||
-- Pad xs to length m with zero
|
||||
pad xs = xs ++ replicate 0 (m - length xs)
|
||||
|
||||
-- All matrices, but paired with their determinants
|
||||
matsWithDets :: Int -> Int -> [(Matrix Int, Int)]
|
||||
matsWithDets m n = map (\x -> (x, determinant x `mod` n)) $ allMatrices m n
|
||||
|
||||
-- Nonzero determinants
|
||||
mGL m n = map fst $ filter (\(x,d) -> d /= 0) $ matsWithDets' m n
|
||||
-- Determinant is 1
|
||||
mSL m n = map fst $ filter (\(x,d) -> d == 1) $ matsWithDets' m n
|
||||
```
|
||||
</details>
|
||||
|
||||
|
||||
### Projectivity
|
||||
|
||||
Another important matrix group is the [*projective general linear group*](https://en.wikipedia.org/wiki/Projective_linear_group), PGL(*n*, *K*). In this group, two matrices are considered equal if one is a scalar multiple of the other. Equivalently, the elements *are* these equivalence classes, and the product of two classes is the set of all possible products of items from one class with items from the other.
|
||||
|
||||
Both this and the determinant 1 constraint can apply at the same time, forming the *projective special linear group*, PSL(*n*, *K*).
|
||||
|
||||
For GF(2), all of these groups are the same, since the only nonzero determinant and scalar multiple is 1. Therefore, it's beneficial to contrast SL and PGL with another example.
|
||||
|
||||
Let's arbitrarily examine GL(2, 5). Since 4 squares to 1 (mod 5) and we're working with 2×2 matrices, the determinant is unchanged when a matrix is scalar-multiplied by 4. These multiples are identified in PSL. On the other hand, in PGL, there are classes of matrices with determinant 2 and 3, which do not square to 1. These classes are exactly the ones which are "left out" of PSL.
|
||||
|
||||
$$
|
||||
\begin{matrix}
|
||||
\boxed{
|
||||
\begin{gather*}
|
||||
\large \text{GL}(2, 5)
|
||||
\\
|
||||
\underset{\det = 4}{
|
||||
\left(\begin{matrix}
|
||||
0 & 1 \\
|
||||
1 & 1
|
||||
\end{matrix} \right)
|
||||
},
|
||||
\textcolor{red}{
|
||||
\underset{\det = 1}{
|
||||
\left(\begin{matrix}
|
||||
0 & 2 \\
|
||||
2 & 2
|
||||
\end{matrix} \right)
|
||||
}},
|
||||
\underset{\det = 2}{
|
||||
\left(\begin{matrix}
|
||||
1 & 0 \\
|
||||
0 & 2
|
||||
\end{matrix} \right)
|
||||
},
|
||||
\underset{\det = 3}{
|
||||
\left(\begin{matrix}
|
||||
2 & 0 \\
|
||||
0 & 4
|
||||
\end{matrix} \right)
|
||||
},
|
||||
...
|
||||
\end{gather*}
|
||||
}
|
||||
& \twoheadrightarrow &
|
||||
\boxed{
|
||||
\begin{gather*}
|
||||
\large \text{PGL}(2,5)
|
||||
\\
|
||||
\underset{\det = 1, ~4}{
|
||||
\textcolor{red}{
|
||||
\left\{
|
||||
\left(\begin{matrix}
|
||||
0 & 1 \\
|
||||
1 & 1
|
||||
\end{matrix} \right),
|
||||
\left(\begin{matrix}
|
||||
0 & 2 \\
|
||||
2 & 2
|
||||
\end{matrix} \right),
|
||||
...
|
||||
\right\}
|
||||
}}
|
||||
\\
|
||||
\underset{\det = 2, ~ 3}{
|
||||
\left\{
|
||||
\left(\begin{matrix}
|
||||
1 & 0 \\
|
||||
0 & 2
|
||||
\end{matrix} \right),
|
||||
\left(\begin{matrix}
|
||||
2 & 0 \\
|
||||
0 & 4
|
||||
\end{matrix} \right),
|
||||
...
|
||||
\right\}
|
||||
} \\
|
||||
...
|
||||
\end{gather*}
|
||||
}
|
||||
\\ ~ \\
|
||||
\boxed{
|
||||
\begin{gather*}
|
||||
\large \text{SL}(2,5)
|
||||
\\
|
||||
\textcolor{red}{
|
||||
\left(\begin{matrix}
|
||||
0 & 2 \\
|
||||
2 & 2
|
||||
\end{matrix} \right)
|
||||
},
|
||||
\left(\begin{matrix}
|
||||
0 & 3 \\
|
||||
3 & 3
|
||||
\end{matrix} \right),
|
||||
...
|
||||
\end{gather*}
|
||||
}
|
||||
& \twoheadrightarrow &
|
||||
\boxed{
|
||||
\begin{gather*}
|
||||
\large \text{PSL}(2,5)
|
||||
\\
|
||||
\textcolor{red}{
|
||||
\left\{
|
||||
\left(\begin{matrix}
|
||||
0 & 2 \\
|
||||
2 & 2
|
||||
\end{matrix} \right),
|
||||
\left(\begin{matrix}
|
||||
0 & 3 \\
|
||||
3 & 3
|
||||
\end{matrix} \right),
|
||||
...
|
||||
\right\}
|
||||
}
|
||||
...
|
||||
\end{gather*}
|
||||
}
|
||||
\end{matrix}
|
||||
$$
|
||||
|
||||
<details>
|
||||
<summary>
|
||||
Haskell implementation of PGL and PSL for prime fields
|
||||
</summary>
|
||||
PGL and PSL require special equality. It's certainly possible to write a definition which makes the classes explicit, as its own new type. We could then define equality on this type through `Eq`. This is rather inefficient, though, so I'll choose to work with the representatives instead.
|
||||
|
||||
```{.haskell}
|
||||
import Data.List (nubBy)
|
||||
|
||||
scalarTimes :: Int -> Int -> Matrix Int -> Matrix Int
|
||||
-- Scalar-multiply a matrix (mod p)
|
||||
scalarTimes n k = fmap ((`mod` n) . (*k))
|
||||
|
||||
projEq :: Int -> Matrix Int -> Matrix Int -> Bool
|
||||
-- Construct all scalar multiples mod n, then check if ys is any of them.
|
||||
-- This is ludicrously inefficient, and only works for fields.
|
||||
projEq n xs ys = ys `elem` [scalarTimes n k xs | k <- [1..n-1]]
|
||||
|
||||
-- Strip out duplicates in GL and SL with projective equality
|
||||
mPGL m n = nubBy (projEq n) $ mGL m n
|
||||
mPSL m n = nubBy (projEq n) $ mSL m n
|
||||
```
|
||||
</details>
|
||||
|
||||
|
||||
### Exceptional Isomorphisms
|
||||
|
||||
When *K* is a finite field, the smaller PSLs turn out specify some interesting groups. We've studied the case of PSL(2, 2) being isomorphic to *S*~3~ already, but it is also the case that:
|
||||
|
||||
$$
|
||||
\begin{align*}
|
||||
&\text{PSL}(2,3) \cong A_4 & & \text{(order 24)}
|
||||
\\ ~ \\
|
||||
&\text{PSL}(2,4) \cong \text{PSL}(2,5) \cong A_5 & & \text{(order 60)}
|
||||
\\ ~ \\
|
||||
&\text{PSL}(2,7) \cong \text{PSL}(3,2) & & \text{(order 168)}
|
||||
\end{align*}
|
||||
$$
|
||||
|
||||
These relationships can be proven abstractly (and frequently are!). However, I always found myself wanting. For PSL(2, 3) and *A*~4~, it's trivial to assign elements to one another by hand. But *A*~5~ is getting untenable, to say nothing of PSL(2, 7). In these circumstances, it's a good idea to leverage the computer.
|
||||
|
||||
|
||||
Warming Up: *A*~5~ and PSL(2, 5)
|
||||
--------------------------------
|
||||
|
||||
*A*~5~, the alternating group on 5 elements, is composed of the [even](https://en.wikipedia.org/wiki/Parity_of_a_permutation) permutations of 5 elements. It also happens to describe the rotations of an icosahedron. Within the group, there are three kinds of elements:
|
||||
|
||||
- The product of two 2-cycles, such as a = (1 2)(3 4)
|
||||
- On an icosahedron, this corresponds to a 180 degree rotation (or more precisely, 1/2 of a turn) about an edge
|
||||
- 5-cycles, such as b = (1 2 3 4 5)
|
||||
- This corresponds to a 72 degree rotation (1/5 of a turn) around the center of a face
|
||||
- 3-cycles, such as ab = (2 4 5)
|
||||
- This corresponds to a 120 degree rotation (1/3 of a turn) around a vertex
|
||||
|
||||
It happens to be the case that all elements of the group can be expressed as a product between *a* and *b* -- they generate the group.
|
||||
|
||||
|
||||
### Mapping to Matrices
|
||||
|
||||
To create a correspondence with PSL(2, 5), we need to identify permutations with matrices. Obviously, the identity permutation goes to the identity matrix. Then, since *a* and *b* generate the group, we can search for two matrices which obey the same relations (under projective equality, since we're working in PSL). One such correspondence is:
|
||||
|
||||
$$
|
||||
\begin{array}{}
|
||||
\begin{gather*}
|
||||
A = \left(\begin{matrix}
|
||||
1 & 1 \\
|
||||
3 & 4
|
||||
\end{matrix} \right)
|
||||
\qquad
|
||||
A^2 = \left(\begin{matrix}
|
||||
4 & 0 \\
|
||||
0 & 4
|
||||
\end{matrix}\right) =
|
||||
4 \left(\begin{matrix}
|
||||
1 & 0 \\
|
||||
0 & 1
|
||||
\end{matrix}\right)
|
||||
\qquad
|
||||
\end{gather*}
|
||||
\\ ~ \\ \hline \\
|
||||
\begin{gather*}
|
||||
B = \left(\begin{matrix}
|
||||
0 & 2 \\
|
||||
2 & 2
|
||||
\end{matrix} \right)
|
||||
\qquad
|
||||
B^2 = \left(\begin{matrix}
|
||||
4 & 4 \\
|
||||
4 & 3
|
||||
\end{matrix}\right)
|
||||
\qquad
|
||||
B^3 = \left(\begin{matrix}
|
||||
3 & 1 \\
|
||||
1 & 4
|
||||
\end{matrix}\right)
|
||||
\\
|
||||
B^4 = \left(\begin{matrix}
|
||||
2 & 3 \\
|
||||
3 & 0
|
||||
\end{matrix}\right)
|
||||
\qquad
|
||||
B^5 = \left(\begin{matrix}
|
||||
1 & 0 \\
|
||||
0 & 1
|
||||
\end{matrix}\right)
|
||||
\end{gather*}
|
||||
\\ ~ \\ \hline \\
|
||||
\begin{gather*}
|
||||
(AB) = \left(\begin{matrix}
|
||||
2 & 4 \\
|
||||
3 & 4
|
||||
\end{matrix} \right)
|
||||
\qquad
|
||||
(AB)^2 = \left(\begin{matrix}
|
||||
1 & 4 \\
|
||||
3 & 3
|
||||
\end{matrix}\right)
|
||||
\qquad
|
||||
(AB)^3 = \left(\begin{matrix}
|
||||
4 & 0 \\
|
||||
0 & 4
|
||||
\end{matrix}\right)
|
||||
\end{gather*} =
|
||||
4 \left(\begin{matrix}
|
||||
1 & 0 \\
|
||||
0 & 1
|
||||
\end{matrix}\right)
|
||||
\end{array}
|
||||
$$
|
||||
|
||||
|
||||
<details>
|
||||
<summary>
|
||||
Haskell implementation using B as a generator to find candidates for A
|
||||
</summary>
|
||||
```{.haskell}
|
||||
orderWith :: Eq a => (a -> a -> a) -> (a -> Bool) -> a -> Int
|
||||
-- Repeatedly apply f to p, until the predicate z
|
||||
-- (usually equality to some quantity) becomes True.
|
||||
-- Get the length of the resulting list
|
||||
orderWith f z p = (+1) $ length $ takeWhile (not . z) $ iterate (f p) p
|
||||
|
||||
-- Order with respect to PSL(2, 5): using matrix multiplication (mod 5)
|
||||
-- and projective equality to the identity matrix
|
||||
orderPSL25 = orderWith (\x -> fmap (`mod` 5) . (x |*|))) (projEq 5 $ eye 2)
|
||||
|
||||
-- Only order 2 elements of PSL(2, 5)
|
||||
psl25_order2 = filter ((==2) . orderPSL25) $ mPSL 2 5
|
||||
|
||||
-- Start with B as a generator
|
||||
psl25_gen_B = toMatrix [[0,2],[2,2]]
|
||||
|
||||
-- Find an order 2 element whose product with `psl25_gen_B` has order 3
|
||||
psl25_gen_A_candidates = filter ((==3) . orderPSL25 . (psl25_gen_B |*|)) \
|
||||
psl25_order2
|
||||
|
||||
-- Candidate matrices:
|
||||
--
|
||||
-- [1,1]
|
||||
-- [3,4]
|
||||
--
|
||||
-- [1,3]
|
||||
-- [1,4]
|
||||
--
|
||||
-- [2,0]
|
||||
-- [0,3]
|
||||
--
|
||||
-- [2,0]
|
||||
-- [4,3]
|
||||
--
|
||||
-- [2,4]
|
||||
-- [0,3]
|
||||
```
|
||||
|
||||
If you're unsatisfied with starting from *B*, realize that we could have filtered out only the order 5 elements of PSL(2, 5) (`filter ((==5) . psl25Order) $ mPSL 2 5`), and picked any element from this list to start.
|
||||
</details>
|
||||
|
||||
|
||||
We now have a correspondence between three elements of *A*~5~ and PSL(2, 5). We can "run" both sets of the generators until we associate all elements to one another. This is most visually appealing to see as a Cayley graph:
|
||||
|
||||
::: {}
|
||||
![]()
|
||||
Cayley graph showing an isomorphism between A5 and PSL(2, 5). <br>
|
||||
Order-2 elements are red, order-3 elements are green, and order-5 elements are blue. <br>
|
||||
Purple arrows are order-5 generators, orange arrows are order-2 generators.
|
||||
:::
|
||||
|
||||
|
||||
PSL(2, 4)
|
||||
---------
|
||||
|
||||
We could do the same for PSL(2, 4), but we can't just work modulo 4 -- remember, the elements of GF(4) are 0, 1, *α*, and *α*^2^. It follows that GL(2, 4) is composed of (invertible) matrices of those elements, and SL(2, 4) is composed of matrices with determinant 1.
|
||||
|
||||
$$
|
||||
\begin{matrix}
|
||||
\boxed{
|
||||
\begin{gather*}
|
||||
\large \text{GL}(2, 4)
|
||||
\\
|
||||
\textcolor{red}{
|
||||
\underset{\det = 1}{
|
||||
\left(\begin{matrix}
|
||||
0 & 1 \\
|
||||
1 & 1
|
||||
\end{matrix} \right)
|
||||
}},
|
||||
\underset{\det = \alpha + 1}{
|
||||
\left(\begin{matrix}
|
||||
0 & \alpha \\
|
||||
\alpha & \alpha
|
||||
\end{matrix} \right)
|
||||
},
|
||||
\underset{\det = \alpha}{
|
||||
\left(\begin{matrix}
|
||||
1 & 0 \\
|
||||
0 & \alpha
|
||||
\end{matrix} \right)
|
||||
},
|
||||
\textcolor{red}{
|
||||
\underset{\det = 1}{
|
||||
\left(\begin{matrix}
|
||||
\alpha & 0 \\
|
||||
0 & \alpha^2
|
||||
\end{matrix} \right)
|
||||
}},
|
||||
...
|
||||
\end{gather*}
|
||||
}
|
||||
\\ ~ \\
|
||||
\boxed{
|
||||
\begin{gather*}
|
||||
\large \text{SL}(2,4)
|
||||
\\
|
||||
\textcolor{red}{
|
||||
\left(\begin{matrix}
|
||||
0 & 1 \\
|
||||
1 & 1
|
||||
\end{matrix} \right)
|
||||
},
|
||||
\textcolor{red}{
|
||||
\left(\begin{matrix}
|
||||
\alpha & 0 \\
|
||||
0 & \alpha^2
|
||||
\end{matrix} \right)
|
||||
},
|
||||
...
|
||||
\end{gather*}
|
||||
}
|
||||
\end{matrix}
|
||||
$$
|
||||
|
||||
Scalar multiplication by *α* multiplies the determinant by *α*^2^; by *α*^2^ multiplies the determinant by *α*^4^ = *α*. Thus, SL(2, 4) is also PSL(2, 4), since no scalar multiple has determinant 1.
|
||||
|
||||
Let's start by looking at an order-5 matrix over PSL(2, 4). We'll call this matrix *B*' to correspond with our order-5 generator in PSL(2, 5).
|
||||
|
||||
$$
|
||||
\begin{gather*}
|
||||
B' = \left(\begin{matrix}
|
||||
0 & \alpha \\
|
||||
\alpha^2 & \alpha^2
|
||||
\end{matrix} \right)
|
||||
\qquad
|
||||
(B')^2 = \left(\begin{matrix}
|
||||
1 & 1 \\
|
||||
\alpha & \alpha^2
|
||||
\end{matrix}\right)
|
||||
\qquad
|
||||
(B')^3 = \left(\begin{matrix}
|
||||
\alpha^2 & 1 \\
|
||||
\alpha & 1
|
||||
\end{matrix}\right)
|
||||
\\
|
||||
(B')^4 = \left(\begin{matrix}
|
||||
\alpha^2 & \alpha \\
|
||||
\alpha^2 & 0
|
||||
\end{matrix}\right)
|
||||
\qquad
|
||||
(B')^5 = \left(\begin{matrix}
|
||||
1 & 0 \\
|
||||
0 & 1
|
||||
\end{matrix}\right)
|
||||
\\ ~ \\
|
||||
\det B' = 0\alpha^2 - \alpha^3 = 1
|
||||
\end{gather*}
|
||||
$$
|
||||
|
||||
|
||||
We need to be able to do three things over GL(2, 4) on a computer:
|
||||
|
||||
- multiply matrices over GF(4),
|
||||
- compare those matrices,
|
||||
- compute their determinant, and
|
||||
- be able to systematically write down all of them
|
||||
|
||||
It would then follow for us to repeat what we did with with SL(2, 5). But as I've said, working symbolically is hard for computers, and the methods described for prime fields do not work in general with prime power fields. Fortunately, we're amply prepared to find a solution.
|
||||
|
||||
|
||||
### Bootstrapping Matrices
|
||||
|
||||
Recall that the elements of GF(4) can also be written as the zero matrix, the identity matrix, *C*~*p*~, and *C*~*p*~^2^ (where *C*~*p*~ is the companion matrix of *p*(x) and again, *p*(x) = *x*^2^ + *x* + 1). This means we can also write elements of GL(2, 4) as matrices *of matrices*. Arithmetic works exactly the same as it does symbolically -- we just replace all instances of *α* in *B*' with *C*~*p*~.
|
||||
|
||||
$$
|
||||
f^* : \mathbb{F}_4 {}^{2 \times 2} \rightarrow (\mathbb{F}_2 {}^{2 \times 2})^{2 \times 2}
|
||||
\\ ~ \\
|
||||
\begin{align*}
|
||||
\bar {B'} = f^*(B') &= \left(\begin{matrix}
|
||||
f(0) & f(\alpha) \\
|
||||
f(\alpha^2) & f(\alpha^2)
|
||||
\end{matrix} \right) = \left(\begin{matrix}
|
||||
{\bf 0} & C_p \\
|
||||
C_p {}^2 & C_p {}^2
|
||||
\end{matrix} \right) \\
|
||||
&= \left(\begin{matrix}
|
||||
\left(\begin{matrix} 0 & 0 \\ 0 & 0 \end{matrix} \right) &
|
||||
\left(\begin{matrix} 0 & 1 \\ 1 & 1 \end{matrix} \right) \\
|
||||
\left(\begin{matrix} 1 & 1 \\ 1 & 0 \end{matrix} \right) &
|
||||
\left(\begin{matrix} 1 & 1 \\ 1 & 0 \end{matrix} \right)
|
||||
\end{matrix} \right)
|
||||
\\ ~ \\
|
||||
(f^*(\bar B'))^2 &= \left(\begin{matrix}
|
||||
({\bf 0})({\bf 0}) + C_p {}^3 & ({\bf 0})C_p +C_p {}^3 \\
|
||||
({\bf 0})C_p {}^2 + C_p {}^4 & C_p {}^3 + C_p {}^4
|
||||
\end{matrix} \right) \\
|
||||
&= \left(\begin{matrix}
|
||||
I & I \\
|
||||
C_p {} & C_p {}^2
|
||||
\end{matrix} \right) = \left(\begin{matrix}
|
||||
f(1) & f(1) \\
|
||||
f(\alpha) & f(\alpha^2)
|
||||
\end{matrix} \right) =
|
||||
f^*((\bar B')^2)
|
||||
\end{align*}
|
||||
$$
|
||||
|
||||
Make no mistake, this is *not* a [block matrix](https://en.wikipedia.org/wiki/Block_matrix), at least not a typical one. Namely, the layering means that the determinant (which signifies its membership in SL) is another matrix:
|
||||
|
||||
$$
|
||||
\begin{align*}
|
||||
\det( f^*(B') ) &= {\bf 0} (C_p {}^2) - (C_p)(C_p {}^2) \\
|
||||
&=
|
||||
\left(\begin{matrix} 0 & 0 \\ 0 & 0 \end{matrix} \right)
|
||||
\left(\begin{matrix} 1 & 1 \\ 1 & 0 \end{matrix} \right) -
|
||||
\left(\begin{matrix} 0 & 1 \\ 1 & 1 \end{matrix} \right)
|
||||
\left(\begin{matrix} 1 & 1 \\ 1 & 0 \end{matrix} \right) \\
|
||||
&= \left(\begin{matrix} 1 & 0 \\ 0 & 1 \end{matrix} \right) \mod 2 \\
|
||||
&= I = f(\det(B'))
|
||||
\end{align*}
|
||||
$$
|
||||
|
||||
Since *B*' is in SL(2, 4), the determinant is unsurprisingly *f*(1) = I. The (matrix) determinants of *f*\* applied to other elements of GL(2, 4) could just as well be *f*(*α*) = *C*~*p*~ or *f*(*α*^2^) = *C*~*p*~^2^.
|
||||
|
||||
|
||||
### Implementation
|
||||
|
||||
Using this method, we can implement PSL(2, 4) directly. All we need to do is find all possible 4-tuples of **0**, *I*, *C*~*p*~, and *C*~*p*~^2^, then arrange each into a 2x2 matrix. Multiplication follows from the typical definition and the multiplicative identity is just *f*\*(*I*).
|
||||
|
||||
|
||||
<details>
|
||||
<summary>
|
||||
Haskell implementation of PSL(2, 4)
|
||||
</summary>
|
||||
```{.haskell}
|
||||
import Data.List (findIndex)
|
||||
|
||||
-- Matrices which obey the same relations as the elements of GF(4)
|
||||
zero_f4 = zero 2
|
||||
one_f4 = eye 2
|
||||
alpha_f4 = toMatrix [[0,1],[1,1]]
|
||||
alpha2_f4 = toMatrix [[1,1],[1,0]]
|
||||
|
||||
-- Gathered into a list
|
||||
field4 = [zero_f4, one_f4, alpha_f4, alpha2_f4]
|
||||
|
||||
-- Convenient show function for these matrices
|
||||
showF4 x = case findIndex (==x) field4 of
|
||||
Just 0 -> "0"
|
||||
Just 1 -> "1"
|
||||
Just 2 -> "α"
|
||||
Just 3 -> "α^2"
|
||||
Nothing -> "N/A"
|
||||
|
||||
-- Identity matrix over GF(4)
|
||||
psl_24_identity = toMatrix [[one_f4, zero_f4], [zero_f4, one_f4]]
|
||||
|
||||
-- All possible matrices over GF(4)
|
||||
-- Create a list of 4-lists of elements from GF(4), then
|
||||
-- Shape them into 2x2 matrices
|
||||
f4_matrices = map (toMatrix . reshape 2) $ sequence $ replicate 4 field4
|
||||
|
||||
-- Sieve out those which have a determinant of 1 in the field
|
||||
mPSL24 = filter ((==one_f4) . (fmap (`mod` 2)) . laplaceDet) $ f4_matrices
|
||||
```
|
||||
</details>
|
||||
|
||||
Now that we can generate the group, we can finally repeat what we did with PSL(2, 5). All we have to do is filter out order-2 elements, then further filter for those which have an order-3 product with *B*'.
|
||||
|
||||
<details>
|
||||
<summary>
|
||||
Haskell implementation using *B*' as a generator to find candidates for *A*'
|
||||
</summary>
|
||||
```{.haskell}
|
||||
-- Order with respect to PSL(2, 4): using matrix multiplication (mod 2)
|
||||
-- and projective equality to the identity matrix
|
||||
orderPSL24 = orderWith (\x -> fmap (fmap (`mod` 2)) . (x*))) (== psl_24_identity)
|
||||
|
||||
-- Only order 2 elements of PSL(2, 4)
|
||||
psl24_order2 = filter ((==2) . orderPSL24) $ mPSL24
|
||||
|
||||
-- Start with B as a generator
|
||||
psl24_gen_B = toMatrix [[zero_f4, alpha_f4], [alpha2_f4, alpha2_f4]]
|
||||
|
||||
-- Find an order 2 element whose product with `psl24_gen_B` has order 3
|
||||
psl24_gen_A_candidates = filter ((==3) . orderPSL24 . (psl24_gen_B*))
|
||||
psl24_order2
|
||||
|
||||
-- Candidate matrices:
|
||||
--
|
||||
-- ["0","1"]
|
||||
-- ["1","0"]
|
||||
--
|
||||
-- ["0","α^2"]
|
||||
-- ["α","0"]
|
||||
--
|
||||
-- ["1","0"]
|
||||
-- ["1","1"]
|
||||
--
|
||||
-- ["1","α^2"]
|
||||
-- ["0","1"]
|
||||
--
|
||||
-- ["α","1"]
|
||||
-- ["α","α"]
|
||||
```
|
||||
</details>
|
||||
|
||||
Finally, we can decide on an *A*', the order-2 generator with the properties we wanted.
|
||||
|
||||
$$
|
||||
\begin{array}{}
|
||||
\begin{gather*}
|
||||
A' = \left(\begin{matrix}
|
||||
0 & \alpha^2 \\
|
||||
\alpha & 0
|
||||
\end{matrix} \right)
|
||||
\qquad
|
||||
(A')^2 = \left(\begin{matrix}
|
||||
1 & 0 \\
|
||||
0 & 1
|
||||
\end{matrix}\right)
|
||||
\end{gather*}
|
||||
\\ ~ \\ \hline \\
|
||||
\begin{gather*}
|
||||
A'B' =
|
||||
\left(\begin{matrix}
|
||||
\alpha & \alpha \\
|
||||
0 & \alpha^2
|
||||
\end{matrix} \right)
|
||||
\qquad
|
||||
(A'B')^2 =
|
||||
\left(\begin{matrix}
|
||||
\alpha^2 & \alpha \\
|
||||
0 & \alpha
|
||||
\end{matrix} \right)
|
||||
\qquad
|
||||
(A'B')^3 =
|
||||
\left(\begin{matrix}
|
||||
1 & 0 \\
|
||||
0 & 1
|
||||
\end{matrix} \right)
|
||||
\qquad
|
||||
\end{gather*}
|
||||
\end{array}
|
||||
$$
|
||||
|
||||
Then, we can arrange them on a Cayley graph in the same way as PSL(2, 5):
|
||||
|
||||
|
||||
::: {}
|
||||
![]()
|
||||
Cayley graph showing an isomorphism between *A*^5^ and PSL(2, 4). <br>
|
||||
Colors indicate the same thing as in the previous diagram.
|
||||
:::
|
||||
|
||||
|
||||
Closing
|
||||
-------
|
||||
|
||||
This post addresses my original goal in implementing finite fields, namely computationally finding an explicit map between *A*^5^ and PSL(2, 4). I believe the results are a little more satisfying than attempting to wrap your head around group-theoretic proofs. That's not to discount the power and astounding amount of work that goes into the latter method. It does tend to leave things rather opaque, however.
|
||||
|
||||
If you'd prefer a more interactive diagram showing the above isomorphisms, I've gone to the liberty of creating a hoverable SVG:
|
||||
|
||||
![]()
|
||||
|
||||
This post slightly diverts our course from the previous one's focus on fields. The [next one]() will focus on more results regarding the treatment of layered matrices. The algebraic consequences of this structure are notable in and of themselves, and are entirely obfuscated by the usual interpretation of block matrices.
|
||||
|
||||
Diagrams created with Geogebra and Inkscape.
|
||||
636
finite/4/index.qmd
Normal file
@ -0,0 +1,636 @@
|
||||
---
|
||||
format:
|
||||
html:
|
||||
html-math-method: katex
|
||||
jupyter: python3
|
||||
---
|
||||
|
||||
|
||||
Exploring Finite Fields, Part 4: The Power of Forgetting
|
||||
========================================================
|
||||
|
||||
The [last post]() in this series focused on understanding some small linear groups and implementing them on the computer over both a prime field and prime power field.
|
||||
|
||||
The prime power case was particularly interesting. First, we adjoined the roots of a polynomial to the base field, GF(2). Rather than the traditional means of adding new symbols like *α*, we used companion matrices, which behave the same arithmetically. For example, for the smallest prime power field, GF(4), we use the polynomial *p*(*x*) = *x*^2^ + *x* + 1, and map its symbolic roots (*α* and *α*^2^), to matrices over GF(2):
|
||||
|
||||
$$
|
||||
f : \mathbb{F}_4 \longrightarrow \mathbb{F}_2 {}^{2 \times 2}
|
||||
\\ ~ \\
|
||||
\begin{gather*}
|
||||
f(0) = {\bf 0} = \left(\begin{matrix}0 & 0 \\ 0 & 0 \end{matrix}\right) &
|
||||
f(1) = I = \left(\begin{matrix}1 & 0 \\ 0 & 1 \end{matrix}\right) \\
|
||||
f(\alpha) = C_p = \left(\begin{matrix}0 & 1 \\ 1 & 1 \end{matrix}\right) &
|
||||
f(\alpha^2) = C_p {}^2 = \left(\begin{matrix}1 & 1 \\ 1 & 0 \end{matrix}\right)
|
||||
\end{gather*}
|
||||
\\ ~ \\
|
||||
f(a + b)= f(a) + f(b), \quad f(ab) = f(a)f(b)
|
||||
$$
|
||||
|
||||
Finally, we constructed GL(2, 4) using matrices of matrices -- not [block matrices](https://en.wikipedia.org/wiki/Block_matrix)! This post will focus on studying this method in slightly more detail.
|
||||
|
||||
|
||||
Reframing the Path Until Now
|
||||
----------------------------
|
||||
|
||||
In the above description, we already mentioned larger structures over GF(2), namely polynomials and matrices. Since GF(4) can itself be described with matrices over GF(2), we can generalize *f* to give us two more maps:
|
||||
|
||||
- *f*\*, which converts matrices over GF(4) to double-layered matrices over GF(2), and
|
||||
- *f*^*•*^ which converts polynomials over GF(4) to polynomials of matrices over GF(2)
|
||||
|
||||
|
||||
### Matrix Map
|
||||
|
||||
We examined the former map briefly in the previous post. More explicitly, we looked at a matrix *B* in SL(2, 4) which had the property that it was cyclic of order five. Then, to work with it without relying on symbols, we simply applied *f* over the contents of the matrix.
|
||||
|
||||
$$
|
||||
\begin{gather*}
|
||||
f^* : \mathbb{F}_4 {}^{2 \times 2} \longrightarrow
|
||||
(\mathbb{F}_2 {}^{2 \times 2})^{2 \times 2}
|
||||
\\ ~ \\
|
||||
B = \left(\begin{matrix}
|
||||
0 & \alpha \\ \alpha^2 & \alpha^2
|
||||
\end{matrix} \right)
|
||||
\\
|
||||
B^* = f^*(B) = \left(\begin{matrix}
|
||||
f(0) & f(\alpha) \\ f(\alpha^2) & f(\alpha^2)
|
||||
\end{matrix} \right) =
|
||||
\left(\begin{matrix}
|
||||
\left(\begin{matrix} 0 & 0 \\ 0 & 0 \end{matrix} \right) &
|
||||
\left(\begin{matrix} 0 & 1 \\ 1 & 1 \end{matrix} \right) \\
|
||||
\left(\begin{matrix} 1 & 1 \\ 1 & 0 \end{matrix} \right) &
|
||||
\left(\begin{matrix} 1 & 1 \\ 1 & 0 \end{matrix} \right)
|
||||
\end{matrix} \right)
|
||||
\end{gather*}
|
||||
$$
|
||||
|
||||
We can do this because a matrix contains values in the domain of *f*, thus uniquely determining a way to change the internal structure (what Haskell calls a [functor](https://wiki.haskell.org/Functor)). Furthermore, due to the properties of *f*, it and *f*\* obey an important relationship with the determinant: it commutes, as in the following diagram:
|
||||
|
||||
$$
|
||||
\begin{gather*}
|
||||
f(\det(B)) = f(1) = I =\det(B^*)= \det(f^*(B))
|
||||
\\ ~ \\
|
||||
\begin{matrix}
|
||||
& \mathbb{F}_4 {}^{2 \times 2} &
|
||||
\overset{\det} {\longrightarrow} &
|
||||
\mathbb{F}_4 \\
|
||||
\\
|
||||
\small f^* & | & & | & f\\
|
||||
& \downarrow & & \downarrow \\
|
||||
& & & & \\
|
||||
&
|
||||
(\mathbb{F}_2 {}^{2 \times 2})^{2 \times 2} &
|
||||
\underset{\det}{\longrightarrow} &
|
||||
\mathbb{F}_2 {}^{2 \times 2} \\
|
||||
\end{matrix}
|
||||
\end{gather*}
|
||||
$$
|
||||
|
||||
It should be noted that the determinant strips off the *outer* matrix. We could also consider the map **det**\* , where we apply the determinant to the internal matrices (in Haskell terms, `fmap det`). This map isn't as nice though, since:
|
||||
|
||||
$$
|
||||
\begin{align*}
|
||||
\det {}^*(B^*)
|
||||
&= \left(\begin{matrix}
|
||||
\det \left(\begin{matrix} 0 & 0 \\ 0 & 0 \end{matrix} \right) &
|
||||
\det \left(\begin{matrix} 0 & 1 \\ 1 & 1 \end{matrix} \right) \\
|
||||
\det \left(\begin{matrix} 1 & 1 \\ 1 & 0 \end{matrix} \right) &
|
||||
\det \left(\begin{matrix} 1 & 1 \\ 1 & 0 \end{matrix} \right)
|
||||
\end{matrix} \right)
|
||||
= \left(\begin{matrix} 0 & 1 \\ 1 & 1 \end{matrix} \right)
|
||||
\\ ~ \\
|
||||
&\neq \left(\begin{matrix} 1 & 0 \\ 0 & 1 \end{matrix} \right)
|
||||
= \det(B^*)
|
||||
\end{align*}
|
||||
$$
|
||||
|
||||
|
||||
### Polynomial Map
|
||||
|
||||
Much like how we can change the internal structure of matrices, we can do the same for polynomials. For the purposes of demonstration, we'll work with *b* = *λ*^2^ + *α*^2^*λ* + 1 , the characteristic polynomial of *B*, since it has coefficients in the domain of *f*. We define the extended map *f*^*•*^ as:
|
||||
|
||||
$$
|
||||
\begin{gather*}
|
||||
f^{\bullet} : \mathbb{F}_4[\lambda] \longrightarrow
|
||||
\mathbb{F}_2 {}^{2 \times 2}[\Lambda] \\
|
||||
f^{\bullet} (\lambda) = \Lambda \qquad
|
||||
f^{\bullet}(a) = f(a), \quad a \in \mathbb{F}_4
|
||||
\\ ~ \\
|
||||
\begin{align*}
|
||||
b^{\bullet}
|
||||
= f^{\bullet}(b)
|
||||
&= f^{\bullet}(\lambda^2)
|
||||
&&+&& f^{\bullet}(\alpha^2)f^{\bullet}(\lambda)
|
||||
&&+&& f^{\bullet}(1) \\
|
||||
&= \Lambda^2
|
||||
&&+&& \left(\begin{matrix} 1 & 1 \\ 1 & 0\end{matrix}\right) \Lambda
|
||||
&&+&& \left(\begin{matrix} 1 & 0 \\ 0 & 1 \end{matrix}\right)
|
||||
\end{align*}
|
||||
\end{gather*}
|
||||
$$
|
||||
|
||||
Since we're looking at the characteristic polynomial of *B*, we might as well also look at the characteristic polynomial of *B*\*, its image under *f*\*. We already looked at the determinant of this matrix, which is the constant term of the characteristic polynomial (up to sign). Therefore, it's probably not surprising that *f*^*•*^ and the characteristic polynomial commute in a similar fashion to the determinant.
|
||||
|
||||
$$
|
||||
\begin{align*}
|
||||
b^*
|
||||
&= \text{charpoly}(f^*(B))
|
||||
= \text{charpoly}
|
||||
\left(\begin{matrix}
|
||||
\left(\begin{matrix} 0 & 0 \\ 0 & 0 \end{matrix} \right) &
|
||||
\left(\begin{matrix} 0 & 1 \\ 1 & 1 \end{matrix} \right) \\
|
||||
\left(\begin{matrix} 1 & 1 \\ 1 & 0 \end{matrix} \right) &
|
||||
\left(\begin{matrix} 1 & 1 \\ 1 & 0 \end{matrix} \right)
|
||||
\end{matrix} \right) \\
|
||||
&= \Lambda^2 +
|
||||
\left(\begin{matrix} 1 & 1 \\ 1 & 0 \end{matrix} \right) \Lambda +
|
||||
\left(\begin{matrix} 1 & 1 \\ 1 & 0 \end{matrix} \right)
|
||||
= f^{\bullet}(\text{charpoly}(B))
|
||||
= b^\bullet
|
||||
\end{align*}
|
||||
\\ ~ \\
|
||||
\begin{matrix}
|
||||
& \mathbb{F}_4 {}^{2 \times 2} &
|
||||
\overset{\text{charpoly}} {\longrightarrow} &
|
||||
\mathbb{F}_4[\lambda] \\
|
||||
\\
|
||||
\small f^* & | & & | & f^\bullet\\
|
||||
& \downarrow & & \downarrow \\
|
||||
& & & & \\
|
||||
&
|
||||
(\mathbb{F}_2 {}^{2 \times 2})^{2 \times 2} &
|
||||
\underset{\text{charpoly}}{\longrightarrow} &
|
||||
(\mathbb{F}_2 {}^{2 \times 2})[\Lambda] \\
|
||||
\end{matrix}
|
||||
$$
|
||||
|
||||
It should also be mentioned that **charpoly**\*, taking the characteristic polynomials of the internal matrices, does *not* obey the same relationship. For one, the type is wrong: the codomain is a matrix *containing* polynomials, rather than a polynomial over matrices.
|
||||
|
||||
There *does* happen to be an isomorphism between the two structures (the reverse direction of which we'll discuss momentarily). But even by converting to the proper type, we already have a counterexample in the constant term from taking det* earlier.
|
||||
|
||||
$$
|
||||
\begin{align*}
|
||||
\text{charpoly}^*(B^*)
|
||||
&= \left(\begin{matrix}
|
||||
\text{charpoly} \left(\begin{matrix} 0 & 0 \\ 0 & 0 \end{matrix} \right) &
|
||||
\text{charpoly} \left(\begin{matrix} 0 & 1 \\ 1 & 1 \end{matrix} \right) \\
|
||||
\text{charpoly} \left(\begin{matrix} 1 & 1 \\ 1 & 0 \end{matrix} \right) &
|
||||
\text{charpoly} \left(\begin{matrix} 1 & 1 \\ 1 & 0 \end{matrix} \right)
|
||||
\end{matrix} \right)
|
||||
\\
|
||||
&= \left(\begin{matrix}
|
||||
\lambda^2 & \lambda^2 + \lambda + 1 \\
|
||||
\lambda^2 + \lambda + 1 & \lambda^2 + \lambda + 1
|
||||
\end{matrix} \right) \\
|
||||
&\cong
|
||||
\left(\begin{matrix} 1 & 1 \\ 1 & 1 \end{matrix} \right) \Lambda^2
|
||||
+ \left(\begin{matrix} 0 & 1 \\ 1 & 1 \end{matrix} \right) \Lambda
|
||||
+ \left(\begin{matrix} 0 & 1 \\ 1 & 1 \end{matrix} \right)
|
||||
\\ ~ \\
|
||||
&\neq f^{\bullet}(\text{charpoly}(B))
|
||||
\end{align*}
|
||||
$$
|
||||
|
||||
|
||||
Forgetting
|
||||
----------
|
||||
|
||||
Clearly, layering matrices has several advantages over how we usually interpret block matrices. But what happens if we *do* "forget" about the internal structure?
|
||||
|
||||
$$
|
||||
\begin{gather*}
|
||||
\text{forget} : (\mathbb{F}_2 {}^{2 \times 2})^{2 \times 2}
|
||||
\longrightarrow \mathbb{F}_2 {}^{4 \times 4}
|
||||
\\ ~ \\
|
||||
\hat B = \text{forget}(B^*) =
|
||||
\text{forget}\left(\begin{matrix}
|
||||
\left(\begin{matrix} 0 & 0 \\ 0 & 0 \end{matrix} \right) &
|
||||
\left(\begin{matrix} 0 & 1 \\ 1 & 1 \end{matrix} \right) \\
|
||||
\left(\begin{matrix} 1 & 1 \\ 1 & 0 \end{matrix} \right) &
|
||||
\left(\begin{matrix} 1 & 1 \\ 1 & 0 \end{matrix} \right)
|
||||
\end{matrix} \right) =
|
||||
\left(\begin{matrix}
|
||||
0 & 0 & 0 & 1 \\
|
||||
0 & 0 & 1 & 1 \\
|
||||
1 & 1 & 1 & 1 \\
|
||||
1 & 0 & 1 & 0
|
||||
\end{matrix} \right)
|
||||
\end{gather*}
|
||||
$$
|
||||
|
||||
<details>
|
||||
<summary>
|
||||
Haskell implementation of `forget`
|
||||
</summary>
|
||||
```{.haskell}
|
||||
forget :: Matrix (Matrix a) -> Matrix a
|
||||
-- Massively complicated point-free way to forget matrices:
|
||||
-- 1. Convert internal matrices to lists of lists
|
||||
-- 2. Convert the external matrix to a list of lists
|
||||
-- 3. There are now four layers of lists. Transpose the second and third.
|
||||
-- 4. Concat the new third and fourth layers together
|
||||
-- 5. Concat the first and second layers together
|
||||
-- 6. Convert the list of lists back to a matrix
|
||||
forget = toMatrix . concat . fmap (fmap concat . transpose) .
|
||||
fromMatrix . fmap fromMatrix
|
||||
```
|
||||
|
||||
To see why this is the structure, remember that we need to work with rows of the external matrix at the same time. We'd like to read across the whole row, but this involves descending into two matrices. The `fmap transpose` allows us to collect rows in the way we expect. For example, for the above matrix, We get `[[[0,0],[0,1]], [[0,0],[1,1]]]` after the transposition, which are the first two rows, grouped by the matrix they belonged to. Then, we can finally get the desired row by `fmap (fmap concat)`ing the rows together. Finally, we `concat` once more to undo the column grouping.
|
||||
</details>
|
||||
|
||||
Like *f*, `forget` preserves addition and multiplication, a fact already appreciated by block matrices. Further, by *f*, the internal matrices multiply the same as elements of GF(4). Hence, this shows us directly that GL(2, 4) is a subgroup of GL(4, 2).
|
||||
|
||||
However, an obvious difference between layered and "forgotten" matrices is the determinant and characteristic polynomial:
|
||||
|
||||
$$
|
||||
\begin{align*}
|
||||
\det {B^*} &= \left(\begin{matrix}1 & 0 \\ 0 & 1\end{matrix}\right)
|
||||
\\ ~ \\
|
||||
\det {\hat B} &= 1
|
||||
\end{align*}
|
||||
\qquad
|
||||
\begin{align*}
|
||||
\text{charpoly}(B^*) &=
|
||||
\Lambda^2 +
|
||||
\left(\begin{matrix}1 & 1 \\ 1 & 0 \end{matrix}\right)\Lambda +
|
||||
\left(\begin{matrix}1 & 0 \\ 0 & 1\end{matrix}\right)
|
||||
\\ ~ \\
|
||||
\text{charpoly}(\hat B) &=
|
||||
\lambda^4 + \lambda^3 + \lambda^2 + \lambda + 1\\
|
||||
\end{align*}
|
||||
$$
|
||||
|
||||
|
||||
### Another Path to the Forgotten
|
||||
|
||||
It's a relatively simple matter to move between determinants, since it's straightforward to identify 1 and the identity matrix. However, a natural question to ask is whether there's a way to reconcile or coerce the matrix polynomial into the "forgotten" one.
|
||||
|
||||
First, let's formally establish a path from matrix polynomials to a matrix of polynomials. We need only use our friend from the [second post]() -- polynomial evaluation. Simply evaluating a matrix polynomial at *λI* converts our matrix indeterminate (*Λ*) into a scalar one (*λ*).
|
||||
|
||||
$$
|
||||
\begin{align*}
|
||||
\text{eval}_{\Lambda \mapsto \lambda I} &:
|
||||
(\mathbb{F}_2 {}^{2 \times 2})[\Lambda]
|
||||
\rightarrow (\mathbb{F}_2[\lambda]) {}^{2 \times 2} \\ &:: \quad
|
||||
r(\Lambda) \mapsto r(\lambda I)
|
||||
\\ ~ \\
|
||||
\text{eval}_{\Lambda \mapsto \lambda I}(\text{charpoly}(B^*)) &=
|
||||
(\lambda I)^2 +
|
||||
\left(\begin{matrix}1 & 1 \\ 1 & 0 \end{matrix}\right)(\lambda I) +
|
||||
\left(\begin{matrix}1 & 0 \\ 0 & 1\end{matrix}\right)
|
||||
\\
|
||||
&=
|
||||
\left(\begin{matrix}
|
||||
\lambda^2 + \lambda + 1 & \lambda \\
|
||||
\lambda & \lambda^2 + 1
|
||||
\end{matrix}\right)
|
||||
\end{align*}
|
||||
$$
|
||||
|
||||
Since a matrix containing polynomials is still a matrix, we can then take its determinant. What pops out is exactly what we were after, and we can arrange our maps into another diagram:
|
||||
|
||||
$$
|
||||
\begin{align*}
|
||||
\det(\text{eval}_{\Lambda \mapsto \lambda I}(\text{charpoly}(B^*))) &=
|
||||
(\lambda^2 + \lambda + 1)(\lambda^2 + 1) - \lambda^2 \\
|
||||
&= \lambda^4 + \lambda^3 + \lambda^2 + \lambda + 1 \\
|
||||
&= \text{charpoly}(\hat B)
|
||||
\end{align*} \\ ~ \\
|
||||
\begin{matrix}
|
||||
& (\mathbb{F}_2 {}^{2 \times 2})^{2 \times 2} &
|
||||
\overset{\text{charpoly}} {\longrightarrow} &
|
||||
(\mathbb{F}_2 {}^{2 \times 2})[\Lambda] \\
|
||||
\\
|
||||
& & &\downarrow & \small \text{eval}_{\Lambda \mapsto \lambda I} \\
|
||||
& | \\
|
||||
\small \text{forget}& | & & (\mathbb{F}_2 [\lambda])^{2 \times 2} \\
|
||||
& \downarrow \\
|
||||
& & & \downarrow & \det \\
|
||||
\\
|
||||
&
|
||||
\mathbb{F}_2 {}^{4 \times 4} &
|
||||
\underset{\text{charpoly}}{\longrightarrow} &
|
||||
\mathbb{F}_2[\lambda] \\
|
||||
\end{matrix} \\ ~ \\
|
||||
\text{charpoly} \circ \text{forget} =
|
||||
\det \circ ~\text{eval}_{\Lambda \mapsto \lambda I} \circ\text{charpoly}
|
||||
$$
|
||||
|
||||
<details>
|
||||
<summary>
|
||||
Haskell demonstration of this commutation
|
||||
</summary>
|
||||
Fortunately, the implementation of `charpoly` using Laplace expansion already works with numeric matrices. Therefore, we need only define the special eval:
|
||||
|
||||
```{.haskell}
|
||||
toMatrixPolynomial :: Num a => Polynomial (Matrix a) -> Matrix (Polynomial a)
|
||||
-- Collect our coefficient matrices into a single matrix of polynomials
|
||||
toMatrixPolynomial (Poly ps) = Mat $ array rs values where
|
||||
-- Technically, we're always working with square matrices, but we should
|
||||
-- always use the largest bounds available.
|
||||
(is,js) = unzip $ map mDims ps
|
||||
rs = ((0,0),(maximum is - 1,maximum js - 1))
|
||||
-- Address a matrix. This needs defaulting to zero to be fully correct
|
||||
-- with respect to the range given by `rs`
|
||||
access b (Mat m) = m!b
|
||||
-- Build the value at an address by addressing over the coefficients
|
||||
-- ps is already in rising coefficient order, so our values are too.
|
||||
values = map (\r -> (r, Poly $ map (access r) $ ps)) (range rs)
|
||||
```
|
||||
|
||||
Now we can simply observe:
|
||||
|
||||
```{.haskell}
|
||||
field4 = [zero 2, eye 2, toMatrix [[0,1],[1,1]], toMatrix [[1,1],[1,0]]]
|
||||
|
||||
mB = toMatrix $ [[field4!!0, field4!!2], [field4!!3, field4!!3]]
|
||||
|
||||
-- >>> mapM_ print $ fromMatrix $ forget mB
|
||||
-- -- [0,0,0,1]
|
||||
-- -- [0,0,1,1]
|
||||
-- -- [1,1,1,1]
|
||||
-- -- [1,0,1,0]
|
||||
|
||||
-- >>> fmap (`mod` 2) $ charpoly $ forget mB
|
||||
-- -- 1x^4 + 1x^3 + 1x^2 + 1x + 1
|
||||
-- >>> fmap (`mod` 2) $ determinant $ toMatrixPolynomial $ charpoly mB
|
||||
-- -- 1x^4 + 1x^3 + 1x^2 + 1x + 1
|
||||
```
|
||||
</details>
|
||||
|
||||
It should be noted that we do *not* get the same results by taking the determinant after applying charpoly\*, indicating that the above method is "correct".
|
||||
|
||||
$$
|
||||
\begin{align*}
|
||||
|
||||
\text{charpoly}^*(B^*) &= \left(\begin{matrix}
|
||||
\lambda^2 & \lambda^2 + \lambda + 1 \\
|
||||
\lambda^2 + \lambda + 1 & \lambda^2 + \lambda + 1
|
||||
\end{matrix}\right)
|
||||
\\ ~ \\
|
||||
\det( \text{charpoly}^*(B^*)) &=
|
||||
\lambda^2(\lambda^2 + \lambda + 1) - (\lambda^2 + \lambda + 1)^2 \\
|
||||
&= \lambda^3 + 1 \mod 2
|
||||
\end{align*}
|
||||
$$
|
||||
|
||||
|
||||
### Cycles and Cycles
|
||||
|
||||
Since we can get *λ*^4^ + *λ*^3^ + *λ*^2^ + *λ* + 1 in two ways, it's natural to assume this polynomial is significant in some way. In the language of the the second post, the polynomial can also be written as ~2~31, whose root we determined was cyclic of order 5. This happens to match the order of *B* in GL(2, 4).
|
||||
|
||||
Perhaps this is unsurprising, since there are only so many polynomials of degree 4 over GF(2). However, the reason we see it is more obvious if we look at the powers of scalar multiples of B. First, recall that *f*\* takes us from matrices over GF(4) to matrices of matrices of GF(2). Then define a map g that gives us degree 4 polynomials:
|
||||
|
||||
$$
|
||||
g : \mathbb{F}_4^{2 \times 2} \rightarrow \mathbb{F}_2[\lambda] \\
|
||||
g = \text{charpoly} \circ \text{forget} \circ f^*
|
||||
\\~ \\
|
||||
\begin{array}{ccc|ccc|ccc}
|
||||
& \scriptsize \left(\begin{matrix}
|
||||
0 & \alpha \\ \alpha^2 & \alpha^2
|
||||
\end{matrix}\right) & &
|
||||
& \scriptsize \left(\begin{matrix}
|
||||
0 & \alpha^2 \\ 1 & 1
|
||||
\end{matrix}\right) & &
|
||||
& \scriptsize \left(\begin{matrix}
|
||||
0 & 1 \\ \alpha & \alpha
|
||||
\end{matrix}\right)
|
||||
\\
|
||||
B &
|
||||
\overset{g}{\mapsto} &
|
||||
11111_\lambda &
|
||||
\alpha B &
|
||||
\overset{g}{\mapsto} &
|
||||
10011_\lambda &
|
||||
\alpha^2 B &
|
||||
\overset{g}{\mapsto} &
|
||||
11001_\lambda
|
||||
\\
|
||||
B^2 &
|
||||
\overset{g}{\mapsto} &
|
||||
11111_\lambda &
|
||||
(\alpha B)^2 &
|
||||
\overset{g}{\mapsto} &
|
||||
10011_\lambda &
|
||||
(\alpha^2 B)^2 &
|
||||
\overset{g}{\mapsto} &
|
||||
11001_\lambda
|
||||
\\
|
||||
B^3 &
|
||||
\overset{g}{\mapsto} &
|
||||
11111_\lambda &
|
||||
(\alpha B)^3 &
|
||||
\overset{g}{\mapsto} &
|
||||
11111_\lambda &
|
||||
(\alpha^2 B)^3 &
|
||||
\overset{g}{\mapsto} &
|
||||
11111_\lambda
|
||||
\\
|
||||
B^4 &
|
||||
\overset{g}{\mapsto} &
|
||||
11111_\lambda &
|
||||
(\alpha B)^4 &
|
||||
\overset{g}{\mapsto} &
|
||||
10011_\lambda &
|
||||
(\alpha^2 B)^4 &
|
||||
\overset{g}{\mapsto} &
|
||||
11001_\lambda
|
||||
\\
|
||||
B^5 &
|
||||
\overset{g}{\mapsto} &
|
||||
10001_\lambda &
|
||||
(\alpha B)^5 &
|
||||
\overset{g}{\mapsto} &
|
||||
10101_\lambda &
|
||||
(\alpha^2 B)^5 &
|
||||
\overset{g}{\mapsto} &
|
||||
10101_\lambda
|
||||
\end{array}
|
||||
$$
|
||||
|
||||
The matrices in the middle and rightmost columns both have order 15 inside GL(2, 4). Correspondingly, both 10011~λ~ = ~2~19 and 11001~λ~ = ~2~25 are primitive, and so have roots of order 15 over GF(2).
|
||||
|
||||
|
||||
### A Field?
|
||||
|
||||
Since we have 15 matrices generated by the powers of one, you might wonder whether or not they can correspond to the nonzero elements of GF(16). And they can! In a sense, we've "borrowed" the order 15 elements from this "field" within GL(4, 2). However, none of the powers of this matrix are the companion matrix of either ~2~19 or ~2~25.
|
||||
|
||||
<details>
|
||||
<summary>
|
||||
Haskell demonstration of the field-like-ness of these matrices
|
||||
</summary>
|
||||
|
||||
All we really need to do is test additive closure, since the powers trivially commute and include the identity matrix.
|
||||
|
||||
```{.haskell}
|
||||
hasAdditiveClosure :: Integral a => Int -> a -> [Matrix a] -> bool
|
||||
-- Check whether n x n matrices (mod p) have additive closure
|
||||
-- Supplement the identity, even if it is not already present
|
||||
hasAdditiveClosure n p xs = all (`elem` xs') sums where
|
||||
-- Add in the zero matrix
|
||||
xs' = zero n:xs
|
||||
-- Calculate all possible sums of pairs (mod p)
|
||||
sums = map (fmap (`mod` p)) $ (+) <$> xs' <*> xs'
|
||||
|
||||
|
||||
generatesField :: Integral a => Int -> a -> Matrix a -> bool
|
||||
-- Generate the powers of x, then test if they form a field (mod p)
|
||||
generatesField n p x = hasAdditiveClosure n p xs where
|
||||
xs = map (fmap (`mod` p) . (x^)) [1..p^n-1]
|
||||
|
||||
alphaB = toMatrix [[zero 2, field4!!3],[eye 2, eye 2]]
|
||||
|
||||
-- >>> mapM_ $ print $ fromMatrix $ forget alphaB
|
||||
-- -- [0,0,1,1]
|
||||
-- -- [0,0,1,0]
|
||||
-- -- [1,0,1,0]
|
||||
-- -- [0,1,0,1]
|
||||
--
|
||||
-- >>> generatesField 4 2 $ forget $ alphaB
|
||||
-- -- True
|
||||
```
|
||||
</details>
|
||||
|
||||
More directly, we might also observe that *α*^2^*B* is the companion matrix of an irreducible polynomial over GF(4), namely *q*(*x*) = *x*^2^ - *αx* - *α*.
|
||||
|
||||
Both the "forgotten" matrices and the aforementioned companion matrices lie within GL(4, 2). A natural question to ask is whether we can make fields by the following process:
|
||||
|
||||
1. Filter out all order-15 elements of GL(4, 2)
|
||||
2. Partition the elements and their powers into their respective order-15 subgroups
|
||||
3. Add the zero matrix into each class
|
||||
4. Check whether all classes are additively closed (and are therefore fields)
|
||||
|
||||
In this case, it happens to be true, but proving this in general is difficult, and I haven't done so.
|
||||
|
||||
|
||||
Expanding Dimensions
|
||||
--------------------
|
||||
|
||||
Of course, we need not only focus on GF(4) -- we can just as easily work over GL(2, 2*r*) for other *r* than 2. In this case, the internal matrices will be *r*×*r* while the external one remains 2×2. But neither do we have to work exclusively with 2×2 matrices -- we can work over GL(*n*, 2^*r*^). In either circumstance, the "borrowing" of elements of larger order still occurs. This is summarized by the following diagram:
|
||||
|
||||
$$
|
||||
\begin{gather*}
|
||||
&& & \scriptsize \text{forget} \circ f_1^* & & \scriptsize f_2 \\
|
||||
\text{SL}(n,2^r) & \hookrightarrow &
|
||||
\text{GL}(n, 2^r) & \hookrightarrow &
|
||||
\text{GL}(nr, 2) &\hookleftarrow & \mathbb{F}_{2^{nr}} \\ ~ \\
|
||||
\underset{\text{order } k}S & &
|
||||
\underset{\text{order } k}S, \underset{\text{order } 2^{nr}-1}T &&&&
|
||||
\underset{\text{order } k}s, \underset{\text{order } 2^{nr}-1}{t}
|
||||
\end{gather*}
|
||||
$$
|
||||
|
||||
Here, *f*~1~ is our map from GF(2^*r*^) to *r*×*r* matrices and *f*~2~ is a similar map. *r* must greater than 1 for us to properly make use of matrix arithmetic. Similarly, *n* must be greater than 1 for the leftmost GL. Thus, *nr* is a composite number. Here, *k* is a proper factor of 2^*nr*^ - 1. In the prior discussion, *k* was 5 and 2^*nr*^ - 1 was 15.
|
||||
|
||||
Recall that primitive polynomials over GF(2^*nr*^) have roots with order 2^*nr*^ - 1. This number can *never* be prime, since Mersenne primes are the only primes of the form 2^*p*^ - 1 -- *p* itself must be prime. Thus, in GL of prime dimensions, we can never loan to a GL over a field of larger order with the same characteristic. Conversely, GL(*nr* + 1, 2) trivially contains GL(*nr*, 2) by fixing a subspace. So we do eventually see elements of order 2^*m*^ - 1 for either prime or composite *m*.
|
||||
|
||||
|
||||
### Other Primes
|
||||
|
||||
This concern about prime dimensions is unique to characteristic 2. For any other prime *p*, *p*^*m*^ - 1 is composite since it is at the very least even. All other remarks about the above diagram should still hold for any other prime *p*.
|
||||
|
||||
In addition, our earlier diagram where we correspond the order of an element in GL(2, 2^2^) with the order of an element in GF(2^2•2^) via the characteristic polynomial also generalizes. Though I have not proven it, I strongly suspect the following diagram commutes, at least in the case where *K* is a finite field:
|
||||
|
||||
$$
|
||||
\begin{matrix}
|
||||
& (K^{r \times r})^{n \times n} &
|
||||
\overset{\text{charpoly}} {\longrightarrow} &
|
||||
(K^{r \times r})[\Lambda] \\
|
||||
\\
|
||||
& & &\downarrow & \small \text{eval}_{\Lambda \mapsto \lambda I} \\
|
||||
& | \\
|
||||
\small \text{forget}& | & & (K [\lambda])^{r \times r} \\
|
||||
& \downarrow \\
|
||||
& & & \downarrow & \det \\
|
||||
\\
|
||||
&
|
||||
K {}^{nr \times nr} &
|
||||
\underset{\text{charpoly}}{\longrightarrow} &
|
||||
K[\lambda] \\
|
||||
\end{matrix}
|
||||
\\ ~ \\
|
||||
\text{charpoly} \circ \text{forget} =
|
||||
\det \circ ~ \text{eval}_{\Lambda \mapsto \lambda I} \circ\text{charpoly}
|
||||
$$
|
||||
|
||||
Over larger primes, the gap between GL and SL may grow ever larger, but SL over a prime power field seems to inject into SL over a prime field. If the above diagram is true, then the prior statement follows.
|
||||
|
||||
|
||||
### Monadicity and Injections
|
||||
|
||||
The action of forgetting the internal structure may sound somewhat familiar if you know your Haskell. Remember that for lists, we can do something similar -- converting `[[1,2,3],[4,5,6]]` to `[1,2,3,4,5,6]` is just a matter of applying `concat`. But this is an instance in which we know lists to behave like a [monad](https://wiki.haskell.org/Monad). Despite being an indecipherable bit of jargon to newcomers, it just means we:
|
||||
|
||||
1. can apply functions inside the structure (for example, to the elements of a list),
|
||||
2. have a sensible injection into the structure (creating singleton lists, called `return`), and
|
||||
3. can reduce two layers to one (concat, or join for monads in general).
|
||||
- Monads are traditionally defined using the operator `>>=`, but `join = (>>= id)`
|
||||
|
||||
Just comparing the types of `join :: Monad m => m (m a) -> m a` and `forget :: Matrix (Matrix a) -> Matrix a` suggests that `Matrix` (meaning square matrices) could be a monad, and further, one which respects addition and multiplication. Of course, **this is only true when our internal matrices are all the same size**. In the above diagrams, this restriction has applied, but should be stated explicitly since no dimension is specified by `Matrix a`.
|
||||
|
||||
However, we run into difficulty at condition 2. For one, only "numbers" (elements of a ring) can go inside matrices. This restricts where monadicity can hold. More importantly, we have a *lot* of freedom in what dimension we choose to inject into. For example, we might pick a `return` that uses 1×1 matrices (which add no additional structure). We might also pick `return2`, which scalar-multiplies its argument to a 2×2 identity matrix instead.
|
||||
|
||||
Unfortunately, there's no good answer. At the very least, we can close our eyes and pretend that we have a nice diagram:
|
||||
|
||||
$$
|
||||
\begin{gather*}
|
||||
\begin{matrix}
|
||||
& L\underset{\text{degree } r}{/} K
|
||||
\\ \\
|
||||
\small f &
|
||||
\begin{matrix}
|
||||
| \\ \downarrow
|
||||
\end{matrix}
|
||||
\\ \\
|
||||
& K^{r \times r}
|
||||
\end{matrix}
|
||||
& \quad & \quad &
|
||||
\begin{matrix}
|
||||
& (L\underset{\text{degree } r}{/} K)^{n \times n}
|
||||
\\ \\
|
||||
\small f^* &
|
||||
\begin{matrix}
|
||||
| \\ \downarrow
|
||||
\end{matrix}
|
||||
& \searrow & \small \texttt{>>=} ~ f \qquad
|
||||
\\ \\
|
||||
& (K^{r \times r})^{n \times n} &
|
||||
\underset{\text{forget}} {\longrightarrow} &
|
||||
K {}^{nr \times nr}
|
||||
\end{matrix}
|
||||
\end{gather*}
|
||||
$$
|
||||
|
||||
As one last note on the monadicity of matrices, I *have* played around with an alternative `Matrix` type which includes scalars alongside proper matrices, which would allow for a simple canonical injection. Unfortunately, it complicates `join` -- we just place the responsibility of sizing the internal matrices front-and-center since we can correspond internal scalars with identity matrices.
|
||||
|
||||
|
||||
Closing
|
||||
-------
|
||||
|
||||
At this point, I've gone on far too long about algebra. One nagging curiosity makes me wonder whether the there are any diagrams like the following:
|
||||
|
||||
$$
|
||||
\begin{matrix}
|
||||
& (L\underset{\text{degree } r}{/} K)^{n \times n} &&&
|
||||
& (L\underset{\text{degree } n}{/} K)^{r \times r}
|
||||
\\ \\
|
||||
\small f_1^* &
|
||||
\begin{matrix}
|
||||
| \\ \downarrow
|
||||
\end{matrix}
|
||||
& \searrow & & \swarrow &
|
||||
\begin{matrix}
|
||||
| \\ \downarrow
|
||||
\end{matrix} & f_2^*
|
||||
\\ \\
|
||||
& (K^{r \times r})^{n \times n} &
|
||||
\underset{\text{forget}} {\longrightarrow} &
|
||||
K {}^{nr \times nr} &
|
||||
\underset{\text{forget}}{\longleftarrow} &
|
||||
(K^{n \times n})^{r \times r}
|
||||
\end{matrix}
|
||||
$$
|
||||
|
||||
Or in English, whether "rebracketing" certain *nr*×*nr* matrices can be traced back to not only a degree *r* field extension, but also one of degree *n*.
|
||||
|
||||
The mathematician in me tells me to believe in well-defined structures. Matrices are one such structure, with myriad applications. However, the computer scientist in me laments that the application of these structures is buried in symbols and that layering them is at most glossed over. There is clear utility and interest in doing so, otherwise the diagrams shown above would not exist.
|
||||
|
||||
Of course, there's plenty of reason *not* to go down this route. For one, it's plainly inefficient -- GPUs are *built* on matrix operations being as efficient as possible, i.e., without the layering. It's also inefficient to learn for people *just* learning matrices. I'd still argue that the method is efficient for learning about more complex topics, like field extensions.
|
||||
428
generating_poly/1/index.qmd
Normal file
@ -0,0 +1,428 @@
|
||||
---
|
||||
format:
|
||||
html:
|
||||
html-math-method: katex
|
||||
---
|
||||
|
||||
<style>
|
||||
.red {
|
||||
color: red;
|
||||
}
|
||||
|
||||
.orange {
|
||||
color: orange;
|
||||
}
|
||||
|
||||
.yellow {
|
||||
color: yellow;
|
||||
}
|
||||
|
||||
.aqua {
|
||||
color: aqua;
|
||||
}
|
||||
|
||||
.green {
|
||||
color: green;
|
||||
}
|
||||
|
||||
.cyan {
|
||||
color: cyan;
|
||||
}
|
||||
|
||||
.blue {
|
||||
color: blue;
|
||||
}
|
||||
|
||||
.purple {
|
||||
color: purple;
|
||||
}
|
||||
</style>
|
||||
|
||||
|
||||
Generating Polynomials, Part 1: Regular Constructibility
|
||||
========================================================
|
||||
|
||||
[Recently](), I used coordinate-free geometry to derive the volumes of the Platonic solids, a problem which was very accessible to the ancient Greeks. On the other hand, they found certain problems regarding which figures can be constructed via compass and straightedge to be very difficult. For example, they struggled with problems like [doubling the cube](https://en.wikipedia.org/wiki/Doubling_the_cube) or [squaring the circle](https://en.wikipedia.org/wiki/Squaring_the_circle), which are known (through circa 19th century mathematics) to be impossible . However, before extending geometry with a third dimension or including the areas of circles in geometry, a simpler problem becomes apparent; namely, what kinds of regular polygons are constructible?
|
||||
|
||||
|
||||
Regular Geometry and a Complex Series
|
||||
-------------------------------------
|
||||
|
||||
When constructing a regular polygon, one wants ratios relating a side, an inradius, and the circumradius. If one of these measurements is declared to be a unit, then only a single ratio is needed, since the other is available through the Pythagorean theorem. This is best exemplified by the following figure
|
||||
|
||||
![]()
|
||||
|
||||
In a convex polygon, the total central angle is always one full turn, or $2\pi$ radians. The central angle of a regular *n*-gon is ${2\pi \over n}$ radians, and the green angle above is half of it. This means that the ratio of half of the side and circumradius is $\sin(\pi / n)$ radians. But how can this quantity be derived?
|
||||
|
||||
Let's turn this question on its head. Let $\theta = \pi / n$, meaning $n\theta = \pi$. Applying sine over this gives $\sin(n\theta) = \sin(\pi) = 0$. Therefore, constructing a polygon is equivalent to solving this equation. It then becomes a question of how to express $\sin(n\theta)$ (and $\cos(n\theta)$).
|
||||
|
||||
Thanks to [Euler's formula](https://en.wikipedia.org/wiki/Euler%27s_formula) and [de Moivre's formula](https://en.wikipedia.org/wiki/De_Moivre%27s_formula), this can be phrased in terms of the complex exponential.
|
||||
|
||||
$$
|
||||
\begin{align*}
|
||||
e^{i\theta} &= \text{cis}(\theta) = \cos(\theta) + i\sin(\theta)
|
||||
& \text{ Euler's formula} \\
|
||||
\text{cis}(n \theta) = e^{i(n\theta)} &= e^{(i\theta)n} = {(e^{i\theta})}^n = \text{cis}(\theta)^n \\
|
||||
\cos(n \theta) + i\sin(n \theta) &= (\cos(\theta) + i\sin(\theta))^n
|
||||
& \text{ de Moivre's formula}
|
||||
\end{align*}
|
||||
$$
|
||||
|
||||
De Moivre's formula for $n = 2$ gives
|
||||
|
||||
$$
|
||||
\begin{align*}
|
||||
\text{cis}(\theta)^2 &= (\text{c} + i\text{s})^2 \\
|
||||
&= \text{c}^2 + 2i\text{cs} - \text{s}^2 + (0 = \text{c}^2 + \text{s}^2 - 1) \\
|
||||
&= 2\text{c}^2 + 2i\text{cs} - 1 \\
|
||||
&= 2\text{c}(\text{c} + i\text{s}) - 1 \\
|
||||
&= 2\cos(\theta)\text{cis}(\theta) - 1 \\
|
||||
\end{align*}
|
||||
$$
|
||||
|
||||
This can easily be massaged into a recurrence relation.
|
||||
|
||||
$$
|
||||
\begin{align*}
|
||||
\text{cis}(\theta)^2 &= 2\cos(\theta)\text{cis}(\theta) - 1 \\
|
||||
\text{cis}(\theta)^{n+2} &= 2\cos(\theta)\text{cis}(\theta)^{n+1} - \text{cis}(\theta)^n \\
|
||||
\text{cis}((n+2)\theta) &= 2\cos(\theta)\text{cis}((n+1)\theta) - \text{cis}(n\theta) \\
|
||||
\end{align*}
|
||||
$$
|
||||
|
||||
Through some fairly straightforward summatory manipulations, the sequence can be interpreted as the coefficients in a Taylor series, giving a [generating function](https://en.wikipedia.org/wiki/Generating_function).
|
||||
|
||||
$$
|
||||
\begin{align*}
|
||||
\sum_{n=0}^\infty \text{cis}((n+2)\theta)x^n
|
||||
&= 2\cos(\theta) \sum_{n=0}^\infty \text{cis}((n+1)\theta) x^n
|
||||
- \sum_{n=0}^\infty \text{cis}(n\theta) x^n \\
|
||||
{F(x; \text{cis}(\theta)) - 1 - x\text{cis}(\theta) \over x^2}
|
||||
&= 2\cos(\theta) {F(x; \text{cis}(\theta)) - 1 \over x}
|
||||
- F(x; \text{cis}(\theta)) \\ \\
|
||||
F - 1 - x\text{cis}(\theta)
|
||||
&= 2\cos(\theta) x (F - 1)
|
||||
- x^2 F \\
|
||||
F - 2\cos(\theta) x F + x^2 F
|
||||
&= 1 + x(\text{cis}(\theta) - 2\cos(\theta)) \\ \\
|
||||
F(x; \text{cis}(\theta))
|
||||
&= {1 + x(\text{cis}(\theta) - 2\cos(\theta)) \over
|
||||
1 - 2\cos(\theta)x + x^2}
|
||||
\end{align*}
|
||||
$$
|
||||
|
||||
Even though the generating function *F* is parametrized by the complex exponential of $\theta$, separating the real and imaginary components reveals an expression in terms of $\cos(\theta)$. This is useful because the real and imaginary parts of *F* correspond to $\cos(n\theta)$ and $\sin(n\theta)$, respectively.
|
||||
|
||||
$$
|
||||
\begin{align*}
|
||||
\Re[ F(x; \text{cis}(\theta)) ] &= {1 + x(\cos(\theta) - 2\cos(\theta)) \over
|
||||
1 - 2\cos(\theta)x + x^2} \\
|
||||
&= {1 - x\cos(\theta) \over 1 - 2\cos(\theta)x + x^2} = A(x; \cos(\theta)) \\
|
||||
\Im[ F(x; \text{cis}(\theta)) ]
|
||||
&= {x \sin(\theta) \over 1 - 2\cos(\theta)x + x^2} = B(x; \cos(\theta))\sin(\theta)
|
||||
\end{align*}
|
||||
$$
|
||||
|
||||
Extracting the coefficients of *x* in *A* and *B* yields an expression for $\cos(n\theta)$ and $\sin(n\theta)$ in terms of $\cos(\theta)$ (and in the latter case, a common factor of $\sin(\theta)$). If $\cos(\theta)$ in *A* and *B* is replaced with the parameter *z*, then all of the trigonometric functions are removed from the equation, and it becomes evident that this relationship is polynomial. This can actually be observed as early as the recurrence relation.
|
||||
|
||||
$$
|
||||
\begin{align*}
|
||||
\text{cis}(\theta)^{n+2} &= 2\cos(\theta)\text{cis}(\theta)^{n+1} - \text{cis}(\theta)^n \\
|
||||
a_{n+2} &= 2 z a_{n+1} - a_n \\
|
||||
\Re[ a_0 ] &= 1,~~ \Im[ a_0 ] = 0 \\
|
||||
\Re[ a_1 ] &= z,~~ \Im[ a_1 ] = 1 \cdot \sin(\theta)
|
||||
\end{align*}
|
||||
$$
|
||||
|
||||
In other words, *A* starts off with $1, z, ...$, and *B* starts off with $0, 1, ...$. These polynomials are [*Chebyshev polynomials*](https://en.wikipedia.org/wiki/Chebyshev_polynomial) *of the first (A) and second (B) kind*. Actually, the polynomials of the second kind are typically not offset (the x in the numerator of *B* is omitted). However, this form makes explicit which polygon (remember? we were working with those) we are considering, and will be important later. For future reference, the first few polynomials of the second kind (at $z / 2$) are:
|
||||
|
||||
| n | $[x^n]B(x; z / 2) = U_{n -\ 1}(z / 2)$ | Factored |
|
||||
|----|-----------------------------------------|---------------------------------------------------|
|
||||
| 0 | 0 | 0 |
|
||||
| 1 | 1 | 1 |
|
||||
| 2 | $z$ | $z$ |
|
||||
| 3 | $z^2 -\ 1$ | $(z -\ 1)(z + 1)$ |
|
||||
| 4 | $z^3 -\ 2z$ | $z(z^2 -\ 2)$ |
|
||||
| 5 | $z^4 -\ 3z^2 + 1$ | $(z^2 -\ z -\ 1)(z^2 + z -\ 1)$ |
|
||||
| 6 | $z^5 -\ 4 z^3 + 3z$ | $z(z^2 -\ 1)(z^2 -\ 3)$ |
|
||||
| 7 | $z^6 -\ 5 z^4 + 6 z^2 -\ 1$ | $(z^3 -\ z^2 -\ 2 z + 1)(z^3 + z^2 -\ 2 z -\ 1)$ |
|
||||
| 8 | $z^7 -\ 6 z^5 + 10 z^3 -\ 4 z$ | $z(z^2 -\ 2)(z^4 -\ 4 z^2 + 2)$ |
|
||||
| 9 | $z^8 -\ 7 z^6 + 15 z^4 -\ 10 z^2 + 1$ | $(z^2 -\ 1)(z^3 -\ 3 z -\ 1)(z^3 -\ 3 z + 1)$ |
|
||||
| 10 | $z^9 -\ 8 z^7 + 21 z^5 -\ 20 z^3 + 5 z$ | $z(z^2 -\ z -\ 1)(z^2 + z -\ 1)(z^4 -\ 5z^2 + 5)$ |
|
||||
|
||||
[OEIS A049310](http://oeis.org/A049310)
|
||||
|
||||
Evaluating the polynomials at $z / 2$ cancels the 2 in the denominator (and recurrence), making these expressions much simpler. This evaluation can also be interpreted intuitively by studying the the previous diagram. Since the side length was bisected by the inradius, the side length in terms of a unit circumradius is $2\sin ({\pi / n} )$. To compensate for this doubling, the Chebyshev polynomial must be evaluated at half its normal argument.
|
||||
|
||||
|
||||
### Back on the Plane
|
||||
|
||||
The constructibility criterion is deeply connected to the Chebyshev polynomials. In compass and straightedge constructions, one only has access to linear forms (lines) and quadratic forms (circles). This means that a figure is constructible if and only if the root can be achieved through normal arithmetic (which is linear) and square roots (which are quadratic).
|
||||
|
||||
Let's look at a regular pentagon. The relevant polynomial is
|
||||
|
||||
$$
|
||||
[x^5]B \left( x; {z \over 2} \right)
|
||||
= z^4 - 3z^2 + 1
|
||||
= (z^2 - z - 1) (z^2 + z - 1)
|
||||
$$
|
||||
|
||||
As a reminder, when $z = 2\cos( \pi / 5 )$, the polynomial evaluates to 0. Also, either factor is the other evaluated at -*z*. Thus, one of the factors in terms is the minimal polynomial of $2\cos(\pi / 5 )$. The former is correct, since $2\cos( \pi / 5 ) = \phi$, the golden ratio.
|
||||
|
||||
An example of where constructability fails is for $2\cos( \pi / 7 )$.
|
||||
|
||||
$$
|
||||
\begin{align*}
|
||||
[x^7]B \left( x; {z \over 2} \right)
|
||||
&= z^6 - 5 z^4 + 6 z^2 - 1 \\
|
||||
&= ( z^3 - z^2 - 2 z + 1 ) (z^3 + z^2 - 2 z - 1 )
|
||||
\end{align*}
|
||||
$$
|
||||
|
||||
Whichever is the minimal polynomial (the former), it is a cubic, and constructing a regular heptagon is equivalent to solving it for *z*. But there are no (nondegenerate) cubics that one can produce via compass and straightedge, and the construction fails.
|
||||
|
||||
One might think the same of $2\cos(\pi /10 )$
|
||||
|
||||
$$
|
||||
\begin{align*}
|
||||
[x^{10}]B \left( x; {z \over 2} \right)
|
||||
&= z^9 - 8 z^7 + 21 z^5 - 20 z^3 + 5 z \\
|
||||
&= z ( z^2 - z - 1 )( z^2 + z - 1 )( z^4 - 5 z^2 + 5 )
|
||||
\end{align*}
|
||||
$$
|
||||
|
||||
This expression also contains the polynomials for $2\cos( \pi / 5 )$. This is because a regular decagon would contain two disjoint regular pentagons, produced by connecting every other vertex.
|
||||
|
||||
![]()
|
||||
|
||||
The polynomial which actually corresponds to $2\cos( \pi / 10 )$ is the quartic, which seems to suggest that it will require a fourth root and somehow decagons will not be constructible. However, it can be solved by completing the square, and we can breathe a sigh of relief.
|
||||
|
||||
$$
|
||||
\begin{align*}
|
||||
z^4 - 5z^2 &= -5 \\
|
||||
z^4 - 5z^2 + (5/2)^2 &= -5 + (5/2)^2 \\
|
||||
( z^2 - 5/2)^2 &= {25 - 20 \over 4} \\
|
||||
( z^2 - 5/2) &= {\sqrt 5 \over 2} \\
|
||||
z^2 &= {5 \over 2} + {\sqrt 5 \over 2} \\
|
||||
z &= \sqrt{ {5 + \sqrt 5 \over 2} }
|
||||
\end{align*}
|
||||
$$
|
||||
|
||||
|
||||
The Triangle behind Regular Polygons
|
||||
------------------------------------
|
||||
|
||||
Preferring *z* to be halved in $B(x; z/2)$ makes something else more evident. Observe these four rows of the Chebyshev polynomials
|
||||
|
||||
| n | $[x^n]B(x; z / 2)$ | k | *m* = 2*k* + 1 | *n* - *m* | $[z^{n -\ m}][x^n]B(x; z / 2)$ |
|
||||
|----|-----------------------------|---|----------------|-----------|--------------------------------|
|
||||
| 4 | $z^3 -\ 2z$ | 0 | 1 | 3 | 1 |
|
||||
| 5 | $z^4 -\ 3z^2 + 1$ | 1 | 3 | 2 | -3 |
|
||||
| 6 | $z^5 -\ 4 z^3 + 3z$ | 2 | 5 | 1 | 3 |
|
||||
| 7 | $z^6 -\ 5 z^4 + 6 z^2 -\ 1$ | 3 | 7 | 0 | -1 |
|
||||
|
||||
The last column looks like an alternating row of Pascal's triangle, and can be expressed as ${n -\ k -\ 1 \choose k}(-1)^k$. This resemblance can be made more apparent by listing the coefficients of the polynomials in a table.
|
||||
|
||||
|
||||
```{python}
|
||||
#| echo: false
|
||||
|
||||
from IPython.display import Markdown
|
||||
from tabulate import tabulate
|
||||
from math import comb
|
||||
|
||||
rainbow = [
|
||||
"",
|
||||
"red",
|
||||
"orange",
|
||||
"yellow",
|
||||
"aqua",
|
||||
"green",
|
||||
"cyan",
|
||||
"blue",
|
||||
"purple"
|
||||
"",
|
||||
"",
|
||||
]
|
||||
|
||||
entry = lambda x, color: f"<span class=\"{rainbow[color]}\">{x}</span>"
|
||||
|
||||
Markdown(tabulate(
|
||||
[
|
||||
[
|
||||
n,
|
||||
*[" " for nm in range(1, 11 - n)],
|
||||
*[
|
||||
0 if k % 2 == 1
|
||||
else entry(
|
||||
comb(n - (k // 2) - 1, nm - (k // 2)) * (-1)**(k // 2),
|
||||
n - (k // 2) - 1,
|
||||
)
|
||||
for nm, k in zip(range(n), range(10))
|
||||
]
|
||||
]
|
||||
for n in range(1, 11)
|
||||
],
|
||||
headers=[
|
||||
"n",
|
||||
*[f"$z^{nm}$" for nm in reversed(range(2, 10))],
|
||||
"$z$",
|
||||
"$1$",
|
||||
],
|
||||
numalign="right",
|
||||
stralign="right",
|
||||
))
|
||||
```
|
||||
|
||||
Though they alternate in sign, the rows of Pascal's triangle appear along diagonals, which I have marked in rainbow. Meanwhile, alternating versions of the naturals (1, 2, 3, 4...), the triangular numbers (1, 3, 6, 10...), the tetrahedral numbers (1, 4, 10, 20...), etc. are present along the columns, albeit spaced out by 0's.
|
||||
|
||||
The relationship of the Chebyshev polynomials to the triangle is easier to see if the coefficient extraction of $B(x; z / 2)$ is reversed.
|
||||
|
||||
$$
|
||||
\begin{align*}
|
||||
B(x; z / 2) &= {x \over 1 - zx + x^2}
|
||||
= {x \over 1 + x^2 - zx}
|
||||
= {x \over 1 + x^2} \cdot
|
||||
{1 \over {1 + x^2 \over 1 + x^2} - z{x \over 1 + x^2}} \\
|
||||
[z^n]B(x; z / 2) &= {x \over 1 + x^2} [z^n] {1 \over 1 - z{x \over 1 + x^2}}
|
||||
= {x \over 1 + x^2} \left( {x \over 1 + x^2} \right)^n \\
|
||||
&= \left( {x \over 1 + x^2} \right)^{n+1}
|
||||
= x^{n+1} (1 + x^2)^{-n - 1} \\
|
||||
&= x^{n+1} \sum_{k=0}^\infty {-n - 1 \choose k}(x^2)^k
|
||||
\end{align*}
|
||||
$$
|
||||
|
||||
While the use of the binomial theorem in $1 + x^2$ is more than enough to justify the appearance of Pascal's triangle (along with explaining the 0's), I will press onward until it becomes excruciatingly obvious.
|
||||
|
||||
$$
|
||||
\begin{align*}
|
||||
{(-n - 1)_k} &= (-n - 1)(-n - 2) \cdots (-n - k) \\
|
||||
&= (-1)^k (n + k)(n + k - 1) \cdots (n + 1) \\
|
||||
&= (-1)^k (n + k)_k \\
|
||||
\implies {-n - 1 \choose k}
|
||||
&= {n + k \choose k}(-1)^k \\ \\
|
||||
[z^n]B(x; z / 2) &= x^{n+1} \sum_{k=0}^\infty {n + k \choose k} (-1)^k x^{2k} \\
|
||||
\end{align*}
|
||||
$$
|
||||
|
||||
Squinting hard enough, the binomial coefficient is similar to the earlier which gave the third row of Pascal's triangle. If k is fixed, then this expression actually generates the antidiagonal entries of the coefficient table, which are the columns with uniform sign. The alternation instead occurs between antidiagonals (one is all positive, the next is 0's, the next is all negative, etc.). The initial $x^{n+1}$ lags these sequences so that they reproduce the triangle.
|
||||
|
||||
|
||||
### Imagined Transmutation
|
||||
|
||||
The generating function of the Chebyshev polynomials resembles other two term recurrences. This resemblance can be made explicit with a simple algebraic manipulation.
|
||||
|
||||
$$
|
||||
\begin{align*}
|
||||
B(ix; -iz / 2) &= {1 \over 1 -\ (-i z)(ix) + (ix)^2}
|
||||
= {1 \over 1 -\ (-i^2) z x + (i^2)(x^2)} \\
|
||||
&= {1 \over 1 -\ z x -\ x^2}
|
||||
\end{align*}
|
||||
$$
|
||||
|
||||
The poles of this expression are the reciprocals and additive inverses of the metallic means. For example, if $z = 1$, then the denominator is $1 -\ x -\ x^2$, which has $1 / \phi$ as a root. Equally well, it is also a generating function of the Fibonacci numbers. The same can be said for the silver ratio and Pell numbers, and so on for higher $z$.
|
||||
|
||||
In terms of the Chebyshev polynomials, this removes the alternation in the coefficients of $U_n$, and restores Pascal's triangle to its nonalternating form. Related to the previous point, it is possible to find the Fibonacci numbers (Pell numbers, etc.) in Pascal's triangle, which you can read more about [here](http://users.dimi.uniud.it/~giacomo.dellariccia/Glossary/Pascal/Koshy2011.pdf).
|
||||
|
||||
|
||||
Manipulating the Series
|
||||
-----------------------
|
||||
|
||||
### Total Degrees
|
||||
|
||||
Look back to the table of $U_{n -\ 1}(z / 2)$. When I brought up decagons, I pointed out their relationship to pentagons as an explanation for why $U_{5 -\ 1}(z / 2)$ appears as a factor. Conveniently, $U_{2 -\ 1}(z / 2)$ is also a factor, and 10 is an even number. This pattern is present throughout the table; $n = 6$ contains factors for $n = 2 \text{ and } 3$ and the prime numbers have no smaller factors. If this observation is legitimate, call the factor polynomials $f_n(z)$ and denote $p_n(z) = U_{n -\ 1}( z / 2 )$.
|
||||
|
||||
It can also be observed that a factor is either symmetric ($g(z) = g(-z)$), or is the product of another polynomial and its reflection, potentially negated. For example, $p_9(z) = f_3(z) \cdot g_9(z) \cdot -g_9(-z)$, where $g_9(z) = z^3 -\ 3z -\ 1$. These reflections are necessary for $n = 3, 5, 7, 9$, strongly implying that it occurs on the odd terms.
|
||||
|
||||
In other words, if $f_n$ is the new polynomial introduced by $p_n$ of, then denote its conditional factorization $g_n$.
|
||||
|
||||
$$
|
||||
f_n(z) = \begin{cases}
|
||||
g_n(z) & n \text{ is even} \\
|
||||
g_n(z)g_n(-z) & \text{$n$ is odd and ${\deg(f_n) \over 2}$ is even } \\
|
||||
-g_n(z)g_n(-z) & \text{otherwise}
|
||||
\end{cases}
|
||||
$$
|
||||
|
||||
The final case seems to be tied to [OEIS A004614](http://oeis.org/A004614), which are primes of the form $4k+3$ and products thereof.
|
||||
|
||||
Without resorting to any advanced techniques, the degrees of $f_n$ are not too difficult to work out. The degree of $p_n(z)$ is $n -\ 1$, which is also the degree of $f_n(z)$ if *n* is prime. If *n* is composite, then the degree of $f_n(z)$ is $n -\ 1$ minus the degrees of the divisors of $n -\ 1$. This leaves behind how many numbers less than *n* are coprime to *n*. Therefore $\deg(f_n) = \varphi(n)$, the Euler totient function.
|
||||
|
||||
The totient function can be used to examine the parity of *n*. If *n* is odd, it is coprime to 2 and all even numbers. The introduced factor of 2 to 2*n* removes the evens from the totient, but this is compensated by the addition of the odd multiples of old numbers coprime to *n* and new primes. This means that $\varphi(2n) = \varphi(n)$ for odd *n* ($n \neq 1$).
|
||||
|
||||
The same argument can be used for even *n*: there are as many odd numbers from 0 to *n* as there are from *n* to 2*n*, and there are an equal number of numbers coprime to 2*n* in either interval. Therefore, $\varphi(2n) = 2\varphi(n)$ for even *n*.
|
||||
|
||||
This collapses the cases of the conditional factorization of $f_n$ into one, and the degrees of $g_n$ are
|
||||
|
||||
$$
|
||||
\begin{align*} \deg( g_n(z) ) &= \begin{cases}
|
||||
\deg( f_n(z) ) = \varphi(n) & n \text{ is even} & \implies \varphi(2n) / 2 \\
|
||||
\deg( f_n(z) ) / 2= \varphi(n) / 2 & n \text{ is odd} & \implies \varphi(2n) / 2 \\
|
||||
\end{cases} \\
|
||||
&= \varphi(2n) / 2
|
||||
\end{align*}
|
||||
$$
|
||||
|
||||
Though they were present in the earlier Chebyshev table, the $g_n$ themselves are presented again, along with the expression for their degree
|
||||
|
||||
|
||||
| n | $\varphi(2n)/2$ | $g_n(z)$ | Coefficient List, Rising Powers |
|
||||
|----|-----------------------------------------|------------------------|-----------------------------------------|
|
||||
| 2 | 1 | $z$ | [0, 1] |
|
||||
| 3 | 1 | $z -\ 1$ | [-1, 1] |
|
||||
| 4 | 2 | $z^2 -\ 2$ | [-2, 0, 1] |
|
||||
| 5 | 2 | $z^2 -\ z -\ 1$ | [-1, -1, 1] |
|
||||
| 6 | 2 | $z^2 -\ 3$ | [-2, 0, 1] |
|
||||
| 7 | 3 | $z^3 -\ z^2 -\ 2z + 1$ | [1, -2, -1, 1] |
|
||||
| 8 | 4 | $z^4 -\ 4z^2 + 2$ | [2, 0, -4, 0, 1] |
|
||||
| 9 | 3 | $z^3 -\ 3z + 1$ | [1, -3, 0, 1] |
|
||||
| 10 | 4 | $z^4 -\ 5z^2 + 5$ | [5, 0, -5, 0, 1] |
|
||||
| | [OEIS A055034](http://oeis.org/A055034) | | [OEIS A187360](http://oeis.org/A187360) |
|
||||
|
||||
|
||||
### Attempts to Factor
|
||||
|
||||
The relationship between $p_n$ and the intermediate $f_d$, where *d* is a divisor of *n*, can be made explicit by a [Moebius inversion](https://en.wikipedia.org/wiki/M%C3%B6bius_inversion_formula).
|
||||
|
||||
$$
|
||||
\begin{align*}
|
||||
p_n(z) &= \prod_{d|n} f_n(z) \\
|
||||
\log( p_n(z) ) &= \log \left( \prod_{d|n} f_d(z) \right)
|
||||
= \sum_{d|n} \log( f_d(z) ) \\
|
||||
\log( f_n(z) ) &= \sum_{d|n} {\mu \left({n \over d}\right)}
|
||||
\log( p_d(z) ) \\
|
||||
f_n(z) &= \prod_{d|n} p_d(z)^{\mu \left({n \over d}\right)} \\ \\
|
||||
f_6(z) = g_6(z) &= p_6(z)^{\mu(1)}
|
||||
p_3(z)^{\mu(2)}
|
||||
p_2(z)^{\mu(3)} \\
|
||||
&= {p_6(z) \over p_3(z) p_2(z)} \\
|
||||
\end{align*}
|
||||
$$
|
||||
|
||||
Mobius inversion by means of [Dirichlet generating functions](https://en.wikipedia.org/wiki/Dirichlet_series#Formal_Dirichlet_series) is algebraically clear. But moving from $f_n$ to $g_n$ is not easy. $\varphi(n)$ can also be easily expressed by in the Dirichlet world (it is $\zeta(s -\ 1) / \zeta(s)$, where $\zeta$ is the Riemann zeta function), which is useful for knowing when to negate a term. However, the move which doubles the argument of $\varphi$ is difficult to perform in terms of a Dirichlet series, and leaves me stuck.
|
||||
|
||||
Even reformatting as a [Lambert series](https://en.wikipedia.org/wiki/Lambert_series) (another kind amenable to Moebius inversion) doesn't provide any intuition, since the product relationship between the polynomials necessitates a logarithm. If you're in the mood for awful-looking math, it is
|
||||
|
||||
$$
|
||||
\begin{align*}
|
||||
\log( p_n(z) ) &= \sum_{d|n} \log( f_d(z) ) \\
|
||||
\sum_{n = 1}^\infty \log( p_n ) x^n
|
||||
&= \sum_{n = 1}^\infty \sum_{d|n} \log( f_d ) x^n \\
|
||||
&= \sum_{k = 1}^\infty \sum_{m = 1}^\infty \log( f_m ) x^{m k} \\
|
||||
&= \sum_{m = 1}^\infty \log( f_m ) \sum_{k = 1}^\infty (x^m)^k \\
|
||||
&= \sum_{m = 1}^\infty \log( f_m ) {x^m \over 1 - x^m} \\
|
||||
\prod_{n = 1}^\infty p_n(z)^{(x^n)} &= \prod_{n = 1}^\infty f_n(z)^{\left({x^n \over 1 - x^n}\right)}
|
||||
\end{align*}
|
||||
$$
|
||||
|
||||
Either way, the number-theoretic properties of this sequence are very difficult to ascertain without advanced techniques. If research has been done, it is not easily available in the OEIS.
|
||||
|
||||
|
||||
Closing
|
||||
-------
|
||||
|
||||
My initial jumping off point for writing this article was completely different. However, in the process of writing, its share of the article shrank and shrank until its introduction was only vaguely related to what preceded it. But alas, the introduction via geometric constructions flows better coming off my [post about the Platonic solids](). As well, it reads better if I rely less on "if you search for this sequence of numbers" and more on how to interpret the definition. Consider reading [the follow-up]() to this post if you're interested in another way one can obtain the Chebyshev polynomials.
|
||||
|
||||
Diagrams created with GeoGebra.
|
||||
|
||||
Update: I have since rederived the Chebyshev polynomials without the complex exponential, which you can read about in [this post]().
|
||||
327
generating_poly/2/index.qmd
Normal file
@ -0,0 +1,327 @@
|
||||
---
|
||||
format:
|
||||
html:
|
||||
html-math-method: katex
|
||||
---
|
||||
|
||||
|
||||
Generating Polynomials, Part 2: Ghostly Chains
|
||||
==============================================
|
||||
|
||||
In the [previous post](), I tied the geometry regular polygons to a sequence of polynomials though some clever algebraic manipulation. But let's deign to ask a very basic question: what is a polygon?
|
||||
|
||||
Fundamentally, it is just a collection of vertices and edges. Each vertex is connected to its two neighbors by two edges. Only examining these figures by their connectedness is precisely the kind of thing *graph theory* deals with. Graph can seem like a strange name, as it has no relation to the familiar graphs on a Cartesian plane one may be familiar with. Either way, it is a worthy subject of study, and will be the focus of this article.
|
||||
|
||||
|
||||
Loops without Distance
|
||||
----------------------
|
||||
|
||||
For polygons in a Euclidean setting, the position of points matters, as well as which points connect to which. A rectangle is different from a trapezoid or a kite. However, topologically, all of these are quadrilateral graphs and cannot be distinguished; they are but a simple notion of 4 points in a loop.
|
||||
|
||||
![]()
|
||||
|
||||
From a graph theory perspective, the vertices are sometimes called nodes. In these graphs, each edge has no direction associated to it, so the graph is called *undirected*. Additionally, these graphs are *planar* since the nodes can be arranged so that no nodes cross another, despite the appearance of the lower-right figure.
|
||||
|
||||
If the graph is a simple loop, it is called a [*cycle graph*](https://en.wikipedia.org/wiki/Cycle_graph), denoted $C_n$, where n is the number of nodes. In a cycle graph, all nodes and all edges are identical to each of the others. Therefore, the best geometric interpretation is a shape which is
|
||||
|
||||
- Regular, so that each edge and each angle (vertex) are of equal measure
|
||||
- Convex, so that no edge meets another without creating a vertex (or node)
|
||||
|
||||
In other words, $C_3$ is analogous to an equilateral triangle, $C_4$ is analogous to a square, and so on.
|
||||
|
||||
|
||||
### Encoding Graphs
|
||||
|
||||
There are two primary ways to store information about a graph. The first is by labelling each node (for example, with integers), then recording the edges as a list of pairs of connected nodes. In the case of an undirected graph, these are unordered pairs. While such a list is convenient, it doesn't convey a lot of information about the graph besides the number of edges.
|
||||
|
||||
Alternatively, these pairs can also be interpreted as addresses in a matrix, called an *adjacency matrix*.
|
||||
|
||||
$$
|
||||
\begin{align*}
|
||||
C_3 := \begin{matrix} [(0, 1),\\ (1, 2),\\ (2, 0)] \end{matrix} &\cong
|
||||
\begin{pmatrix} 0 & 1 & 1 \\ 1 & 0 & 1 \\ 1 & 1 & 0 \end{pmatrix} \\ \\
|
||||
C_4 := \begin{matrix} [(0, 1),\\ (1, 2),\\ (2, 3),\\ (3, 0)] \end{matrix} & \cong
|
||||
\begin{pmatrix} 0 & 1 & 0 & 1 \\ 1 & 0 & 1 & 0 \\ 0 & 1 & 0 & 1 \\ 1 & 0 & 1 & 0 \end{pmatrix} \\ \\
|
||||
C_5 := \begin{matrix} [(0, 1),\\ (1, 2),\\ (2, 3),\\ (3, 4),\\ (4, 0)] \end{matrix} &\cong
|
||||
\begin{pmatrix} 0 & 1 & 0 & 0 & 1 \\ 1 & 0 & 1 & 0 & 0 \\
|
||||
0 & 1 & 0 & 1 & 0 \\ 0 & 0 & 1 & 0 & 1 \\ 1 & 0 & 0 & 1 & 0 \end{pmatrix} \\
|
||||
\end{align*}
|
||||
$$
|
||||
|
||||
Each adjacency matrix is square, where each column and row refer to a specific node. An entry is 1 when the nodes corresponding to the row and column of its address are joined by an edge (and zero otherwise). For undirected graphs, these matrices are symmetric, since it is possible to traverse an edge in either direction.
|
||||
|
||||
Swapping the labels on two nodes is as simple as exchanging two rows and two columns. Just one of these swaps would flip the sign of the determinant of the adjacency matrix. However, since they occur in pairs, the determinant is invariant of the labelling (equally, a graph invariant).
|
||||
|
||||
|
||||
Prismatic Recurrence
|
||||
--------------------
|
||||
|
||||
The determinant of a matrix is also the product of its eigenvalues, which are another matrix invariant. The set of eigenvalues is also called its *spectrum*, and the study of the spectra of graphs is called [*spectral graph theory*](https://en.wikipedia.org/wiki/Spectral_graph_theory), which is among the most mystifying names in math to read for the first time.
|
||||
|
||||
Eigenvalues are the roots of the characteristic polynomial of a matrix. The matrix $C_5$ is sufficiently large enough to generalize to $C_n$, and its characteristic polynomial by [Laplace expansion](https://en.wikipedia.org/wiki/Laplace_expansion) is:
|
||||
|
||||
$$
|
||||
\begin{gather*}
|
||||
Ax = \lambda x \implies (\lambda I - A)x = 0 \\ \\
|
||||
c_5(\lambda) = |\lambda I - C_5| = \left |
|
||||
\begin{matrix} \lambda & -1 & 0 & 0 & -1 \\ -1 & \lambda & -1 & 0 & 0 \\
|
||||
0 & -1 & \lambda & -1 & 0 \\ 0 & 0 & -1 & \lambda & -1 \\ -1 & 0 & 0 & -1 & \lambda \end{matrix}
|
||||
\right | \\
|
||||
= \lambda m_{1,1}
|
||||
+ \overbrace{(-1)}^\text{entry}\overbrace{(-1)^{1 + 2 \ }}^\text{sign} m_{1, 2}
|
||||
+ \overbrace{(-1)}^\text{entry}\overbrace{(-1)^{1 + 5 \ }}^\text{sign} m_{1, 5}
|
||||
\end{gather*}
|
||||
$$
|
||||
|
||||
Note that every occurrence of "5" generalizes to higher *n*. The first minor is easily expressed in terms of *another* matrix's characteristic polynomial.
|
||||
|
||||
$$
|
||||
m_{1, 1} = \left |
|
||||
\begin{matrix} \lambda & -1 & 0 & 0 \\ -1 & \lambda & -1 & 0 \\
|
||||
0 & -1 & \lambda & -1 \\ 0 & 0 & -1 & \lambda \end{matrix}
|
||||
\right | = |\lambda I - P_4| = p_{5-1}(\lambda)
|
||||
$$
|
||||
|
||||
We will come to the meaning of the $P_n$ in a moment. Meanwhile, the second and third minors require another expansion, but one that (thankfully) quickly terminates.
|
||||
|
||||
$$
|
||||
\begin{matrix}
|
||||
m_{1, 2} =& \left |
|
||||
\begin{matrix}-1 & -1 & 0 & 0 \\ 0 & \lambda & -1 & 0 \\
|
||||
0 & -1 & \lambda & -1 \\ -1 & 0 & -1 & \lambda \end{matrix}
|
||||
\right | &=& (-1) \left |
|
||||
\begin{matrix}\lambda & -1 & 0 \\ -1 & \lambda & -1 \\ 0 & -1 & \lambda \end{matrix}
|
||||
\right | &+& (-1)(-1)^{1 + 4} \left |
|
||||
\begin{matrix}-1 & 0 & 0 \\\lambda & -1 & 0 \\ -1 & \lambda & -1 \end{matrix}
|
||||
\right | \\
|
||||
&&=& (-1)|\lambda I - P_3| &+& (-1)\overbrace{(-1)^{5}(-1)^{5 - 2}}^{\text{even, even when $\scriptsize n \neq 5$}} \\
|
||||
&&=& ((-1)p_{5 - 2}(\lambda) &+& (-1)) \\
|
||||
&&=& -(p_{5 - 2}(\lambda) &+& 1) \\
|
||||
\\
|
||||
m_{1, 5} =& \left |
|
||||
\begin{matrix}-1 & \lambda & -1 & 0 \\ 0 & -1 & \lambda & -1 \\
|
||||
0 & 0 & -1 & \lambda \\ -1 & 0 & 0 & -1 \end{matrix}
|
||||
\right | &=& (-1) \left |
|
||||
\begin{matrix}-1 & \lambda & -1 \\ 0 & -1 & \lambda \\ 0 & 0 & -1 \end{matrix}
|
||||
\right | &+& (-1)(-1)^{5 - 2} \left |
|
||||
\begin{matrix}\lambda & -1 & 0 \\ -1 & \lambda & -1 \\
|
||||
0 & -1 & \lambda \end{matrix}
|
||||
\right | \\
|
||||
&&=& (-1)(-1)^{5-2} &+& (-1)(-1)^{5 - 2}|\lambda I - P_3| \\
|
||||
&&=& (-1)^{5-1}((-1)(-1) &+& (-1)(-1)p_{5 - 2}(\lambda)) \\
|
||||
&&=& (-1)^{5-1}(1 &+& p_{5 - 2}(\lambda))
|
||||
\end{matrix}
|
||||
$$
|
||||
|
||||
All together, this produces a characteristic polynomial in terms of the polynomials $p_n$:
|
||||
|
||||
$$
|
||||
\begin{align*}
|
||||
&&c_5(\lambda) &= \lambda p_{5 - 1}
|
||||
+ (-1)(p_{5 - 2} + 1)
|
||||
+ (-1)\overbrace{(-1)^{5 - 1} (-1)^{5 - 1}}^{\text{even, even when $\scriptsize n \neq 5$}}(p_{5 - 2} + 1) \\
|
||||
&&&= \lambda p_{5 - 1}
|
||||
- (p_{5 - 2} + 1)
|
||||
- (p_{5 - 2} + 1) \\
|
||||
&&&= \lambda p_{5 - 1}
|
||||
- 2(p_{5 - 2} + 1) \\
|
||||
&&\implies c_n(\lambda) &= \lambda p_{n - 1}(\lambda)
|
||||
- 2(p_{n - 2}(\lambda) + 1) \\
|
||||
\end{align*}
|
||||
$$
|
||||
|
||||
This resembles a recurrence relation, which is great, but it is meaningless without knowing $p_n$.
|
||||
|
||||
|
||||
Powerful Chains
|
||||
---------------
|
||||
|
||||
The various $P_n$ are in fact the adjacency matrices of a path on *n* nodes.
|
||||
|
||||
![]()
|
||||
|
||||
$$
|
||||
\begin{align*}
|
||||
P_2 &:= \begin{matrix} [(0, 1)] \end{matrix} \cong
|
||||
\begin{pmatrix} 0 & 1 \\ 1 & 0 \end{pmatrix} \\
|
||||
P_3 &:= \begin{matrix} [(0, 1),\\ (1, 2)] \end{matrix} \cong
|
||||
\begin{pmatrix} 0 & 1 & 0 \\ 1 & 0 & 1 \\ 0 & 1 & 0 \end{pmatrix} \\
|
||||
P_4 &:= \begin{matrix} [(0, 1),\\ (1, 2),\\ (2, 3)] \end{matrix} \cong
|
||||
\begin{pmatrix} 0 & 1 & 0 & 0 \\ 1 & 0 & 1 & 0 \\ 0 & 1 & 0 & 1 \\ 0 & 0 & 1 & 0 \end{pmatrix} \\ \\
|
||||
\end{align*}
|
||||
$$
|
||||
|
||||
Without the entries in the corners of the matrix, the characteristic polynomials of $P_n$ are much easier to solve for.
|
||||
|
||||
$$
|
||||
\begin{gather*}
|
||||
p_4(\lambda) = |\lambda I - P_4| = \left |
|
||||
\begin{matrix} \lambda & -1 & 0 & 0 \\ -1 & \lambda & -1 & 0 \\
|
||||
0 & -1 & \lambda & -1 \\ 0 & 0 & -1 & \lambda \end{matrix}
|
||||
\right | \\ \\
|
||||
= \lambda \left |
|
||||
\begin{matrix} \lambda & -1 & 0 \\ -1 & \lambda & -1 \\ 0 & -1 & \lambda \end{matrix}
|
||||
\right | + (-1)(-1)^{1+2} \left |
|
||||
\begin{matrix} -1 & -1 & 0 \\ 0 & \lambda & -1 \\ 0 & -1 & \lambda \end{matrix}
|
||||
\right | \\ \\
|
||||
= \lambda |\lambda I - P_3| + \left ( (-1) \left |
|
||||
\begin{matrix} \lambda & -1 \\ -1 & \lambda \end{matrix}
|
||||
\right | + (-1)(-1) \left |
|
||||
\begin{matrix} 0 & -1 \\ 0 & \lambda \end{matrix}
|
||||
\right | \right) \\ \\
|
||||
= \lambda |\lambda I - P_3| - |\lambda I - P_2| \\
|
||||
= \lambda p_{4 - 1}(\lambda) - p_{4 - 2}(\lambda) \\
|
||||
\implies p_{n}(\lambda) = \lambda p_{n - 1}(\lambda) - p_{n - 2}(\lambda)
|
||||
\end{gather*}
|
||||
$$
|
||||
|
||||
While the earlier equation for $c_n$ in terms of $p_n$ reminded of a recurrence relation, actually is one (if perhaps eerily familiar).
|
||||
|
||||
Since the recurrence has order 2, it requires two initial terms: $p_0$ and $p_1$. The graph corresponding to $p_1$ is a single node, not connected to anything. Therefore, its adjacency matrix is a 1x1 matrix with 0 as its only entry, and its characteristic polynomial is $\lambda$. By the recurrence, $p_2 = \lambda p_1 -\ p_0 = \lambda^2 -\ p_0$. Equating terms with the characteristic polynomial of $P_2$, it is obvious that
|
||||
|
||||
$$
|
||||
|\lambda I - P_2| = \begin{pmatrix}\lambda & -1 \\ -1 & \lambda \end{pmatrix}
|
||||
= \lambda^2 - 1 = \lambda p_1 - p_0 \\
|
||||
\implies p_0 = 1
|
||||
$$
|
||||
|
||||
which makes sense, since $p_0$ should have degree zero. Therefore, the sequence of polynomials $p_n(\lambda)$ is:
|
||||
|
||||
$$
|
||||
\begin{gather*}
|
||||
p_0(\lambda) =& && 1 \\
|
||||
p_1(\lambda) =& && \lambda \\
|
||||
p_2(\lambda) =& \lambda \lambda - 1 &=& \lambda^2 - 1 \\
|
||||
p_3(\lambda) =& \lambda (\lambda^2 - 1) - \lambda &=& \lambda(\lambda^2 - 2) \\
|
||||
p_4(\lambda) =& \lambda (\lambda(\lambda^2 - 2)) - (\lambda^2 - 1)
|
||||
&=& \lambda^4 - 3\lambda^2 + 1 \\
|
||||
\vdots&\vdots&&\vdots
|
||||
\end{gather*}
|
||||
$$
|
||||
|
||||
But wait, we've seen these before (if you read the previous post, that is). These are just the Chebyshev polynomials of the second kind, evaluated at $\lambda / 2$. Indeed, their recurrence relations are identical, and the characteristic polynomial of $P_n$ is $U_n(\lambda / 2)$. Effectively, this connects an n-path to a regular $n+1$-gon.
|
||||
|
||||
Since the generating function of $U_n$ is known, the generating function for the $c_n$ which prompted this is also easily determined. For ease of use, let
|
||||
|
||||
$$
|
||||
P(x; \lambda) = {B(x; \lambda / 2) \over x} = {1 \over 1 - \lambda x +\ x^2}
|
||||
$$
|
||||
|
||||
Discarding the initial $c_0$ and $c_1$ by setting them to 0, the generating function is
|
||||
|
||||
$$
|
||||
\begin{align*}
|
||||
c_{n+2}(\lambda) &= \lambda p_{n+1}(\lambda) - 2(p_n(\lambda) + 1) \\ \\
|
||||
{C(x; \lambda) - c_0(\lambda) - x c_1(\lambda) \over x^2}
|
||||
&= \lambda \left( {P(x; \lambda) - 1 \over x} \right)
|
||||
- 2\left( P(x; \lambda) + {1 \over 1 - x} \right) \\
|
||||
C &= x \lambda (P - 1) -\
|
||||
2x^2\left( P + {1 \over 1 - x} \right) \\
|
||||
C{(1 - x) \over P} &= x \lambda \left(1 - {1 \over P} \right)(1 - x) -\
|
||||
2x^2\left( (1 - x) + {1 \over P} \right) \\
|
||||
&= x^4 \lambda - 2 x^4 - x^3 \lambda^2 + x^3 \lambda
|
||||
+ 2 x^3 + x^2 \lambda^2 - 4 x^2 \\
|
||||
&= x^2 (\lambda - 2) (x^2 - \lambda x - x + \lambda + 2) \\ \\
|
||||
C(x; \lambda) &= x^2 (\lambda - 2)
|
||||
{(x^2 - (\lambda + 1) x + \lambda + 2)
|
||||
\over (1 - x)(1 - \lambda x + x^2)}
|
||||
\end{align*}
|
||||
$$
|
||||
|
||||
While the numerator is considerably more complicated than the one for P, the factor $\lambda -\ 2$ drops out of the entire series, pleasantly informing that 2 is an eigenvalue of all $C_n$.
|
||||
|
||||
|
||||
Some other Exceptional Graphs
|
||||
-----------------------------
|
||||
|
||||
And now for something completely different (and which prompted me to research this topic in the first place). Another simple family of graphs are [*trees*](https://en.wikipedia.org/wiki/Tree_%28graph_theory%29). They are in some sense opposite to the cycle graphs, since they contain no cycles.
|
||||
|
||||
|
||||
### Platonic Trees
|
||||
|
||||
Of trees, three small ones (which are not also paths) stand out. They are based on the [Schläfli symbols](https://en.wikipedia.org/wiki/Schl%C3%A4fli_symbol) of the Platonic solids. These expressions convey which regular polygon is present, and how many of them are found at every vertex.
|
||||
|
||||
- Tetrahedron: {3, 3}
|
||||
- Equilateral triangles, three around a vertex
|
||||
- Octahedron: {3, 4}
|
||||
- Equilateral triangles, four around a vertex
|
||||
- Icosahedron: {3, 5}
|
||||
- Equilateral triangles, five around a vertex
|
||||
- Cube: {4, 3}
|
||||
- Squares, three around a vertex
|
||||
- Dodecahdedron: {5, 3}
|
||||
- Regular pentagons, three around a vertex
|
||||
|
||||
Each edge in a Platonic solid connects two faces, which gives a third parameter of 2. From each parameter, create a $n-1$-path, and join the three to a central node. Intuitively, this is because we have shown that $n-1$-paths are related to regular *n*-gons, which show up in the pairs of dual Platonic solids.
|
||||
|
||||
::: {}
|
||||
![]()
|
||||
Adjacency matrices of T as a heatmap. Purple is 0, yellow is 1.
|
||||
:::
|
||||
|
||||
Dispensing with the Laplace expansion and finding a recurrence relation, the characteristic polynomials for each of the three trees is
|
||||
|
||||
$$
|
||||
\begin{align*}
|
||||
|\lambda I - T_{3,3}| = t_{3,3}(\lambda)
|
||||
&= \lambda^{6} - 5 \lambda^{4} + 5 \lambda^{2} - 1 \\
|
||||
&= (\lambda - 1) (\lambda + 1) (\lambda^{4} - 4 \lambda^{2} + 1) \\
|
||||
|\lambda I - T_{3,4}| = t_{3,4}(\lambda)
|
||||
&= \lambda^{7} - 6 \lambda^{5} + 9 \lambda^{3} - 3 \lambda \\
|
||||
&= \lambda (\lambda^{6} - 6 \lambda^{4} + 9 \lambda^{2} - 3) \\
|
||||
|\lambda I - T_{3,5}| = t_{3,5}(\lambda)
|
||||
&= \lambda^{8} - 7 \lambda^{6} + 14 \lambda^{4} - 8 \lambda^{2} + 1
|
||||
\end{align*}
|
||||
$$
|
||||
|
||||
Searching the OEIS for the coefficients of $t_{3,5}$ returns sequence [A228786](http://oeis.org/A228786), which informs that it is the minimal polynomial of $2\sin( \pi/15 )$. This sequence also informs that, where $m_n$ is the minimal polynomial of $2\sin( \pi / n )$:
|
||||
|
||||
- $t_{3,3} = m_6(\lambda) \cdot -m_6(-\lambda) \cdot m_{12}(\lambda)$
|
||||
- $t_{3,4} = m_1(\lambda) \cdot m_9(\lambda)$
|
||||
|
||||
Perhaps this is not surprising, given how $2\cos(\pi / n)$ also appear in the spectra of graphs. However, I am perplexed by the apparent relationship of tetrahedra to dodecagons, octahedra to enneagons, and icosahedra to 15-gons. It is also strange that 9 is *not* related to the smallest Platonic solid, and is sandwiched between 12 and 15.
|
||||
|
||||
|
||||
### Wooden Tiles
|
||||
|
||||
Platonic solids can be seen as regular tilings of the sphere. Schläfli symbols also exist for the regular tilings of the plane (which can also tile the torus, another topologically significant object).
|
||||
|
||||
- Triangular tiling: {3, 6}
|
||||
- Equilateral triangles; 6 around a vertex
|
||||
- Square tiling: {4, 4}
|
||||
- Squares; 4 around a vertex
|
||||
- Hexagonal tiling: {6, 3}
|
||||
- Regular hexagons; 3 around a vertex
|
||||
|
||||
::: {}
|
||||
![]()
|
||||
Adjacency matrices as a heatmap
|
||||
:::
|
||||
|
||||
I would prefer *not* to wrestle the adjacency matrices into a general recurrence relation, but if one would like to go down this route, try using the Laplace expansion of the southmost tip of the "island" in the $T_{3,n}$ graphs as an example.
|
||||
|
||||
The characteristic polynomials of *these* graphs are
|
||||
|
||||
$$
|
||||
\begin{align*}
|
||||
|\lambda I - T_{4,4}| = t_{4,4}(\lambda)
|
||||
&= \lambda^{8} - 7 \lambda^{6} + 14 \lambda^{4} - 8 \lambda^{2} \\
|
||||
&= (\lambda - 1) (\lambda + 1) (\lambda^{4} - 4 \lambda^{2} + 1) \\
|
||||
&= m_6(\lambda) \cdot -m_6(-\lambda) \cdot m_8(\lambda) \\
|
||||
|\lambda I - T_{3,6}| = t_{3,6}(\lambda)
|
||||
&= \lambda^{9} - 8 \lambda^{7} + 20 \lambda^{5} - 17 \lambda^{3} + 4 \lambda \\
|
||||
&= \lambda (\lambda - 1)(\lambda + 1) (\lambda - 2)(\lambda + 2)
|
||||
(\lambda^{2} - \lambda - 1) (\lambda^{2} + \lambda - 1) \\
|
||||
&= m_1(\lambda) \cdot m_6(\lambda) \cdot -m_6(-\lambda)
|
||||
\cdot m_2(\lambda) \cdot -m_2(-\lambda)
|
||||
\cdot m_{10}(\lambda) \cdot m_{10}(-\lambda) \\
|
||||
\end{align*}
|
||||
$$
|
||||
|
||||
Where the $m_n$ come from the sine polynomial series. To me, this implies that where chains are connected to cosines of fractions of a half-turn, these trefoil trees are connected to sines of fractions of turns (but you'd have to derive a general rule to be sure).
|
||||
|
||||
|
||||
Closing
|
||||
-------
|
||||
|
||||
Regardless of whether chains or polygons are more fundamental, it is certainly interesting that they are just an algebraic stone's (a *calculus*'s?) toss away from one another. Perhaps Euler skipped such stones from the bridges of Koenigsberg which inspired him to initiate graph theory.
|
||||
305
generating_poly/extra/index.qmd
Normal file
@ -0,0 +1,305 @@
|
||||
---
|
||||
format:
|
||||
html:
|
||||
html-math-method: katex
|
||||
---
|
||||
|
||||
|
||||
Generating Polynomials Extra: Legendary
|
||||
=======================================
|
||||
|
||||
In the [previous]() [two]() posts, I made clear the ties between the Chebyshev polynomials and polygonal constructibility and graph theory, the benefits of having an infinite family of polynomials are manifold. In this post, I will construct another family with different properties, but one that is still related to the Chebyshev polynomials.
|
||||
|
||||
The format of this post will be slightly different: it will have a less concrete goal and be geared more toward following mathematical intuition.
|
||||
|
||||
|
||||
Orthogonality
|
||||
-------------
|
||||
|
||||
Another very basic question we can ask is: what exactly is a polynomial? Formally (or by viewing it as a container for data), it is no more than a list of numbers with the following operations:
|
||||
|
||||
- Addition between two polynomials, implying
|
||||
- Scalar multiplication of a polynomial
|
||||
- Multiplication between two polynomials
|
||||
- Evaluation at a number
|
||||
|
||||
By "number", I mean an object of the same type as the coefficients, which can be a natural, an integer, a rational, etc. The first two properties above and existence of the zero polynomial imply that polynomials can be considered a [vector space](https://en.wikipedia.org/wiki/Vector_space).
|
||||
|
||||
Another thing they have in common with typical Cartesian vectors is that a dot product can be defined on them. Again from a data perspective, a dot product must be calculated from information in *both* polynomials and have a value whose type is the same as the coefficients of the polynomial. Naively, this could be done by using the already-defined multiplication on two polynomials, then evaluating the product at some value.
|
||||
|
||||
In actuality, this is done by *integrating* the product of two polynomials. Sometimes a third expression is included in the product, termed a *weight function*, but the simplest weight function is 1. Similarly, the simplest interval is from -1 to 1, as this can be used to exploit symmetry for odd integrands.
|
||||
|
||||
$$
|
||||
\begin{gather}
|
||||
P(z) \cdot_w Q(z) = \int_a^b P(z)Q(z)w(z)dz \\
|
||||
P(z) \cdot Q(z) = \int_{-1}^1 P(z)Q(z)dz
|
||||
\end{gather}
|
||||
$$
|
||||
|
||||
If the product of *P* and *Q* is an odd polynomial, then their dot product is trivially 0, and they are orthogonal. For example, if $P(z) = 1$ and $Q(z) = z$, then the integrand is simply *z*; this polynomial is odd, so $1$ and $z$ are orthogonal. The inner products of $1$ and $z$ with themselves (or norms, by analogy with typical vectors) are:
|
||||
|
||||
$$
|
||||
\begin{gather}
|
||||
1 \cdot 1 = \int_{-1}^1 1^2 dz = \left.{z^{\vphantom{0}}}\right]_{-1}^1 = 1 -\ (-1) = 2 \\
|
||||
z \cdot z = \int_{-1}^1 z^2 dz = \left.{z^3 \over 3}\right]_{-1}^1 = {1 \over 3} -\ \left(-{1 \over 3}\right) = {2 \over 3}
|
||||
\end{gather}
|
||||
$$
|
||||
|
||||
What if we were to add a third polynomial into the mix, which is orthogonal to both $1$ and $z$, has degree 2, and whose norm is, say, 2/5? To start, just use a generic quadratic polynomial $p_2(z) = a z^2 + b z + c$. Then enforce all three constraints:
|
||||
|
||||
$$
|
||||
\begin{align*}
|
||||
1 \cdot p_2 &= \int_{-1}^1 (a z^2 + b z + c) dz
|
||||
= \left[ {a z^3 \over 3} + c z \right]_{-1}^1
|
||||
= {2 \over 3}a + 2c = 0 \\
|
||||
z \cdot p_2 &= \int_{-1}^1 (a z^3 + b z^2 + c z) dz
|
||||
= \left[ {b z^3 \over 3} \right]_{-1}^1
|
||||
= {2 \over 3}b = 0 \\
|
||||
p_2 \cdot p_2 &= \int_{-1}^1 (a z^2 + c)^2 dz
|
||||
= \int_{-1}^1 (a^2 z^4 + 2ac z^2 + c^2) dz = {2 \over 5}
|
||||
\end{align*}
|
||||
$$
|
||||
|
||||
Already it can be seen that *b* is 0, which implies the new polynomial is completely even, like $1$ which preceded it. The final integral, though not challenging, requires a fair number of steps to resemble a constraint on *a* and *c* which solves the system.
|
||||
|
||||
$$
|
||||
\begin{align*}
|
||||
\int_{-1}^1 (a^2 z^4 + 2ac z^2 + c^2) dz
|
||||
=&~ \left[ a^2 {z^5 \over 5} + ( 2ac ) {z^3 \over 3} + c^2 z \right]_{-1}^1 \\
|
||||
=&~ {2a^2 \over 5} + {4ac \over 3} + 2c^2
|
||||
= {2a^2 \over 5} + {2ac \over 3} + {2ac \over 3} + 2c^2 \\
|
||||
=&~ {2 \over 15} ( 3a^2 + 5ac ) + c \left( {2a \over 3} + 2c \right) \\
|
||||
=&~ {2 \over 15} ( 3(-3c)^2 + 5(-3c)c ) + c (0)
|
||||
= {2 \over 15}(27c^2 -\ 15c^2) \\
|
||||
=&~ {2 \over 5} (4c^2) = {2 \over 5} \implies c = \pm {1 \over 2} \\
|
||||
\implies& {2a \over 3} \pm 1 = 0 \qquad a = \mp {3 \over 2}
|
||||
\end{align*}
|
||||
$$
|
||||
|
||||
Preferring the leading coefficient a to be positive, this yields the polynomial $p_2(z) = {1 \over 2}(3z^2 -\ 1)$. We might have sought a different constraint which requires less algebra to evaluate, for example by forcing $p_2(1) = 1$ (though this turns out to be equivalent to the one already given).
|
||||
|
||||
This family of polynomials is called the [Legendre polynomials](https://en.wikipedia.org/wiki/Legendre_polynomials), named after Adrien-Marie Legendre. I bring up the man behind them in particular because only one surviving portrait of him exists, and it is a fairly humorous caricature.
|
||||
|
||||
::: {}
|
||||
![]()
|
||||
Public domain image retrieved from Wikimedia
|
||||
:::
|
||||
|
||||
An entire family of mutually orthogonal polynomials has its uses. When doing numeric computation involving integrals, expressing a (scaled and shifted) general polynomial in the orthogonal basis not only simplifies the math, but can prevent errors from accumulating. They also have applications in electrical engineering.
|
||||
|
||||
Even with the alternative, it becomes clear that extending the family further will require more free coefficients, more integrals, and an overall bigger system. How did Legendre do it? Is there a way to bypass so much math?
|
||||
|
||||
|
||||
Presupposition and Trial and Error
|
||||
----------------------------------
|
||||
|
||||
Of course there is. What do we know about this problem? We're dealing with a sequence of polynomials, where
|
||||
|
||||
- A polynomial's degree uniquely identifies it in the sequence,
|
||||
- Any two polynomials which are not the same are orthogonal,
|
||||
- Any polynomial's norm is $2/(2n + 1)$, where *n* is the degree of the polynomial
|
||||
- The first two terms are $1$ and $z$
|
||||
|
||||
In the same manner as with the Chebyshev polynomials, considering a sequence of polynomials is easiest if given as an expression whose Taylor series coefficients are the requisite polynomials. As a reminder, and for the sake of consistency with the previous post, the polynomial variable has been *z*, and the series variable will be *x*.
|
||||
|
||||
We don't know what this expression is, and we only know a few terms of the series
|
||||
|
||||
$$
|
||||
\begin{align*}
|
||||
F(x; z) &= \sum_{n=0}^\infty p_n(z) x^n \\
|
||||
&= p_0(z) + p_1(z)x + p_2(z)x^2 + ... \\
|
||||
&= 1 + zx + {1 \over 2}(3z^2 -\ 1) x^2 + ...
|
||||
\end{align*}
|
||||
$$
|
||||
|
||||
We want to exploit the norm and orthogonality condition, which are obtained by integrating the product of any two coefficients. As a single object *F*, it is very easy to get every possible product of two terms -- it is simply given by $F^2$. Despite the apparent difficulty in distributing over an infinite number of terms, the result can be expressed somewhat simply.
|
||||
|
||||
$$
|
||||
\begin{align*}
|
||||
F(x; z)^2 &= \left( \sum_{n=0}^\infty p_n x^n \right)^2
|
||||
= (p_0 + p_1 x + p_2 x^2 + ...)(p_0 + p_1 x + p_2 x^2 + ...) \\
|
||||
&= p_0^2 + (2p_0 p_1) x + (2p_0 p_2 + p_1^2) x^2 + (2p_0 p_3 + 2p_1 p_2) x^3 + ... \\
|
||||
&= \sum_{\substack{n = 0 \\ r + s = n}}^\infty p_r p_s x^n
|
||||
= \sum_{n = 0}^\infty p_n^2 x^{2n}
|
||||
+ \sum_{\substack{n = 0 \\ r + s = n \\ r \neq s}}^\infty p_r p_s x^n
|
||||
\end{align*}
|
||||
$$
|
||||
|
||||
This expression can be integrated over *z* on the boundary defined by the inner product. The integral of the sum is the sum of the integrals since x as a series variable is totally independent of *z* (as well as [a separate kind of object](https://en.wikipedia.org/wiki/Indeterminate_%28variable%29)).
|
||||
|
||||
$$
|
||||
\begin{align*}
|
||||
\int_{-1}^1 F(x; z)^2 dz
|
||||
&= \int_{-1}^1 \left( \sum_{n = 0}^\infty p_n^2 x^{2n} \right) dz
|
||||
+ \int_{-1}^1 \left( \sum_{
|
||||
\substack{n = 0 \\ r + s = n \\ r \neq s}}^\infty p_r p_s x^n \right) \\
|
||||
&= \sum_{n = 0}^\infty \left( \int_{-1}^1 p_n^2 dz \right) x^{2n}
|
||||
+ \sum_{\substack{n = 0 \\ r + s = n \\ r \neq s}}^\infty
|
||||
\left( \int_{-1}^1 p_r p_s dz \right) x^n \\
|
||||
&= \sum_{n = 0}^\infty {2 \over 2n + 1} x^{2n}
|
||||
\end{align*}
|
||||
$$
|
||||
|
||||
When multiplied by *x*, this sum very much looks like the integral of another expression,
|
||||
|
||||
$$
|
||||
\begin{align*}
|
||||
x \int_{-1}^1 F(x; z)^2 dz
|
||||
&= \sum_{n = 0}^\infty {2 \over 2n + 1} x^{2n+1}
|
||||
= \int \left( \sum_{n = 0}^\infty 2 x^{2n} \right) dx \\
|
||||
&= \int {2dx \over 1 -\ x^2} = \int { \left( {A \over 1 + x} + {B \over 1 -\ x} \right) } \\
|
||||
&= A\ln(1+x) -\ B\ln(1 -\ x) \\
|
||||
2 &= A(1 -\ x) + B(1 + x)
|
||||
\implies \stackrel{x = -1}{A = 1}, \quad \stackrel{x = 1}{B = 1} \\
|
||||
\end{align*}
|
||||
$$
|
||||
|
||||
As a reminder, the goal of these manipulations is to find a closed expression which resembles the evaluation of integral on the LHS with respect to *z*. Fortunately, the partial fraction decomposition is not only simple, but resembles an evaluated integral.
|
||||
|
||||
Before continuing, it is imperative that *x* be divided out of both sides. This implies that the coefficient of *z* in the expression of the logarithm is a multiple of *x*. For example:
|
||||
|
||||
$$
|
||||
\begin{align*}
|
||||
\int_{-1}^1 F^2 dz
|
||||
&= {1 \over x}( \ln(1+x) -\ \ln(1 -\ x) ) \\
|
||||
&= {1 \over x} \left[ \ln(1 +\ zx)^{\vphantom{0}} \right]_{z = -1}^1 \\
|
||||
\partial_z \ln(1 + zx) &= {x \over 1 + zx} \\
|
||||
\implies F^2 &\stackrel{?}{=} {1 \over 1 + zx}
|
||||
\quad F \stackrel{?}{=} {1 \over \sqrt{1 + zx} }
|
||||
\end{align*}
|
||||
$$
|
||||
|
||||
But this expression is clearly wrong. It can be interpreted as a power series in *zx*, rather than just in *x*. This series can also come from a binomial expansion in $1 + zx$, and its terms compared with the ones we already know. The second Legendre polynomial is ${1 \over 2}(3z^2 -\ 1)$, but it is impossible that this expression will be generated, since it contains a term other than a multiple of $z^2$.
|
||||
|
||||
Using logarithm identities, an alternate expression can be obtained
|
||||
|
||||
$$
|
||||
\begin{align*}
|
||||
\int_{-1}^1 F^2 dz
|
||||
&= {1 \over x}( \ln(1+x) -\ \ln(1 -\ x) ) \\
|
||||
&= {1 \over 2x}( \ln((1+x)^2) -\ \ln((1 -\ x)^2) )\\
|
||||
&= {1 \over 2x}( \ln(1+ 2x + x^2) -\ {1 \over 2}\ln(1 -\ 2x + x^2) ) \\
|
||||
&= {1 \over 2x} \left[ \ln(1 + 2zx + x^2) \right]_{z = -1}^1 \\
|
||||
\partial_z \ln(1 + 2zx + x^2) &= {2x \over 1 + 2zx + x^2} \\
|
||||
\implies F^2 &\stackrel{?}{=} {1 \over 1 + 2zx + x^2}
|
||||
\quad F \stackrel{?}{=} {1 \over \sqrt{1 + 2zx + x^2} }
|
||||
\end{align*}
|
||||
$$
|
||||
|
||||
The justification for this move is that we start with two polynomials, $1$ and $z$, so the expression must be quadratic in *x* to fit with the two initial values. Examining the first term of the series (i.e., the coefficient of *x*) by taking its derivative, this expression is only *almost* correct.
|
||||
|
||||
$$
|
||||
\begin{align*}
|
||||
\left. \left( \partial_x (1 + 2zx + x^2)^{-1/2} \right) \right|_{x = 0} &=
|
||||
\left. -{1 \over 2} (1 + 2zx + x^2)^{-3/2} (2z + 2x) \right|_{x = 0} \\
|
||||
&= (1 + 0 + 0)^{-3/2} (-z -\ 0) \\
|
||||
&= -z
|
||||
\end{align*}
|
||||
$$
|
||||
|
||||
This has the opposite sign of $z$, the first term in the series. However, the series does correctly generate the zeroth term 1. Thus, by replacing *z* with -*z* in the expression of *F*, one obtains a new expression, which can be integrated to verify its validity.
|
||||
|
||||
$$
|
||||
\begin{align*}
|
||||
F &\stackrel{?}{=} {1 \over \sqrt{1 -\ 2zx + x^2} } \\
|
||||
\int_{-1}^1 {dz \over 1 -\ 2zx + x^2}
|
||||
&= -{1 \over 2x}\left[ \ln( 1 -\ 2zx + x^2 ) \right]_{z=-1}^{1} \\
|
||||
&= -{1 \over 2x}( \ln( 1 -\ 2x + x^2 ) -\ \ln( 1 + 2x + x^2 ) ) \\
|
||||
&= -{1 \over 2x}( \ln( (1 -\ x)^2 ) -\ \ln( (1 + x)^2 ) ) \\
|
||||
&= {1 \over x}( \ln( 1 + x ) -\ \ln( 1 -\ x ) )
|
||||
\end{align*}
|
||||
$$
|
||||
|
||||
Which is the exact same as the previous constraint given by the orthogonality condition. These previous hurdles are in part due to the non-uniqueness of the square root, but also because reversing integration over symmetric bounds is challenging.
|
||||
|
||||
This final expression is correct, and the generating function for the Legendre polynomials is
|
||||
|
||||
$$
|
||||
F(x; z) = {1 \over \sqrt{1 -\ 2zx + x^2} }
|
||||
$$
|
||||
|
||||
Isn't this form somewhat familiar? It is simply the square root of the expression which generates the Chebyshev polynomials of the second kind (without an offset).
|
||||
|
||||
$$
|
||||
F(x; z) = \sqrt{B(x; z) \over x}
|
||||
$$
|
||||
|
||||
The generating function approach is (at least according to Wikipedia) how Legendre approached this problem. From the math above, it certainly has a degree of elegance to it, albeit one which requires some apparent (but justified) leaps in logic.
|
||||
|
||||
|
||||
Recurrence
|
||||
----------
|
||||
|
||||
With a closed expression finally known, is it possible to obtain a recurrence? It is, but doing so is no easier than the previous steps. The result and process for doing so are outlined on Wikipedia, but I will do so explicitly here. Begin by differentiating *F* with respect to *x*, which shifts the series and multiplies each polynomial by its place in the sequence (i.e., its degree)
|
||||
|
||||
$$
|
||||
\begin{align*}
|
||||
F(x; z) &= \sum_{n=0}^\infty p_n(z)x^n
|
||||
= {1 \over \sqrt{1 -\ 2zx + x^2} } \\
|
||||
\partial_x F(x; z) &= \sum_{n=1}^\infty n p_n(z)x^{n-1}
|
||||
= {z -\ x \over ( 1 -\ 2zx + x^2 )^{3/2} }
|
||||
= {z -\ x \over 1 -\ 2zx + x^2 } F(x; z) \\
|
||||
(z -\ x) \sum_{n=0}^\infty p_n x^n
|
||||
&= (1 -\ 2zx + x^2) \sum_{n=1}^\infty n p_n x^{n-1}
|
||||
\end{align*}
|
||||
$$
|
||||
|
||||
With the sums re-exposed, the most difficult part is aligning like terms. The most natural range of summation starts at 1 (like the RHS), but the power of *x* is simply $x^n$ (like the LHS). Therefore, distributing over each sum and realigning indices yields:
|
||||
|
||||
$$
|
||||
\text{LHS} \left \{ \begin{align*}
|
||||
z\sum_{n=0}^\infty p_n x^n
|
||||
&= z p_0 + z \sum_{n=1}^\infty p_n x^n
|
||||
\\
|
||||
x\sum_{n=0}^\infty p_n x^n
|
||||
&= \sum_{n=0}^\infty p_n x^{n+1}
|
||||
= \sum_{n=1}^\infty p_{n-1} x^n
|
||||
\end{align*} \right .
|
||||
\\
|
||||
\text{RHS} \left \{ \begin{align*}
|
||||
\sum_{n=1}^\infty n p_n x^{n-1}
|
||||
&= \sum_{n=0}^\infty (n + 1) p_{n + 1} x^n
|
||||
= p_1 + \sum_{n=1}^\infty (n + 1) p_{n + 1} x^n
|
||||
\\
|
||||
2zx\sum_{n=1}^\infty n p_n x^{n-1}
|
||||
&= 2z\sum_{n=1}^\infty n p_n x^n \\
|
||||
x^2\sum_{n=1}^\infty n p_n x^{n-1}
|
||||
&= \sum_{n=1}^\infty n p_n x^{n+1}
|
||||
= \sum_{n=0}^\infty n p_n x^{n+1}
|
||||
= \sum_{n=1}^\infty (n -\ 1) p_{n-1} x^n
|
||||
\end{align*}\right.
|
||||
$$
|
||||
|
||||
Now the only problem which remains are the elements which are *not* in a sum, $zp_0$ and $p_1$. But these are both just *z*, and they are on opposite sides of the equation, so they cancel out. The remaining sums can be dropped entirely, and an explicit recurrence is formed.
|
||||
|
||||
$$
|
||||
\begin{align*}
|
||||
(z -\ x) \sum_{n=0}^\infty p_n x^n
|
||||
&= (1 -\ 2zx + x^2) \sum_{n=1}^\infty n p_n x^{n-1} \\
|
||||
z \sum_{n=1}^\infty p_n x^n -\ \sum_{n=1}^\infty p_{n-1} x^n
|
||||
&= \sum_{n=1}^\infty (n + 1) p_{n + 1} x^n -\ 2z\sum_{n=1}^\infty n p_n x^n
|
||||
+ \sum_{n=1}^\infty (n -\ 1) p_{n-1} x^n \\
|
||||
z p_n -\ p_{n-1} &=
|
||||
(n + 1) p_{n + 1} -\ 2z n p_n + (n -\ 1) p_{n-1} \\
|
||||
-(n + 1) p_{n + 1} &=
|
||||
-z p_n (n + 1) -\ 2z n p_n + (n -\ 1) p_{n-1} + p_{n-1} \\
|
||||
(n + 1) p_{n + 1} &= (2n + 1)z p_n -\ n p_{n-1}
|
||||
\end{align*}
|
||||
$$
|
||||
|
||||
This form is called *Bonnet’s recursion formula*. Trying out this formula with $1$ and $z$ indeed produces the correct next term.
|
||||
|
||||
$$
|
||||
\begin{align*}
|
||||
(n + 1) p_{n + 1} &= (2n + 1)z p_n -\ n p_{n-1} \\
|
||||
(1 + 1) p_{1 + 1} &= (2(1) + 1)z p_1 -\ 1 p_{1-1} \\
|
||||
2 p_2 &= 3z(z) -\ p_0 \\
|
||||
p_2 &= {1 \over 2}(3z^2 -\ 1)
|
||||
\end{align*}
|
||||
$$
|
||||
|
||||
The recursion formula also implies something interesting: like the Chebyshev polynomials of the second kind, all polynomials are either totally even or totally odd.
|
||||
|
||||
***
|
||||
|
||||
With the Chebyshev polynomials, the goal was to manipulate a recurrence relation into a generating function. However, the Legendre polynomials require the opposite; one first starts by assuming they have the generating function. Only through clever manipulations and experimentation can an expression be recovered, and from the expression, a recurrence.
|
||||
15
index.qmd
@ -1,15 +0,0 @@
|
||||
---
|
||||
title: "Posts"
|
||||
listing:
|
||||
contents:
|
||||
- posts/math/polycount/*/index.*
|
||||
- posts/math/pentagons/*/index.*
|
||||
- posts/math/chebyshev/*/index.*
|
||||
- posts/math/stereo/*/index.*
|
||||
- posts/math/permutations/*/index.*
|
||||
- posts/math/type-algebra/*/index.*
|
||||
- posts/math/number-number/*/index.*
|
||||
- posts/math/finite-field/*/index.*
|
||||
- posts/math/misc/*/index.*
|
||||
sort: "date desc"
|
||||
---
|
||||
@ -1,108 +0,0 @@
|
||||
---
|
||||
title: "Complex Embedding of *p*-adics"
|
||||
description: |
|
||||
Visualizing fractals generated by sending *p*-adics to the complex plane.
|
||||
format:
|
||||
html:
|
||||
html-math-method: katex
|
||||
categories:
|
||||
- interactive
|
||||
- algebra
|
||||
---
|
||||
|
||||
```{ojs}
|
||||
//| echo: false
|
||||
|
||||
{{< include ./showAdic.ojs >}}
|
||||
```
|
||||
|
||||
About
|
||||
-----
|
||||
|
||||
The Wikipedia article on the [*p*-adic valuation](https://en.wikipedia.org/wiki/P-adic_valuation)
|
||||
contains [a figure](https://commons.wikimedia.org/wiki/File:2adic12480.svg) whose description
|
||||
provides a way to map *p*-adics into the complex numbers[^1].
|
||||
The gist is to construct a Fourier series over truncations of numbers.
|
||||
Each term of the series is weighted by a geometrically decreasing coefficient *c*.
|
||||
|
||||
$$
|
||||
[...d_2 d_1 d_0]_p \mapsto e^{2\pi i [d_0] / p}
|
||||
+ c e^{2\pi i [d_1 d_0] / p^2}
|
||||
+ c^2 e^{2\pi i [d_2 d_1 d_0] / p^2}
|
||||
+ ...
|
||||
\\
|
||||
f_N(d; p) = \sum_{n = 0}^N c^n e^{2\pi i \cdot [d_{n:0}]_p / p^{n + 1}}
|
||||
$$
|
||||
|
||||
Assuming the first term dominates, this can be interpreted as placing numbers evenly
|
||||
around the unit circle according to their one's place.
|
||||
Then, we offset each by smaller circles, each centered on the last, using more and more digits.
|
||||
This produces a fractal pattern that looks like a wheel with *p* spokes.
|
||||
At each point on where the spokes meet the rim, there is another smaller wheel with *p* spokes,
|
||||
ad infinitum.
|
||||
|
||||
This is somewhat visible in the Wikimedia diagram.
|
||||
All of the odd numbers are at the left side of the diagram, since the leading term of the series for them
|
||||
is negative one.
|
||||
The odd numbers are further split into those of the forms $4k + 1$ and $4k + 3$.
|
||||
|
||||
|
||||
Controls
|
||||
--------
|
||||
|
||||
Each of the inputs corresponds to something from the above formula.
|
||||
|
||||
- *b*, the base of the expansions.
|
||||
- Each point is the expansion of an integer in base *b*,
|
||||
which corresponds to a sequence of digits (*d* in the above formula).
|
||||
- *p*, the base used in the embedding.
|
||||
- The same *p* that appears in the above formula.
|
||||
- Truncations of digit sequences ($d_{n:0}$) are interpreted as strings in base *p*,
|
||||
then divided by $p^{n+1}$.
|
||||
- *c*, the geometric constant.
|
||||
- Smaller *c* means more tightly packed points.
|
||||
|
||||
Note that only 1024 points are calculated, and that only fifteen terms of the series are used ($N = 15$).
|
||||
|
||||
|
||||
Suggestions
|
||||
-----------
|
||||
|
||||
### Invariance of *b*
|
||||
|
||||
Set *b* and *p* to 2 and *c* to 0.55.
|
||||
Slowly increase *p* to 3.
|
||||
The pattern should largely remain the same, but appear to be rotated around.
|
||||
Increasing *p* further shears the pattern into an indistinct line of points.
|
||||
This shows that the embedding base *does* matter, but the way the expansions are constructed
|
||||
gives rise to the pattern.
|
||||
|
||||
|
||||
### Small Changes
|
||||
|
||||
With *c* sufficiently small (about 0.3), and *p* fixed at 2, changing *b* keeps the diagram
|
||||
almost the same.
|
||||
This is because many numbers get sent to the same place as others.
|
||||
For example, when only considering the first term of the series, "1" and "3" are both mapped to
|
||||
$e^{\pi i} = e^{3 \pi i}$
|
||||
|
||||
If you make *c* larger, you can notice that points disappear from the case when *p* is 2.
|
||||
If the plot used a massive number of points, this difference wouldn't be as visible.
|
||||
|
||||
|
||||
### Blooming flower, in reverse
|
||||
|
||||
Try cranking *b* and *p* up to 10 and set *c* to something around 0.2 so that you can
|
||||
clearly see a decagon made of decagons
|
||||
Then, strobe *p* down to its minimum value.
|
||||
Notice the larger decagon and smaller decagons collapse into nonagons when *p* hits 9.
|
||||
|
||||
|
||||
### Lesser Bases
|
||||
|
||||
Set *b* to 2 and *p* to 1.1, the lowest it can go.
|
||||
Moving *c* back and forth, you should be able to see an interesting fractal.
|
||||
|
||||
|
||||
[^1]: Taken from the paper "Fractal geometry for images of continuous embeddings of p-adic
|
||||
numbers and solenoids into Euclidean spaces" (DOI: 10.1007/BF02073866).
|
||||
@ -1,69 +0,0 @@
|
||||
// Convert x into its expansion in base b, as an array of integers (ascending powers of b)
|
||||
toBase = (b, x) => {
|
||||
if (x == 0) { return [0] }
|
||||
|
||||
let ret = [];
|
||||
while (x > 0) {
|
||||
ret.push(x % b);
|
||||
x = Math.floor(x / b);
|
||||
}
|
||||
return ret;
|
||||
};
|
||||
|
||||
// Interpret xs as an expansion in base b (ascending powers of b)
|
||||
fromBase = (b, xs) => {
|
||||
let plval = 1
|
||||
return xs.reduce((a, x) => {
|
||||
let new_a = x * plval;
|
||||
plval *= b;
|
||||
return a + new_a;
|
||||
}, 0)
|
||||
}
|
||||
|
||||
// Map an expansion to a complex number (as a 2-array).
|
||||
// The expansion is interpreted in base `b`.
|
||||
// `n` terms of the series are used, with geometric ratio `c`
|
||||
adicAngles = (expansion, b, n, c) => {
|
||||
return d3.range(n).reduce((a, i) => {
|
||||
let angle = fromBase(b, expansion.slice(null, i + 1)) / (b ** (i + 1));
|
||||
let x = c**i * Math.cos(2 * Math.PI * angle);
|
||||
let y = c**i * Math.sin(2 * Math.PI * angle);
|
||||
return [a[0] + x, a[1] + y];
|
||||
}, [0, 0]);
|
||||
}
|
||||
|
||||
pointCount = 1024;
|
||||
expansions = d3.range(pointCount).map((x) => toBase(base, x));
|
||||
|
||||
embedding = expansions.map(
|
||||
(x) => adicAngles(x, embedBase, 15, geometric)
|
||||
);
|
||||
|
||||
viewof base = Inputs.range([2, 10], {
|
||||
value: 2,
|
||||
step: 1,
|
||||
label: "Base of expansions (b)",
|
||||
});
|
||||
|
||||
viewof embedBase = Inputs.range([1.1, 10], {
|
||||
value: 2,
|
||||
step: 0.1,
|
||||
label: "Embedding base (p)",
|
||||
});
|
||||
|
||||
viewof geometric = Inputs.range([0.005, 0.995], {
|
||||
value: 0.9,
|
||||
step: 0.005,
|
||||
label: "Geometric ratio (c)",
|
||||
});
|
||||
|
||||
plot = Plot.plot({
|
||||
grid: true,
|
||||
inset: 10,
|
||||
// aspectRatio: 1,
|
||||
width: 640,
|
||||
height: 480,
|
||||
marks: [
|
||||
Plot.dot(embedding, { r: 1 })
|
||||
]
|
||||
});
|
||||
BIN
logo-favicon.png
(Stored with Git LFS)
@ -1,55 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
version="1.0"
|
||||
width="81.467003pt"
|
||||
height="89.874596pt"
|
||||
viewBox="0 0 81.467003 89.874596"
|
||||
preserveAspectRatio="xMidYMid"
|
||||
id="svg3"
|
||||
sodipodi:docname="logo-vector.svg"
|
||||
inkscape:version="1.4 (e7c3feb100, 2024-10-09)"
|
||||
inkscape:export-filename="logo-vector.png"
|
||||
inkscape:export-xdpi="96"
|
||||
inkscape:export-ydpi="96"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg">
|
||||
<defs
|
||||
id="defs3" />
|
||||
<sodipodi:namedview
|
||||
id="namedview3"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#000000"
|
||||
borderopacity="0.25"
|
||||
inkscape:showpageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pagecheckerboard="0"
|
||||
inkscape:deskcolor="#d1d1d1"
|
||||
inkscape:document-units="pt"
|
||||
inkscape:zoom="4.4744239"
|
||||
inkscape:cx="65.483291"
|
||||
inkscape:cy="69.95314"
|
||||
inkscape:window-width="1850"
|
||||
inkscape:window-height="1052"
|
||||
inkscape:window-x="1920"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="g3" />
|
||||
<metadata
|
||||
id="metadata1">
|
||||
Created by potrace 1.16, written by Peter Selinger 2001-2019
|
||||
</metadata>
|
||||
<g
|
||||
transform="matrix(0.1,0,0,-0.1,-255.3147,709.4459)"
|
||||
fill="#ffffff"
|
||||
stroke="none"
|
||||
id="g3">
|
||||
<path
|
||||
d="m 3108,7004 c -54,-29 -64,-93 -23,-142 l 25,-30 -35,-35 c -39,-39 -44,-70 -20,-116 13,-26 36,-40 92,-56 36,-10 99,13 127,46 39,47 36,93 -11,138 l -38,36 28,27 c 83,81 -37,191 -145,132 z m 102,-19 c 17,-9 30,-20 30,-24 0,-5 2,-16 6,-24 3,-8 -7,-28 -21,-45 -26,-31 -27,-31 -57,-16 -17,9 -42,27 -55,40 -20,20 -22,27 -13,44 20,38 65,48 110,25 z m -8,-204 c 25,-16 49,-39 53,-50 13,-42 -31,-81 -91,-81 -31,0 -84,50 -84,78 0,24 46,82 64,82 7,0 33,-13 58,-29 z"
|
||||
id="path1" />
|
||||
<path
|
||||
d="m 2736,6628 c -38,-36 -56,-78 -34,-78 7,0 19,9 25,19 18,29 61,34 116,13 l 49,-19 -102,-94 c -89,-82 -170,-174 -170,-193 0,-15 24,-3 50,24 15,17 37,30 47,30 11,0 32,-13 48,-30 33,-34 72,-39 114,-14 47,28 99,124 67,124 -8,0 -18,-9 -21,-21 -8,-23 -61,-59 -88,-59 -10,0 -41,7 -68,16 l -51,17 125,121 c 129,125 156,159 136,172 -7,4 -22,-7 -36,-25 -31,-39 -57,-39 -93,-1 -37,40 -71,39 -114,-2 z"
|
||||
id="path2" />
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 2.3 KiB |
292
mandelbrot/1/index.qmd
Normal file
@ -0,0 +1,292 @@
|
||||
---
|
||||
format:
|
||||
html:
|
||||
html-math-method: katex
|
||||
---
|
||||
|
||||
|
||||
Running from Hearts: Mandelbrot beyond i
|
||||
========================================
|
||||
|
||||
Fractals are popular among mathematicians because they are typically easy to generate, but display complex behavior. The [*Mandelbrot set*](
|
||||
https://en.wikipedia.org/wiki/Mandelbrot_set) is such an example, recognizable as a cardioid surrounded by circles and infinitesimally thin tendrils. A complex number $c = a + bi$ is in the Mandelbrot set if the iterative process $z_0 = 0;~z_{n+1} = z_{n}^2 + c$ does not tend toward infinity.
|
||||
|
||||
Naively, this requires calculating $z_\infty$, an infinite procedure which cannot be completed. Instead, it is typical to run the iteration for a finite number of steps. Numbers are excluded from the set if the norm of a $z_n$ exceeds a certain bound. The set lies within a circle in the complex plane of radius 2 centered at 0, which establishes a bound on the norm.
|
||||
|
||||
Even after reducing an infinite process to a finite one, there are several definitions implicit in this description. Naturally, it is possible to [increase the power of $z$](https://en.wikipedia.org/wiki/Multibrot_set), but I would prefer to explore other options, such as:
|
||||
|
||||
- Changing the value of $i$ in $a + bi$
|
||||
- Using a norm other than the Euclidean ($|z| = a^2 + b^2$)
|
||||
- Altering the manner in which complex numbers multiply
|
||||
|
||||
|
||||
Other Roots of Unity
|
||||
--------------------
|
||||
|
||||
The imaginary unit *i* lies at a quarter turn around the unit circle, starting from the positive real axis and rotating counterclockwise. Complex numbers which are positioned at fractions of a turn around the unit circle are termed *roots of unity*. Since it takes four quarter turns to produce one full turn, *i* is a fourth (primitive) root of unity. Multiplying complex numbers adds their angles, so this is equivalent to the statement $i^4 = 1$. With *i* as the imaginary unit, the vectors connecting it and 1 to the origin form an orthonormal basis for the complex numbers.
|
||||
|
||||
All roots of unity other than the first (1), second (-1), and fourth (*i*) are given in terms of the imaginary unit and surds. For example, the sixth root of unity lying in the upper half of the complex plane is $\xi_6 = \frac 1 2 + i\frac{\sqrt 3} 2$. If we consider complex numbers of the form $a + b\xi_6$, then this has the effect of rotating the imaginary unit from its original position.
|
||||
|
||||
::: {}
|
||||
![]()
|
||||
This diagram and all others are shown in the range -2 to 2 for both the real and imaginary axes
|
||||
:::
|
||||
|
||||
The basis with respect to 1 is no longer orthogonal, and this shears the Mandelbrot set along that angle. "Up" is now 30 degrees to the left of where it once was, where *i* lies in relation to $\xi_6$.
|
||||
|
||||
Introducing a scalar multiple to the *b* term moves *i* off of the unit circle. Predictably, the *b* term must grow or shrink in the opposite way. This means that the set dilates along the vertical if *i* lies within the unit circle, and shrinks if *i* lies outside. This can be combined with the shearing effect, but the general shape of the Mandelbrot set stays the same.
|
||||
|
||||
|
||||
Out of the Norm
|
||||
---------------
|
||||
|
||||
We used the unit circle to justify speaking about roots of unity. It is defined by the Euclidean norm. This form naturally arises as the product of a complex number and its conjugate.
|
||||
|
||||
$$
|
||||
|z| = a^2 + b^2 = (a + bi) (a\ - bi) = zz^*
|
||||
$$
|
||||
|
||||
Points which lie on a circle with radius 2 have a norm of 4, which means that it is sufficient to test our points while generating the set by $|z_n| \leq 4$.
|
||||
|
||||
|
||||
### Being Hyperbolic
|
||||
|
||||
There are other norms we can consider that alter the notion of distance. For example, we can consider a hyperbolic norm. There are two of them, which are dual to one another.
|
||||
|
||||
$$
|
||||
\begin{align*}
|
||||
|z|_{{hyp}_1} &= a^2 - b^2 \\
|
||||
|z|_{{hyp}_2} &= ab
|
||||
\end{align*}
|
||||
$$
|
||||
|
||||
Both of these expressions can take on negative values. We address this by squaring them, producing a quartic form. This also squares the bound on the norm to $z_{hyp} \leq 16$.
|
||||
|
||||
:::: {}
|
||||
::: {}
|
||||
![]()
|
||||
:::
|
||||
|
||||
::: {}
|
||||
![]()
|
||||
:::
|
||||
::::
|
||||
|
||||
Using this norm to bound the set produces the above two images. Hyperbolic spikes replace the rounded regions which bound the set at successive iterations. However, the black figure in the middle remains largely the same. Notably, the spikes in one graph appear to be rotated from the other, just as how the curve $xy = 1$ is a rotation of $x^2\ - y^2 = 1$.
|
||||
|
||||
|
||||
### Maximizing Manhattan
|
||||
|
||||
The Euclidean norm also belongs to a group called [$L^p$ norms](https://en.wikipedia.org/wiki/Lp_space).
|
||||
|
||||
$$
|
||||
||z||_p = |a^p| + |b^p|
|
||||
$$
|
||||
|
||||
(**Note**: To simplify things, I'm leaving out the radical typically seen here.) Two more dual norms lie at extreme values of *p*: 1 and $\infty$. Circles within the $L^1$ ("taxicab") norm are squares, albeit rotated 45 degrees.
|
||||
|
||||
The above definition doesn't work with $\infty$, but for higher *p*, one of *a* or *b* will tend to dominate the other. Therefore, the norm degenerates to $||z||_\infty = \max(a, b)$. Circles with respect to this norm are also squares, but with edges parallel to the axes.
|
||||
|
||||
:::: {}
|
||||
::: {}
|
||||
![]()
|
||||
:::
|
||||
|
||||
::: {}
|
||||
![]()
|
||||
:::
|
||||
::::
|
||||
|
||||
These two norms produces the above images. The regions are generally larger when using the maximum norm since the unit circle has a larger area. The cusps and curves seem to be interchanged between plots, similarly to the spokes in the hyperbolic norms.
|
||||
|
||||
Unfortunately, all of these norms still produce roughly the same shape. This is because they all share the notion of "infinitely far" from the origin, which isn't enough to change the shape of the set. Whatever process is used to determine the general size of *z*, the magnitudes of both *a* and *b* tend to grow if a number is not in the set.
|
||||
|
||||
|
||||
Distributing Values
|
||||
-------------------
|
||||
|
||||
A more subtle alteration we can make is changing the the entire operation of multiplication. When multiplying two complex numbers, there are four pairs of products which can appear among the real and imaginary components of the result. If $\odot$ signifies pointwise matrix multiplication and $\Sigma$ is an operator which sums the elements, then we can characterize multiplication as:
|
||||
|
||||
$$
|
||||
\begin{gather*}
|
||||
z_1 z_2 =
|
||||
(a + bi) (c + di) = \begin{matrix}
|
||||
&(ac)(\boldsymbol{1^2}) & + & (ad)(\boldsymbol{1i}) \\
|
||||
+&(bc)(\boldsymbol{i1}) & + & (bd)(\boldsymbol{i^2})
|
||||
\end{matrix} \\ \\
|
||||
= \Sigma \left(
|
||||
\begin{pmatrix}
|
||||
ac & ad \\
|
||||
bc & bd
|
||||
\end{pmatrix}
|
||||
\odot
|
||||
\begin{pmatrix}
|
||||
1^2 & 1i \\
|
||||
i1 & i^2
|
||||
\end{pmatrix}
|
||||
\right)
|
||||
= \Sigma (
|
||||
P_2 \odot M
|
||||
)
|
||||
\end{gather*}
|
||||
$$
|
||||
|
||||
This characterization is a little too naive, since we can assume that $1^2 = 1$ and $1i = i1 = i$. The first equality follows from scalar multiplication working on complex numbers. $i^2$ is free from such limitations, and a more honest product can be formulated as:
|
||||
|
||||
$$
|
||||
\begin{gather*}
|
||||
(a + bi) (c + di) = ac + (bc + ad)i + bdi^2 \\ \\
|
||||
= \Sigma \left(
|
||||
P_2 \odot
|
||||
\begin{pmatrix} 1 & i \\ i & i^2 \end{pmatrix}
|
||||
\right )= \Sigma (
|
||||
P_2 \odot M
|
||||
)
|
||||
\end{gather*}
|
||||
$$
|
||||
|
||||
This restriction enforces the distributivity of multiplication over addition. Since *M* is symmetric, it also means that multiplication is commutative. For the purposes of generating the normal set, commutativity isn't required, but it may become a problem if we use higher powers of *z*.
|
||||
|
||||
|
||||
### Complex, but Split
|
||||
|
||||
Complex numbers are defined by the relation $i^2 = 1$. If instead $i^2 = 1$, then the system is termed the "[split-complex numbers](https://en.wikipedia.org/wiki/Split-complex_number)". They are typically assigned the hyperbolic norm $a^2 - b^2$, since this is the product of a number and its conjugate. Before using this norm, let's see the Mandelbrot set with respect to the other four norms over the split complex numbers.
|
||||
|
||||
![]()
|
||||
|
||||
All four images have the same shape. Rather than the distinctive main cardioid which appears in the normal Mandelbrot set, the only thing which remains is a black diamond. The approximant regions outside of the black shape are only due to the norm considered, as previously shown. In the hyperbolic (upper right) plot, the spoke along the positive real axis is an artifact of this. In fact, the part of this plot which lies on the real axis should be exactly the same as in the normal Mandelbrot set, since it has no imaginary component.
|
||||
|
||||
![]()
|
||||
|
||||
The other hyperbolic norm produces more or less the same shape, albeit with some black islands and a hyperbolic "bite" taken out of the left side. By picking a different threshold value, both of these artifacts disappear. However, the spokes along the lines $\Re(z) = \Im(z)$ and $\Re(z) = -\Im(z)$ are numbers for which the norm is 0, and will not be removed, similar to the other hyperbolic 0 line.
|
||||
|
||||
If the we transition the value of $i^2$ between -1 and 1, then the Mandelbrot set transitions between its familiar shape and the alien diamond shape.
|
||||
|
||||
![]()
|
||||
|
||||
Exactly halfway between this transition from -1 to 1, $i^2 = 0$. This system is called the "dual numbers", and their multiplication is similar to the treatment of infinitesimals in nonstandard calculus.
|
||||
|
||||
|
||||
### Oops, all Imaginary
|
||||
|
||||
$i^2$ need not be a real number. Letting $i^2 = i$ or $i^2 = -i$ means that imaginary terms cannot "escape" to influence the real component as they can normally.
|
||||
|
||||
:::: {}
|
||||
::: {}
|
||||
![]()
|
||||
$i^2 = i$
|
||||
:::
|
||||
|
||||
::: {}
|
||||
![]()
|
||||
$i^2 = -i$
|
||||
:::
|
||||
::::
|
||||
|
||||
If we squint hard enough, this also appears to be midway between a transition between the Mandelbrot set in the complex numbers and in the split-complex numbers. It combines both the diamond shape (albeit sheared) and hints of interesting behavior toward the boundary.
|
||||
|
||||
In the following video, the value of $i^2$ is rotated about the unit circle, with the blue arrow pointing to the value.
|
||||
|
||||
![]()
|
||||
|
||||
This plot also contains some of the shears previously seen by assigning i to another root of unity.
|
||||
|
||||
|
||||
Other Vector Products
|
||||
---------------------
|
||||
|
||||
Without relaxing the distributive law, we can choose to examine numbers composed of two imaginary values, rather than a real and an imaginary one. Numbers remain 2D, but of the form $z = ai + bj$. We have a bit more freedom in choosing the products
|
||||
|
||||
$$
|
||||
\begin{gather*}
|
||||
z_1 z_2 =
|
||||
(ai + bj) (ci + dj) = \begin{matrix}
|
||||
&(ac)(\boldsymbol{i^2}) & + & (ad)(\boldsymbol{ij}) \\
|
||||
+&(bc)(\boldsymbol{ji}) & + & (bd)(\boldsymbol{j^2})
|
||||
\end{matrix} \\ \\
|
||||
= \Sigma \left(
|
||||
P_2 \odot
|
||||
\begin{pmatrix}
|
||||
i^2 & ij \\
|
||||
ji & j^2
|
||||
\end{pmatrix}
|
||||
\right)
|
||||
= \Sigma \left(
|
||||
P_2 \odot M
|
||||
\right)
|
||||
\end{gather*}
|
||||
$$
|
||||
|
||||
Each term of *M* should have an *i* or a *j* component, and no real components, so that the product remains two-dimensional. I'll take it one step further and say that entries must be any of 0, $\pm i$ and $\pm j$.
|
||||
|
||||
|
||||
### Absorbative Imaginary
|
||||
|
||||
We can construct a simple matrix by letting each of ij and ji be zero and i and j are absorbative with respect to themselves.
|
||||
|
||||
$$
|
||||
M = \begin{pmatrix}
|
||||
i & 0 \\
|
||||
0 & j
|
||||
\end{pmatrix} \Rightarrow (ai + bj) (ci + dj) = aci + bdj
|
||||
$$
|
||||
|
||||
This form is similar to the dot product between two 2D vectors. If we use this scheme, the shape produced by the Mandelbrot iteration is fairly boring.
|
||||
|
||||
![]()
|
||||
|
||||
The harsh black edge meeting the pale yellow region is due to any growth of $z^n,~|z| < 2$ being counteracted by the initial value under consideration.
|
||||
|
||||
|
||||
### Cyclic Imaginary
|
||||
|
||||
The previous multiplication is uninteresting because one component never affects the other. We can slightly alter the multiplication so that such an interchange can take place.
|
||||
|
||||
$$
|
||||
M = \begin{pmatrix}
|
||||
j & 0 \\
|
||||
0 & i
|
||||
\end{pmatrix} \Rightarrow (ai + bj) (ci + dj) = bdi + acj
|
||||
$$
|
||||
|
||||
![]()
|
||||
|
||||
The boundary of the figure no longer appears to lie parallel with either the real or imaginary axis. There also appear to be some "bubbles" of exclusion in the lower right corner, as well as "hairs" of inclusion coming off the main body.
|
||||
|
||||
|
||||
### Mutually Imaginary
|
||||
|
||||
We can also move the the terms of the above matrices onto the off-diagonal of *M*, producing yet another pair of multiplications.
|
||||
|
||||
$$
|
||||
\begin{gather*}
|
||||
M = \begin{pmatrix}
|
||||
0 & i \\
|
||||
j & 0
|
||||
\end{pmatrix} \Rightarrow (ai + bj) (ci + dj) = adi + bcj \\
|
||||
M' = \begin{pmatrix}
|
||||
0 & j \\
|
||||
i & 0
|
||||
\end{pmatrix} \Rightarrow (ai + bj) (ci + dj) = bci + adj
|
||||
\end{gather*}
|
||||
$$
|
||||
|
||||
As stated previously, if *M* is not symmetric, then the operation is not commutative. Interchanging the order of the operands in either of these multiplications results in interchanging the *i* and *j* components. This has no effect when squaring a number since both the left and right operands are the same.
|
||||
|
||||
![]()
|
||||
|
||||
In this multiplication, hyperbolic shapes appear to be taking form in the upper right quadrant. There also appears to be a somewhat parabolic shape in the opposite quadrant. It joins up with the hyperbolae at the positive real and imaginary axes.
|
||||
|
||||
|
||||
Summary and Closing
|
||||
-------------------
|
||||
|
||||
My original goal was to pinpoint what gives the Mandelbrot set its shape. Armed with this knowledge, it would be possible to find a sufficient generalization of the set to higher dimensions. Before proceeding to 3D, I wanted to explore some less-examined options as they pertain to the typical, 2D set.
|
||||
|
||||
Without changing the iterative process, the multiplication of numbers determines the shape of the Mandelbrot set. In a sense, the set is a manifestation of the distributive law with respect to an underlying number system. While we can shear this shape by rotating i around the unit circle, assigning a value to $i^2$ produces more prominent changes, without needing to involve approximating roots.
|
||||
|
||||
By using a system with both an *i* and a *j* component, the shape of the set can be altered further, as in the final examples given. With minimal effort, we can make it 3D by letting these numbers also have a real component. This will be the focus of the [next post]().
|
||||
|
||||
|
||||
### Additional Links
|
||||
- [Generalized Mandelbrot Sets and Moduli Spaces](https://www.math.uwaterloo.ca/~wgilbert/FractalGallery/Mandel/MandelMath.html), by Professor William Gilbert
|
||||
403
mandelbrot/2/index.qmd
Normal file
@ -0,0 +1,403 @@
|
||||
---
|
||||
format:
|
||||
html:
|
||||
html-math-method: katex
|
||||
---
|
||||
|
||||
|
||||
Running from... Diamonds?: Mandelbrot beyond ii
|
||||
===============================================
|
||||
|
||||
This post assumes you have read the previous post, which discusses some more implicit assumptions when generating the Mandelbrot set. The core assumption is in how multiplication works in a number system, and this is the manner in which I will proceed to generalize the set to 3D.
|
||||
|
||||
|
||||
First Steps in 3D
|
||||
-----------------
|
||||
|
||||
|
||||
The previous post ended just as I began discussing numbers with two imaginary components *i* and *j*. If we add in the real component again, then numbers are now three-dimensional and multiplication can be characterized as
|
||||
|
||||
$$
|
||||
\begin{gather*}
|
||||
\begin{matrix} w_1 w_2 = (a + bi + cj) (d + ei + fj) =&
|
||||
ad + (bd + ae)\boldsymbol{i} + (af + cd)\boldsymbol{j} \\
|
||||
&+\ be\boldsymbol{i^2} + bf\boldsymbol{ij} + ce\boldsymbol{ji} + cf\boldsymbol{j^2}
|
||||
\end{matrix} \\ \\
|
||||
= \Sigma \left(
|
||||
\begin{pmatrix}
|
||||
ad & ae & af \\
|
||||
bd & be & bf \\
|
||||
cd & ce & cf
|
||||
\end{pmatrix}
|
||||
\odot
|
||||
\begin{pmatrix}
|
||||
1 & i & j \\
|
||||
i & i^2 & ij \\
|
||||
j & ji & j^2
|
||||
\end{pmatrix}
|
||||
\right )
|
||||
= \Sigma \left(
|
||||
P_3 \odot
|
||||
\begin{pmatrix}
|
||||
1 & \begin{matrix}i & j \end{matrix} \\
|
||||
\begin{matrix}i \\ j \end{matrix} & M
|
||||
\end{pmatrix}
|
||||
\right )
|
||||
\end{gather*}
|
||||
$$
|
||||
|
||||
...where M is the matrix block which controls how the imaginary terms i and j multiply. Previously, *M* was the single element $i^2$. It is now a 2×2 matrix, so there is much more freedom in the choice of its elements.
|
||||
|
||||
With more freedom comes the need to make decisions which narrow the focus. Most obviously, *M* should be symmetric so that multiplication is commutative. Next, expressions such as $ij = i$, which eliminate an imaginary term arbitrarily, imply the lack of an inverse element or that an imaginary axis is equivalent to a real one. I glossed over this issue earlier when rotating $i^2$ about the unit circle. Now that *M* is 2×2, we can only populate the off-diagonal with real components. Considering otherwise for 3D algebras is out of the scope of this post, as it is not sufficiently interesting.
|
||||
|
||||
The above decisions do not affect the main diagonal, except in that $i^2 \neq i$ and $j^2 \neq j$. Squares are still allowed to "cycle" between imaginary axes, and may even change in sign (e.g., $i^2 = -j$).
|
||||
|
||||
To generate the set, I will apply the iteration 7 times and use the Euclidean norm. In 3D, our range is the cube from that extends from -2 to 2 in all dimensions. I will visualize the set in two ways: a scatterplot of points which remain after the iterations, and as a video of slices along planes parallel to the *ij* plane. The scatterplot will be useful to identify similar shapes, while the slices will show the halos that correspond to number of iterations.
|
||||
|
||||
|
||||
Roots of Unity: Part Deux
|
||||
-------------------------
|
||||
|
||||
[Roots of unity](https://en.wikipedia.org/wiki/Root_of_unity) are the most well-suited tool to extending a number system. I mentioned previously that -1 is the second root of unity, and it creates negative numbers. *i* is the fourth root of unity, and it creates the complex numbers. Continuing along even numbers, the *sixth* root of unity should correspond to 3D numbers. But didn't we already discuss this when we sheared the set in the previous post?
|
||||
|
||||
Not necessarily. Previously, we expressed this root as a complex number. It can be described completely algebraically, which avoids using square roots. Just as the fourth roots of unity lie on the vertices of a (tilted) square, the *sixth* roots lie on a regular hexagon, with 0 at the center. One of these vertices must correspond to 1, and the point opposite it to -1. The real axis forms the line that connects them.
|
||||
|
||||
![]()
|
||||
|
||||
This leaves two pairs of vertices, each of which can correspond to an "imaginary" axis. There are four possible ways to orient these axes, by "picking" a root for the positive-going direction.
|
||||
|
||||
|
||||
### Upper and Lower Halves
|
||||
|
||||
Two of these choices are equivalent: +*i* and +*j* on the upper half of the hexagon, and +*i* and +*j* on the lower half of the hexagon. Even though this basis is not orthogonal like the fourth root of unity, the components still multiply in the same way that their angle on the unit circle adds, and in either case,
|
||||
|
||||
$$
|
||||
i^2 = j,~ j^2 = -i,~ ij = ji = -1
|
||||
~\implies~
|
||||
M =
|
||||
\begin{pmatrix} j & -1 \\ -1 & -i \end{pmatrix}
|
||||
$$
|
||||
|
||||
Alternatively, +i and +j may both lie on the right half of the figure, near 1. In this case,
|
||||
|
||||
$$
|
||||
i^2 = -j,~ j^2 = -i,~ ij = ji = 1
|
||||
~\implies~
|
||||
M =
|
||||
\begin{pmatrix} -j & 1 \\ 1 & -i \end{pmatrix}
|
||||
$$
|
||||
|
||||
Both of these definitions of M have the commonality that $i^3 = -1$.
|
||||
|
||||
|
||||
### Left Half
|
||||
|
||||
However, by picking the two roots on the left half of the figure, $i^3 = j^3 = 1$, i.e. they are both third roots of unity. These can be imagined as the rotations on a triangle with labelled vertices which preserve the orientation, but permute the labels.
|
||||
|
||||
:::: {layout-ncol = "2"}
|
||||
::: {}
|
||||
![]()
|
||||
:::
|
||||
|
||||
::: {}
|
||||
$$
|
||||
j^2 = i,~ i^2 = j,~ ij = ji = 1
|
||||
\\ M =
|
||||
\begin{pmatrix} j & 1 \\ 1 & i \end{pmatrix}
|
||||
$$
|
||||
:::
|
||||
::::
|
||||
|
||||
|
||||
### Right Half
|
||||
|
||||
The reflection of i and j in the above case makes both of them sixth roots of unity, i.e., $i^3 = j^3 = -1$.
|
||||
|
||||
$$
|
||||
j^2 = i,~ i^2 = -j,~ ij = ji = -1
|
||||
~\implies~
|
||||
M =
|
||||
\begin{pmatrix} -j & -1 \\ -1 & i \end{pmatrix}
|
||||
$$
|
||||
|
||||
|
||||
### Visualizations
|
||||
|
||||
Despite there being four different ways in which the sixth root defines *M*, the Mandelbrot set makes the same shape in all cases. In fact, its shape scarcely changes from its familiar appearance:
|
||||
|
||||
This shape is a cylinder of the the original Mandelbrot set. In fact, from another angle, it resembles the split-complex Mandelbrot set (the diamond). This implies that within each system created by the sixth root of unity, there are still numbers which behave similarly to the standard complex numbers (after all, the basis is not orthogonal) and the split-complex numbers.
|
||||
|
||||
$$
|
||||
M_6 = \begin{pmatrix}
|
||||
j & -1 \\
|
||||
-1 & -i
|
||||
\end{pmatrix}
|
||||
\equiv \begin{pmatrix}
|
||||
-j & 1 \\
|
||||
1 & -i
|
||||
\end{pmatrix}
|
||||
\equiv \begin{pmatrix}
|
||||
j & 1 \\
|
||||
1 & i
|
||||
\end{pmatrix}
|
||||
\equiv \begin{pmatrix}
|
||||
-j & -1 \\
|
||||
-1 & i
|
||||
\end{pmatrix}
|
||||
$$
|
||||
|
||||
Taking slices of the first multiplication (which corresponds to the upper left diagram), the familiar set appears to appear only in parts at a time. There are some regions which appear outside of the familiar shape, but these appear to be artifacts of the "imprecision" with which these numbers approximate the complex numbers.
|
||||
|
||||
![]()
|
||||
|
||||
|
||||
Mutual Complexity
|
||||
-----------------
|
||||
|
||||
With the restraints on *M* given before, four of the eight "cyclic" systems which have been discussed. Three of the remaining are:
|
||||
|
||||
$$
|
||||
M_+ = \begin{pmatrix}
|
||||
j & -1 \\
|
||||
-1 & i
|
||||
\end{pmatrix},~
|
||||
M_* = \begin{pmatrix}
|
||||
-j & 1 \\
|
||||
1 & i
|
||||
\end{pmatrix},~
|
||||
M_- = \begin{pmatrix}
|
||||
-j & -1 \\
|
||||
-1 & -i
|
||||
\end{pmatrix}
|
||||
$$
|
||||
|
||||
The remaining is equivalent to $M_*$, with the signs on j and i swapped. Each of these systems is in some way mutually complex or split-complex. Unfortunately, in all them, associativity breaks down:
|
||||
|
||||
$$
|
||||
\begin{matrix}
|
||||
M_+: &
|
||||
(i^2)j = j^2 = -i \neq i = i(ij)
|
||||
\\
|
||||
M_*: &
|
||||
(i^2)j = -j^2 = -i \neq i = i(ij)
|
||||
\\
|
||||
M_-: &
|
||||
i(j^2) = -i^2 = j \neq -j = (ij)j
|
||||
\end{matrix}
|
||||
$$
|
||||
|
||||
Just as all the sixth roots correspond to the same figure, so too do all of these nonassociative variants.
|
||||
|
||||
![]()
|
||||
|
||||
This figure is distinct from the original set, appearing more fish-like. The slices (which correspond to the upper left diagram are) appear to bubble and burst as planes intersect the figure.
|
||||
|
||||
![]()
|
||||
|
||||
|
||||
Doubly Complex
|
||||
--------------
|
||||
|
||||
*M* need not contain complex members. The entries 1 and -1 may freely appear on the main diagonal. Four more matrices can be generated if commutativity is maintained
|
||||
|
||||
$$
|
||||
\begin{matrix}
|
||||
M_{-1} = \begin{pmatrix}
|
||||
-1 & -1 \\
|
||||
-1 & -1
|
||||
\end{pmatrix}, &
|
||||
M_{\pm 1} = \begin{pmatrix}
|
||||
1 & -1 \\
|
||||
-1 & 1
|
||||
\end{pmatrix}, \\
|
||||
M_{\mp 1} = \begin{pmatrix}
|
||||
-1 & 1 \\
|
||||
1 & -1
|
||||
\end{pmatrix}, &
|
||||
M_{+1} = \begin{pmatrix}
|
||||
1 & 1 \\
|
||||
1 & 1
|
||||
\end{pmatrix}
|
||||
\end{matrix}
|
||||
$$
|
||||
|
||||
Assuming associativity, each multiplication states that one of *i* or *j* is redundant.
|
||||
|
||||
$$
|
||||
\begin{matrix}
|
||||
M_{-1}: &
|
||||
(i^2)j = -j \neq -i = i(ij) \\
|
||||
M_{\pm 1}: &
|
||||
(i^2)j = j \neq -i = i(ij) \\
|
||||
M_{\mp 1}: &
|
||||
(i^2)j = -j \neq i = i(ij) \\
|
||||
M_{+1}: &
|
||||
(i^2)j = j \neq i = i(ij)
|
||||
\end{matrix}
|
||||
$$
|
||||
|
||||
Running the Mandelbrot iteration reveals pairs of these to be similar. However, I believe this is an artifact of the range/iteration limits. It may be the case that the thin sliver of points near the negative real boundary is the same in all schemes. I can think of no other explanation for the diagonal pair to appear different.
|
||||
|
||||
![]()
|
||||
|
||||
::: {}
|
||||
![]()
|
||||
$M_{-1}$
|
||||
:::
|
||||
|
||||
::: {}
|
||||
![]()
|
||||
$M_{-1}$
|
||||
:::
|
||||
|
||||
::: {}
|
||||
![]()
|
||||
$M_{+1}$
|
||||
:::
|
||||
|
||||
|
||||
Impotent Products
|
||||
-----------------
|
||||
|
||||
Thus far, the product of two imaginary terms of magnitude 1 produces a third term of magnitude 1. However, it is also possible that the product has magnitude 0, a sort of infinitesimal. Without making *M* a matrix of all 0's, there are 6 possible variations.
|
||||
|
||||
The first four are produced when *i* and *j* are "mutually" infinitesimal, i.e., their product is 0, but their squares are not. This means that in *M*, the main diagonal is 1 or -1, and the off diagonal is 0:
|
||||
|
||||
$$
|
||||
M = \begin{pmatrix}
|
||||
1 & 0 \\
|
||||
0 & 1
|
||||
\end{pmatrix},~
|
||||
\begin{pmatrix}
|
||||
1 & 0 \\
|
||||
0 & -1
|
||||
\end{pmatrix} \equiv
|
||||
\begin{pmatrix}
|
||||
-1 & 0 \\
|
||||
0 & 1
|
||||
\end{pmatrix},~
|
||||
\begin{pmatrix}
|
||||
-1 & 0 \\
|
||||
0 & -1
|
||||
\end{pmatrix}
|
||||
$$
|
||||
|
||||
Notably, all of these products satisfy either of the quadratic equations $i^2 + j^2 = \pm 2$ or $i^2\ - j^2 = \pm 2$. Therefore, it might be unsurprising that the Mandelbrot set is in the shape of conic sections.
|
||||
|
||||
![]()
|
||||
|
||||
The upper-left shape is two cones that lie base-on-base, the upper-right and lower-left are distinctly hyperbolic, and the lower-right is a solid of revolution of the original Mandelbrot set. The upper left can also be thought of as a solid of revolution, but of the Mandelbrot set produced by the *split-complex numbers*, which is why it appears so diamond-like. While it may be the case that the remaining two sets demonstrate the properties of both, it is not readily visible, at least not within the range shown. Slices of each are as follows:
|
||||
|
||||
:::: {layout-ncol = "2"}
|
||||
::: {}
|
||||
$$
|
||||
M_\circ = \begin{pmatrix}
|
||||
1 & 0 \\
|
||||
0 & 1
|
||||
\end{pmatrix}
|
||||
$$
|
||||
:::
|
||||
|
||||
::: {}
|
||||
![]()
|
||||
:::
|
||||
::::
|
||||
|
||||
:::: {layout-ncol = "2"}
|
||||
::: {}
|
||||
$$
|
||||
\begin{align*} M_H = \begin{pmatrix}
|
||||
-1 & 0 \\
|
||||
0 & 1
|
||||
\end{pmatrix} \\
|
||||
\equiv \begin{pmatrix}
|
||||
1 & 0 \\
|
||||
0 & -1
|
||||
\end{pmatrix}
|
||||
\end{align*}
|
||||
$$
|
||||
:::
|
||||
|
||||
::: {}
|
||||
![]()
|
||||
:::
|
||||
::::
|
||||
|
||||
:::: {layout-ncol = "2"}
|
||||
::: {}
|
||||
$$
|
||||
M_\bullet = \begin{pmatrix}
|
||||
-1 & 0 \\
|
||||
0 & -1
|
||||
\end{pmatrix}
|
||||
$$
|
||||
:::
|
||||
|
||||
::: {}
|
||||
![]()
|
||||
:::
|
||||
::::
|
||||
|
||||
|
||||
### Other Hyperbolic Cases
|
||||
|
||||
There are two additional products if the squares of *i* and *j* are nilpotent, but their product is either 1 or -1:
|
||||
|
||||
![]()
|
||||
|
||||
These turn out to be reflections of one another. The slices are similar to the hyperbolae in $M_H$ above, but corresponding to the hyperbola $xy = 1$ instead.
|
||||
|
||||
![]()
|
||||
|
||||
|
||||
### Permanently Imaginary
|
||||
|
||||
Beyond the six already given, there are also the products which are mutually infinitesimal, but independently cyclic. This multiplication is the same as the "point-swap" kind from the previous post, where the imaginary part of the product is pointwise, then swapped between axes. Similarly to previous cases, all four figures produced are the same.
|
||||
|
||||
![]()
|
||||
|
||||
To me, this shape looks like a fancy wine jug, complete with a loop to attach a string. With respect to other shapes, it appears to resemble the [Burning Ship fractal](https://en.wikipedia.org/wiki/Burning_Ship_fractal), bisected by a plane. Slices reveal bubbles of exclusion inside, as well as a rather erratic section past $\Re(z) = 0$.
|
||||
|
||||
![]()
|
||||
|
||||
|
||||
Pro-Working from Home
|
||||
---------------------
|
||||
|
||||
We can also try relaxing the commutativity rule. If the sign changes when multiplicands are swapped, such behavior is called anticommutativity. For the 2×2 *M*, this means that the off-diagonal elements are nonzero and have opposite sign from each other. Without compromising associativity, two anticommutative elements necessitate a third:
|
||||
|
||||
$$
|
||||
\begin{gather*}
|
||||
ij = -ji = \alpha \\
|
||||
iij = i(ij) = -(ij)i = -iji \\
|
||||
i\alpha = -\alpha i
|
||||
\end{gather*}
|
||||
$$
|
||||
|
||||
$\alpha$ cannot contain either *i* or *j* without relaxing the inverse rule.
|
||||
|
||||
Since squaring a number is part of the Mandelbrot map, these multiplication schemes are identical to those with zeros on the off-diagonal, due to cancellation. When *M* is totally real, we form the familiar conics-shaped figures again. Similarly, cyclic squares correspond to the same burning ship shape. If we allowed 0 on the main diagonal, *M* would be equivalent to a zero matrix, and be unsatisfactory for our purposes.
|
||||
|
||||
:::: {}
|
||||
::: {}
|
||||
![]()
|
||||
:::
|
||||
|
||||
::: {}
|
||||
![]()
|
||||
:::
|
||||
::::
|
||||
|
||||
Since all of these schemes are nonassociative, starting with cubes, there is a choice to left-multiply or right-multiply first. Until four dimensions, anticommutativity isn't a well-founded property.
|
||||
|
||||
|
||||
Summary and Closing
|
||||
-------------------
|
||||
|
||||
Rather than discussing the analogues of the pointwise-like products in 3D, I will stop here. Enough data has been collected to discern the various *M*.
|
||||
|
||||
Despite properties like inverses and commutativity being readily apparent from the shape of *M*, associativity is rather elusive. The kind of associativity being violated is apparent in the Mandelbrot set itself. When the multiplication scheme includes 0 terms, one can deduce that $i = 0$ or $j = 0$ by assuming associativity. In terms of chaotic behavior in the Mandelbrot set, this is better-behaved than the any of the cyclic types which do not correspond to sixth roots of unity, where the deduction is instead $i = \pm j$.
|
||||
|
||||
The determinant of *M* is only sometimes relevant. For all of the types which are sixth roots of unity, $|M| = 0$. Contrast this with the cyclic types which are not, for which $|M| = -2$. All of the totally real M also have determinant 0, as do the cyclic, mutually infinitesimal products. Worse than that, if M has 0's on the off-diagonal, then there exists a similar anticommutative scheme with a different determinant.
|
||||
|
||||
To address both of these problems, and the growing vastness of higher-dimensional space, I will add more restrictions in the [next, final post]() regarding 4D Mandelbrot analogues.
|
||||
401
mandelbrot/3/index.qmd
Normal file
@ -0,0 +1,401 @@
|
||||
---
|
||||
format:
|
||||
html:
|
||||
html-math-method: katex
|
||||
---
|
||||
|
||||
|
||||
Clubs and Spades: Mandelbrot beyond iii
|
||||
=======================================
|
||||
|
||||
This post assumes you have read the [one previous](), which discusses some 3D number systems, i.e., numbers which feature two imaginary components, which produce interesting figures when applying the Mandelbrot map. This post will discuss 4D analogues, which behave a bit better in some regards.
|
||||
|
||||
|
||||
A Step to the Ana
|
||||
-----------------
|
||||
|
||||
For all of the challenges that 3D space presents, thing worsen in 4D. Assuming distributivity over addition, multiplication is characterized as:
|
||||
|
||||
$$
|
||||
\begin{gather*}
|
||||
q_1 q_2 = (a + bi + cj + dk) (e + fi + gj +hk) \\
|
||||
\begin{matrix}
|
||||
=~ ae &+\ (be + af)\boldsymbol{i} + (ag + ce)\boldsymbol{j}
|
||||
+ (ah + de)\boldsymbol{k} \\
|
||||
&+\ bf\boldsymbol{i^2} +\ bg\boldsymbol{ij} + bh\boldsymbol{ik} \\
|
||||
&+\ cf\boldsymbol{ji} +\ cg\boldsymbol{j^2} + ch\boldsymbol{jk} \\
|
||||
&+\ df\boldsymbol{ki} +\ dg\boldsymbol{kj} + dh\boldsymbol{k^2}
|
||||
\end{matrix} \\ \\
|
||||
= \Sigma \left(
|
||||
\begin{pmatrix}
|
||||
ae & af & ag & ah \\
|
||||
be & bf & bg & bh \\
|
||||
ce & cf & cg & ch \\
|
||||
de & df & dg & dh
|
||||
\end{pmatrix}
|
||||
\odot
|
||||
\begin{pmatrix}
|
||||
1 & i & j & k \\
|
||||
i & i^2 & ij & ik \\
|
||||
j & ji & j^2 & jk \\
|
||||
k & ki & kj & k^2
|
||||
\end{pmatrix}
|
||||
\right ) \\ \\
|
||||
= \Sigma \left(
|
||||
P_4 \odot
|
||||
\begin{pmatrix}
|
||||
1 & i & j & k \\
|
||||
i & & | & \\
|
||||
j & - & M & - \\
|
||||
k & & | &
|
||||
\end{pmatrix}
|
||||
\right )
|
||||
\end{gather*}
|
||||
$$
|
||||
|
||||
*M* is now a 3×3 block, meaning that the imaginary axes now form a 3D space unto themselves.
|
||||
|
||||
This time, I will outline some nice properties that multiplication should have among the imaginary components, and the corresponding rules for *M*:
|
||||
|
||||
- Multiplication must be either commutative or anticommutative
|
||||
- *M* must be either symmetric or skew-symmetric. That is, elements and their reflection over the main diagonal are either the same or have opposite sign.
|
||||
- Multiplication must not be absorbative. That is, $i^2 \neq i,~ij \neq i$
|
||||
- *M* must not contain any of *i*, *j*, or *k* on their own columns.
|
||||
- Multiplication must be at least partially associative
|
||||
- *ijk* must have a single value
|
||||
- This property is difficult to ascertain immediately from *M*, but will be apparent in at least one cubic form.
|
||||
- All products must have magnitude 1
|
||||
- *M* must contain only 1, *i*, *j*, *k*, or their additive inverses
|
||||
- For most multiplicands, the product has extent in all three imaginary directions
|
||||
- Every imaginary term appears at least once in *M*
|
||||
|
||||
Along with *M*, I will be giving its determinant. This value doesn't appear to be meaningful *per se*, but it does function as a sample of products. If the multiplication described is anticommutative, the determinant can have multiple values, but I will use standard Laplace expansion and ($ad - cb$) as 2×2 determinants to keep things consistent.
|
||||
|
||||
|
||||
Glimpsing 4D
|
||||
------------
|
||||
|
||||
It is considerably more difficult to visualize four dimensional objects than those of lower dimension. Four separate slice videos will be produced along various planes for each multiplication:
|
||||
|
||||
1. The 1i plane and advancing in the j direction ($\mathfrak K(q) = 0$)
|
||||
2. The ij plane and advancing in the real direction ($\mathfrak K(q) = 0$)
|
||||
3. The jk plane and advancing in the i direction ($\mathfrak R(q) = 0$)
|
||||
4. The jk plane and advancing in the real direction ($\mathfrak I(q) = 0$)
|
||||
|
||||
Any object with four dimensions can be coerced into an input for the set (i.e., mapped onto the hypercube $[-2, 2]^4$). For example, images are 2D, with the color at any one pixel being 3D; this is five dimensions in total, more than enough. Thus, each we can interpret each 2D slice above as an "input image". The image coordinates correspond to the real and i components (centered on the origin; positive i toward the top, positive reals toward the right). Meanwhile, hue angle corresponds to j ($[-180°, 180°) \mapsto [-2, 2)$), and saturation to k ($[0, 1] \mapsto [-2, 2]$).
|
||||
|
||||
Using this technique, I will produce four more 2D slices:
|
||||
|
||||
a. Repeating the 1i components in jk: $~a + bi + aj + bk$
|
||||
b. Reversing the 1i components in jk: $~a + bi + bj + ak$
|
||||
c. Sharing the imaginary component across ijk: $~a + bi + bj + bk$
|
||||
d. A "footprint": $~a + bi + \theta j + \alpha k$
|
||||
|
||||
$$
|
||||
\theta = \frac{2 \text{atan2}(b,a)}{\pi},~
|
||||
\alpha = 2\max(|a|, |b|) - 4
|
||||
$$
|
||||
|
||||
The footprint is not intended to show detail, but to function as a tool to identify similar multiplications.
|
||||
|
||||
::: {}
|
||||
![]()
|
||||
2D slice input images. Clockwise from top left: a, b, d, c
|
||||
:::
|
||||
|
||||
|
||||
Starting Simple: Eighth Roots
|
||||
-----------------------------
|
||||
|
||||
Two- and three-dimensional numbers are produced from the fourth and sixth roots of unity respectively. Therefore it should stand to reason that we can produce 4D numbers from the eighth root of unity. Using the intuition from the sixth root, the eighth roots lie on the vertices of a regular octagon. Opposite points can be connected, corresponding to the positive- and negative-going directions. With two of these points occupied by the reals, there are three remaining pairs, any of which could correspond to *i*, *j*, or *k*. There are 6 ways to select the axes, as well as 2^3^ = 8 possible sign orientations.
|
||||
|
||||
In 3D, this strategy made 8 matrices, of which 4 were the same. Instead of doing the same for all 48 choices, I will only show one: where *i* is on the vertical and *j* and *k* are on either side of 1. Multiplication is commutative (and associative) for roots of unity, so:
|
||||
|
||||
$$
|
||||
\begin{gather*}
|
||||
i^2 = -1,~ j^2 = i,~ k^2 = -i,~ jk = 1
|
||||
~\Rightarrow~ ijk = i\\
|
||||
M_8 = \begin{pmatrix}
|
||||
-1 & -k & j \\
|
||||
-k & i & 1 \\
|
||||
j & 1 & -i
|
||||
\end{pmatrix},~
|
||||
\begin{matrix} |M_8| &= i^2 - i j^2 + i k^2 - 2 j k + 1 \\
|
||||
&= i^2 - i^2 - i^2 - 2 + 1 = 0
|
||||
\end{matrix}
|
||||
\end{gather*}
|
||||
$$
|
||||
|
||||
::: {}
|
||||
![]()
|
||||
Clockwise from top left: 1*i* plane, *j* direction; *ij* plane, 1 direction; *jk* plane, 1 direction; *jk* plane, i direction. All subsequent videos will follow the same scheme.
|
||||
:::
|
||||
|
||||
In the top left slice video, somewhat unsurprisingly, the original Mandelbrot set still appears. Interestingly, the bottom two slices approach the same figure at $\Re(q) = 0$, despite growing differently.
|
||||
|
||||
![]()
|
||||
|
||||
Both the split-complex and the complex sets appear within the images, albeit rotated. This resembles the case with the sixth root cylinder, and that this multiplication scheme is also a hybrid of the two sets.
|
||||
|
||||
|
||||
Square Symmetry
|
||||
---------------
|
||||
|
||||
Just as the group of rotations on a triangle were discussed in 3D, rotations on squares can be described in 4D. Half-turns correspond to *i*, and clockwise and counterclockwise quarter-turns correspond to either of *j* and *k*. Predictably, this means that *j* and *k* are fourth roots of unity, effectively recreating the complex numbers.
|
||||
|
||||
$$
|
||||
\begin{gather*}
|
||||
i^2 = 1,~ j^2 = k^2 = i,~ ijk = i \\
|
||||
M_\square = \begin{pmatrix}
|
||||
1 & k & j \\
|
||||
k & i & 1 \\
|
||||
j & 1 & i
|
||||
\end{pmatrix},~
|
||||
\begin{matrix} |M_\square| &= -i j^2 + 2 j k - i k^2 - 2 \\
|
||||
&= -i^2 + 2 - i^2 - 2 = -2
|
||||
\end{matrix}
|
||||
\end{gather*}
|
||||
$$
|
||||
|
||||
![]()
|
||||
|
||||
Since the multiplication has no explicit change in sign, the slices tend to reflect the *split-complex* set rather than the complex one. The original complex set is still visible among the top right slices, windowed by the split-complex set. This is due to the effect of the two fourth roots *j* and *k* reproducing the 2D complex numbers.
|
||||
|
||||
![]()
|
||||
|
||||
The footprint looks similar, especially the stray red spot and upper blob. The rest are just more of the same split-complex set, although one is sheared into rectangle instead.
|
||||
|
||||
|
||||
Quaternions
|
||||
-----------
|
||||
|
||||
Quaternions are the most common 4D extension of the complex numbers. Discovered by Hamilton for the purpose of expressing rotations in 3D, they are a major progenitor of vector analysis. Unlike the previous two systems, quaternions are anticommutative and no imaginary axis is distinguished from another.
|
||||
|
||||
$$
|
||||
\begin{gather*}
|
||||
i^2 = j^2 = k^2 = ijk = -1 \\
|
||||
M_H = \begin{pmatrix}
|
||||
-1 & k & -j \\
|
||||
-k & -1 & i \\
|
||||
j & -i & -1
|
||||
\end{pmatrix},~
|
||||
\begin{matrix} |M_H| &= -1(1 + i^2) - k(k - ji) - j(ki - j) \\
|
||||
&= -i^2 - j^2 - k^2 - 1 - 2ijk = 4
|
||||
\end{matrix}
|
||||
\end{gather*}
|
||||
$$
|
||||
|
||||
The quaternions are very spherical, since the imaginary elements satisfy $-i^2 - j^2 - k^2 = 3$. This property is what allows the quaternions to describe 3D rotations so gracefully, and it should no surprise that such figures appear in the slices.
|
||||
|
||||
![]()
|
||||
|
||||
The top left and bottom right slices are the same since they combine the real axis and two imaginary directions. The spheres are most apparent in the subspace where $\Re(q) = 0$. The original Mandelbrot set comes into view in the upper right (and to a degree, in the two slices that are the same), perhaps unsurprisingly, since quaternions extend imaginary numbers so naturally.
|
||||
|
||||
![]()
|
||||
|
||||
The footprint is now decidedly different, with three red spots. Further, the original set appears when all three imaginary components are the same. Although slightly deformed, it shows that the three imaginary components, taken all at once, partially recombine to form the original complex numbers. The other two images appear to be near the main cardioid, especially when compared with the reproduced set.
|
||||
|
||||
|
||||
Dihedral Group of Order 8
|
||||
-------------------------
|
||||
|
||||
A similar anticommutative multiplication corresponds to a dihedral group. It describes another set of symmetries on a square: *i* corresponds to quarter turns and *j* and *k* correspond to reflection over either diagonal. This means that *i* remains a fourth root of unity, while *j* and *k* are both second roots of unity; they are distinguished from each other in how they interact with *i*.
|
||||
|
||||
$$
|
||||
\begin{gather*}
|
||||
i^2 = -1,~ j^2 = k^2 = ijk = 1 \\
|
||||
M_\diamond = \begin{pmatrix}
|
||||
-1 & k & -j \\
|
||||
-k & 1 & -i \\
|
||||
j & i & 1
|
||||
\end{pmatrix},~
|
||||
\begin{matrix} |M_\diamond| &= -1(1 + i^2) - k(-k + ji) - j(-ki - j) \\
|
||||
&= -i^2 + j^2 + k^2 - 1 + 2ijk = 4
|
||||
\end{matrix}
|
||||
\end{gather*}
|
||||
$$
|
||||
|
||||
The *ij* (or *ik*) pair form the hyperbolic equation $j^2 - i^2 = 2$ and the *jk* pair form the circular equation $j^2 + k^2 = 2$. Therefore, we might expect that the slice videos correspond to different conics...
|
||||
|
||||
![]()
|
||||
|
||||
...which is the case. The top left image features two hyperbolic "ghosts" of the original Mandelbrot set which come together, while the top right and bottom left show hyperboloids. The bottom right slices either a sphere, which was not predicted, or the solid of revolution of the split-complex set.
|
||||
|
||||
![]()
|
||||
|
||||
The first two images appear to be along two hyperbolic asymptotes. Contrary to the quaternions, the set when all three imaginary components recombine is the split-complex one. The footprint is also the first to contain any black, or more accurately, any points whose image coordinates satisfy the membership condition of the set.
|
||||
|
||||
Though not shown, it is also certain that the set corresponding to the dual numbers also lies somewhere within this maze of an algebra, since $a + bi + bj \cong a + b\epsilon$. The manifold conic figures and multitude of alternative sets combine to make this the multiplication I find most interesting.
|
||||
|
||||
|
||||
Mandelbrot Menagerie
|
||||
--------------------
|
||||
|
||||
Unfortunately, the above examples are the most well-defined systems. Nonassociativity pervades other options. Though the Mandelbrot set pertains to the action of squaring rather than cubing, its shape becomes unstable when multiplication is not associative. Thus, the remainder of the post will be dedicated to a showcase of some "better" systems. For each, I will show a single example alongside *M*.
|
||||
|
||||
|
||||
### Triply Split-Complex
|
||||
|
||||
The square rotation group, but with the lower right 2×2 block rotated. This algebra appears to be associative, but is exceptionally uninteresting.
|
||||
|
||||
$$
|
||||
\begin{gather*}
|
||||
i^2 = j^2 = k^2 = ijk = 1 \\
|
||||
M = \begin{pmatrix}
|
||||
1 & k & j \\
|
||||
k & 1 & i \\
|
||||
j & i & 1
|
||||
\end{pmatrix},~
|
||||
\begin{matrix} |M| &= -i^2 + 2 i j k - j^2 - k^2 + 1 \\
|
||||
&= -1 + 2 - 1 - 1 + 1 = 0
|
||||
\end{matrix}
|
||||
\end{gather*}
|
||||
$$
|
||||
|
||||
![]()
|
||||
|
||||
![]()
|
||||
|
||||
|
||||
### Triply Complex
|
||||
|
||||
Quaternions, but commutative and without negative co-products. Can also be seen as the above, but with reversed sign on the main diagonal.
|
||||
|
||||
$$
|
||||
\begin{gather*}
|
||||
i^2 = j^2 = k^2 = ijk = -1 \\
|
||||
M = \begin{pmatrix}
|
||||
-1 & k & j \\
|
||||
k & -1 & i \\
|
||||
j & i & -1
|
||||
\end{pmatrix},~
|
||||
\begin{matrix} |M| &= i^2 + 2 i j k + j^2 + k^2 - 1 \\
|
||||
&= -1 - 2 - 1 - 1 - 1 = -6
|
||||
\end{matrix} \\
|
||||
i^2 j = -j \neq j = ik = i(ij)
|
||||
\end{gather*}
|
||||
$$
|
||||
|
||||
![]()
|
||||
|
||||
![]()
|
||||
|
||||
|
||||
### Negi-Dihedral
|
||||
|
||||
The dihedral group, but negated (i.e., with negated squares). Still anticommutative, but has two fourth roots and one second root of unity.
|
||||
|
||||
$$
|
||||
\begin{gather*}
|
||||
i^2 = 1,~ j^2 = k^2 = ijk = -1 \\
|
||||
M = \begin{pmatrix}
|
||||
1 & k & -j \\
|
||||
-k & -1 & -i \\
|
||||
j & i & -1
|
||||
\end{pmatrix},~
|
||||
\begin{matrix} |M| &= (1 + i^2) - k(k + ji) - j(-ki + j) \\
|
||||
&= 1 + i^2 - k^2 - j^2 + 2ijk = 2
|
||||
\end{matrix} \\
|
||||
i^2 j = j \neq -j = ik = i(ij)
|
||||
\end{gather*}
|
||||
$$
|
||||
|
||||
![]()
|
||||
|
||||
![]()
|
||||
|
||||
|
||||
### Anti-Dihedral
|
||||
|
||||
The dihedral group, but commutative.
|
||||
|
||||
$$
|
||||
\begin{gather*}
|
||||
i^2 = ijk = -1,~ j^2 = k^2 = 1 \\
|
||||
M = \begin{pmatrix}
|
||||
-1 & -k & -j \\
|
||||
-k & 1 & i \\
|
||||
-j & i & 1
|
||||
\end{pmatrix},~
|
||||
\begin{matrix} |M| &= i^2 + 2 i j k - j^2 - k^2 - 1 \\
|
||||
&= -1 - 2 - 1 - 1 - 1 = -6
|
||||
\end{matrix} \\
|
||||
j^2k = k \neq -k = ji = j(jk)
|
||||
\end{gather*}
|
||||
$$
|
||||
|
||||
![]()
|
||||
|
||||
![]()
|
||||
|
||||
|
||||
### Negi-Dihedral
|
||||
|
||||
The dihedral group, but negated (i.e., with negated squares). Still anticommutative, but has two fourth roots and one second root of unity.
|
||||
|
||||
$$
|
||||
\begin{gather*}
|
||||
i^2 = j^2 = k^2 = ijk = 1 \\
|
||||
M = \begin{pmatrix}
|
||||
1 & k & -j \\
|
||||
-k & 1 & i \\
|
||||
j & -i & 1
|
||||
\end{pmatrix},~
|
||||
\begin{matrix} |M| &= (1 + i^2) - k(-k - ji) - j(ki - j) \\
|
||||
&= 1 + i^2 + j^2 + k^2 - 2ijk = 2
|
||||
\end{matrix} \\
|
||||
i^2j = j \neq -j = ik = i(ij)
|
||||
\end{gather*}
|
||||
$$
|
||||
|
||||
![]()
|
||||
|
||||
![]()
|
||||
|
||||
|
||||
### Anti-Eighth Root
|
||||
|
||||
The multiplication based on the eighth roots of unity, but anticommutative. This one is significantly more ill-defined than those previous, and its determinant will not be calculated.
|
||||
|
||||
$$
|
||||
\begin{gather*}
|
||||
i^2 = -1,~ j^2 = k^2 = i,~ ijk = i \\
|
||||
M = \begin{pmatrix}
|
||||
-1 & -k & j \\
|
||||
k & i & -1 \\
|
||||
-j & 1 & i
|
||||
\end{pmatrix} \\
|
||||
j^2k = ik = j \neq -j = j(jk)
|
||||
\end{gather*}
|
||||
$$
|
||||
|
||||
![]()
|
||||
|
||||
![]()
|
||||
|
||||
|
||||
### Hybrid Complex
|
||||
|
||||
A very bad multiplication scheme, made to violate a couple of rules that I established in the initial specification for *M*. i is still a fourth root of unity, but co-products of it and the other terms are 0. Products of j and k lead back to the real and imaginary axes.
|
||||
|
||||
$$
|
||||
\begin{gather*}
|
||||
i^2 = -1,~ j^2 = k^2 = i,~ ijk = i \\
|
||||
M = \begin{pmatrix}
|
||||
-1 & 0 & 0 \\
|
||||
0 & i & 1 \\
|
||||
0 & 1 & -i
|
||||
\end{pmatrix},~ |M| = -(-i^2 - 1) = 0 \\
|
||||
i^2j = -j \neq 0 = i(ij)
|
||||
\end{gather*}
|
||||
$$
|
||||
|
||||
|
||||
Summary and Closing
|
||||
-------------------
|
||||
|
||||
In 4D, the interplay between the complex and split-complex sets deepens. For good choices in the behavior of *i*, *j*, and *k*, the main cardioid as well as the $L^1$ circle turn up rather harmoniously. In 3D, certain multiplications had sets which appeared to be solids of revolution of the 2D set, but surrounded by artifacts eliminated at various iteration counts. Despite similar shapes appearing, no such artifacting is apparent in 4D.
|
||||
|
||||
Unfortunately, the strategy I used to visualize 4D misses out on behavior specific to the fourth dimension. A more natural practice would be to show an explorable space spanning *ijk* with an additional slider that controls the real coordinate. For each value on the slider, we need to generate the set on a volume of sample points, which are then reduced to surfaces using 3D edge detection. In real-time, this has obvious drawbacks, as a single iteration on $51^3$ points takes a substantial amount of time, despite using a somewhat large step size of 0.02 . Even with all this effort, it can be difficult to see the slices which produce the videos, and the surface grows rougher with more iterations.
|
||||
|
||||
In higher dimensions, any three imaginary units can form an anticommutative triple. We can also form bigger *M*s by adjoining smaller ones. Most importantly, visualizations get more difficult. The "best" generalizations after quaternions are the octonions in 8D and sedonions in 16D, each of which lose important features like associativity. It should follow that more bizarre properties need to be defined to combat this complexity, but doing so is difficult when there are so many objects in the algebra. As long as the multiplication obeys at least partially basic properties, the shape of the set is rather predictible, if fractal.
|
||||
479
number_number/1/index.qmd
Normal file
@ -0,0 +1,479 @@
|
||||
---
|
||||
format:
|
||||
html:
|
||||
html-math-method: katex
|
||||
---
|
||||
|
||||
|
||||
Numbering Numbers: From 0 to ∞
|
||||
==============================
|
||||
|
||||
The infinite is replete with paradoxes. Some of the best come from comparing sizes of infinite collections. For example, every natural number can be mapped to a (nonnegative) even number and vice versa.
|
||||
|
||||
$$
|
||||
\N \rightarrow 2\N \\
|
||||
n \mapsto 2n \\ ~ \\
|
||||
0 \mapsto 0,~ 1 \mapsto2,~ 2 \mapsto 4,~ 3 \mapsto 6,~ 4 \mapsto 8, ...
|
||||
$$
|
||||
|
||||
(For the purposes of this post, $0 \in \N, ~ 0 \notin \N^+$)
|
||||
|
||||
All even numbers are "hit" by this map (by the definition of an even number), and no two natural numbers map to the same even number (again, more or less by definition, since $2m = 2n$ implies that $m = n$ over $\N$). Therefore, the map is [one-to-one](https://en.wikipedia.org/wiki/Injective_function) and [onto](https://en.wikipedia.org/wiki/Surjective_function), and the map is a [bijection](https://en.wikipedia.org/wiki/Bijection). A consequence is that the map has an inverse, namely by reversing all of the arrows in the above block (i.e., the action of halving an even number).
|
||||
|
||||
Bijections with the natural numbers are easier to understand as a way to place things into a linear sequence. In other words, they enumerate some "sort" of item; in this case, even numbers.
|
||||
|
||||
In the finite world, a bijection between two things implies that they have the same size. It makes sense to extend the same logic to the infinite world, but there's a catch. The nonnegative even numbers are clearly a strict subset of the natural numbers, but by this argument they have the same size.
|
||||
|
||||
$$
|
||||
\begin{matrix}
|
||||
2\N & \longleftrightarrow & \N & \hookleftarrow & 2\N \\
|
||||
0 & \mapsto & \textcolor{red}0 & \dashleftarrow & \textcolor{red}0 \\
|
||||
2 & \mapsto & 1 & & \\
|
||||
4 & \mapsto & \textcolor{red}2 & \dashleftarrow & \textcolor{red}2 \\
|
||||
6 & \mapsto & 3 & & \\
|
||||
8 & \mapsto & \textcolor{red}4 & \dashleftarrow & \textcolor{red}4 \\
|
||||
10 & \mapsto & 5 & & \\
|
||||
12 & \mapsto & \textcolor{red}6 & \dashleftarrow & \textcolor{red}6 \\
|
||||
14 & \mapsto & 7 & & \\
|
||||
16 & \mapsto & \textcolor{red}8 & \dashleftarrow & \textcolor{red}8 \\
|
||||
\vdots & & \vdots & & \vdots
|
||||
\end{matrix}
|
||||
$$
|
||||
|
||||
|
||||
Are we Positive?
|
||||
----------------
|
||||
|
||||
The confusion continues if we look at the integers and the naturals. Integers are the natural numbers and their negatives, so it would be intuitive to assume that there are twice as many of them as there are naturals (more or less one to account for zero). But that logic fails for the naturals and the even numbers, and indeed, it fails for the integers and the naturals as well.
|
||||
|
||||
$$
|
||||
\begin{align*}
|
||||
\mathbb{N} &\rightarrow \mathbb{Z} \\
|
||||
n &\mapsto \left\{ \begin{matrix}
|
||||
n/2 & n \text{ even} \\
|
||||
-(n+1)/2 & n \text{ odd}
|
||||
\end{matrix} \right.
|
||||
\end{align*}
|
||||
\\ ~ \\
|
||||
0 \mapsto 0,\quad 2 \mapsto 1, \quad 4 \mapsto 2, \quad 6 \mapsto 3, \quad 8 \mapsto 4,~... \\
|
||||
1 \mapsto -1, \quad 3 \mapsto -2, \quad 5 \mapsto -3, \quad 7 \mapsto -4, \quad 9 \mapsto -5, ...
|
||||
$$
|
||||
|
||||
Or, in Haskell (if you cover your eyes and pretend that the `undefined` below will never happen):
|
||||
|
||||
```{.haskell}
|
||||
type Nat = Int
|
||||
|
||||
listIntegers :: Nat -> Int
|
||||
listIntegers n
|
||||
| n < 0 = undefined
|
||||
| even n = n `div` 2
|
||||
| otherwise = -(n + 1) `div` 2
|
||||
```
|
||||
|
||||
In other words, this map sends even numbers to the naturals (the inverse of the doubling map) and the odds to the negatives. The same arguments about the bijective nature of this map apply as before, and so the paradox persists, since naturals are also a strict subset of integers.
|
||||
|
||||
|
||||
### Rational Numbers
|
||||
|
||||
Rationals are a bit worse. To make things a little easier, let's focus on the positive rationals (i.e., fractions excluding 0). Unlike the integers, there is no obvious "next rational" after (or even before) 1. If there were, we could follow it with its reciprocal, like how an integer is followed by is negative in the map above.
|
||||
|
||||
On the other hand, the integers provide a sliver of hope that listing all rational numbers is possible. Integers can be defined as pairs of natural numbers, along with a way of considering two pairs equal.
|
||||
|
||||
$$
|
||||
-1 = (0,1) \sim_\Z (1,2) \sim_\Z (2,3) \sim_\Z (3,4) \sim_\Z ... \\
|
||||
~ \\
|
||||
(a,b) \sim_\mathbb{Z} (c,d) \iff a+d = b+c \quad a,b,c,d \in \mathbb{N} \\
|
||||
~ \\
|
||||
\mathbb{Z} := ( \mathbb{N} \times \mathbb{N} ) / \sim_\mathbb{Z}
|
||||
$$
|
||||
|
||||
```{.haskell}
|
||||
intEqual :: (Nat, Nat) -> (Nat, Nat) -> Bool
|
||||
intEqual (a, b) (c, d) = a + d == b + c
|
||||
```
|
||||
|
||||
This relation is the same as saying $a - b = c - d$ (i.e., that -1 = 0 - 1, etc.), but has the benefit of not needing to define subtraction first. This is all the better, since, as grade-schoolers are taught, subtracting a larger natural number from a smaller one is impossible.
|
||||
|
||||
The same equivalence definition exists for positive rationals. It is perhaps more familiar, because of the emphasis placed on simplifying fractions when learning them. We can [cross-multiply](https://en.wikipedia.org/wiki/Cross-multiplication) fractions to get a similar equality condition to the one for integers.
|
||||
|
||||
$$
|
||||
{1 \over 2} = (1,2) \sim_\mathbb{Q} \overset{2/4}{(2,4)} \sim_\mathbb{Q} \overset{3/6}{(3,6)} \sim_\mathbb{Q} \overset{4/8}{(4,8)} \sim_\mathbb{Q} ... \\
|
||||
~ \\
|
||||
(a,b) \sim_\mathbb{Q} (c,d) \iff ad = bc \quad a,b,c,d \in \mathbb{N}^+ \\
|
||||
~ \\
|
||||
\mathbb{Q^+} := ( \mathbb{N^+} \times \mathbb{N^+} ) / \sim_\mathbb{Q}
|
||||
$$
|
||||
|
||||
```{.haskell}
|
||||
ratEqual :: (Nat, Nat) -> (Nat, Nat) -> Bool
|
||||
ratEqual (a, b) (c, d) = a * d == b * c
|
||||
```
|
||||
|
||||
We specify that neither element of the pair can be zero, so this excludes divisions by zero (and the especially tricky case of 0/0, which would be equal to all fractions). Effectively, this just replaces where addition appears in the integer equivalence with multiplication.
|
||||
|
||||
|
||||
### Eliminating Repeats
|
||||
|
||||
Naively, to tackle both of these cases, we might consider enumerating pairs of natural numbers. We order them by sums and break ties by sorting on the first index.
|
||||
|
||||
| Index | Pair (*a*, *b*) | Sum (*a* + *b*) | Integer (*a* - *b*) | Rational (*a*+1 / *b*+1) |
|
||||
|-------|-----------------|-----------------|---------------------|--------------------------|
|
||||
| 0 | (0, 0) | 0 | 0 | 1/1 |
|
||||
| 1 | (0, 1) | 1 | -1 | 1/2 |
|
||||
| 2 | (1, 0) | 1 | 1 | 2/1 |
|
||||
| 3 | (0, 2) | 2 | -2 | 1/3 |
|
||||
| 4 | (1, 1) | 2 | 0 | 2/2 = 1/1 |
|
||||
| 5 | (2, 0) | 2 | 2 | 3/1 |
|
||||
| 6 | (0, 3) | 3 | -3 | 1/4 |
|
||||
| 7 | (1, 2) | 3 | -1 | 2/3 |
|
||||
| 8 | (2, 1) | 3 | 1 | 3/2 |
|
||||
| 9 | (3, 0) | 3 | 3 | 4/1 |
|
||||
| ... | ... | ... | ... | ... |
|
||||
|
||||
```{.haskell}
|
||||
-- All pairs of natural numbers that sum to n
|
||||
listPairs :: Nat -> [(Nat, Nat)]
|
||||
listPairs n = [ (k, n - k) | k <- [0..n] ]
|
||||
|
||||
-- Use a natural number to index the enumeration of all pairs
|
||||
allPairs :: [(Nat, Nat)]
|
||||
allPairs = concat $ map listPairs [0..]
|
||||
|
||||
allPairsMap :: Nat -> (Nat, Nat)
|
||||
allPairsMap n = allPairs !! n
|
||||
```
|
||||
|
||||
This certainly works to show that naturals and pairs of naturals can be put into bijection, but it when interpreting the results as integers or rationals, we double-count several of them. This is easy to see in the case of the integers, but it will also happen in the rationals. For example, the pair (3, 5) would correspond to 4/6 = 2/3, which has already been counted.
|
||||
|
||||
Incidentally, Haskell comes with a function called `nubBy`. This function eliminates duplicates according to another function of our choosing. We can also just implement it ourselves and use it to create a naive enumeration of integers and rationals, based on the equalities defined earlier:
|
||||
|
||||
```{.haskell}
|
||||
nubBy :: (a -> a -> Bool) -> [a] -> [a]
|
||||
nubBy f xs = nubBy' [] xs where
|
||||
nubBy' ys [] = []
|
||||
nubBy' ys (z:zs)
|
||||
-- Ignore this element, something equivalent is in ys
|
||||
| any (f z) ys = nubBy' ys zs
|
||||
-- Append this element to the result and our internal list
|
||||
| otherwise = z:nubBy' (z:ys) zs
|
||||
|
||||
allIntegers :: [(Nat, Nat)]
|
||||
-- Remove duplicates under integer equality
|
||||
allIntegers = nubBy intEqual allPairs
|
||||
|
||||
allIntegersMap :: Nat -> (Nat, Nat)
|
||||
allIntegersMap n = allIntegers !! n
|
||||
|
||||
allRationals :: [(Nat, Nat)]
|
||||
-- Add 1 to the numerator and denominator to get rid of 0,
|
||||
-- then remove duplicates under fraction equality
|
||||
allRationals = nubBy ratEqual $ map (\(a,b) -> (a+1, b+1)) allPairs
|
||||
|
||||
allRationalsMap :: Nat -> (Nat, Nat)
|
||||
allRationalsMap n = allRationals !! n
|
||||
```
|
||||
|
||||
For completeness's sake, the resulting pairs of each map are as follows
|
||||
|
||||
| *n* | `allIntegersMap n` | `allRationalsMap n` |
|
||||
|-----|--------------------|---------------------|
|
||||
| 0 | (0, 0) = 0 | (1, 1) = 1 |
|
||||
| 1 | (0, 1) = -1 | (1, 2) = 1/2 |
|
||||
| 2 | (1, 0) = 1 | (2, 1) = 2/1 |
|
||||
| 3 | (0, 2) = -2 | (1, 3) = 1/3 |
|
||||
| 4 | (2, 0) = 2 | (3, 1) = 3/1 |
|
||||
| 5 | (0, 3) = -3 | (1, 4) = 1/4 |
|
||||
| 6 | (3, 0) = 3 | (2, 3) = 2/3 |
|
||||
| 7 | (0, 4) = -4 | (3, 2) = 3/2 |
|
||||
| 8 | (4, 0) = 4 | (4, 1) = 4/1 |
|
||||
| 9 | (0, 5) = -5 | (1, 5) = 1/5 |
|
||||
| ... | ... | ... |
|
||||
|
||||
Note that the tuples produced by `allIntegers`, when interpreted as integers, happen to coincide with the earlier enumeration given by `listIntegers`.
|
||||
|
||||
|
||||
Tree of Fractions
|
||||
-----------------
|
||||
|
||||
There's an entirely separate structure which contains all rationals in least terms. It relies on an operation between two fractions called the *mediant*. For two rational numbers in least terms *p* and *q*, such that *p* < *q*, the mediant is designated *p* ⊕ *q* and will:
|
||||
|
||||
1. also be in least terms (with some exceptions, see below),
|
||||
2. be larger than *p*, and
|
||||
3. be smaller than *q*
|
||||
|
||||
$$
|
||||
p = {a \over b} < {c \over d} = q, \quad \gcd(a,b) = \gcd(c,d) = 1 \\ ~ \\
|
||||
p < p \oplus q < q \quad \phantom{\gcd(a+c, b+d) = 1} \\ ~ \\
|
||||
{a \over b} < {a+c \over b+d} < {c \over d}, \quad \gcd(a+c, b+d) = 1
|
||||
$$
|
||||
|
||||
We know our sequence of rationals starts with 1/1, 1/2, and 2/1. If we start as before with 1/1 and want to get the other quantities, then we can take its mediants with 0/1 and 1/0, respectively (handwaving the fact that the latter isn't a legitimate fraction).
|
||||
|
||||
$$
|
||||
\begin{align*}
|
||||
&& && \large{1 \over 1} && && \\
|
||||
{ \oplus {0 \over 1} } && \large{/} && && \large{\backslash} ~ && \oplus {1 \over 0} \\
|
||||
&& \large{1 \over 2} && && \large{2 \over 1} &&
|
||||
\end{align*}
|
||||
$$
|
||||
|
||||
We might try continuing this pattern by doing the same thing to 1/2. We can take its mediant with 0/1 to get 1/3. Unfortunately, the mediant of 1/2 and 1/0 is 2/2 (as is the mediant of 2/1 with 0/1), which isn't in least terms, and has already appeared as 1/1.
|
||||
|
||||
We could try another fraction that's appeared in the tree. Unfortunately, 2/1 suffers from the same issue as 1/0 -- 1/2 ⊕ 2/1 = 3/3, which is the same quantity as before, despite both fractions being in least terms. On the other hand, 1/2 ⊕ 1/1 = 2/3, which is in least terms. Similarly, 2/1 ⊕ 1/1 is 3/2, its reciprocal.
|
||||
|
||||
$$
|
||||
\begin{align*}
|
||||
&& && \large{1 \over 2} && && \\
|
||||
{ \oplus {0 \over 1} } && \large{/} && && \large{\backslash} ~ && \oplus {1 \over 1} \\
|
||||
&& \large{1 \over 3} && && \large{2 \over 3} &&
|
||||
\end{align*}
|
||||
\qquad \qquad
|
||||
\begin{align*}
|
||||
&& && \large{2 \over 1} && && \\
|
||||
{ \oplus {1 \over 1} } && \large{/} && && \large{\backslash} ~ && \oplus {1 \over 0} \\
|
||||
&& \large{3 \over 2} && && \large{3 \over 1} &&
|
||||
\end{align*}
|
||||
$$
|
||||
|
||||
The trick is to notice that a step to the left "updates" what the next step to the right looks like. Steps to the right behave symmetrically. For example, in the row we just generated, the left child of 2/3 is its mediant with 1/2, its right child is its mediant with 1/1.
|
||||
|
||||
Continuing this iteration ad infinitum forms the so-called [Stern-Brocot tree](https://en.wikipedia.org/wiki/Stern%E2%80%93Brocot_tree). A notable feature of this is that it is a [binary search tree](https://en.wikipedia.org/wiki/Binary_search_tree) (of infinite height). This means that for any node, the value at the node is greater than all values in the left subtree are and less than all values in the right subtree.
|
||||
|
||||
![]()
|
||||
|
||||
There's a bit of a lie in presenting the tree like this. As a binary tree, it's most convenient to show the nodes spaced evenly, but the distance between 1/1 and 2/1 is not the same as the distance between 1/1 and 1/2.
|
||||
|
||||
We can implement this in Haskell using `Data.Tree`. This package actually lets you describe trees with any number of child nodes, but we only need two for the sake of the Stern-Brocot tree.
|
||||
|
||||
```{.haskell}
|
||||
import Data.Tree
|
||||
|
||||
-- Make a tree by applying the function `make` to each node
|
||||
-- Start with the root value (1, 1), along with
|
||||
-- its left and right steps, (0, 1) and (1, 0)
|
||||
sternBrocot = unfoldTree make $ ((1,1), (0,1), (1,0)) where
|
||||
-- Place the first value in the tree, then describe the next
|
||||
-- values for `make` in a list:
|
||||
make (v@(vn, vd), l@(ln, ld), r@(rn, rd))
|
||||
= (v, [
|
||||
-- the left value, and its left (unchanged) and right steps...
|
||||
(((ln + vn), (ld + vd)), l, v),
|
||||
-- and the right value, and its left and right (unchanged) steps
|
||||
(((vn + rn), (vd + rd)), v, r)
|
||||
])
|
||||
```
|
||||
|
||||
|
||||
### Cutting the Tree Down
|
||||
|
||||
We're halfway there. All that remains is to read off every value in the tree as a sequence. Perhaps the most naive way would be to read off by always following the left or right child. Unfortunately, these give some fairly dull sequences.
|
||||
|
||||
```{.haskell}
|
||||
treePath :: [Int] -> Tree a -> [a]
|
||||
treePath xs (Node y ys)
|
||||
-- If we don't have any directions (xs), or the node
|
||||
-- has no children (ys), then there's nowhere to go
|
||||
| null xs || null ys = [y]
|
||||
-- Otherwise, go down subtree "x", then recurse with that tree
|
||||
-- and the rest of the directions (xs)
|
||||
| otherwise = y:treePath (tail xs) (ys !! head xs)
|
||||
|
||||
-- Always go left (child 0)
|
||||
alwaysLeft = treePath (repeat 0) sternBrocot
|
||||
-- = [(1,1),(1,2),(1,3),(1,4),(1,5),(1,6),(1,7),(1,8),(1,9),(1,10),...]
|
||||
-- i.e., numbers with numerator 1
|
||||
|
||||
-- Always go right (child 1)
|
||||
alwaysRight = treePath (repeat 1) sternBrocot
|
||||
-- = [(1,1),(2,1),(3,1),(4,1),(5,1),(6,1),(7,1),(8,1),(9,1),(10,1),...]
|
||||
-- i.e., numbers with denominator 1
|
||||
```
|
||||
|
||||
Rather than by following paths in the tree, we can instead do a breadth-first search. In other words, we read off each row individually, in order. This gives us our sequence of rational numbers with no repeats.
|
||||
|
||||
$$
|
||||
\begin{align*}
|
||||
\mathbb{N^+}& ~\rightarrow~ \mathbb{Q} \\
|
||||
n & ~\mapsto~ \text{bfs}[n]
|
||||
\end{align*}
|
||||
\\ ~ \\
|
||||
1 \mapsto 1/1,~ \\
|
||||
2 \mapsto 1/2,\quad 3 \mapsto 2/1,~ \\
|
||||
4 \mapsto 1/3,\quad 5 \mapsto 2/3, \quad 6 \mapsto 3/2, \quad 7 \mapsto 3/1,~ ...
|
||||
$$
|
||||
|
||||
For convenience, this enumeration is given starting from 1 rather than from 0. This numbering makes it clearer that each row starts with a power of 2, since the structure is a binary tree, and the complexity doubles with each row. The enumeration could just as easily start from 0 by starting with $\N$, then getting to $\N^+$ with $n \mapsto n+1$.
|
||||
|
||||
We can also write a breadth-first search in Haskell, for posterity:
|
||||
|
||||
```{.haskell}
|
||||
bfs :: Tree a -> [a]
|
||||
bfs (Node root children) = bfs' root children where
|
||||
-- Place the current node in the list
|
||||
bfs' v [] = [v]
|
||||
-- Pluck one node off our list of trees, then recurse with
|
||||
-- the rest, along with that node's children
|
||||
bfs' v ((Node y ys):xs) = v:bfs' y (xs ++ ys)
|
||||
|
||||
sternBrocotRationals = bfs sternBrocot
|
||||
```
|
||||
|
||||
The entries in this enumeration have already been given.
|
||||
|
||||
|
||||
### Another Tree
|
||||
|
||||
Another tree of fractions to consider is the tree of binary fractions. These fractions simply consist of odd numbers divided by powers of two. The most convenient way to organize these into a tree is to keep denominators equal if the nodes have the same depth from the root. We also stipulate that we arrange the nodes as a binary search tree, like the Stern-Brocot tree.
|
||||
|
||||
The tree starts from 1/1 as before. Its children have denominator 2, so we have 1/2 to the left and 3/2 to the right. This is equivalent to subtracting 1/2 for the left step and adding 1/2 for the right step. At the next layer, we want fractions with denominator 1/4, and do similarly. In terms of adding and subtracting, we just use 1/4 instead of 1/2.
|
||||
|
||||
![]()
|
||||
|
||||
We can describe this easily in Haskell:
|
||||
|
||||
```{.haskell}
|
||||
-- Start with 1/1 (i.e., (1, 1))
|
||||
binFracTree = unfoldTree make $ (1,1) where
|
||||
-- Place the first value in the tree, then describe the next
|
||||
-- values for `make` in a list:
|
||||
make v@(vn, vd)
|
||||
= (v, [
|
||||
-- double the numerator and denominator, then subtract 1 from the numerator
|
||||
(2*vn - 1, 2*vd),
|
||||
-- same, but add 1 to the numerator instead
|
||||
(2*vn + 1, 2*vd)
|
||||
])
|
||||
```
|
||||
|
||||
The entries of this tree have an additional interpretation when converted to their binary expansions. These fractions always terminate in a "1" in binary, but ignoring this final entry, starting from the root and following "left" for 0 and "right" for 1 places us at that fraction in the tree. In other words, the binary expansions encode the path from the root to the node.
|
||||
|
||||
|
||||
Why Bother?
|
||||
-----------
|
||||
|
||||
The tree of binary fractions and the Stern-Brocot tree are both infinite binary search trees, so we might imagine overlaying one tree over the other, pairing up the individual entries.
|
||||
|
||||
![]()
|
||||
|
||||
In Haskell, we can pair up entries recursively:
|
||||
|
||||
```{.haskell}
|
||||
zipTree :: Tree a -> Tree b -> Tree (a,b)
|
||||
-- Pair the values in the nodes together, then recurse with the child trees
|
||||
zipTree (Node x xs) (Node y ys) = Node (x,y) $ zipWith zipTree xs ys
|
||||
|
||||
binarySBTree = zipTree sternBrocot binFracTree
|
||||
```
|
||||
|
||||
Conveniently, both left subtrees of the root fall in the interval (0, 1). It also pairs up 1 and 1/2 with themselves. Doing so establishes a bijection between the rationals and the binary rationals in that interval. Rationals are more continuous than integers, so it might be of some curiosity to plot this function. We only have to look at a square over the unit interval. Doing so reveals a curious shape:
|
||||
|
||||
:::: {}
|
||||
::: {}
|
||||
![]()
|
||||
:::
|
||||
|
||||
::: {}
|
||||
![]()
|
||||
:::
|
||||
|
||||
Left: binary rationals on the x-axis, rationals on the y-axis. <br>
|
||||
Right: rationals on the x-axis, binary rationals on the y-axis.
|
||||
::::
|
||||
|
||||
The plot on the right which maps the rationals to the binary rationals is known as [Minkowski's question mark function](https://en.wikipedia.org/wiki/Minkowski%27s_question-mark_function). Notice that this function is nearly 1/2 for values near 1/2 (nearly 1/4 for values near 1/3, nearly 1/8 for values near 1/4, etc.).
|
||||
|
||||
|
||||
### I'm Repeating Myself
|
||||
|
||||
The inverse question mark map (which I'll call ¿ for short), besides mapping binary rationals to rationals, has an interesting relationship with other rational numbers. Recall that we only defined the function in terms of fractions which happen to have finite binary expansions. Those with infinite binary expansions, such as 1/3 (and indeed, any fraction whose denominator isn't a power of 2) aren't defined.
|
||||
|
||||
$$
|
||||
{1 \over 2} = 0.1_2 \\
|
||||
{1 \over 3} = 0.\overline{01} = 0.\textcolor{red}{01}\textcolor{green}{01}\textcolor{blue}{01}... \\
|
||||
{1 \over 4} = 0.01_2 \\
|
||||
{1 \over 5} = 0.\overline{0011} = 0.\textcolor{red}{0011}\textcolor{green}{0011}\textcolor{blue}{0011}... \\
|
||||
\vdots
|
||||
$$
|
||||
|
||||
We can persevere if we continue to interpret the binary strings as a path in the tree. This means that for 1/3, we go left initially, then alternate between going left and right. As we do so, let's take note of the values we pass along the way:
|
||||
|
||||
```{.haskell}
|
||||
-- Follow the path described by the expansion of 1/3
|
||||
treePath (0:cycle [0,1]) $ zipTree sternBrocot binFracTree
|
||||
```
|
||||
|
||||
| | Binary fraction | Binary fraction (decimal) | Stern-Brocot rational | Stern-Brocot rational (decimal)
|
||||
|-----|-------------------|---------------------------|-----------------------|--------------------------------|
|
||||
| 0 | 1/1 | 1 | 1/1 | 1 |
|
||||
| 1 | 1/2 | 0.5 | 1/2 | 1/2 |
|
||||
| 2 | 1/4 | 0.25 | 1/3 | 0.3333333... |
|
||||
| 3 | 3/8 | 0.375 | 2/5 | 0.4 |
|
||||
| 4 | 5/16 | 0.3125 | 3/8 | 0.375 |
|
||||
| 5 | 11/32 | 0.34375 | 5/13 | 0.38461538... |
|
||||
| 6 | 21/64 | 0.328125 | 8/21 | 0.32812538... |
|
||||
| 7 | 43/128 | 0.3359375 | 13/34 | 0.3823529... |
|
||||
| 8 | 85/256 | 0.33203125 | 21/55 | 0.38181818... |
|
||||
| ⋮ | ⋮ | ⋮ | ⋮ | ⋮ |
|
||||
| 100 | (too big to show) | 0.3333333333... | (too big to show) | 0.381966011... |
|
||||
| ⋮ | ⋮ | ⋮ | ⋮ | ⋮ |
|
||||
|
||||
:::: {layout-ncol = "2"}
|
||||
::: {}
|
||||
![]()
|
||||
:::
|
||||
|
||||
::: {}
|
||||
![]()
|
||||
:::
|
||||
|
||||
Left: binary convergents of 1/3 <br>
|
||||
Right: ¿ applied to binary convergents of 1/3, which also appear to converge
|
||||
::::
|
||||
|
||||
Both sequences appear to converge to a number, with the binary fractions obviously converging to 1/3. The rationals from the Stern-Brocot don't appear to be converging to a repeating decimal. Looking closer, the numerators and denominators of the fractions appear to come from the Fibonacci numbers. In fact, the quantity that the fractions approach is $2 - \varphi$, where φ is the golden ratio. This number is the root of the polynomial $x^2 - 3x + 1$.
|
||||
|
||||
In fact, all degree 2 polynomials have roots that are encoded by a repeating path in the Stern-Brocot tree. Put another way, ¿ can be extended to map rationals other than binary fractions to quadratic roots (and ? maps quadratic roots to rational numbers). This is easier to understand when writing the quantity as its [continued fraction expansion](https://en.wikipedia.org/wiki/Continued_fraction), but that's an entirely separate discussion.
|
||||
|
||||
Either way, it tells us something interesting: not only can all rational numbers be enumerated, but so can quadratic *irrationals*.
|
||||
|
||||
|
||||
### The Other Side
|
||||
|
||||
I'd like to briefly digress from talking about enumerations and mention the right subtree. The question mark function, as defined here, is only defined on numbers between 0 and 1 (and even then, technically only rational numbers). According to Wikipedia's definition, the question mark function is quasi-periodic -- $?(x + 1) = ?(x) + 1$. On the other hand, according to the definition by pairing up the two trees, rationals greater than 1 get mapped to binary fractions between 1 and 2.
|
||||
|
||||
:::: {layout-ncol = "2"}
|
||||
::: {}
|
||||
![]()
|
||||
:::
|
||||
|
||||
::: {}
|
||||
![]()
|
||||
:::
|
||||
|
||||
Question mark function including right subtree. <br>
|
||||
Left: linear x-axis. <br>
|
||||
Right: (base 2)-logarithmic x-axis.
|
||||
::::
|
||||
|
||||
Here are graphs describing *our* question mark function, on linear and logarithmic plots. Instead of repeating, the function continues its self-similar behavior as it proceeds onward to infinity (logarithmically). The right graph stretches from -∞, where its value would be 0, to ∞, where its value would be 2.
|
||||
|
||||
Personally, I like this definition a bit better, if only because it matches other ways of thinking about the interval (0, 1). For example,
|
||||
|
||||
- In topology, it's common to show that this interval is homeomorphic to the entire real line
|
||||
|
||||
- It's similar to the [rational functions which appear in stereography](), which continue to infinity instead of being periodic
|
||||
|
||||
- It showcases how the Stern-Brocot tree sorts rational numbers by complexity better
|
||||
|
||||
However, it's also true that different definitions are good for different things. For example, periodicity matches the intuition that numbers can be decomposed into a fractional and integral part. Integral parts grow without bound, while fractional parts are periodic, just like the function would be.
|
||||
|
||||
|
||||
Closing
|
||||
-------
|
||||
|
||||
I'd like to draw this discussion of enumerating numbers to a close for now. I wrote this article to establish some preliminaries regarding *another* post that I have planned. On the other hand, since I was describing the Stern-Brocot tree, I felt it also pertinent to show the question mark function, since it's a very interesting self-similar curve. Even then, I have shown them as a curiosity instead of giving them their time in the spotlight.
|
||||
|
||||
I have omitted some things I would like to have discussed, such as [order type](https://en.wikipedia.org/wiki/Order_type), and enumerating things beyond just the quadratic irrationals. I may return to some of these topics in the future, such as to show a way to order integer polynomials.
|
||||
|
||||
Diagrams created with GeoGebra (because trying to render them in LaTeX would have taken too long) and Matplotlib (yes, I called into a Python interpreter from Haskell out of laziness).
|
||||
508
number_number/2/index.qmd
Normal file
@ -0,0 +1,508 @@
|
||||
---
|
||||
format:
|
||||
html:
|
||||
html-math-method: katex
|
||||
---
|
||||
|
||||
<style>
|
||||
.red {
|
||||
color: red;
|
||||
}
|
||||
|
||||
.green {
|
||||
color: green;
|
||||
}
|
||||
</style>
|
||||
|
||||
Numbering Numbers, Part 2: Ordering Obliquely
|
||||
=============================================
|
||||
|
||||
This post assumes you have read the [previous one](), which discusses the creation of sequences containing every integer, every binary fraction, and in fact, every fraction. From the fractions, we also could enumerate quadratic irrational numbers using the *question-mark function*.
|
||||
|
||||
|
||||
Other Irrationals
|
||||
-----------------
|
||||
|
||||
Because rationals -- and even some irrationals -- can be enumerated, we might imagine that it would be nice to enumerate *all* irrational numbers. Unfortunately, we're not very lucky this time.
|
||||
|
||||
Let's start by making what we mean by "number" more direct. We've already been exposed to infinite expansions, like 1/3 in binary (and conveniently, also decimal). In discussing the question mark function, I mentioned the utility of repeating expansions as a means of accessing quadratic rationals in the Stern-Brocot tree. A general sequence need not repeat, so we choose to treat these extra "infinite expansions" as numbers. Proving that a rational number must have a repeating expansion is difficult, but if we accept this premise, then the new non-repeating expansions are our irrationals. For example, $2 - \varphi \approx 0.381966...$, which we encountered last time, is such a number.
|
||||
|
||||
Doing this introduces a number of headaches, the least of which is attempting to do arithmetic with such quantities. However, we're only concerned with the contents of these sequences to show why we can't list out all irrationals.
|
||||
|
||||
|
||||
### Diagonalization
|
||||
|
||||
We can narrow our focus to the interval between 0 and 1, since the numbers outside this interval are their reciprocals. Now (if we agree to use base ten), "all numbers between 0 and 1" as we've defined them begin with "0.", followed by an infinite sequence of digits 0-9. Suppose that we have an enumeration of every infinite sequence on this list -- no sequence is left out. [Cantor's diagonal argument](https://en.wikipedia.org/wiki/Cantor%27s_diagonal_argument) shows that a new sequence can be found by taking the sequence on the diagonal and changing each individual digit to another one. The new sequence differs in at least one place from every element on the list, so it cannot be on the list, showing that such an enumeration cannot exist.
|
||||
|
||||
This is illustrated for binary sequences in this diagram:
|
||||
|
||||
::: {}
|
||||
<figure class="wp-block-image size-full">
|
||||
<a title="Jochen Burghardt, CC BY-SA 3.0 <https://creativecommons.org/licenses/by-sa/3.0>, via Wikimedia Commons" href="https://commons.wikimedia.org/wiki/File:Diagonal_argument_01_svg.svg"><img width="256" alt="Diagonal argument 01 svg" style="background-color:white !important; border-radius: 5px" src="https://upload.wikimedia.org/wikipedia/commons/thumb/b/b7/Diagonal_argument_01_svg.svg/256px-Diagonal_argument_01_svg.svg.png"></a>
|
||||
<figcaption>
|
||||
Source: Jochen Burghardt, via Wikimedia Commons
|
||||
</figcaption>
|
||||
</figure>
|
||||
:::
|
||||
|
||||
- It's fairly common to show this argument without much further elaboration, but there are a few problems with it:
|
||||
- We're using infinite sequences of digits, not numbers
|
||||
- Equality between sequences is defined by having all elements coincide
|
||||
- We assume we have an enumeration of sequences to which the argument applies. The contents of the enumeration are a mystery.
|
||||
- We have no idea where the rational numbers are, or if we'd construct one by applying the diagonal argument
|
||||
|
||||
|
||||
### Equality
|
||||
|
||||
The purpose of the diagonal argument is to produce a new sequence which was not previously enumerated. The sequence is different in all positions, but what we actually want is equality with respect to the base. In base ten, we have the peculiar identity that [$0.\overline{9} = 1$](https://en.wikipedia.org/wiki/0.999...). This means that if the diagonal argument (applied to base ten sequences) constructs a new sequence with the digit 9 repeating forever, it might be equivalent to a sequence which was already in the list:
|
||||
|
||||
```{python}
|
||||
#| echo: false
|
||||
|
||||
from IPython.display import Markdown
|
||||
from tabulate import tabulate
|
||||
|
||||
red = lambda x: f"<span class=\"red\">{x}</span>"
|
||||
green = lambda x: f"<span class=\"green\">{x}</span>"
|
||||
|
||||
def zipconcat(*args):
|
||||
return [sum(z, start=[]) for z in zip(*map(list, args))]
|
||||
|
||||
diag = lambda f, yss: [
|
||||
[
|
||||
f(y) if i == j else y
|
||||
for j, y in enumerate(ys)
|
||||
]
|
||||
for i, ys in enumerate(yss)
|
||||
]
|
||||
|
||||
Markdown(tabulate(
|
||||
zipconcat(
|
||||
map(lambda x: [x], [0, 1, 2, green(3), 4, 5, "...", green("ω")]),
|
||||
diag(red, [
|
||||
[1, 2, 3, 4, 5, 6],
|
||||
[9, 2, 4, 8, 3, 7],
|
||||
[2, 2, 8, 2, 2, 2],
|
||||
map(green, [2, 3, 9, 3, 9, 9]),
|
||||
[9, 4, 9, 4, 9, 4],
|
||||
[8, 1, 2, 5, 7, 9],
|
||||
["...", "...", "...", "...", "...", "..."],
|
||||
map(green, [2, 3, 9, 4, 0, 0]),
|
||||
]),
|
||||
[["..."]]*8,
|
||||
),
|
||||
headers=["Sequence", *range(6), "..."],
|
||||
))
|
||||
```
|
||||
|
||||
A case in which the diagonal argument could construct a number already on the list.
|
||||
|
||||
In the above table, sequence 3 is assumed to continue with 9's forever. The new sequence ω comes from taking the red digits along the diagonal and mapping each digit to the next one (mod ten). In the enumeration given, the diagonal continues with 9's forever, so we end up with 0's forever in ω.
|
||||
|
||||
|
||||
### Picking a Sequence and Ensuring Rationals
|
||||
|
||||
"No problem, just pick another enumeration," you might say. Indeed, the example given relies on a simple function applied on the diagonal and an enumeration to which it is particularly ill-suited.
|
||||
|
||||
Instead, let's focus on something we *can* do. Instead of assuming we have all irrational numbers listed out already, let's start smaller. As of last post, we already have several ways to enumerate all rational numbers between 0 and 1. If we take this enumeration, convert rational numbers to their expansions in a base, and apply the diagonal argument, the resulting quantity *should* be an irrational number.
|
||||
|
||||
For convenience, we'll use the binary expansions of rationals as our sequences. That way, to get a unique sequence on the diagonal, we only have to worry about changing "0"s to "1"s (and vice versa). Since we have less flexibility in our digits, it also relieves us from some of responsibility of finding a "good" function, like in the decimal case. However, it's still possible the argument constructs a number already equal to something on the list.
|
||||
|
||||
|
||||
Converting to Silicon
|
||||
---------------------
|
||||
|
||||
Before going any further, let's convert the diagonal argument into a function. We want to, given an enumeration of binary sequences, produce a new sequence not on the list. This can be implemented in Haskell fairly easily:
|
||||
|
||||
|
||||
```{.haskell}
|
||||
diagonalize :: [[Int]] -> [Int]
|
||||
-- pair each sequence with its index
|
||||
diagonalize xs = let sequences = zip [0..] xs in
|
||||
-- read out the red diagonal
|
||||
let diagonal = map (\(n, s_n) -> (s_n !! n)) sequences in
|
||||
-- map 0 to 1 and vice versa
|
||||
map (1 -) diagonal
|
||||
-- or in point-free form
|
||||
-- diagonalize = map (\(x,y) -> 1 - (y !! x)) . zip [0..]
|
||||
```
|
||||
|
||||
Nothing about this function is specific to "binary sequences", since `Int` contains values other than `1` and `0`. It's just more intuitive to work with them instead of "`True`" and "`False`" (since `Bool` actually does have 2 values). You can replace `1 -` with `not` to get a similar function for the type `Bool`.
|
||||
|
||||
We also need a function to get a rational number's binary expansion. This is simple if you recall how to do long division. We try to divide the numerator by the denominator, "emit" the quotient as part of the result list, then continue with the remainder (and the denominator is unchanged). It's not *quite* that simple, since we also need to "bring down" more zeroes. In binary, we can add more zeroes to an expansion by just multiplying by 2.
|
||||
|
||||
```{.haskell}
|
||||
binDiv :: Int -> Int -> [Int]
|
||||
-- Divide n by d; q becomes part of the result list
|
||||
-- The rest of the list comes from doubling the remainder and keeping d fixed
|
||||
binDiv n d = let (q,r) = n `divMod` d in q:binDiv (2*r) d
|
||||
|
||||
x = take 10 $ binDiv 1 3
|
||||
-- x = [0,0,1,0,1,0,1,0,1,0]
|
||||
-- 1/3 = 0.01010101...
|
||||
y = take 10 $ binDiv 1 5
|
||||
-- y = [0,0,0,1,1,0,0,1,1,0]
|
||||
-- 1/5 = 0.00110011...
|
||||
```
|
||||
|
||||
This function gives us the leading 0 (actually the integer part of the quotient of n by d), but we can peel it off by applying tail.
|
||||
|
||||
Since we intend to interpret these sequences as binary numbers, we might as well also convert this into a form we recognize as a number. All we need to do is take a weighted sum of each sequence by its binary place value.
|
||||
|
||||
```{.haskell}
|
||||
fromBinSeq :: Int -> [Int] -> Double
|
||||
-- Construct a list of place values starting with 1/2
|
||||
fromBinSeq p = let placeValues = (tail $ iterate (/2) 1) in
|
||||
-- Convert the sequence to a type that can multiply with
|
||||
-- the place values, then weight, truncate, and sum.
|
||||
sum . take p . zipWith (*) placeValues . map fromIntegral
|
||||
|
||||
oneFifth = fromBinSeq 64 $ tail $ binDiv 1 5
|
||||
-- oneFifth = 0.2 :: Double
|
||||
```
|
||||
|
||||
The precision *p* here is mostly useless, since we intend to take this to as far as doubles will go. *p* = 100 will do for most sequences, since it's rare that we'll encounter more than a few zeroes at the beginning of a sequence.
|
||||
|
||||
|
||||
Some Enumerations
|
||||
-----------------
|
||||
|
||||
Now, for the sake of argument, let's look at an enumeration that fails. Using the tree of binary fractions from the last post, we use a breadth-first search to create a list of terminating binary expansions.
|
||||
|
||||
::: {}
|
||||
![]()
|
||||
Tree of binary fractions, as the tree of terminating binary expansions. We perform a BFS on the left subtree to obtain the values between 0 and 1.
|
||||
:::
|
||||
|
||||
```{python}
|
||||
#| echo: false
|
||||
|
||||
Markdown(tabulate(
|
||||
zipconcat(
|
||||
[
|
||||
[0, "1/2"],
|
||||
[1, "1/4"],
|
||||
[2, "3/4"],
|
||||
[3, "1/8"],
|
||||
[4, "3/8"],
|
||||
[5, "5/8"],
|
||||
[6, "7/8"],
|
||||
[7, "1/16"],
|
||||
["...", "..."],
|
||||
["ω", ""],
|
||||
],
|
||||
diag(red, [
|
||||
[1, 0, 0, 0, 0, 0],
|
||||
[0, 1, 0, 0, 0, 0],
|
||||
[1, 1, 0, 0, 0, 0],
|
||||
[0, 0, 1, 0, 0, 0],
|
||||
[0, 1, 1, 0, 0, 0],
|
||||
[1, 0, 1, 0, 0, 0],
|
||||
[1, 1, 1, 0, 0, 0],
|
||||
[0, 0, 0, 1, 0, 0],
|
||||
["...", "...", "...", "...", "...", "..."],
|
||||
[0, 0, 1, 1, 1, 1],
|
||||
]),
|
||||
[["..."]]*10,
|
||||
),
|
||||
headers=["*n*", "Number", *range(6), "..."],
|
||||
))
|
||||
```
|
||||
|
||||
```{.haskell}
|
||||
-- Extract the left subtree (i.e., the first child subtree)
|
||||
badDiag = let (Node _ (tree:__)) = binFracTree in
|
||||
diagonalize $ map (tail . uncurry binDiv) $ bfs tree
|
||||
```
|
||||
|
||||
Computing the diagonal sequence, it quickly becomes apparent that we're going to keep getting "0"s along the diagonal. This is because we're effectively just counting in binary some number of digits to the right. The length of a binary expansion grows logarithmically rather than linearly; in other words, we can't count fast enough by just adding 1 (or adding any number, really).
|
||||
|
||||
Even worse than this, we get a sequence which is equal to sequence 1 as a binary expansion. We can't even rely on the diagonal argument to give us a new number that *isn't* equal to a binary fraction.
|
||||
|
||||
|
||||
### Stern-Brocot Diagonal
|
||||
|
||||
The Stern-Brocot tree contains more than just binary fractions, so we're bound to encounter more than "0" forever when running along the diagonal. Again, looking at the left subtree, we can read off fractions between 0 and 1.
|
||||
|
||||
![]()
|
||||
|
||||
We end up with the following enumeration:
|
||||
|
||||
```{python}
|
||||
#| echo: false
|
||||
|
||||
Markdown(tabulate(
|
||||
zipconcat(
|
||||
[
|
||||
[0, "1/2"],
|
||||
[1, "1/3"],
|
||||
[2, "2/3"],
|
||||
[3, "1/4"],
|
||||
[4, "2/5"],
|
||||
[5, "3/5"],
|
||||
[6, "3/4"],
|
||||
[7, "1/5"],
|
||||
["...", "..."],
|
||||
["ω", ""],
|
||||
],
|
||||
diag(red, [
|
||||
[1, 0, 0, 0, 0, 0, 0, 0],
|
||||
[0, 1, 0, 1, 0, 1, 0, 1],
|
||||
[1, 0, 1, 0, 1, 0, 1, 0],
|
||||
[0, 0, 1, 0, 0, 0, 0, 0],
|
||||
[0, 1, 1, 0, 0, 1, 1, 0],
|
||||
[1, 0, 0, 1, 1, 0, 0, 1],
|
||||
[1, 1, 0, 0, 0, 0, 0, 0],
|
||||
[0, 0, 1, 1, 0, 0, 1, 1],
|
||||
["...", "...", "...", "...", "...", "...", "...", "..."],
|
||||
[0, 0, 0, 1, 1, 1, 1, 0],
|
||||
]),
|
||||
[["..."]]*10,
|
||||
),
|
||||
headers=["*n*", "Number", *range(8), "..."],
|
||||
))
|
||||
```
|
||||
|
||||
```{.haskell}
|
||||
-- Extract the left subtree (i.e., the first child subtree)
|
||||
sbDiag = let (Node _ (tree:__)) = sternBrocot in
|
||||
diagonalize $ map (tail . uncurry binDiv) $ bfs tree
|
||||
|
||||
-- take 20 sbDiag = [0,0,0,1,1,1,1,0,1,1,0,1,1,1,1,1,0,0,1,1]
|
||||
-- in other words, 0.00011110110111110011...
|
||||
```
|
||||
|
||||
When expressed as a decimal, the new sequence corresponds to the value 0.12059395276... . Dually, its continued fraction expansion begins \[0; 8,3,2,2,1,2,12, ...\]. While the number is (almost) certainly irrational, I have no idea whether it is algebraic or transcendental.
|
||||
|
||||
|
||||
### Pairs, without repeats
|
||||
|
||||
We have a second, similar enumeration given by `allRationalsMap` in the previous post. We'll need to filter out the numbers greater than 1 from this sequence, but that's not too difficult since we're already filtering out repeats.
|
||||
|
||||
```{python}
|
||||
#| echo: false
|
||||
|
||||
Markdown(tabulate(
|
||||
zipconcat(
|
||||
[
|
||||
[0, "1/2"],
|
||||
[1, "1/3"],
|
||||
[2, "1/4"],
|
||||
[3, "2/3"],
|
||||
[4, "1/5"],
|
||||
[5, "1/6"],
|
||||
[6, "2/5"],
|
||||
[7, "3/4"],
|
||||
["...", "..."],
|
||||
["ω", ""],
|
||||
],
|
||||
diag(red, [
|
||||
[1, 0, 0, 0, 0, 0, 0, 0],
|
||||
[0, 1, 0, 1, 0, 1, 0, 1],
|
||||
[0, 1, 0, 0, 0, 0, 0, 0],
|
||||
[1, 0, 1, 0, 1, 0, 1, 0],
|
||||
[0, 0, 1, 1, 0, 0, 1, 1],
|
||||
[0, 0, 1, 0, 1, 0, 1, 0],
|
||||
[0, 1, 1, 0, 0, 1, 1, 0],
|
||||
[1, 1, 0, 0, 0, 0, 0, 0],
|
||||
["...", "...", "...", "...", "...", "...", "...", "..."],
|
||||
[0, 0, 1, 1, 1, 1, 0, 1],
|
||||
]),
|
||||
[["..."]]*10,
|
||||
),
|
||||
headers=["*n*", "Number", *range(8), "..."],
|
||||
))
|
||||
```
|
||||
|
||||
```{.haskell}
|
||||
-- Only focus on the rationals whose denominator is bigger
|
||||
arDiag = let rationals01 = filter (uncurry (<)) allRationals in
|
||||
diagonalize $ map (tail . uncurry binDiv) $ rationals01
|
||||
|
||||
-- take 20 arDiag = [0,0,1,1,1,1,0,1,0,1,1,1,0,1,0,0,0,1,0,0]
|
||||
-- in other words, 0.00111101011101000100...
|
||||
```
|
||||
|
||||
This new sequence has a decimal expansion equivalent to 0.24005574958... (continued fraction expansion begins \[0; 4, 6, 28, 1, 1, 5, 1, ...\]). Again, this is probably irrational, since WolframAlpha has no idea on whether a closed form exists.
|
||||
|
||||
|
||||
The Diagonal Transform
|
||||
----------------------
|
||||
|
||||
Why stop with just one? This new number can just be tacked onto the beginning of the list. Then, we re-apply the diagonal argument to obtain a new number. And so on ad infinitum.
|
||||
|
||||
```{python}
|
||||
#| echo: false
|
||||
|
||||
diag2 = lambda d, yss: [
|
||||
[
|
||||
d.get(i - j, lambda x: x)(y)
|
||||
for j, y in enumerate(ys)
|
||||
]
|
||||
for i, ys in enumerate(yss)
|
||||
]
|
||||
|
||||
Markdown(tabulate(
|
||||
[["...", "", *(["..."]*9)]]
|
||||
+ zipconcat(
|
||||
[
|
||||
[green("-2"), ""],
|
||||
[red("-1"), ""],
|
||||
[0, "1/2"],
|
||||
[1, "1/3"],
|
||||
[2, "2/3"],
|
||||
[3, "1/4"],
|
||||
[4, "2/5"],
|
||||
[5, "3/5"],
|
||||
[6, "3/4"],
|
||||
[7, "1/5"],
|
||||
["...", "..."],
|
||||
],
|
||||
diag2(
|
||||
{
|
||||
1: green,
|
||||
2: red,
|
||||
},
|
||||
[
|
||||
[1, 1, 1, 1, 1, 0, 1, 1],
|
||||
[0, 0, 0, 1, 1, 1, 1, 0],
|
||||
[1, 0, 0, 0, 0, 0, 0, 0],
|
||||
[0, 1, 0, 1, 0, 1, 0, 1],
|
||||
[1, 0, 1, 0, 1, 0, 1, 0],
|
||||
[0, 0, 1, 0, 0, 0, 0, 0],
|
||||
[0, 1, 1, 0, 0, 1, 1, 0],
|
||||
[1, 0, 0, 1, 1, 0, 0, 1],
|
||||
[1, 1, 0, 0, 0, 0, 0, 0],
|
||||
[0, 0, 1, 1, 0, 0, 1, 1],
|
||||
["...", "...", "...", "...", "...", "...", "...", "..."],
|
||||
]
|
||||
),
|
||||
[["..."]]*12,
|
||||
),
|
||||
headers=["*n*", "Number", *range(8), "..."],
|
||||
))
|
||||
```
|
||||
Using the Stern-Brocot enumeration ~~because I like it better~~
|
||||
|
||||
```{.haskell}
|
||||
transform :: [[Int]] -> [[Int]]
|
||||
-- Emit the new diagonal sequence, then recurse with the new sequence
|
||||
-- prepended to the original enumeration
|
||||
transform xs = let ds = diagonalize xs in ds:transform (ds:xs)
|
||||
|
||||
sbDiagSeq = let (Node _ (tree:__)) = sternBrocot in
|
||||
transform $ map (tail . uncurry binDiv) $ bfs tree
|
||||
-- take 10 $ map (fromBinSeq 100) $ sbDiagSeq
|
||||
-- = [0.12059395276295479, 0.9839683315741587, 0.39401828609177836,
|
||||
-- 0.7474914867558182, 3.876798422930419e-2, 0.7802097209903278,
|
||||
-- 0.3215249242021624, 0.6795283379777878, 0.1938245109955674,
|
||||
-- 0.947203605609322]
|
||||
```
|
||||
|
||||
Does this list out "all" irrational numbers? Not even close. In fact, this just gives us a bijection between the original enumeration and a new one containing our irrationals. The new numbers we get depend heavily on the order of the original sequence. This is obvious just by looking at the first entry produced by our two good enumerations. Perhaps if we permuted the enumeration of rationals in all possible ways, we would end up listing all irrational numbers, but we'd also run through [all ways of ordering the natural numbers](https://en.wikipedia.org/wiki/Baire_space_%28set_theory%29).
|
||||
|
||||
The fact that "bad" enumerations exist tells us that it's not even guaranteed that we don't collide with any rationals. I conjecture that the good enumerations won't do so, since we shouldn't ever encounter an infinite sequence of "0"s, and a sequence should eventually differ in at least one position from one already listed.
|
||||
|
||||
|
||||
### Almost Involution
|
||||
|
||||
Since the function has the same input and output type, you may wonder what happens when it's applied multiple times. Perhaps you assume that, since `\x -> 1 - x` swaps 0 and 1, we'll get the original sequence back again. Alas, experimentation proves us wrong.
|
||||
|
||||
```{.haskell}
|
||||
sbDiagSeq2 = transform sbDiagSeq
|
||||
-- take 10 $ map (fromBinSeq 100) $ sbDiagSeq2
|
||||
-- [0.5, 1/2
|
||||
-- 0.3333333333333333, 1/3
|
||||
-- 0.9166666666666666, 11/12
|
||||
-- 0.125, 1/8
|
||||
-- 0.7124999999999999, 57/80
|
||||
-- 0.2875, 23/80
|
||||
-- 0.859375, 55/64
|
||||
-- 7.5e-2, 3/40
|
||||
-- 0.6841517857142857, ???, possibly 613/896
|
||||
-- 0.486328125] 249/512
|
||||
```
|
||||
|
||||
The fraction forms of the above numbers are my best guesses. Either way, it only matches for the first two terms before going off the rails.
|
||||
|
||||
Even stranger than this distorted reflection is the fact that going through the mirror again doesn't take us anywhere new
|
||||
|
||||
```{.haskell}
|
||||
sbDiagSeq3 = transform sbDiagSeq2
|
||||
-- take 10 $ map (fromBinSeq 100) $ sbDiagSeq3
|
||||
-- = [0.12059395276295479, 0.9839683315741587, 0.39401828609177836,
|
||||
-- 0.7474914867558182, 3.876798422930419e-2, 0.7802097209903278,
|
||||
-- 0.3215249242021624, 0.6795283379777878, 0.1938245109955674,
|
||||
-- 0.947203605609322]
|
||||
--
|
||||
-- (take 10 $ map (fromBinSeq 100) $ sbDiagSeq3) \
|
||||
-- == (take 10 $ map (fromBinSeq 100) $ sbDiagSeq)
|
||||
-- = True
|
||||
```
|
||||
|
||||
In other words, applying the transform thrice is the same as applying the transform once. Not that this has been shown rigorously in the least -- it's only been tested numerically for the first 10 numbers that we generate.
|
||||
|
||||
Regardless, this semi-involutory behavior is strange and nontrivial. And it's not limited to this enumeration.
|
||||
|
||||
```{.haskell}
|
||||
arDiagSeq = let rationals01 = filter (uncurry (<)) allRationals in
|
||||
transform $ map (tail . uncurry binDiv) rationals01
|
||||
|
||||
-- -- What goes in isn't what comes out
|
||||
-- take 10 $ map (fromBinSeq 100) $ transform arDiagSeq
|
||||
-- [0.5, 1/2
|
||||
-- 0.3333333333333333, 1/3
|
||||
-- 0.75, 3/4
|
||||
-- 0.16666666666666666, 1/6
|
||||
-- 0.7, 7/10
|
||||
-- 0.41666666666666663, 5/12
|
||||
-- 0.8687499999999999, 139/160
|
||||
-- 0.1015625, 13/128
|
||||
-- 0.5295758928571428, ???, possibly 949/1792
|
||||
-- 0.49453125] 633/1280
|
||||
--
|
||||
--
|
||||
-- -- And applying the transform twice is sometimes an identity (maybe)
|
||||
-- (take 10 $ map (fromBinSeq 100) $ transform $ transform arDiagSeq) \
|
||||
-- == (take 10 $ map (fromBinSeq 100) $ arDiagSeq)
|
||||
-- = True
|
||||
|
||||
bfDiagSeq = let (Node _ (tree:__)) = binFracTree in
|
||||
transform $ map (tail . uncurry binDiv) $ bfs tree
|
||||
-- -- The bad enumeration just gives more binary fractions...
|
||||
-- take 10 $ map (fromBinSeq 100) bfDiagSeq
|
||||
-- [0.25, 1/4
|
||||
-- 1.0, 1/1
|
||||
-- 0.5, 1/2
|
||||
-- 0.625, 5/8
|
||||
-- 6.25e-2, 1/16
|
||||
-- 0.78125, 25/32
|
||||
-- 0.390625, 25/64
|
||||
-- 0.6328125, 81/128
|
||||
-- 0.19140625, 49/256
|
||||
-- 0.814453125] 417/512
|
||||
|
||||
-- -- But it still doesn't mean double-transforming gives the original
|
||||
-- take 10 $ map (fromBinSeq 100) $ transform bfDiagSeq
|
||||
--
|
||||
-- [0.5, 1/2
|
||||
-- 0.25, 1/4
|
||||
-- 0.75, 3/4
|
||||
-- 0.125, 1/8
|
||||
-- 0.6875, 11/16
|
||||
-- 0.46875, 15/32
|
||||
-- 0.859375, 55/64
|
||||
-- 0.1171875, 15/128
|
||||
-- 0.55859375, 143/256
|
||||
-- 0.435546875] 223/512
|
||||
```
|
||||
|
||||
What does it mean that the initial enumeration comes back as a completely different one? Since the new one is "stable" with respect to applying the diagonal transform twice, are the results somehow preferable or significant?
|
||||
|
||||
|
||||
Closing
|
||||
-------
|
||||
|
||||
These questions, and others I have about the products of this process, I unfortunately have no answer for. I was mostly troubled by how rare it is to find people applying the diagonal argument to something to anything oh random sequences. Random sequences, either by choice or by algorithm (if you can even call it random at that point), are really only good to show how to *apply* the diagonal argument. Without knowing *what* the argument is applied to, it's useless as a tool. It also still remains to prove that your new sequences are sufficient for the purpose (and I've only shown a case in which it fails).
|
||||
|
||||
(Recycled) diagrams made in Geogebra. Downloadable Haskell code, including things from the previous post available [here]().
|
||||
333
pentagons/1/index.qmd
Normal file
@ -0,0 +1,333 @@
|
||||
---
|
||||
format:
|
||||
html:
|
||||
html-math-method: katex
|
||||
---
|
||||
|
||||
|
||||
12 Pentagons, Part 1
|
||||
====================
|
||||
|
||||
Recently I've been trying my hand at a little 3D geometry. I was watching a lecture on YouTube when the presenter asked the following as an exercise:
|
||||
|
||||
> A soccer ball is a (roughly spherical) figure made of pentagons and hexagons, each meeting 3 at a point. Prove that there are 12 pentagons. If you want to explore this problem further: how many hexagons can there be?
|
||||
|
||||
While innocuous on its surface, it has occupied my thoughts for the better part of a month, as the latter question seems to have no simple answer without running into the most obvious solutions. This post will aim to summarize these "simple" answers.
|
||||
|
||||
|
||||
Why 12? Why Hexagons?
|
||||
---------------------
|
||||
|
||||
A 3D figure is composed of three elements in particular: vertices, edges and faces. In this problem, faces can be either pentagons or hexagons, giving an system in four unknowns.
|
||||
|
||||
First, I would like to draw attention to the first constraint on the problem, that every vertex connects three edges (and every edge joins two vertices). If all of the faces on a polyhedron are convex polygons, then no two edges are collinear (else a face contains a 180 degree angle), and there must be at least three that meet at a point (else one of the two faces contains an angle greater than 180 degrees). Equivalently, consider the dual of the polyhedron, made by making every vertex into a face and vice versa. A vertex connected to two edges would on the dual become a digon, which cannot be made with line segments. Thus, $3V = 2E$ is the simplest class of polyhedra, whose duals are entirely triangles.
|
||||
|
||||
Next, rather than assuming there are only pentagons and hexagons, let us assume instead that we only have pentagons and n-gons. Every pentagon contributes 5 vertices and edges; every *n*-gon contributes *n* vertices and edges. Further, we also know that an edge joins any 2 faces, and every vertex joins exactly 3 faces. Therefore, counting every face will count every edge twice and every vertex thrice:
|
||||
|
||||
$$
|
||||
2E = 3V = 5F_5 + nF_n
|
||||
$$
|
||||
|
||||
This gives us two equations out of the four needed to completely solve the system. We also know that the shape is like a soccer ball, so its [Euler characteristic](https://en.wikipedia.org/wiki/Euler_characteristic) is 2, which adds a third equation into the mix:
|
||||
|
||||
Exactly 12
|
||||
----------
|
||||
|
||||
We want to annihilate $F_n$, and we are looking for integer solutions, so multiply through by *m*, which is the LCM of *n* and some other number *k*. Let the GCD of *n* and *k* be denoted l:
|
||||
|
||||
$$
|
||||
\begin{gather*}
|
||||
m = {kn \over (k, n)} = {kn \over l} \implies ml = kn \\ \\
|
||||
mV - mE + mF_5 + \textcolor{green}{m}F_n = 2m \\
|
||||
mV - \textcolor{red}{\stackrel{3V = 2E}{V({3 \over 2}m)}}
|
||||
+ mF_5 + \textcolor{green}{kn \over l}F_n \textcolor{blue}{\stackrel{3V = 5F_5 + nF_n}
|
||||
{- {k \over l}nF_n - {k \over l}5F_5 + {k \over l}3V}} = 2m \\ \\
|
||||
V({3k \over l} - {m \over 2}) + F_5(m - {5k \over l}) = 2m \\
|
||||
V(6k - ml) + F_5(2ml - 10k) = 4ml \\
|
||||
V(6k - nk) + F_5(2nk - 10k) = 4nk \\
|
||||
V(6 - n) + F_5(2n - 10) = 4n
|
||||
\end{gather*}
|
||||
$$
|
||||
|
||||
At this point, we would like to eliminate one of the variables, so either $n = 5$ (there are only pentagons), or $n = 6$ (the non-pentagons are hexagons).
|
||||
|
||||
$$
|
||||
\begin{align*}
|
||||
n &= 5 \implies V(6 - 5) + F_5(2(5) - 10) = V = 4(5) = 20 \\
|
||||
n &= 6 \implies V(6 - 6) + F_5(2(6) - 10) = 2F_5 = 4(6) = 24
|
||||
\end{align*}
|
||||
$$
|
||||
|
||||
If all the faces in the figure are pentagons, then there must be 20 vertices (which also means there are 30 edges). On the other hand, if we allow hexagons, then __there are exactly 12 pentagons__. This is the case even if there are no hexagons, which together with the first solution, give the vertex, edge, and face counts for a dodecahedron.
|
||||
|
||||
|
||||
### Increasing Specificity
|
||||
|
||||
It bears repeating that there are four unknowns and we have used three equations. While one of the unknowns has been solved, the remaining three need an additional equation to produce a consistent solution.
|
||||
|
||||
Perhaps it is possible to count more precisely to produce a new equation. Each edge comes in 3 genera: it can either join 2 pentagons, 2 hexagons, or a pentagon and a hexagon each. Similarly, each vertex has 4 different arrangements: 3 pentagons, 2 pentagons and 1 hexagon, 1 pentagon and 2 hexagons, and 3 hexagons.
|
||||
|
||||
:::{}
|
||||
![]()
|
||||
Left to right, top row: $V_0, V_1, V_2, V_3$, bottom row: $E_0, E_1, E_2$. Subscripts denote number of pentagons present.
|
||||
:::
|
||||
|
||||
Counting only pentagons, only hexagons, and only each type of vertex gives:
|
||||
|
||||
$$
|
||||
6F_6 = 3V_0 + 2V_1 + V_2 = 2E_0 + E_1 \\
|
||||
5F_5 = V_1 + 2V_2 + 3V_3 = E_1 + 2E_2
|
||||
$$
|
||||
|
||||
When these equations are added together, they reproduce the $3V = 2E$ relationship. By adding 5 more unknowns, only a couple more equations have been added to the system, and no new information has been gained aside from the combinatorics of vertex and edge configurations. A solution for the number of hexagons must be realized by other means.
|
||||
|
||||
|
||||
An Argument from Symmetry
|
||||
-------------------------
|
||||
|
||||
Having established that there are 12 pentagons, and that the base case is a dodecahedron, what next? What follows is known as the [Goldberg-Coxeter construction](https://en.wikipedia.org/wiki/Goldberg%E2%80%93Coxeter_construction), since the resultant polyhedra are known as Goldberg polyhedra.
|
||||
|
||||
The argument is as follows: since a dodecahedron has icosahedral symmetry, it makes sense to expand it by placing a regular pentagon (of a suitable size) at every vertex of an icosahedron. Then, hexagons are used to fill the gaps between pentagons. For regular pentagons and equilateral hexagons, this has three properties:
|
||||
|
||||
1. Each pentagon is *transitive*, or equivalent to other pentagons in terms of the way hexagons are connected to it.
|
||||
2. Since each pentagon is regular, it is invariant under fifths of a turn. This pentagon can be thought of as the compound of 5 overlapping equilateral triangles, each of which when considered alone tessellates the plane.
|
||||
3. Each triple of pentagons is rotationally symmetric under thirds of a turn, as in the rotation of a dodecahedron through two antipodal vertices. This also must be the case for the figure made by the hexagons which connect triples.
|
||||
|
||||
### Triangles and Honeycombs
|
||||
|
||||
Though it is impossible to surround a regular pentagon with hexagons without distortion in the plane, it *is* possible in 3D space. By the vertex condition, each hexagon must meet in threes, similarly to how regular hexagons tessellate the plane as in a honeycomb. The dual to this arrangement a would replace pentagons with 5 triangles and hexagons with 6 triangles.
|
||||
|
||||
If these triangles are all equilateral, then the former can be formed into pyramids and the latter into coplanar hexagons. By virtue of being coplanar, they *also* tessellate the plane. Therefore, a fifth of this dual figure can be described by the regular triangular tiling. By identifying hexagons (which reverses the dual), this figure can be understood as a fifth of a regular pentagon and its neighboring hexagons (hereafter termed a pentagon's sector).
|
||||
|
||||
:::{.column width="40%"}
|
||||
![]()
|
||||
Triangular grid before...
|
||||
:::
|
||||
|
||||
:::{.column width="40%"}
|
||||
![]()
|
||||
...and after identifying hexagons.
|
||||
:::
|
||||
|
||||
In the left figure, the lower-leftmost triangle is one-fifth of a pentagonal pyramid, dual to a pentagon.
|
||||
In the right figure, it corresponds to a section of a regular pentagon.
|
||||
|
||||
Each point in this grid is of the form $a + bu$, where *u* is the primitive sixth root of unity that lives in the upper half of the complex plane. Since 1 and *u* are not perpendicular, the norm is not simply $a^2 + b^2$. Rather than trying to describe a point in rectangular coordinates with square roots, we can find its norm by multiplying by its conjugate, which is $a + b u^{6-1} = a + b u^5$. As a primitive sixth root, u has the property that $u^2 - u + 1 = 0$, so:
|
||||
|
||||
$$
|
||||
\begin{gather*}
|
||||
\| a + bu \| = (a + bu)(a + bu^5) = a^2 + ab(u + u^5) + b^2 \\ \\
|
||||
u + u^5 = u + u \textcolor{red}{u^2 u^2} = u + u\textcolor{red}{(u - 1)(u - 1)} \\
|
||||
= u + \textcolor{blue}{(u^2 - u)}(u - 1)
|
||||
= u + \textcolor{blue}{(-1)}(u - 1) = 1
|
||||
\\ \\
|
||||
\| a + bu \| = a^2 + ab + b^2
|
||||
\end{gather*}
|
||||
$$
|
||||
|
||||
Hooray, a simple (and symmetric) polynomial in *a* and *b*! This symmetry is apparent in the grid, since the grid is symmetric about the angle bisector of the lower-leftmost angle. Thus, *a* and *b* are interchangeable.
|
||||
|
||||
|
||||
### Counting Triangles
|
||||
|
||||
Each point $a + bu = (a, b)$ has an secondary interpretation: it parametrizes a path between the center of two pentagonal faces. Starting from any pentagon facing an edge, walk across *a* edges onto the center of hexagons. Then, turn 60 degrees, and walk across *b* edges onto another pentagon, completing the walk. The turn may be made either clockwise or counterclockwise and produces two chiral opposites when $a \neq b$. For simplicity's sake, let $a \ge b$ mean a clockwise turn so that these opposites can be differentiated by reversing the tuple.
|
||||
|
||||
:::{}
|
||||
![]()
|
||||
Path between pentagons corresponding to (4, 2). The gray outline will become clearer in the following figures.
|
||||
:::
|
||||
|
||||
The "center" of the red pentagon is at (0, 0) and is the lower-left vertex of the red triangle. The center of the first adjacent hexagon along the red line is (1, 1); after traversing *a* hexagons we end up at (*a*, *a*). The hexagon to the lower right of this one is at $(a, a) + (2, -1)$; after *b* steps, the center of the blue pentagon lies at $(a, a) + (2b, -b) = (a + 2b, a - b)$.
|
||||
|
||||
|
||||
### Construction Classes
|
||||
|
||||
What's the point of being able to specify neighboring pentagons in triangular coordinates? It turns out that the (triangular) norm of the path directly corresponds to the number of triangles unique to each pentagon's sector. Geometrically, there are three classes.
|
||||
|
||||
|
||||
#### Class I
|
||||
|
||||
Points of the form (*a*, 0) (or symmetrically, (0, *a*)) have norm $a^2$. This is also the number of triangles within a larger triangle bounded by the line connecting (*a*, 0) and (0, *a*). In the diagram below, two pentagonal sectors with the same number of triangles are connected end-to-end.
|
||||
|
||||
:::{}
|
||||
![]()
|
||||
Areas corresponding to tuple (4, 0). This is the only class where we need to consider pairs.
|
||||
:::
|
||||
|
||||
|
||||
#### Class II
|
||||
|
||||
Points of the form (*a*, *a*) have norm $3a^2$. This is also the number of triangles contained within a trapezoid through the points (0, 0), (0, *a*), (*a*, *a*), and (*a*, 2*a*). In the diagram below, three pentagonal sectors are connected, since the path across hexagons is the same for a 60 degree turn in either direction.
|
||||
|
||||
:::{}
|
||||
![]()
|
||||
Areas corresponding to tuple (4, 4). The region shared by the three pentagonal sectors is outlined in dark gray.
|
||||
:::
|
||||
|
||||
|
||||
#### Class III
|
||||
|
||||
All other tuples (*a*, *b*) do not cleanly slice the triangular plane. However, it is still possible to count the number of triangles in a triple of sectors. The lines which connect the nearest vertices of any two pentagons are the diagonals of a parallelogram. These parallelograms contain 2*wh* triangles (which can be seen by completing the square), or *wh* triangles when cleft in half by the diagonal. The center of the figure contains a large triangle with 3*b* triangles on an edge. This leaves three parallelograms with width 1 and height *h*, or 6*h* triangles unaccounted for.
|
||||
|
||||
:::{.column width="25%"}
|
||||
![]()
|
||||
:::
|
||||
|
||||
:::{.column width="25%"}
|
||||
![]()
|
||||
:::
|
||||
|
||||
:::{.column width="25%"}
|
||||
![]()
|
||||
:::
|
||||
|
||||
Areas corresponding to tuples (4, *b*). Triangles which belong to a pentagon are colored red, green, and blue. Parallelograms (width *w*, height *h*) are colored in light red, green and blue. Completions of parallelograms (width 1, height *h*) are in dark gray. Central triangle colored in light gray.
|
||||
|
||||
In order to find suitable values for *w* and *h*, recall the coordinates of the center of the blue pentagon where the red pentagon lies at the origin: $(a + 2b, a - b)$. The edge length of the central triangle is 3*b*, which can be seen from the subtraction $a + 2b - (a - b)$. The diagonal of the red parallelogram reaches from (1, 0) to $(a + 2b - 1, a - b)$. This means $w = a + 2b - 2$ and $l = a - b$. There are therefore:
|
||||
|
||||
$$
|
||||
\begin{align*}
|
||||
T &= 3wh + (3b)^2 + 6h
|
||||
= 3(a + 2b - 2)(a - b) + 9b^2 + 6(a - b) \\[4pt]
|
||||
&= 3(a^2 + 2ab - 2a - ab - 2b^2 + 2b) + 9b^2 + 6a - 6b \\[4pt]
|
||||
&= 3a^2 + 3ab + (9 - 6)b^2 + (6 - 6)a - (6 - 6)b \\[4pt]
|
||||
&= 3a^2 + 3ab + 3b^2 = 3\|a + bu\| \text{ triangles per triple of sectors}
|
||||
\end{align*}
|
||||
$$
|
||||
|
||||
|
||||
### Triangles to Hexagons
|
||||
|
||||
We counted triangles rather than hexagons because the former is easier to count in the triangular plane. Plus, we know that hexagons can be decomposed (and recomposed) into 6 triangles. Now we can easily count the number of hexagons. The lower-leftmost triangle is part of a pentagon, so it is not counted. Of the remaining triangles, 6 make up a hexagon, meaning the point (*a*, *b*) counts $\|a +bu\| - 1 \over 6$ hexagons. These hexagons are only within the sector of a single pentagonal edge, so there are:
|
||||
|
||||
$$
|
||||
\begin{gather*}
|
||||
{\|a +bu\| - 1 \over 6}
|
||||
\scriptsize {\text{hexagons} \over \text{sector}} \normalsize \cdot 5
|
||||
\scriptsize {\text{sectors} \over \text{pentagon}} \normalsize \cdot 12
|
||||
\scriptsize \text{ pentagons} \normalsize \\[4pt]
|
||||
= 10(\|a +bu\| - 1) \text{ hexagons}
|
||||
\end{gather*}
|
||||
$$
|
||||
|
||||
In other words, the number of hexagons is a multiple of 10 dictated by triangular norms of integer tuples minus 1. It may seem strange that the result is an integer, since every pentagonal sector contains at least some partial hexagons. However, all of these partial hexagons are completed by their adjacent sectors, whether on the same pentagon or those formed by any three pentagons. Visualize this by placing the regions formed by these triples (enclosed above in dark gray) on the faces on an icosahedron, the dual of the dodecahedron.
|
||||
|
||||
|
||||
Soccer Balls and Beyond
|
||||
-----------------------
|
||||
|
||||
The three cases of paths as described above are also used to delineate classes of Goldberg polyhedra. All possess rotational icosahedral symmetry ($I$) by virtue of their construction. Only class I and II polyhedra are mirror-symmetric ($I_h$) with class III polyhedra coming in chiral pairs, as mentioned previously.
|
||||
|
||||
|
||||
### Basic Conway Operators
|
||||
|
||||
Before listing certain Goldberg polyhedra, I will comment on their relationship to [Conway polyhedron notation](https://en.wikipedia.org/wiki/Conway_polyhedron_notation). Given a "seed" polyhedron and a string of operators (applied right-to-left), many polyhedra can be constructed. The simplest seed polyhedra are the Platonic solids (their symbols enclosed in parentheses): the (T)etrahedron, (C)ube, (O)ctahedron, (D)odecahedron, and (I)cosahedron.
|
||||
|
||||
:::{}
|
||||
![]()
|
||||
*D*, the regular dodecahedron
|
||||
:::
|
||||
|
||||
|
||||
### List of Operators
|
||||
|
||||
Roughly, 6 operators generate most Goldberg polyhedra:
|
||||
|
||||
- Dual (*d*)
|
||||
|
||||
- Swaps faces for vertices and vice versa. Involutory.
|
||||
|
||||
- Kis ($k_n$)
|
||||
|
||||
- Replaces each face with a pyramid. If *n* is specified, only applies to *n*-gonal faces.
|
||||
|
||||
- Truncate ($t_n = dk_nd$)
|
||||
|
||||
- Expands a vertex into a face, with the number of sides equalling the degree of the vertex. If *n* is specified, only applies to vertices of degree *n*.
|
||||
|
||||
- Subdivide ($u_n$)
|
||||
|
||||
- For polyhedra with triangular faces, divides each into $n^2$ triangles by cutting each edge into *n* parts. For unspecified *n*, *n* = 2.
|
||||
|
||||
- Chamfer (*c* = *dud*)
|
||||
|
||||
- Adds hexagonal faces along edges, preserving existing vertices and faces.
|
||||
|
||||
- Whirl (*w*)
|
||||
|
||||
- Rotates faces outward and interpolates with hexagonal faces along each edge. Higher order whirls are possible, but outside the scope of this post.
|
||||
|
||||
:::{}
|
||||
![]()
|
||||
[I = dD](https://levskaya.github.io/polyhedronisme/?recipe=I)
|
||||
:::
|
||||
|
||||
:::{}
|
||||
![]()
|
||||
[kD](https://levskaya.github.io/polyhedronisme/?recipe=kD)
|
||||
:::
|
||||
|
||||
:::{}
|
||||
![]()
|
||||
[tD](https://levskaya.github.io/polyhedronisme/?recipe=tD)
|
||||
:::
|
||||
|
||||
:::{}
|
||||
![]()
|
||||
[uI](https://levskaya.github.io/polyhedronisme/?recipe=uI)
|
||||
:::
|
||||
|
||||
:::{}
|
||||
![]()
|
||||
[cD](https://levskaya.github.io/polyhedronisme/?recipe=K300cD)
|
||||
:::
|
||||
|
||||
:::{}
|
||||
![]()
|
||||
[wD](https://levskaya.github.io/polyhedronisme/?recipe=K300wD)
|
||||
:::
|
||||
|
||||
The last three operations can be obtained from the Goldberg-Coxeter construction, and as such are termed Goldberg-Coxeter operators. In particular, since every vertex in a Goldberg polyhedron has degree 3, it is always possible to use odd *u* operators by taking the dual. Both chamfer and whirl add hexagons, meaning they transform Goldberg polyhedra into other Goldberg polyhedra. Two compound operators in particular which do the same are:
|
||||
|
||||
- $dk = d(dtd) = td$
|
||||
|
||||
- Raises pentagons and expands hexagons (as in central hexagonal numbers). Changes class I polyhedra into class II and vice versa.
|
||||
|
||||
- $(dk)^2 = dkdk = tk$
|
||||
|
||||
- See above. Preserves class.
|
||||
|
||||
|
||||
List of Hexagon Counts
|
||||
----------------------
|
||||
|
||||
Here is a list containing the number of hexagons in each Goldberg polyhedron, answering the initial question. Though this list can be found [elsewhere](https://en.wikipedia.org/wiki/List_of_geodesic_polyhedra_and_Goldberg_polyhedra#Icosahedral), I will duplicate the first few entries here.
|
||||
|
||||
| Class | Tuple | $F_6$ | V | E | Conway |
|
||||
|-------|--------|-------|-----|-----|--------|
|
||||
| I | [(1, 0)](https://en.wikipedia.org/wiki/Regular_dodecahedron) | 0 | 20 | 30 | [D](https://levskaya.github.io/polyhedronisme/?recipe=D) |
|
||||
| | [(2, 0)](https://en.wikipedia.org/wiki/Chamfered_dodecahedron) | 30 | 80 | 120 | [cD](https://levskaya.github.io/polyhedronisme/?recipe=K300cD) |
|
||||
| | (3, 0) | 80 | 180 | 270 | [tkD = du3I](https://levskaya.github.io/polyhedronisme/?recipe=tkD) |
|
||||
| | (4, 0) | 150 | 320 | 480 | [ccD = duuI](https://levskaya.github.io/polyhedronisme/?recipe=duudD) |
|
||||
| | (5, 0) | 240 | 400 | 600 | [du5I](https://levskaya.github.io/polyhedronisme/?recipe=du5I) |
|
||||
| II | [(1, 1)](https://en.wikipedia.org/wiki/Truncated_icosahedron) | 20 | 60 | 90 | tI |
|
||||
| | (2, 2) | 110 | 240 | 360 | [tdcD](https://levskaya.github.io/polyhedronisme/?recipe=K300tdcD) |
|
||||
| | (3, 3) | 260 | 540 | 810 | [tktI](https://levskaya.github.io/polyhedronisme/?recipe=tktI) |
|
||||
| III | (2, 1) | 60 | 140 | 210 | [wD](https://levskaya.github.io/polyhedronisme/?recipe=K300wD) |
|
||||
| | (3, 1) | 120 | 260 | 390 | \* |
|
||||
| | (3, 2) | 180 | 380 | 570 | \* |
|
||||
| | (4, 1) | 200 | 420 | 630 | [tdwD](https://levskaya.github.io/polyhedronisme/?recipe=K300tdwD) |
|
||||
|
||||
\* higher-order whirl needed
|
||||
|
||||
The polyhedron which corresponds to the shape of a soccer ball has parameter (1, 1), and is known (as implied by its Conway notation) as the truncated icosahedron. Additionally, similarly to how the entry (1, 0) is special because the dodecahedron is a Platonic solid, (1, 1) is special in that it is an [*Archimedean solid*](https://en.wikipedia.org/wiki/Archimedean_solid): every vertex has the same configuration of 2 hexagons and 1 pentagon ($V = V_1$).
|
||||
|
||||
|
||||
Closing
|
||||
-------
|
||||
|
||||
Goldberg polyhedra on their own are fascinating because they can be found in nature. [Buckyballs](https://en.wikipedia.org/wiki/Buckminsterfullerene) can be formed according to their structure, with number of carbons equalling the number of vertices. Viral [capsids](https://en.wikipedia.org/wiki/Capsid) are frequently observed to be arranged in these shapes. Goldberg's original paper can be found [here](https://www.jstage.jst.go.jp/article/tmj1911/43/0/43_0_104/_article), which contains additional observations such as the non-uniqueness of hexagon counts to a particular tuple.
|
||||
|
||||
Despite the elegance in the symmetry and simple classification of these shapes, this does not produce *every* possible polyhedron as described by the problem statement. In the [next]() [few]() posts, I will do my best to catalogue additional, slightly more obscure solution polyhedra.
|
||||
|
||||
Polyhedron images were generated using [polyHédronisme](https://levskaya.github.io/polyhedronisme/), triangular grid images were created using Matplotlib, and vertex enumeration image was created with GeoGebra.
|
||||
315
pentagons/2/index.qmd
Normal file
@ -0,0 +1,315 @@
|
||||
---
|
||||
format:
|
||||
html:
|
||||
html-math-method: katex
|
||||
jupyter: python3
|
||||
---
|
||||
|
||||
<style>
|
||||
.quarto-uncaptioned {
|
||||
display: none
|
||||
}
|
||||
</style>
|
||||
|
||||
|
||||
12 Pentagons, Part 2
|
||||
====================
|
||||
|
||||
This is the second part in an investigation into answering the following question:
|
||||
|
||||
> A soccer ball is a (roughly spherical) figure made of pentagons and hexagons, each meeting 3 at a point. [T]here are 12 pentagons...how many hexagons can there be?
|
||||
|
||||
The [post prior to this one]() proved the 12 pentagons portion as well as outlined an entire solution class: (dodecahedral) Goldberg polyhedra. However, there exist more obscure solutions missed by this construction.
|
||||
|
||||
|
||||
Twelve is Four Triples
|
||||
----------------------
|
||||
|
||||
A key characteristic of the solution polyhedra is that each vertex is of degree three. It would be extraordinarily convenient if The post prior to this one proved the 12 pentagons portion as well as outlined an entire solution class: (dodecahedral) Goldberg polyhedra. However, there exist more obscure solutions missed by this construction.three pentagons came together at a vertex, or in the parlance of the previous post, a $V_3$. There are four triples, so there are four vertices. Fortunately, there exists a Platonic solid with four vertices whose symmetries we can exploit: the tetrahedron.
|
||||
|
||||
|
||||
### Extended Goldberg Polyhedra
|
||||
|
||||
The tetrahedron's vertex configuration ($3V = 2E$) qualifies it to undergo Goldberg construction. Recall the triangular plane and hexagonal paths from the previous part (presented again here for convenience)
|
||||
|
||||
::: {}
|
||||
![]()
|
||||
:::
|
||||
|
||||
Instead of the red, green, and blue triangles being part of a larger pentagon, they can also be considered as whole triangles with a sector on each edge. Supposing a tetrahedron is made into a Goldberg polyhedron, where does that get us? Well for starters, we know there are:
|
||||
|
||||
$$
|
||||
\begin{gather*}
|
||||
{\|a +bu\| – 1 \over 6} \scriptsize {\text{hexagons} \over \text{sector}} \normalsize \cdot 3 \scriptsize {\text{sectors} \over \text{triangle}} \normalsize \cdot 4 \scriptsize \text{ triangles} \normalsize \\ \\
|
||||
= 2(\|a +bu\| – 1) \text{ hexagons}
|
||||
\end{gather*}
|
||||
$$
|
||||
|
||||
Next, cap each triangular face by extending the non-coplanar edges into a vertex. This transforms the 3 hexagons around each of the 4 triangles into pentagons. There are now 12 pentagons and $2(\|a +bu\| – 1) - 12 = 2\|a +bu\| – 14$ hexagons. This is a sort of "antitruncation", since the process in reverse is truncation. Rather than selecting for the degree, this type of truncation selects for the vertex configuration: that of having three pentagons meeting at it.
|
||||
|
||||
|
||||
### Problems and Solutions
|
||||
|
||||
There is a slight problem with the expression for the number of hexagons: the norms of (1, 0), (1, 1), (2, 0), and (2, 1) are all less than or equal to 7. This is because the antitruncations correspond to one of the three Platonic solids with 3 faces to an vertex:
|
||||
|
||||
::: {}
|
||||
![]()
|
||||
(1, 0): T
|
||||
Antitruncation: dT = T
|
||||
:::
|
||||
|
||||
::: {}
|
||||
![]()
|
||||
(1, 1): tT
|
||||
Antitruncation: T
|
||||
:::
|
||||
|
||||
::: {}
|
||||
![]()
|
||||
(2, 0): cT
|
||||
Antitruncation: C
|
||||
:::
|
||||
|
||||
::: {}
|
||||
![]()
|
||||
(2, 1): wT
|
||||
Antitruncation: D
|
||||
:::
|
||||
|
||||
With these exceptional cases taken care of, the table of solution polyhedra of this form is as follows:
|
||||
|
||||
```{python}
|
||||
#| label: tbl-antitruncation
|
||||
#| echo: false
|
||||
|
||||
from IPython.display import Markdown
|
||||
from tabulate import tabulate
|
||||
|
||||
polyhedronisme = lambda x, y: f"[{x}](https://levskaya.github.io/polyhedronisme/?recipe={y})"
|
||||
|
||||
class1 = [
|
||||
["(1, 0)", polyhedronisme("T", "T"), -12, "-", "-", polyhedronisme("dT", "dT")],
|
||||
["(2, 0)", polyhedronisme("cT", "K300cT"), -6, "-", "-", polyhedronisme("C", "C")],
|
||||
["(3, 0)", polyhedronisme("du3T = tkT", "K300tkT"), 4, 28, 42, polyhedronisme("t6kT", "K300t6kT")],
|
||||
["(4, 0)", polyhedronisme("duuT = ccT", "K300duC30uT"), 18, 56, 84, polyhedronisme("t6juT", "C300t6juT")],
|
||||
["(5, 0)", polyhedronisme("du5T", "K300duC30uT"), 36, 92, 138, "**"],
|
||||
["(6, 0)", polyhedronisme("duu3T = ctkT", "K300duK300dtkT"), 58, 136, 204, polyhedronisme("t6kcT", "K300t6kcT")],
|
||||
]
|
||||
class2 = [
|
||||
["(1, 1)", polyhedronisme("tT", "T"), -8, "-", "-", polyhedronisme("T", "T")],
|
||||
["(2, 2)", polyhedronisme("ctT", "K300duK30dtT"), 10, 40, 60, polyhedronisme("t6uT", "K300t6uT")],
|
||||
["(3, 3)", polyhedronisme("tktT", "K300tktT"), 40, 100, 150, polyhedronisme("t6ktT", "K30t6ktT")],
|
||||
["(4, 4)", polyhedronisme("cctT", "K300duC30uT"), 82, 184, 276, polyhedronisme("t6uuT", "K300t6uK30dK30duT")],
|
||||
]
|
||||
class3 = [
|
||||
["(2, 1)", polyhedronisme("wT", "K300wT"), 0, "-", "-", polyhedronisme("D", "D")],
|
||||
["(3, 1)", "*", 12, 44, 66, "*"],
|
||||
["(3, 2)", "*", 24, 48, 102, "*"],
|
||||
["(4, 1)", polyhedronisme("wtT", "K300wK30tT"), 28, 76, 114, polyhedronisme("t6gtT", "K300t6gK30tT")],
|
||||
["(4, 2)", polyhedronisme("wcT", "K300wK30cT"), 42, 104, 156, polyhedronisme("t6guT = t6gcT", "K300t6gK30cT")],
|
||||
]
|
||||
|
||||
Markdown(tabulate(
|
||||
[
|
||||
[class_name if i == 0 else ""] + row
|
||||
for class_, class_name in zip([class1, class2, class3], ["I", "II", "III"])
|
||||
for i, row in enumerate(class_)
|
||||
],
|
||||
headers=["Class","Tuple", "Conway", "$F_6$", "V", "E", "Conway"],
|
||||
numalign="center",
|
||||
stralign="center",
|
||||
))
|
||||
```
|
||||
::: {}
|
||||
\* higher-order whirl needed
|
||||
|
||||
\*\* Unknown. Possibly nonexistent under standard operators
|
||||
:::
|
||||
|
||||
Note that the links in the above table may have recipes do not match their entry. Rather, the recipe is equivalent to the simpler string given to ensure the viewer can stably generate the output shape. The operators g and j, which I did not introduce previously, were also used; rather than explaining their intuitive meaning, see [the Wikipedia article](https://en.wikipedia.org/wiki/Conway_polyhedron_notation) instead.
|
||||
|
||||
The smallest "real" tetrahedral solution has 4 hexagonal faces. This is the [(order-6) truncated triakis tetrahedron](https://en.wikipedia.org/wiki/Truncated_triakis_tetrahedron), which can be discerned by reading its Conway notation. The $V_3$s are arranged on the faces of a tetrahedron owing to the construction, and the hexagons are arranged on the vertices. Alternatively, on the dual to this imaginary tetrahedron, the faces map to faces and the vertices to vertices.
|
||||
|
||||
::: {}
|
||||
![]()
|
||||
Truncated triakis tetrahedron, t6kT
|
||||
:::
|
||||
|
||||
It can be observed that higher-order class I polyhedra expand these hexagons into larger hexagons as in the centered hexagonal numbers. Similarly, higher-order class II polyhedra form triples of triangular numbers. Other figures made of hexagons with triangular symmetry fall under class III.
|
||||
|
||||
|
||||
### Solution Non-Exclusivity
|
||||
|
||||
Is it possible for any of these tetrahedral Goldberg solutions to also be dodecahedral Goldberg solutions? For this to be the case,
|
||||
|
||||
$$
|
||||
\begin{align*}
|
||||
2\|m + nu\| - 14 &= 10\|a + bu\| - 10 \\
|
||||
\|m + nu\| - 2 &= 5\|a + bu\|, \text{ for } a, b, m, n \in \mathbb{Z} \\
|
||||
\|m + nu\| &\equiv 2\ (\text{mod } 5)
|
||||
\end{align*}
|
||||
$$
|
||||
|
||||
Class I tetrahedral antitruncations have a norm which is a square number, but 2 is not among the squares mod 5, so they will never intersect dodecahedral solutions. However, class II and III solutions congruent to (2, 2) or (3, 3) (mod 5) have the correct multiplicity, the former of which is reflected in the solution table above. Class II solutions turn out to be a red herring, since $5\|a, b\|$ is never congruent to 1 (= -2, mod 3). Only tetrahedral class III collisions exist, either congruent to the pairs above or to (1, 2), (2, 1), (3, 4), or (4, 3) (mod 5). The equivalent pairs for the first few solution parameters are:
|
||||
|
||||
Dodecahedral Parameter | Tetrahedral Parameter | $F_6$
|
||||
------------------------|-----------------------|-------
|
||||
(1, 0) | (2, 1) | 0
|
||||
(2, 1) | (4, 3) | 60
|
||||
(3, 1) | (7, 2) | 120
|
||||
(3, 2) | (8, 3) | 180
|
||||
(5, 0) | (7, 6) | 240
|
||||
(5, 1) | (12, 1) | 300
|
||||
(6, 1) | (9, 8) <br> (13, 3) | 420
|
||||
(5, 3) <br> (7, 0) | (11, 7) <br> (14, 3) | 480
|
||||
(17, 1) | (17, 1) | 600
|
||||
|
||||
|
||||
Twelve is Six Pairs
|
||||
-------------------
|
||||
|
||||
The truncated triakis tetrahedron also reveals another possible set of solution polyhedra: those formed by maintaining six $E_2$s rather than four $V_3$s. By no small coincidence, the tetrahedron has six edges onto which these edges can be arranged. Unfortunately, this selective edge preservation makes it difficult to write solution polyhedra in Conway notation using the standard operators.
|
||||
|
||||
It is easiest to see solutions take form on a tetrahedral net. Every face and every vertex of a tetrahedron must be invariant under thirds of a turn, so the shape of the tiling of hexagons at these objects on the net must also be symmetric. Since each face of a tetrahedron is a triangle, arguably the simplest solution is by arranging hexagons in the same way.
|
||||
|
||||
:::: {}
|
||||
::: {}
|
||||
![]()
|
||||
Order-2 solution on tetrahedral net (faces separated by interior dotted lines) with identical points identified (exterior dotted lines).
|
||||
:::
|
||||
|
||||
::: {}
|
||||
![]()
|
||||
Equivalent planar graph. External face is colored blue.
|
||||
:::
|
||||
|
||||
Pairs of pentagons (green) at the center of every edge. Hexagons symmetric about a face are colored red, those symmetric about a vertex are colored blue.
|
||||
::::
|
||||
|
||||
Though it first appears as if the figure made by the face hexagons and the vertex hexagons (see footnote above) is the same, recall that the base case (truncated triakis tetrahedron) has no face hexagons and a hexagon at each vertex. The pattern does not become clearer until examining larger graphs. Let the even triangular numbers be formed at the center of the figure, so that the pentagons meet at the midpoint of the figure. Then the next-highest order net looks like this
|
||||
|
||||
:::: {}
|
||||
::: {}
|
||||
![]()
|
||||
Order-3 solution on tetrahedral net with identical points identified.
|
||||
:::
|
||||
|
||||
::: {}
|
||||
![]()
|
||||
Equivalent planar graph. In this diagram, certain elements have been recolored from the diagram to the left to better indicate membership
|
||||
:::
|
||||
::::
|
||||
|
||||
Much like Goldberg polyhedra, it is easier to understand these figures if they are parameterized by a path between pentagons on a face (of the base tetrahedron). In what I called the order-2 solution, there are two edges that must be crossed to get from pentagon to pentagon; in the order-3 solution, there are three. In the equivalent figure on the right, while the corner figures have steadily increased along triangular numbers (1, 3, 6...), the face figures have gone from a triangular arrangement to a hexagonal arrangement.
|
||||
|
||||
The means of generating the figure for each face is as follows. For triangular numbers $\Delta_n$, the number of points on the edge of the figure is simply n. If the three corner points are turned into pentagons and the remaining points are turned into hexagons, then there will be $n - 1$ edges to traverse. Reorganizing, this means that an order-*n* solution has $\Delta_{n+1} - 3$ hexagons per face, $\Delta_n$ hexagons per edge, and $4(\Delta_{n + 1} + \Delta_{n - 3}) = 4((n+1)^2 - 3)$ hexagons in total.
|
||||
|
||||
::: {}
|
||||
![]()
|
||||
First three face figures as a series of triangular numbers.
|
||||
:::
|
||||
|
||||
Parameter | $F_6$ | V | E
|
||||
------------------------|-------|-----|-----
|
||||
(1, 0) | 4 | 28 | 42
|
||||
(2, 0) | 24 | 68 | 102
|
||||
(3, 0) | 52 | 124 | 186
|
||||
(4, 0) | 88 | 196 | 294
|
||||
(5, 0) | 132 | 284 | 426
|
||||
|
||||
|
||||
### Whirled Solutions
|
||||
|
||||
The entries of the parameter column are 2-tuples for two reasons: one, to be parallel to the previous tables, and two, because there is an additional parameter. When drawing points on the tetrahedral net, there was no need to place the pentagons at on the midpoints of the triangular figures. While the triangular figures were the wrong direction to take, the possibility remains to choose another facet to (symmetrically) fit the pentagons into. Since $\Delta_3$ was skipped in the above diagrams, consider arranging hexagons like this and placing pentagons on one side of the "middle" hexagon in a rotationally symmetric way.
|
||||
|
||||
|
||||
:::: {}
|
||||
::: {}
|
||||
![]()
|
||||
Tetrahedral net with $\Delta_3$ on faces and offset pentagons.
|
||||
:::
|
||||
|
||||
::: {}
|
||||
![]()
|
||||
Equivalent planar graph. External face is colored blue.
|
||||
:::
|
||||
|
||||
::: {}
|
||||
![]()
|
||||
Planar graph with recolored faces and path between pentagons identified.
|
||||
:::
|
||||
|
||||
::: {}
|
||||
![]()
|
||||
Single rotationally symmetric section with paths (and parameters) identified.
|
||||
:::
|
||||
::::
|
||||
|
||||
There are $4(6 + 4) = 40$ hexagons in total, which coincides with the earlier tetrahedral antitruncation (3, 3). To attempt to parametrize this figure, start from a pentagon facing a red hexagon and cross two edges. Then, turn 60 degrees and cross a final edge, completing the path (2, 1). If the previous solutions are similar to class I Goldberg solutions, then these are similar to class III Goldberg solutions. Each edge of the pentagon can be characterized in the following way:
|
||||
|
||||
1. The "constrained" edge shared between two pentagons. Crossing this edge always gives the path (1, 0)
|
||||
2. The "canonical" edge on the face of the tetrahedral net. The shortest paths across any two of these are (2, 1) and (1, 2)
|
||||
3. The edge which shares a vertex with a (b) edge, but not an (a) edge. The paths (3, 0) and (2, 1) link up to a (d) edge.
|
||||
4. The edge which shares a vertex with a (b) edge and an (a) edge. The paths (1, 2) and (3, 0) link up to a (c) edge, and (1, -1) always links it to an (e) edge.
|
||||
5. The last edge, which does not share a vertex with a (b) edge, but does with an (a) edge. Links up to other (e) edges along the path (2, 2) and to (d) edges always along (1, -1).
|
||||
|
||||
The canonical path (2, 1), the constrained path (1, 0) (which comes from preserving $E_2$s), and the auxiliary path (1, -1) combine to create the noncanonical paths, (2, 2) and (3, 0). I have yet to prove this construction works consistently, but I suspect that this can be generalized and that a parallel to class II Goldberg solutions also exists.
|
||||
|
||||
|
||||
Symmetry and Other Tetrahedral Solutions
|
||||
----------------------------------------
|
||||
|
||||
All of these figures have [tetrahedral symmetry](https://en.wikipedia.org/wiki/Tetrahedral_symmetry) ($T$) by construction, at least rotationally. This is possible because the base case, the dodecahedron, has icosahedral symmetry, which contains tetrahedral symmetry. Class I and II Goldberg antitruncations and non-whirled edge-constrained cases also have mirror symmetry about three axes/planes ($T_d$). The order-2 edge-constrained case appears to be even better, since all 8 of the "interpolating" regions containing hexagons are the same. This perhaps implies octahedral symmetry ($O$), though I have not verified this.
|
||||
|
||||
|
||||
### Double-Goldberg
|
||||
|
||||
Every one of these solution figures, both constructed and otherwise, can be extended using one of the previously-discussed Goldberg-Coxeter Conway operators ($dk$, $tk$, $c_n = du_nd$, and $w$) to create another solution while preserving tetrahedral symmetry. Effectively, this combines antitruncations (which expand the pairs of pentagons, but preserve the triples) and the edge-constrained solutions (which expand the triples, but preserve the pairs) based on the truncated triakis tetrahedron. Some of the easily-constructible solutions based on Goldberg polyhedra are accumulated in the table below.
|
||||
|
||||
```{python}
|
||||
#| label: tbl-double-goldberg
|
||||
#| echo: false
|
||||
|
||||
# from IPython.display import Markdown
|
||||
# from tabulate import tabulate
|
||||
#
|
||||
# polyhedronisme = lambda x, y: f"[{x}](https://levskaya.github.io/polyhedronisme/?recipe={y})"
|
||||
|
||||
table = [
|
||||
["c(2, 0)", polyhedronisme("ct6kT", "K300dudt6kT"), "(2, 0), (2, 2), (4, 0)", 46, 112, 168],
|
||||
["c(2, 2)", polyhedronisme("ct6uT", "K300duK30dt6uT"), "(2, 2), (2, 0), (4, 2)", 70, 160, 240],
|
||||
["c(4, 1)", polyhedronisme("ct6gtT", "K300duK50dt6gtT"), "(4, 2), (2, 0), (6, 0)", 142, 304, 456],
|
||||
|
||||
["dk(2, 0)", polyhedronisme("dkt6kT", "K300dkt6kT"), "(1, 1), (2, 2)", 32, 84, 126],
|
||||
["dk(2, 2)", polyhedronisme("dkt6uT", "K300dkK30t6uT"), "(1, 1), (3, 0), (3, 3)", 50, 120, 180],
|
||||
["dk(4, 1)", polyhedronisme("dkt6gtT", "K300dkK50t6gtT"), "(1, 1), (3, 3), (4, 1)", 104, 228, 342],
|
||||
|
||||
["tk(2, 0)", polyhedronisme("tkt6kT", "K300tkt6kT"), "(3, 0), (3, 3)", 116, 252, 378],
|
||||
["tk(2, 2)", polyhedronisme("tkt6uT", "K300tkK30t6uT"), "(3, 0), (3, 3), (6, 0)", 170, 360, 540],
|
||||
["tk(4, 1)", polyhedronisme("tkt6gtT", "K300tkK50t6gtT"),"(3, 0), (6, 3), (9, 0)", 332, 684, 1026],
|
||||
|
||||
["w(2, 0)", polyhedronisme("wt6kT", "K300wK30t6kT"), "(2, 1), (4, 1)", 88, 196, 294],
|
||||
["w(2, 2)", polyhedronisme("wt6uT", "K300wK100t6uT"), "(2, 1), (3, 0), (4, 1)", 130, 280, 420],
|
||||
["w(4, 1)", polyhedronisme("wt6gtT", "K300wK50t6gtT"), "(2, 1), (5, 3), (6, 3)", 256, 532, 798],
|
||||
]
|
||||
|
||||
Markdown(tabulate(
|
||||
table,
|
||||
headers=["(Tetrahedral Goldberg) Parameter", "Conway", "Paths Between Pairs", "$F_6$", "V", "E"],
|
||||
numalign="center",
|
||||
stralign="center",
|
||||
))
|
||||
```
|
||||
Note that higher-order subdivisions (chamfers) and higher-order whirls are still possible.
|
||||
|
||||
The same operators can be applied to the edge-constrained cases (and may intersect with the above table in a truly topologically equivalent sense), but owing to the difficulties in generating these, I will not attempt to tabulate them. Before I consider doing so, I would need to formalize the construction of the graph (or attempt to write a program which identifies identical vertices, as I did manually to sketch the figures initially), canonicalize and tweak the graph into a closed 3D figure, and use the result as a seed in a viewer which supports (importing figures and) interpreting Conway notation.
|
||||
|
||||
|
||||
Closing
|
||||
-------
|
||||
|
||||
Tetrahedral solutions are vastly more complicated. In decreasing the specificity of symmetry, the amount of free parameters increases. Despite claiming existence of these tetrahedral solutions topologically, actual geometric construction of some is difficult. Pentagons are no longer regular, any(?) arrangement with thrice-rotational symmetry per face is valid, and I am unsure whether the resultant polyhedra can even be made equilateral.
|
||||
|
||||
As you may be able to guess, not even specifying tetrahedral symmetry is enough to completely classify every solution either. The [next post]() will discuss additional solutions, some of whose members *cannot* be constructed using common seed polyhedra.
|
||||
|
||||
Polyhedron images were generated using [*polyHédronisme*](https://levskaya.github.io/polyhedronisme/), nets and graphs were created with GeoGebra.
|
||||
437
pentagons/3/index.qmd
Normal file
@ -0,0 +1,437 @@
|
||||
---
|
||||
format:
|
||||
html:
|
||||
html-math-method: katex
|
||||
jupyter: python3
|
||||
---
|
||||
|
||||
<style>
|
||||
.quarto-uncaptioned {
|
||||
display: none
|
||||
}
|
||||
</style>
|
||||
|
||||
|
||||
12 Pentagons, Part 3
|
||||
====================
|
||||
|
||||
This is the third part in an investigation into answering the following question:
|
||||
|
||||
> A soccer ball is a (roughly spherical) figure made of pentagons and hexagons, each meeting 3 at a point. [T]here are 12 pentagons...how many hexagons can there be?
|
||||
|
||||
The [first post]() in the series proved the 12 pentagons portion and investigated (dodecahedral) Goldberg polyhedra. The [second post]() investigated (tetrahedral) Goldberg polyhedra as well as other tetrahedral solutions. Yet more unconventional solutions are presented below.
|
||||
|
||||
|
||||
Introduction
|
||||
------------
|
||||
|
||||
|
||||
### Combinatorics of Goldberg-Coxeter Operators
|
||||
|
||||
I mentioned previously that these solutions cannot be created easily from seed polyhedra in a polyhedron viewer. This prompts the question of how to calculate the vertex, edge, and face counts without acquiring them from the output of such a program.
|
||||
|
||||
Each of the simple GC operators (*dk*, *c*, and *w*) has a combinatoric matrix form when applied to a vector of the vertex, edge, and face counts of a figure S.
|
||||
|
||||
$$
|
||||
S = \begin{pmatrix} v \\ e \\ f \end{pmatrix} = \begin{pmatrix} 2F_6 + 20 \\ 3F_6 + 30 \\ F_6 + 12 \end{pmatrix} \\
|
||||
dk = \begin{pmatrix} 0 & 2 & 0 \\ 0 & 3 & 0 \\ 1 & 0 & 1 \end{pmatrix}, ~
|
||||
c = \begin{pmatrix} 1 & 2 & 0 \\ 0 & 4 & 0 \\ 0 & 1 & 1 \end{pmatrix}, ~
|
||||
w = \begin{pmatrix} 1 & 4 & 0 \\ 0 & 7 & 0 \\ 0 & 2 & 1 \end{pmatrix}
|
||||
$$
|
||||
|
||||
As a reminder, *tk* is a power of the *dk* operator. Powers of a matrix are more readily expressed when the matrix is diagonalized.
|
||||
|
||||
$$
|
||||
\begin{align*}
|
||||
dk &= \begin{pmatrix} 0 & 2 & 0 \\ 0 & 3 & 0 \\ 1 & 0 & 1 \end{pmatrix} =
|
||||
\begin{pmatrix} -1 & 0 & 2 \\ 0 & 0 & 3 \\ 1 & 1 & 1 \end{pmatrix}
|
||||
\begin{pmatrix} 0 & 0 & 0 \\ 0 & 1 & 0 \\ 0 & 0 & 3 \end{pmatrix}
|
||||
\begin{pmatrix} 1 & -2/3 & 0 \\ 1 & -1 & 1 \\ 0 & 1/3 & 0 \end{pmatrix}
|
||||
\\
|
||||
c &= \begin{pmatrix} 1 & 2 & 0 \\ 0 & 4 & 0 \\ 0 & 1 & 1 \end{pmatrix} =
|
||||
\begin{pmatrix} -1 & 0 & 2 \\ 0 & 0 & 3 \\ 1 & 1 & 1 \end{pmatrix}
|
||||
\begin{pmatrix} 1 & 0 & 0 \\ 0 & 1 & 0 \\ 0 & 0 & 4 \end{pmatrix}
|
||||
\begin{pmatrix} 1 & -2/3 & 0 \\ 1 & -1 & 1 \\ 0 & 1/3 & 0 \end{pmatrix}
|
||||
\\
|
||||
w &= \begin{pmatrix} 1 & 4 & 0 \\ 0 & 7 & 0 \\ 0 & 2 & 1 \end{pmatrix} =
|
||||
\begin{pmatrix} -1 & 0 & 2 \\ 0 & 0 & 3 \\ 1 & 1 & 1 \end{pmatrix}
|
||||
\begin{pmatrix} 1 & 0 & 0 \\ 0 & 1 & 0 \\ 0 & 0 & 7 \end{pmatrix}
|
||||
\begin{pmatrix} 1 & -2/3 & 0 \\ 1 & -1 & 1 \\ 0 & 1/3 & 0 \end{pmatrix}
|
||||
\end{align*}
|
||||
$$
|
||||
|
||||
All of these operators share the same eigenvectors. This means that composition of these operators only modifies the diagonal matrix, specifically the upper-left and lower-right eigenvalues. Note also that:
|
||||
|
||||
- The (right) eigenvector (2, 3, 1), is shared by the general system governing the vertex, edge, and hexagon counts (simply look at the vector *S* to see this). In this system (not the one above), it has eigenvalue 0.
|
||||
- The left eigenvector (1, -1, 1) has eigenvalue 1, which corresponds to the Euler characteristic being maintained.
|
||||
- The left eigenvector, (3, -2, 0), when applied to general polyhedra corresponds to the edges and vertices added by the operation: *dk* forces all vertices to be degree-3 (hence the eigenvalue 0) and *c* and *w* maintain previous vertices while adding degree-3 ones (hence the eigenvalue 1).
|
||||
|
||||
All solutions share the same Euler characteristic and the condition 3V = 2E, so the rightmost multiplication simplifies things considerably.
|
||||
|
||||
$$
|
||||
\begin{align*}
|
||||
g_T S &= \begin{pmatrix} -1 & 0 & 2 \\ 0 & 0 & 3 \\ 1 & 1 & 1 \end{pmatrix}
|
||||
\begin{pmatrix} x & 0 & 0 \\ 0 & 1 & 0 \\ 0 & 0 & T \end{pmatrix}
|
||||
\begin{pmatrix} 1 & -{2 \over 3} & 0 \\ 1 & -1 & 1 \\ 0 & {1 \over 3} & 0 \end{pmatrix}
|
||||
\begin{pmatrix} v \\ e \\ f \end{pmatrix}
|
||||
\\[8pt] &=
|
||||
\begin{pmatrix} -1 & 0 & 2 \\ 0 & 0 & 3 \\ 1 & 1 & 1 \end{pmatrix}
|
||||
\begin{pmatrix} x & 0 & 0 \\ 0 & 1 & 0 \\ 0 & 0 & T \end{pmatrix}
|
||||
\begin{pmatrix} v - {2 \over 3} e = 0 \\ v - e + f = 2 \\ {1 \over 3} e \end{pmatrix}
|
||||
\\[8pt] &=
|
||||
\begin{pmatrix} -1 & 0 & 2 \\ 0 & 0 & 3 \\ 1 & 1 & 1 \end{pmatrix}
|
||||
\begin{pmatrix} 0 \\ 2 \\ {1 \over 3} T e \end{pmatrix}
|
||||
\end{align*}
|
||||
$$
|
||||
|
||||
Recall that each of the operators applied to the dodecahedron was a Goldberg polyhedron: *dkD* = *tI* = GC(1, 1), *cD* = GC(2, 0), and *wD* = GC(2, 1). The norm of each of these is 3, 4, and 7 respectively, which is also the eigenvalue T. In fact, all Goldberg-Coxeter operators, not just compositions of these three, simply set $T = \|a + bu\|$ (the eigenvalue x is T mod 3, which as previously mentioned, is never congruent to 2).
|
||||
|
||||
This eigenvalue problem also implies something about the possible values of *T*: it is closed under multiplication. For any *T*, all its powers are *also* possible *T*, as are products between *T*. In fact, the existence of chiral pairs ($a \neq b$) and the ability to compose opposites is what can make *T* nonunique for a given pair (e.g.: $ww = (2, 1) \odot (2, 1) = (5, 3)$, but $ww' = (2, 1) \odot (1, 2) = (7, 0)$).
|
||||
|
||||
Returning to the equation,
|
||||
|
||||
$$
|
||||
\begin{align*}
|
||||
\begin{pmatrix} -1 & 0 & 2 \\ 0 & 0 & 3 \\ 1 & 1 & 1 \end{pmatrix}
|
||||
\begin{pmatrix} 0 \\ 2 \\ {1 \over 3} T e \end{pmatrix} &=
|
||||
\begin{pmatrix} {2 \over 3} Te \\ Te \\ {1 \over 3}Te + 2 \end{pmatrix}
|
||||
\\[8pt] &=
|
||||
\begin{pmatrix} {2 \over 3} T(3F_6 + 30) \\ T(3F_6 + 30) \\ {1 \over 3}T(3F_6 + 30) + 2 \end{pmatrix}
|
||||
\\[8pt] &=
|
||||
\begin{pmatrix} 2T(F_6 + 10) \\ 3T(F_6 + 10) \\ T(F_6 + 10) + 2 \end{pmatrix}
|
||||
\\[12pt]
|
||||
F'_6 &= T(F_6 + 10) - 10
|
||||
\end{align*}
|
||||
$$
|
||||
|
||||
This demonstrates the importance of both the constructed base solution figure *S* with $F_6$ hexagons and the possible values of *T*.
|
||||
|
||||
|
||||
### A brief word about Symmetry
|
||||
|
||||
The dodecahedron, and by extension dodecahedral solutions, have icosahedral symmetry. A sub-symmetry of this, being tetrahedral symmetry, was exploited in the previous post. However, there are further sub-symmetries which have not been encountered. For example, some "smaller" symmetries of the dodecahedron are the vertices under rotation and inversion (dihedral, degree 3) and the faces under rotation and inversion (dihedral, degree 5). One of these two symmetries must be shared by a solution.
|
||||
|
||||
Rather than the typical construction based on paths between pentagons, this section will focus on certain base cases followed by a rudimentary application of the Conway operators above. The particular symmetry group of each figure will be mentioned in each section.
|
||||
|
||||
|
||||
Deltahedra
|
||||
----------
|
||||
|
||||
*Deltahedra* are polyhedra formed by equilateral triangles, a [table of which](https://en.wikipedia.org/wiki/Deltahedron) is available on Wikipedia. Equilateral triangles are important since three to five of them can be joined at a convex vertex, and if coplanar arrangements are allowed, up to six of them. Degree-5 and degree-6 vertices can be dualized or truncated to pentagons and hexagons respectively; additionally, if the former operation is used, then the triangles become degree-3 vertices.
|
||||
|
||||
All convex deltahedra besides the tetrahedron and the icosahedron contain degree-4 vertices. These pose a problem since they become quadrilaterals. Though selective (pyramidal) augmentation can correct these vertices to degree-5 (and those of degree-5 to degree-6), this section will focus on the coplanar entries on the table.
|
||||
|
||||
|
||||
### Triangulated Rhombohedron (Dih3)
|
||||
|
||||
The figure made by cutting the short diagonals of a *trigonal trapezohedron* (a rhombohedron like the cube) is one such degree-4 vertex-free deltahedron. It can also be seen as either a *biaugmentation* (by tetrahedra on opposite faces) of an octahedron or as a [*gyroelongated triangular bipyramid*](https://en.wikipedia.org/wiki/Gyroelongated_bipyramid). Truncating the order-5 vertices produces an eggy-looking figure, and one for which the polyhedron viewer I typically use refuses to comply. Try using this viewer (which unfortunately does not support hotlinking recipes) with the recipe t5z applied to the cube. This figure inherits the dihedral symmetry of degree 3 that the vertices of the dodecahedron have.
|
||||
|
||||
:::: {}
|
||||
::: {}
|
||||
![]()
|
||||
Biaugmented octahedron
|
||||
:::
|
||||
|
||||
::: {}
|
||||
![]()
|
||||
Base case: order-5 truncation of left figure
|
||||
:::
|
||||
|
||||
::: {}
|
||||
![]()
|
||||
Graph of the pole of the base case. On the opposite pole, blue and red hexagons are exchanged.
|
||||
:::
|
||||
::::
|
||||
|
||||
Conway | $F_6$ | V | E
|
||||
--------|----------|-----|-----
|
||||
t5C = B | 6 | 32 | 48
|
||||
dkB | 38 | 96 | 144
|
||||
cB | 54 | 128 | 192
|
||||
wB | 102 | 224 | 336
|
||||
tkB | 134 | 288 | 432
|
||||
$g_T B$ | 16T - 10 | 32T | 48T
|
||||
|
||||
|
||||
### Triangular Frustum (Dih3)
|
||||
|
||||
This figure is formed by a group of four triangles as a base, three half-hexagons on the edges, and closed by a triangle atop. It can also be seen as an augmented octahedron, but with the tetrahedra placed around a single face (a *triaugmentation*). Unfortunately, this figure is not easily constructible from normal seed polyhedra, even in the alternative viewer. However, it is still possible to operate on its projection as a planar graph. Truncating all vertices except those of degree 3 ($t_5 t_6$) produces a figure with 8 hexagons and indeed, 12 pentagons. In this case, the pentagons gather in groups of 4 and are separated by three bands of hexagons joined by two hexagons at either end. The symmetry inherited by this figure is also dihedral of degree 3, but centered about a hexagon, rather than a complex of pentagons.
|
||||
|
||||
:::: {}
|
||||
::: {}
|
||||
![]()
|
||||
:::
|
||||
|
||||
::: {}
|
||||
![]()
|
||||
:::
|
||||
|
||||
::: {}
|
||||
![]()
|
||||
:::
|
||||
|
||||
::: {}
|
||||
![]()
|
||||
:::
|
||||
|
||||
Construction based on planar graph (1). First, the degree-6 vertices are truncated (2). Then, the graph is inverted (3) and the degree-5 vertices are truncated (4).
|
||||
::::
|
||||
|
||||
::: {}
|
||||
![]()
|
||||
One-third of the figure, showing a group of four pentagons. Pentagons in green, band hexagons in red, cap hexagons in blue.
|
||||
:::
|
||||
|
||||
Conway | $F_6$ | V | E
|
||||
--------|----------|-----|-----
|
||||
F | 8 | 36 | 54
|
||||
dkF | 44 | 108 | 162
|
||||
cF | 62 | 144 | 216
|
||||
wF | 116 | 252 | 378
|
||||
tkF | 152 | 324 | 486
|
||||
$g_T F$ | 18T - 10 | 36T | 54T
|
||||
|
||||
***
|
||||
|
||||
The remaining entries of the Wikipedia table with no degree-4 vertices (save the hexagonal antiprism, which I will discuss in the next section) are easily accessible from the tetrahedron. For example, the "augmented tetrahedron" is simply a subdivided tetrahedron (*uT*) and the "(subdivided) truncated tetrahedron" is the hexakis truncated tetrahedron ($k_6 tT$).
|
||||
|
||||
Larger subdivisions (in the $u_n$ sense) of the above two cases are also coplanar deltahedra, so this can be performed before the truncation. Triangular subdivision can add degree-6 vertices, so for the triangulated rhombohedron, an additional order-6 truncation needs to be done. Doing so means $t_5 t_6$ is applied to either case to form the solution figure.
|
||||
|
||||
An example subidivision is shown below. Note how the 3 pentagons at the pole have been separated from another 3 by a triangle of hexagons. I am fairly sure it is possible for mismatched pole configurations to be joined to one another for a more selective subdivision. Other Goldberg-Coxeter operations other than *u* can also be used; *dwd* for example connects non-polar pentagons with spirals of hexagons.
|
||||
|
||||
:::: {}
|
||||
::: {}
|
||||
![]()
|
||||
:::
|
||||
|
||||
::: {}
|
||||
![]()
|
||||
:::
|
||||
|
||||
::: {}
|
||||
![]()
|
||||
$F_6$ = 60, V = 140, E = 210
|
||||
:::
|
||||
|
||||
::: {}
|
||||
![]()
|
||||
$F_6$ = 114, V = 248, E = 372
|
||||
:::
|
||||
|
||||
Left: $t_5 t_6 uzC$, Right: $t_5 t_6 dwdzC$
|
||||
::::
|
||||
|
||||
|
||||
Other Solutions
|
||||
---------------
|
||||
|
||||
This section is for polyhedra which are either more easily constructible or are not easily derived from deltahedra.
|
||||
|
||||
|
||||
### Truncated Trapezohedron (Dih6)
|
||||
|
||||
A *trapezohedron* is the polyhedral dual of an antiprism; an example is a d10, which is the pentagonal case. Despite the name "*n*-gonal trapezohedron," the figure is made entirely from 2*n* kites with the long edges meeting at points and the short edges meeting with each other. Truncating the order-*n* vertices where the long edges of the kites meet produces a truncated trapezohedron, which possesses two regular *n*-gonal "caps" separated by a ring of pentagons. In a way, they can be considered as the pentagonal analogue to prisms (quadrilaterals) and antiprisms (triangles).
|
||||
|
||||
The dodecahedron itself can be realized as a (order-5) truncated pentagonal trapezohedron ($t_5 d A_5$), which emphasizes its degree-5 dihedral symmetry. The next largest truncated trapezohedron is the hexagonal case ($t_6 d A_6$), which contains and 2 hexagons and has dihedral symmetry of degree 6 (which itself contains that of degree 3).
|
||||
|
||||
![]()
|
||||
|
||||
Base case: truncated hexagonal trapezohedron
|
||||
|
||||
Conway | $F_6$ | V | E
|
||||
-------------------------------------------------------------------------------|----------|-----|-----
|
||||
[$t_6dA_6 = T_6$](https://levskaya.github.io/polyhedronisme/?recipe=K300t6dA6) | 2 | 24 | 36
|
||||
[$dkT_6$](https://levskaya.github.io/polyhedronisme/?recipe=dkK300t6dA6) | 26 | 72 | 108
|
||||
[$cT_6$](https://levskaya.github.io/polyhedronisme/?recipe=K300cK30t6dA6) | 38 | 96 | 144
|
||||
[$wT_6$](https://levskaya.github.io/polyhedronisme/?recipe=K300wK30t6dA6) | 86 | 168 | 252
|
||||
[$tkT_6$](https://levskaya.github.io/polyhedronisme/?recipe=K300tkK30t6dA6) | 98 | 216 | 324
|
||||
$g_T T_6$ | 12T - 10 | 24T | 36T
|
||||
|
||||
|
||||
Medially-Separated Dodecahedron (Dih5)
|
||||
--------------------------------------
|
||||
|
||||
As the "truncated pentagonal trapezohedron", the dodecahedron can be separated into halves along an equator (specifically, along the [Petrie polygon](https://en.wikipedia.org/wiki/Petrie_polygon)). This produces two halves with the pole configuration of the dodecahedron, joined together with hexagons. Organizing the pentagons into two pairs of 6 is similar to the earlier case with the triangulated cube, but with a different arrangement of pentagons. The resultant figure has dihedral symmetry of degree 5. Interestingly, it is also the first solution polyhedron with an odd number of faces.
|
||||
|
||||
:::: {}
|
||||
::: {}
|
||||
![]()
|
||||
Dodecahedral graph
|
||||
:::
|
||||
|
||||
::: {}
|
||||
![]()
|
||||
Pole configuration of solution
|
||||
:::
|
||||
|
||||
::: {}
|
||||
![]()
|
||||
Complete base solution. Note how the outer face has been rotated when compared with the dodecahedral graph
|
||||
:::
|
||||
::::
|
||||
|
||||
Conway | $F_6$ | V | E
|
||||
----------------|----------|-----|-----
|
||||
$D_p$ | 5 | 30 | 45
|
||||
$dkD_p$ | 35 | 90 | 135
|
||||
$cD_p$ | 50 | 120 | 180
|
||||
$wD_p$ | 95 | 210 | 315
|
||||
$tkD_p$ | 125 | 270 | 405
|
||||
$g_T D_p$ | 15T - 10 | 30T | 45T
|
||||
|
||||
|
||||
Truncated Gyro-Pyramids (Dih5, Dih6)
|
||||
------------------------------------
|
||||
|
||||
In the previous post, I used the Conway operator *g*, which is called "gyro". It is the dual operator to snubbing, intuition for which can be seen by looking at the [snub cube](https://en.wikipedia.org/wiki/Snub_cube). A *gyro-pyramid* (i.e., the gyro operator applied to pyramids) can roughly be described as a ring of 2*n* pentagons which alternate in orientation, the points of which have an additional edge connecting to one of two antipodal endpoints. Truncating these these adds a face with the same number of edges as the original pyramid, surrounded by hexagons. Solution polyhedra can be found by examining the pentagonal ($t_5 g Y_5$) and hexagonal ($t_6 g Y_6$) cases. The former has dihedral symmetry of degree 5 and the latter has that of degree 6 (which contains degree 3).
|
||||
|
||||
:::: {}
|
||||
::: {}
|
||||
![]()
|
||||
Base case 1: truncated pentagonal gyro-pyramid
|
||||
:::
|
||||
|
||||
::: {}
|
||||
![]()
|
||||
Base case 2: truncated hexagonal gyro-pyramid
|
||||
:::
|
||||
::::
|
||||
|
||||
Conway | $F_6$ | V | E
|
||||
----------------------------------------------------------------------------------|----------|-----|-----
|
||||
[$t_5gY_5 = G_5$](https://levskaya.github.io/polyhedronisme/?recipe=K300t5K30gY5) | 10 | 40 | 60
|
||||
[$dkG_5$](https://levskaya.github.io/polyhedronisme/?recipe=dkK300t5K30gY5) | 50 | 120 | 180
|
||||
[$cG_5$](https://levskaya.github.io/polyhedronisme/?recipe=K300dudt5K30gY5) | 70 | 160 | 240
|
||||
[$wG_5$](https://levskaya.github.io/polyhedronisme/?recipe=K300wK30t5K30gY5) | 130 | 280 | 420
|
||||
[$tkG_5$](https://levskaya.github.io/polyhedronisme/?recipe=tkK300t5K30gY5) | 170 | 360 | 540
|
||||
$g_T G_5$ | 20T - 10 | 40T | 60T
|
||||
[$t_6gY_6 = G_6$](https://levskaya.github.io/polyhedronisme/?recipe=K300t6K30gY6) | 14 | 48 | 72
|
||||
[$dkG_6$](https://levskaya.github.io/polyhedronisme/?recipe=dkK300t6K30gY6) | 62 | 144 | 216
|
||||
[$cG_6$](https://levskaya.github.io/polyhedronisme/?recipe=K300dudK40t6gY6) | 86 | 192 | 288
|
||||
[$wG_6$](https://levskaya.github.io/polyhedronisme/?recipe=K300wK30t6K30gY6) | 158 | 336 | 504
|
||||
[$tkG_6$](https://levskaya.github.io/polyhedronisme/?recipe=tkK300t6K30gY6) | 206 | 432 | 648
|
||||
$g_T G_6$ | 24T - 10 | 48T | 72T
|
||||
|
||||
The pentagonal case demonstrates something interesting: an appeal to the equation $12 = 10 + 2 = 5 \cdot 2 + 2$. The similar equation $12 = 7 + 5$ is unlikely to bear fruit, as an odd number of pentagons cannot alternate up and down.
|
||||
|
||||
|
||||
Japanese Floor Tiling
|
||||
---------------------
|
||||
|
||||
*Tatami* are a Japanese traditional style of floor mat, used even today in Japan as an intuitive measure for the surface area of living spaces. A single mat has an aspect ratio of 2:1, but the complexity comes in how they are arranged. Layouts are termed "inauspicious" (不祝儀敷き, *fushūgi-jiki*) when there are points where four mats meet, while "auspicious" (祝儀敷き, *shūgi-jiki*) layouts have all mats meet in threes. For a sample of the fascination mathematicians have with these arrangements, you need only [search for "tatami" in the OEIS](http://oeis.org/search?q=tatami&language=english&go=Search) to find dozens of combinatorial sequences.
|
||||
|
||||
:::: {}
|
||||
::: {}
|
||||
![]()
|
||||
Inauspicious 4x4 layout
|
||||
:::
|
||||
|
||||
::: {}
|
||||
![]()
|
||||
Auspicious 4x4 layout
|
||||
:::
|
||||
|
||||
::: {}
|
||||
![]()
|
||||
Possible topologies for a single mat
|
||||
:::
|
||||
::::
|
||||
|
||||
Topologically, each *tatami* mat in an arrangement can be thought of as either a quadrilateral, a pentagon or a hexagon. Obviously when considered alone, one mat is a rectangle, as is each mat in a stack of them like in the inauspicious layout above. When two mats are affixed to one side of the mat, it becomes a pentagon, as in the auspicious layout above; all 8 mats are pentagons. Finally, when done to both sides, it becomes a hexagon.
|
||||
|
||||
<p class="has-text-align-center">
|
||||
<a title="Tomruen, CC BY-SA 4.0 <https://creativecommons.org/licenses/by-sa/4.0>, via Wikimedia Commons" href="https://commons.wikimedia.org/wiki/File:Conway_wC.png"><img width="192" alt="Conway wC" src="https://upload.wikimedia.org/wikipedia/commons/f/f4/Conway_wC.png"></a>
|
||||
<a title="See page for author, CC BY-SA 4.0 <https://creativecommons.org/licenses/by-sa/4.0>, via Wikimedia Commons" href="https://commons.wikimedia.org/wiki/File:Tearoom_layout.svg"><img style="background-color: white !important; padding: 5px" width="192" alt="Tearoom layout" src="https://upload.wikimedia.org/wikipedia/commons/thumb/c/c0/Tearoom_layout.svg/256px-Tearoom_layout.svg.png"></a>
|
||||
</p>
|
||||
::: {}
|
||||
Images were retrieved from Wikimedia and belong to their respective owners.
|
||||
:::
|
||||
|
||||
Naturally, the interplay between the latter two elements, as well as the condition that all mats meet in threes has a direct application to the problem at hand. In fact, the graph of the whirl operation on the surface of a cube (left) clearly makes the shape of one of these arrangements (with a half-mat included, right). Two things pose a small issue for auspicious floor layouts:
|
||||
|
||||
- when interpreted as a graph, the external face very quickly accumulates a large number of edges and
|
||||
- each of the mats at the corners of the room have a single degree-2 vertex
|
||||
|
||||
Both of these can be (partially) amended by connecting pairs of corner vertices, which creates additional faces while decreasing the number of edges on the perimeter.
|
||||
|
||||
The standard 4x6 auspicious layout is shown below, with corners connected and pentagons/hexagons identified. Next to it is an equivalent graph with a regular hexagon as an outer face. As a 3D figure, it has only three hexagons and degree-3 dihedral symmetry, another odd number.
|
||||
|
||||
::: {}
|
||||
![]()
|
||||
:::
|
||||
|
||||
::: {}
|
||||
![]()
|
||||
:::
|
||||
|
||||
Conway | $F_6$ | V | E
|
||||
--------------|----------|-----|-----
|
||||
$M$ | 3 | 26 | 39
|
||||
$dkM$ | 29 | 78 | 117
|
||||
$cM$ | 42 | 104 | 156
|
||||
$wM$ | 81 | 182 | 273
|
||||
$tkM$ | 107 | 234 | 351
|
||||
$g_T M$ | 13T - 10 | 26T | 39T
|
||||
|
||||
While the chamfer and whirl are both multiples of 3, the dual-kis somewhat strangely bears 29 and 107, which are both prime. In fact, up to $(dk)^{11}$, the values are either prime or semiprime, and up to $(dk)^{28}$, the values are either 1-, 2-, or 3-, almost primes.
|
||||
|
||||
|
||||
### Tatamified Projections
|
||||
|
||||
While other rectangular *tatami* arrangements contain either too few or too many edges, further graphs of solutions can be generated by using mats with non-rectangular arrangements (connecting corners as necessary), or more easily, nonstandard aspect ratios. Some of these are shown below:
|
||||
|
||||
:::: {}
|
||||
::: {}
|
||||
![]()
|
||||
Dodecahedral graph, as a *tatami* arrangement with a single 4x1 mat
|
||||
:::
|
||||
|
||||
::: {}
|
||||
![]()
|
||||
Medially-separated dodecahedron, as seen above
|
||||
:::
|
||||
|
||||
::: {}
|
||||
![]()
|
||||
Truncated icosahedron graph. Note the path of 2x1 mats
|
||||
:::
|
||||
|
||||
::: {}
|
||||
![]()
|
||||
Triacontahedron (not a base case shown above), initially similar to tI
|
||||
:::
|
||||
::::
|
||||
|
||||
|
||||
Final Tabulation and Closing
|
||||
----------------------------
|
||||
|
||||
The solutions examined have been collected in the table below. Roughly, the possible values for $F_6$ are 2, 3, 4, 5, 6, 8, 10, 12, 14, 18, 20, 24, 26, 28, 29..., though there is nothing exhaustive about the examples considered. In particular, it should be possible to generate further values from selective subdivisions of deltahedra, or by using selective GC operators which still preserve certain symmetries.
|
||||
|
||||
|
||||
| Symmetry | Classification | $F_6$ | Example values
|
||||
|-------------|--------------------------------------|------------|-----------------------------------------
|
||||
| Icosahedral | Dodecahedral Goldberg | $10T - 10$ | 20, 30, 60, 80, 110, 120, 150, 180, 200
|
||||
| Tetrahedral | Tetrahedral Goldberg Antitruncations | $2T - 14$ | 4, 10, 12, 18, 24, 28, 36, 40, 42, 48, 58, 60, 64
|
||||
| | Edge-preserving | $4((n+1)^2 - 3$ | 24, 52, 88, 132, 184, 244, 312, 388, 472, 564
|
||||
| | Other | $2TT' - 4T' - 10$ | 32, 46, 50, 56, 70, 74, 78, 88, 92, 102
|
||||
| | | $(4(n+1)^2 - 2)T - 10$ | 172, 176, 184, 238, 424, 548
|
||||
| $Dih_3$ | Rhombohedron | $16T - 10$ | 6, 38, 54, 102, 134, 182, 198
|
||||
| | Triangular Frustum | $18T - 10$ | 8, 44, 62, 116, 152, 206, 224, 278, 332
|
||||
| | [Tatamihedron](https://en.wikipedia.org/wiki/26-fullerene_graph) | $13T - 10$ | 3, 29, 42, 81, 107, 146, 159, 198, 237, 263, 315
|
||||
| $Dih_5$ | Medially-separated Dodecahedron | $15T - 10$ | 5, 35, 50, 95, 125, 170, 185, 230, 275, 305
|
||||
| | Truncated Pentagonal Gyropyramid | $20T - 10$ | 10, 50, 70, 130, 170, 230, 250
|
||||
| $Dih_6$ | Truncated Hexaagonal Trapezohedron | $12T - 10$ | 2, 26, 38, 74, 98, 134, 146, 182, 218, 242, 290, 314
|
||||
| | Truncated Hexaagonal Gyropyramid | $24T - 10$ | 14, 62, 86, 158, 206, 278, 302
|
||||
|
||||
T, T' are members of the sequence 1, 3, 4, 7, 9, 12, 13, 16, 19, 21... ([OEIS A003136](http://oeis.org/A003136))
|
||||
|
||||
\*: This is the result of a GC operator applied to $2T - 14$, which requires *T* > 7
|
||||
|
||||
Small naturals which do not appear on the list are 1, 7, 9, 11, and 13. Without constructing them, I am unsure whether they can exist. Some possible symmetries are $7 = 5 + 2$ (five equatorial and two polar hexagons, Dih5) and $11 = 9 + 2$ (three hexagons along three lines of longitude or three triangles of hexagons pointing toward a pole, Dih3).
|
||||
|
||||
***
|
||||
|
||||
Despite the Goldberg-Coxeter construction for dodecahedra being well-known, the 12 pentagons rule applies to a much broader class of polyhedra. In fact, due to the GC construction, any polyhedron satisfying the condition can be expanded and twisted into larger and larger solutions, which have little to do with soccer balls.
|
||||
|
||||
Polyhedron images were generated using [polyHédronisme](https://levskaya.github.io/polyhedronisme/) and Dr. Andrew J. Marsh's [polyhedron generator](https://drajmarsh.bitbucket.io/poly3d.html). Nets and graphs were created with GeoGebra. Other images were retrieved from Wikimedia and belong to their respective owners.
|
||||
269
permutations/1/index.qmd
Normal file
@ -0,0 +1,269 @@
|
||||
---
|
||||
format:
|
||||
html:
|
||||
html-math-method: katex
|
||||
---
|
||||
|
||||
|
||||
A Game of Permutations, Part 1: Basics
|
||||
======================================
|
||||
|
||||
In the time since [my last post]() discussing graphs, I have been spurred on to continue playing with them, with a slight focus on abstract algebra. This post will primarily focus on some fundamental concepts before launching into some constructions which will make the journey down this road more manageable. However, I will still assume you are already familiar with what both a [group](https://mathworld.wolfram.com/Group.html) and a [graph](https://mathworld.wolfram.com/Graph.html) are.
|
||||
|
||||
|
||||
The Symmetric Group
|
||||
-------------------
|
||||
|
||||
Some of the most important finite groups are the symmetric group of degree *n* ($S_n$). They are the groups formed by permutations of lists containing *n* elements. There is a group element for each permutation, so the order of the group is the same as the number of permutations, $n!$.
|
||||
|
||||
Note: Since both lists and groups consist of "elements", I will do my best to refer to objects in a group as "group elements" and the objects in a list as "items".
|
||||
|
||||
There are many ways to denote elements of the symmetric group. I will take the liberty of explaining some common notations, each of which are useful in different ways. More information about them can be found [elsewhere](https://mathworld.wolfram.com/Permutation.html) [online](https://en.wikipedia.org/wiki/Permutation#Notations) as well as any adequate group theory text.
|
||||
|
||||
|
||||
Naive List Notation
|
||||
-------------------
|
||||
|
||||
Arguably the simplest way to do things is just apply the permutation to the list $[1, 2, 3]$. Take the element of $S_3$ which can be described as the action "assign the first item to the second index, the second to the third, and the third to the first". When applied to our list, it results in $[3, 1, 2]$, since "1" is in position 2, and similarly for the other items.
|
||||
|
||||
The problem is that this choice is too results-oriented. We can't compose group elements in a meaningful way since all of the information about the permutation is in the position of items in the list, rather than the items of the list themselves.
|
||||
|
||||
|
||||
True List Notations (One- and Two-line Notation)
|
||||
------------------------------------------------
|
||||
|
||||
Therefore, we do the opposite. We instead denote an element of the group by a list of (1-based) indices. The *n*th item in the list describes the position in which *n* can be found after the element acts on a list. Using the same example as previous, we obtain the list $[\![2, 3, 1]\!]$, using double brackets to express that it is a permutation. The first item "2" describes the destination of 1, and similarly for the other items.
|
||||
|
||||
This is known as "one-line notation". By using it, it is straightforward to encode symmetric group elements on a computer. After all, we only have to read the items of a list by the indices in another. Here's a compact definition in Haskell:
|
||||
|
||||
<!--
|
||||
TODO: This seems wrong.
|
||||
--->
|
||||
```{haskell}
|
||||
-- convenient wrapper type for below
|
||||
newtype Permutation = P { unP :: [Int] }
|
||||
apply :: [a] -> Permutation -> [a]
|
||||
apply xs =
|
||||
map ( -- for each item of the permutation, map it to...
|
||||
(xs !!) . -- the nth item of the first list
|
||||
(+(-1)) -- (indexed starting with 1)
|
||||
) . unP -- (after undoing the wrapping)
|
||||
-- written in a non-point free form
|
||||
apply' xs (P ys) = map ( \n -> xs !! (n-1) ) ys
|
||||
|
||||
print $ [1,2,3] `apply` P [2,3,1]
|
||||
```
|
||||
|
||||
One-line notation can be made made more explicit by writing the list $[1, 2, 3, ..., n]$ above it, resulting in "two-line notation". A distinct benefit over one-line notation is that we can easily find the inverse of an element. All we have to do is sort the columns of the permutation by the value in the second row, then swap the two rows.
|
||||
|
||||
$$
|
||||
[\![2, 3, 1]\!]^{-1} =
|
||||
\begin{bmatrix}
|
||||
1 & 2 & 3 \\
|
||||
2 & 3 & 1
|
||||
\end{bmatrix}^{-1} =
|
||||
\begin{bmatrix}
|
||||
3 & 1 & 2 \\
|
||||
1 & 2 & 3
|
||||
\end{bmatrix}^{-1} =
|
||||
\begin{bmatrix}
|
||||
1 & 2 & 3 \\
|
||||
3 & 1 & 2
|
||||
\end{bmatrix} =
|
||||
[\![3, 1, 2]\!]
|
||||
$$
|
||||
|
||||
This also makes clear what the naive notation describes: the inverse of the (true) one-line notation.
|
||||
|
||||
|
||||
While lists are great for being explicit and easy to describe for a computer, humans can easily misinterpret them, and mistakenly switch back and forth between naive and true list notation. There is also a lot of redundancy: $[\![2, 1]\!]$ and $[\![2, 3, 1]\!]$ both describe a group element which swaps the first two items of a list. Worst of all, the notation is so explicit that it is group-theoretically unintuitive.
|
||||
|
||||
|
||||
Cycle Notation
|
||||
--------------
|
||||
|
||||
*Cycle notation* addresses all of these issues at the expense of a more complex group operation. Let's try phrasing our earlier element differently. We start at position 1 and follow it to "2". Then, we see that in position 2, we have "3", and in position 3 we have "1". We have just described a *cycle*, since continuing in this manner would go on forever. We denote this cycle as $(1 ~ 2 ~ 3)$.
|
||||
|
||||
Cycle notation is much more delicate than list notation, since the notation is nonunique:
|
||||
|
||||
- Naturally, the elements of a cycle may be cycled to produce an equivalent expression.
|
||||
|
||||
- $(1 ~ 2 ~ 3) = (3 ~ 1 ~ 2) = (2 ~ 3 ~ 1)$
|
||||
|
||||
- Cycles which have no common elements (i.e., are disjoint) commute, since they act on separate parts of the list.
|
||||
|
||||
- $(1 ~ 2 ~ 3)(4 ~ 5) = (4 ~ 5)(1 ~ 2 ~ 3)$
|
||||
|
||||
The true benefit of cycles is that they are easy to manipulate algebraically. For some reason, [Wikipedia](https://en.wikipedia.org/wiki/Permutation#Cycle_notation) does not elaborate on the composition rules for cycles, and the text which I read as an introduction to group theory simply listed it as an exercise. While playing around with them and deriving these rules oneself *is* a good idea, I will list the most important here:
|
||||
|
||||
- Cycles can be inverted by reversing the order of the indices, and are unchanged by cycling them.
|
||||
|
||||
- $(1 ~ 2 ~ 3)^{-1} = (3 ~ 2 ~ 1) = (1 ~ 3 ~ 2)$
|
||||
|
||||
- Cycles may be composed if the last element in the first is the first index on the right. Inversely, cycles may also be decomposed by partitioning it on an index and duplicating.
|
||||
|
||||
- $(1 ~ 2 ~ 3) = (1 ~ 2 )(2 ~ 3)$
|
||||
|
||||
- If an index in a cycle is repeated twice, it may be omitted from the cycle.
|
||||
|
||||
- $(1 ~ 2 ~ 3)(1 ~ 3) = (1 ~ 2 ~ 3)(3 ~ 1) = (1 ~ 2 ~ 3 ~ 1) = (1 ~ 1 ~ 2 ~ 3) = (2 ~ 3)$
|
||||
|
||||
Going back to $(1 ~ 2 ~ 3)$, if we apply this permutation to the list $[1, 2, 3]$:
|
||||
|
||||
$$
|
||||
(1 ~ 2 ~ 3) \left( \vphantom{0\over1} [1, 2, 3] \right)
|
||||
= (1 ~ 2)(2 ~ 3) \left( \vphantom{0\over1} [1, 2, 3] \right)
|
||||
= (1 ~ 2) \left( \vphantom{0\over1} [1, 3, 2] \right)
|
||||
= [3, 1, 2]
|
||||
$$
|
||||
|
||||
Which is exactly what we expected with our naive notation.
|
||||
|
||||
|
||||
Generators, Permutation Groups, and Sorting
|
||||
-------------------------------------------
|
||||
|
||||
Remember that if we have a group G, then we can select a set of elements $\langle g_1, g_2, g_3, ... \rangle$ as *generators*. If we form all possible products -- not only the pairwise ones $g_1 g_2$, but also $g_1 g_2 g_3$ and all powers of any $g_n$ -- then the products form a subgroup of G. Naturally, the set is called the *generating set*.
|
||||
|
||||
Symmetric groups are of primary interest because of their subgroups, also known as permutation groups. A fundamental result of group theory, known as [Cayley's theorem](https://en.wikipedia.org/wiki/Cayley%27s_theorem), states that all finite groups are isomorphic to one of these subgroups. This means that we can code effectively any group by using elements of the symmetric group.
|
||||
|
||||
For example, consider the generating set $\langle (1 ~ 2) \rangle$, which contains a single element that swaps the first two items of a list. Its square is the identity, meaning that its inverse is itself. The identity and $(1 ~ 2)$ are the only two elements of the generated group, which is isomorphic to $C_2$, the cyclic group of order 2. Similarly, the 3-cycle in the generating set $\langle (1 ~ 2 ~ 3) \rangle$ generates $C_3$, cyclic group of order 3.
|
||||
|
||||
However, the generating set $\langle (1 ~ 2), (1 ~ 2 ~ 3)\rangle$, which contains both of these permutations, generates the entirety of $S_3$. In fact, [every symmetric group can be generated by two elements](https://groupprops.subwiki.org/wiki/Symmetric_group_on_a_finite_set_is_2-generated): a permutation which cycles all elements once, and the permutation which swaps the first two elements, i.e., $\langle (1 ~ 2), (1 ~ 2 ~ 3 ~ 4 ~ ... ~ n) \rangle$.
|
||||
|
||||
|
||||
### Sorting and 2-Cycles
|
||||
|
||||
The proof linked to above, that every symmetric group can be generated by two elements, uses the (somewhat obvious) result that one can produce any permutation of a list by picking two items, swapping them, and repeating until the list is in the desired order.
|
||||
|
||||
This is reminiscent of how sorting algorithms are able to sort a list by only comparing and swapping items. As mentioned earlier when finding inverses using in two-line notation, sorting is almost the inverse of permuting.
|
||||
|
||||
|
||||
### Bubble Sort
|
||||
|
||||
However, not all 2-cycles are necessary to generate the whole symmetric group. Consider [bubble sort](https://en.wikipedia.org/wiki/Bubble_sort), where two elements are swapped when, of two adjacent elements, the latter is less than the former. Until the list is sorted, the algorithm finds all such adjacent inversions. In the worst case, it will swap every pair of adjacent elements, some possibly multiple times, corresponding to the generating set $\langle (1 ~ 2), (2 ~ 3), (3 ~ 4), (4 ~ 5), …, (n-1 ~\ ~ n) \rangle$.
|
||||
|
||||
::: {}
|
||||
![]()
|
||||
Bubble sort ordering a reverse-sorted list
|
||||
:::
|
||||
|
||||
|
||||
### Selection Sort
|
||||
|
||||
Another method, [selection sort](https://en.wikipedia.org/wiki/Selection_sort), searches through the list for the smallest item and swaps it to the beginning. If this is the final item of the list, this results in the permutation $(1 ~ n)$. Supposing that process is continued with the second element and we also want it to swap with the final element, then the next swap corresponds to $(2 ~ n)$. Continuing until the last element, this gives the generating set $\langle (1 ~ n), (2 ~ n), (3 ~ n), (4 ~ n), …, (n-1 ~\ ~ n) \rangle$.
|
||||
|
||||
::: {}
|
||||
![]()
|
||||
Selection sort ordering a particular list, using only swaps with the final element
|
||||
:::
|
||||
|
||||
Note that this behavior for selection sort is uncommon, and this animation omits the selection of a swap candidate. The animation below shows a more destructive selection sort, in which the least element candidate is placed at the end of the list (position 5). Once the algorithm hits the end of the list, the candidate is swapped to the least unsorted position, and the algorithm continues on the rest of the list.
|
||||
|
||||
::: {}
|
||||
![]()
|
||||
"Destructive" selection sort. The actual list being sorted consists of the initial four items, with the final item as temporary storage.
|
||||
:::
|
||||
|
||||
|
||||
Swap Diagrams
|
||||
-------------
|
||||
|
||||
Given a set of 2-cycles, it would be nice to know at a glance if the entire group is generated. At its simplest, a 2-cycle expressed in cycle notation is simply an unordered pair of natural numbers which swap items of an n-list. Similarly, the edges of an undirected graph on n vertices (labelled from 1 to n) may be interpreted as an unordered pair of the vertices it connects.
|
||||
|
||||
If we treat the two objects as the same, then we can convert between graphs and sets of 2-cycles. Going from the latter to the former, we start on an empty graph on n vertices (labelled from 1 to n). Then, we connect two vertices with an edge when the set includes the permutation swapping the indices labelled by the vertices.
|
||||
|
||||
Returning to the generating sets we identified with sorting algorithms we identify with each a graph family.
|
||||
|
||||
- Bubble sort: $\langle (1 ~ 2), (2 ~ 3), (3 ~ 4), (4 ~ 5), …, (n-1 ~~ n) \rangle$
|
||||
|
||||
- The path graphs ($P_n$), which are precisely as they sound: an unbranching path formed by n vertices.
|
||||
|
||||
- "Selection" sort: $\langle (1 ~ n), (2 ~ n), (3 ~ n), (4 ~ n), …, (n-1 ~~ n) \rangle$
|
||||
|
||||
- The star graphs ($\bigstar_n$, since $S_n$ means the symmetric group), one vertex connected to all others.
|
||||
|
||||
- Every 2-cycle in $S_n$
|
||||
|
||||
- The complete graphs ($K_n$), which connect every vertex to every other vertex.
|
||||
|
||||
::: {}
|
||||
![]()
|
||||
:::
|
||||
|
||||
This interpretation of these objects doesn't have proper name, but I think the name "swap diagram" fits. They allow us to answer at least one question about the generating set from a graph theory perspective.
|
||||
|
||||
|
||||
### Connected Graphs
|
||||
|
||||
A graph is connected if a path exists between all pairs of vertices. The simplest possible path is simply a single edge, which we already know to be an available 2-cycle. The next simplest case is a path consisting of two edges. Some cycle algebra shows that we can produce a third cycle which corresponds to an edge connecting the two distant vertices.
|
||||
|
||||
:::: {layout-ncol = "2"}
|
||||
::: {}
|
||||
![]()
|
||||
:::
|
||||
|
||||
::: {}
|
||||
$$
|
||||
\begin{align*}
|
||||
&(m ~ n) (n ~ o) (m ~ n) \\
|
||||
&= (m ~ n ~ o) (m ~ n) \\
|
||||
&= (n ~ o ~ m) (m ~ n) \\
|
||||
&= (n ~ o ~ m ~ n) \\
|
||||
&= (o ~ m) = (m ~ o)
|
||||
\end{align*}
|
||||
$$
|
||||
Note that this is just the conjugation of $(n ~ o)$ by $(m ~ n)$
|
||||
:::
|
||||
::::
|
||||
|
||||
In other words, if we have have two adjacent edges, the new edge corresponds to the product of elements from the generating set. Graph theory has a name for this operation: when we produce *all* new edges by linking vertices that were separated by a distance of 2, the result is called the *square of that graph*. In fact, [higher graph](https://en.wikipedia.org/wiki/Graph_power) powers will reflect connections induced by more conjugations of adjacent edges.
|
||||
|
||||
::: {}
|
||||
![]()
|
||||
As you might be able to guess, this implies that $(1 ~~ 4) = (3 ~~ 4)(2 ~~ 3)(1 ~~ 2)(2 ~~ 3)(3 ~~ 4)$
|
||||
|
||||
Also, $\bigstar_n^2 = K_n$
|
||||
:::
|
||||
|
||||
If our graph is connected, then repeating this operation will tend toward a complete graph. Complete graphs contain every possible edge, and correspond to all possible 2-cycles, which in turn generate the symmetric group. Conversely, if a graph has *n* vertices, then for it to be connected, it must have at least $n-1$ edges. Thus, a generating set of 2-cycles must have at least $n-1$ items to generate the symmetric group.
|
||||
|
||||
Picking a different vertex labelling will correspond to a different generating set. For example, in the image of $P_4$ above, if the edge connecting vertices 1 and 2 is replaced with an edge connecting 1 and 4, then the resulting graph is still $P_4$, even though it describes a different generating set. We can ignore these extra cases entirely -- either way, the graph power argument shows that a connected graph corresponds to a generating set of the whole symmetric group.
|
||||
|
||||
|
||||
### Disconnected Graphs
|
||||
|
||||
A disconnected graph is the [disjoint union](https://en.wikipedia.org/wiki/Disjoint_union_of_graphs) of connected graphs. Under graph powers, we know that each connected graph tends toward a complete graph, meaning a disconnected graph as a whole tends toward a disjoint union of complete graphs, or [cluster graph](https://en.wikipedia.org/wiki/Cluster_graph). But what groups do cluster graphs correspond to?
|
||||
|
||||
The simplest case to consider is what happens when the graph is $P_2 \oplus P_2$. One of the generating sets it corresponds to is $\langle (1 ~ 2), (3 ~ 4) \rangle$, a pair of disjoint cycles. The group they generate is
|
||||
|
||||
$$
|
||||
\{id, (1 ~ 2), (3 ~ 4), (1 ~ 2)(3 ~ 4) \} \cong S_2 \times S_2 \cong \mathbb{Z}_2 \times \mathbb{Z}_2
|
||||
$$
|
||||
|
||||
One way to look at this is by considering paths on each component: we can either cross an edge on the first component (corresponding to $(1 ~ 2)$), the second component (corresponding to $(3 ~ 4)$), or both at the same time. This independence means that one group's structure is duplicated over the other's, or more directly, gives the direct product. In general, if we denote $\gamma$ as the map which "runs" the swap diagram and produces the group, then
|
||||
|
||||
$$
|
||||
\gamma( A \oplus B ) = S_{|A|} \times S_{|B|}, ~ A, B \text{ connected}
|
||||
$$
|
||||
|
||||
where $|A|$ is the number of vertices in A. Or, if we express a disconnected graph *G* as the disjoint union of its connected components $H_i$
|
||||
|
||||
$$
|
||||
\begin{gather*}
|
||||
G = \bigsqcup_i H_i \\
|
||||
\gamma( G ) = \gamma( ~ \bigsqcup_i H_i ~ ) = \prod_i S_{|H_i|}
|
||||
\end{gather*}
|
||||
$$
|
||||
|
||||
Which takes care of every simple graph. While we're rather limited by what kinds of groups can be expressed by a swap diagram, it is rather satisfying that $\gamma$ maps a sum-like object onto a product-like object.
|
||||
|
||||
|
||||
Closing
|
||||
-------
|
||||
|
||||
This concludes the dry introduction to this series of posts discussing some investigations of mine into symmetric groups. I probably could have omitted the sections about permutation notation and generators, but I wanted to be thorough and tie it to concepts which were useful to my understanding. The notion of a graph encoding a generating set in particular will be fairly important going forward.
|
||||
|
||||
Originally, this post was half of a single, sprawling article which meandered this way and that. I hope I've improved the organization by keeping the digression about sorting algorithms to this initial article. The next post will cover some interesting structures which can fill Euclidean space and incredibly large graphs.
|
||||
|
||||
Sorting and graph diagrams made with GeoGebra.
|
||||
402
permutations/2/index.qmd
Normal file
@ -0,0 +1,402 @@
|
||||
---
|
||||
format:
|
||||
html:
|
||||
html-math-method: katex
|
||||
---
|
||||
|
||||
|
||||
A Game of Permutations, Part 2: Permutohedra and very large Graphs
|
||||
==================================================================
|
||||
|
||||
This post assumes you have read (or at least skimmed over parts of) the [first post](), which talks about graphs and the symmetric group. This post will contain some more "empirical" results, since I'm not an expert on graph theory. However, one hardly needs to be an expert to learn or to make computations, observations, and predictions. We left off talking about producing a group from a graph, so we begin now by considering how to do the reverse.
|
||||
|
||||
|
||||
Cayley Graphs
|
||||
-------------
|
||||
|
||||
For a given generating set, we can assign every element in the group it generates to a vertex in a graph. Starting with each of the generators, we draw arrows from one vertex to the other when the product of the initial vertex and a generator (in that order) is the product vertex. If we continue until there are no more arrows to draw, the resulting figure is known as a [Cayley graph](https://mathworld.wolfram.com/CayleyGraph.html).
|
||||
|
||||
Owing to the way in which they are generated, Cayley graphs have a few useful properties as graphs. At every vertex, we have as many outward edges as we do generators in the generating set, so the outward (and in fact, inward) degree of each vertex is the same. In other words, it is a regular graph. More than that, it is vertex-transitive, since labelling a single vertex's outward edges will label that of the entire graph.
|
||||
|
||||
Cayley graphs can take a wide variety of shapes, which depend on the generating set used. Their construction implies a labelling of vertices by permutations and an edge labelling indicative of its generating set, but they can just as easily be abstract graphs separate from the procedure that was used to generate them. Here are a few examples of Cayley graphs made from elements of $S_4$:
|
||||
|
||||
|
||||
::: {}
|
||||
![]()
|
||||
Left: $\{(1 ~ 3 ~ 2 ~ 4), (3 ~ 4), (1 ~ 4 ~ 2 ~ 3)\}$, cube graph <br>
|
||||
Middle: $\{(1 ~ 2 ~ 3), (2 ~ 3 ~ 4)\}$ cuboctahedral graph <br>
|
||||
Right: $\{(2 ~ 3), (3 ~ 4), (2 ~ 3 ~ 4)\}$, octahedral graph <br>
|
||||
Generating sets obtained from the previous MathWorld article
|
||||
:::
|
||||
|
||||
In general, the Cayley graph is a directed graph. However, if for every member of the generating set, we also include its inverse, every directed edge will be matched by an edge in the opposite direction, and the Cayley graph is undirected.
|
||||
|
||||
|
||||
Graphs to Graphs
|
||||
----------------
|
||||
|
||||
Since all 2-cycles are their own inverse, the generating sets which include only them produce undirected Cayley graphs. Furthermore, since the generating set can itself be thought of as a graph, we may consider an operation from graphs to graphs that maps a swap diagram to its Cayley graph.
|
||||
|
||||
::: {}
|
||||
~~Since this operation involves permutations and the number of vertices in the resulting graph grows factorially, I've taken to calling this operation the "graph factorial".~~
|
||||
:::
|
||||
|
||||
I've since renamed this operation the "graph exponential" because of its apparent relationship with the disjoint union. Namely, it seems to be the case that $\exp( A \oplus B ) = \exp( A ) \times \exp( B )$, where $\times$ signifies the [Cartesian (box) product of graphs](https://en.wikipedia.org/wiki/Cartesian_product_of_graphs) rather than the tensor product. While I believe this is a better name, some images in this article retain the earlier A! notation.
|
||||
|
||||
::: {}
|
||||
![]()
|
||||
An example of the graph exponential. While the individual Cayley graphs for $(1 ~ 2)$ and $(3 ~ 4)$ are not shown (they are also 2-paths), their (box) product, the 4-cycle graph, is in the center.
|
||||
:::
|
||||
|
||||
This operation is my own invention, so I am unsure whether or not it constitutes anything useful. In fact, the possible graphs grow so rapidly that computing anything about the exponential of order 8 graphs starts to overwhelm a single computer.
|
||||
|
||||
A random graph will not generally correspond to an interesting generating set, and therefore, will also generally have an uninteresting exponential graph. Hence, I will continue with the examples used previously: paths, stars, and complete graphs. They are among the simplest graphs one can consider, and as we will see shortly, have exponentials which appear to have natural correspondences to other graph families.
|
||||
|
||||
|
||||
Some Small Exponential Graphs
|
||||
-----------------------------
|
||||
|
||||
Because of the difficulty in determining graph isomorphism, it is challenging for a computer to find a graph in an encyclopedia. Computers think of graphs as a list of vertices and their outward edges. But this implementation faces inherent labelling issues. These persist even if the graph is described as a list of (un)ordered pairs, an adjacency matrix, or an incidence matrix, the latter two of which have very large memory footprints. I was able to locate a project named the [Encyclopedia of Finite Graphs](https://github.com/thoppe/Encyclopedia-of-Finite-Graphs), but it is only able to build a database simple connected graphs which can be queried by invariants (and is outdated since it uses Python 2).
|
||||
|
||||
However, as visual objects, humans can compare graphs fairly easily -- the name means "drawing" after all. Exponentials of 3- and 4- graphs are neither so small as to be uninteresting nor so big as to be unparsable by humans.
|
||||
|
||||
### Order 3
|
||||
|
||||
![]()
|
||||
|
||||
At this stage, we only really have two graphs to consider, since $P_3 = \bigstar_3$. Immediately, one can see that $\exp( P_3 ) = \exp( \bigstar_3 ) = C_6$, the 6-cycle graph (or hexagonal graph). It is also apparent that $\exp( K_3 )$ is the utility graph, $K_{3,3}$.
|
||||
|
||||
![]()
|
||||
|
||||
We can again demonstrate the sum law of the graph exponential with $\exp( P_3 \oplus P_2 )$. Simplifying, since we know $\exp( P_3 ) = C_6$, the expression is $C_6 \times P_2 = \text{Prism}_6$, the hexagonal prism graph.
|
||||
|
||||
|
||||
### Order 4 (and beyond)
|
||||
|
||||
:::: {}
|
||||
::: {}
|
||||
![]()
|
||||
$\exp( P_4 )$
|
||||
:::
|
||||
|
||||
::: {}
|
||||
![]()
|
||||
$\exp( \bigstar_4 )$
|
||||
:::
|
||||
::::
|
||||
|
||||
![]()
|
||||
|
||||
With some effort, $\exp( P_4 )$ can be imagined as a projection of a 3D object, the [truncated octahedron](https://en.wikipedia.org/wiki/Truncated_octahedron). Because of its correspondence to a solid figure, this graph is obviously planar. Both the hexagon and this solid belong to a class of polytopes called [*permutohedra*](https://en.wikipedia.org/wiki/Permutohedron), which are figures that are also formed by permutations of the coordinate (1, 2, 3, ..., *n*) in Euclidean space. In fact, they are able to completely tessellate the n-1 dimensional subspace of $\mathbb{R}^n$ where the coordinates sum to the $n-1$th triangular number. Note that the previous graph in the sequence of $P_n!$, the hexagonal graph, is visible in the truncated octahedron. This can be seen in the orthographic projection obtained by the map $(x,y,z,w) \mapsto (x,y,z)$.
|
||||
|
||||
Technically, there is a distinction between the Cayley graphs and permutohedra since their labellings differ. Both have edges generated by swaps, but in the latter case, there is a uniform Euclidean metric between two vertices. More information about the distinction can be found at this article on [Wikimedia](https://commons.wikimedia.org/wiki/Category:Permutohedron_of_order_4_%28raytraced%29#Permutohedron_vs._Cayley_graph). Actually, if one considers a *right* Cayley graph, where each generator is right-multiplied to the permutation at a node rather than left-multiplied, then a true correspondence is obtained.
|
||||
|
||||
Meanwhile, $\exp( \bigstar_4 )$ is more difficult to identify, at least without rearranging its vertices. It turns out to be isomorphic to the [Nauru graph](https://mathworld.wolfram.com/NauruGraph.html), a graph with many strange properties I can't begin to describe. Notably, whereas the graph isomorphic to the permutohedron is obviously a spherical polyhedron, the Nauru graph can be topologically embedded on a torus. The Nauru graph also belongs to the family of [permutation star graphs](https://mathworld.wolfram.com/PermutationStarGraph.html) $PS_n$ (*n* = 4), which also includes the hexagonal graph (*n* = 3). The MathWorld article confirms a correspondence, stating graphs of this form are generated by pairwise swaps.
|
||||
|
||||
My attempts at finding a graph isomorphic to $\exp( K_4 )$ have thus far ended in failure. It is certainly *not* isomorphic to $K_{4,4}$, since $24 \neq 8$.
|
||||
|
||||
|
||||
### Graph Invariants
|
||||
|
||||
While I have managed to identify the families to which some of these graphs belong, I am rather fond of computing (and conjecturing) sequences from objects. Not only is it much easier to consult something like the OEIS for these quantities, but when finding a matching sequence, there are ample articles to consult for more information. By linking to their respective entries, I hope you'll consider reading more there.
|
||||
|
||||
Even though I have obtained these values empirically, I am certain that the sequences for $\exp( P_n )$ and $\exp( \bigstar_n )$ match the corresponding OEIS entries. I also have great confidence in the sequences I found for $\exp( K_n )$.
|
||||
|
||||
|
||||
#### Edge Counts
|
||||
|
||||
Despite knowing how many vertices there are ($n!$, the order of the symmetric group), we don't necessarily know how many edges there are.
|
||||
|
||||
*n* | $\#E(\exp( P_n ))$ | $\#E(\exp( \bigstar_n ))$ | $\#E(\exp( K_n ))$
|
||||
-----|--------------------|---------------------------|-------------------
|
||||
3 | 6 | 6 | 9
|
||||
4 | 36 | 36 | 72
|
||||
5 | 240 | 240 | 600
|
||||
6 | 1800 | 1800 | 5400
|
||||
7 | 15120 | 15120 | 52920
|
||||
Rule | Second column of Lah numbers $L(n,2) = n!{(n-1)(n-2) \over 4}$ [OEIS A001286](http://oeis.org/A001286) | Same as previous | $n!{n(n-1) \over 4}$ [OEIS 001809](http://oeis.org/A001809)
|
||||
|
||||
|
||||
#### Radius and Distance Classes
|
||||
|
||||
The radius of a graph is the smallest possible distance which separates two maximally-separated vertices. Due to vertex transitivity, the greatest distance between two vertices is the same for every vertex.
|
||||
|
||||
*n* | $r(\exp( P_n ))$ | $r(\exp( \bigstar_n ))$ | $r(\exp( K_n ))$
|
||||
-----|------------------|-------------------------|-----------------
|
||||
3 | 3 | 3 | 2
|
||||
4 | 6 | 4 | 3
|
||||
5 | 10 | 6 | 4
|
||||
6 | 15 | 7 | 5
|
||||
7 | 21 | 9 | 6
|
||||
Rule | Triangular numbers $\Delta_{n-1} = {n(n-1) \over 2}$ [OEIS A00021](http://oeis.org/A000217) | Integers not congruent to 2 (mod 3) $\lfloor {n-1 \over 2} \rfloor + n -\ 1$ [OEIS A032766](http://oeis.org/A032766) | *n* - 1
|
||||
|
||||
More information can be gathered about distances on the graph than these reductive quantities. If a vertex is distinguished and the remaining vertices are partitioned into classes by their distances from it, then the size of each class will be the same for every vertex. Including the vertex itself (which is distance 0 away), there will be $r+1$ such classes, where r is the radius. In the case of these graphs, they are a partition of the factorial numbers.
|
||||
|
||||
```{python}
|
||||
#| echo: false
|
||||
|
||||
from IPython.display import Markdown
|
||||
from tabulate import tabulate
|
||||
|
||||
Markdown(tabulate(
|
||||
[
|
||||
[3, "[1, 2, 2, 1]", "[1, 2, 2, 1]", "[1, 3, 2]"],
|
||||
[4, "[1, 3, 5, 6, 5, 3, 1]", "[1, 2, 2, 1]", "[1, 6, 11, 6]"],
|
||||
[5, "[1, 4, 9, 15, 20, 22, 20, 15, 9, 4, 1]", "[1, 4, 12, 30, 44, 26, 3]", "[1, 10, 35, 50, 24]"],
|
||||
[6, "[1, 5, 14, 29, 49, 71, 90, 101,<br>101, 90, 71, 49, 29, 14, 5, 1]", "[1, 5, 20, 70, 170, 250, 169, 35]", "[1, 15, 85, 225, 274, 120]"],
|
||||
[7, "[1, 6, 20, 49, 98, 169, 259, 359, 455, 531, 573,<br>573, 531, 455, 359, 259, 169, 98, 49, 20, 6, 1]", "[1, 6, 30, 135, 460, 1110, 1689, 1254, 340, 15]", "[1, 21, 175, 735, 1624, 1764, 720]"],
|
||||
["Rule", "Mahonian numbers [OEIS A008302](http://oeis.org/A008302)", "Whitney numbers of the second kind (star poset) [OEIS A007799](http://oeis.org/A007799)", "Stirling numbers of the first kind [OEIS A132393](http://oeis.org/A132393)"],
|
||||
],
|
||||
headers=[
|
||||
"*n*",
|
||||
r"$dists(\exp( P_n ))$",
|
||||
r"$dists(\exp( \bigstar_n ))$",
|
||||
r"$dists(\exp( K_n ))$"
|
||||
]
|
||||
))
|
||||
```
|
||||
|
||||
I am certain that the appearance of the Stirling numbers here is legitimate, since these numbers count the number of permutations of *n* objects with *k* disjoint cycles. Obviously, the identity element is distance 1 from all 2-cycles since they are all in the generating set; likewise, all 3-cycles are distance 2 from the identity (but distance 1 from the 2-cycles), and so on until the entire graph has been mapped. The shapes induced by these classes were used to create the diagrams of $\exp( K_3 )$ and $\exp( K_4 )$ above.
|
||||
|
||||
|
||||
#### Spectrum
|
||||
|
||||
The eigenvalues of the adjacency matrix of a graph can be interesting and sometimes help in identifying a graph. Unfortunately, eigenvalues are not necessarily integers, and therefore not easily found in the OEIS (though they are always real for graphs).
|
||||
|
||||
```{python}
|
||||
#| echo: false
|
||||
|
||||
from IPython.display import Markdown
|
||||
from tabulate import tabulate
|
||||
|
||||
f = lambda x: x.replace("\n", "")
|
||||
|
||||
Markdown(tabulate(
|
||||
[
|
||||
[3, r"$(\pm 1)^2 (\pm 2)$", r"$(\pm 1)^2 (\pm 2)$", r"$(0)^4 (\pm 3)$"],
|
||||
[4, f(r"""$$\begin{gather*}
|
||||
(\pm 1)^3 (\pm 3) \\
|
||||
(x^2 -\ 3)^2 \\
|
||||
(x^2 -\ 2x -\ 1)^3
|
||||
(x^2 + 2x -\ 1)^3
|
||||
\end{gather*}$$"""), f(r"""$$\begin{gather*}
|
||||
(0)^4 \\
|
||||
(\pm 1)^3 \\
|
||||
(\pm 2)^6 \\
|
||||
(\pm 3)^{\phantom{0}}
|
||||
\end{gather*}$$"""), f(r"""$$\begin{gather*}
|
||||
(0)^4 \\
|
||||
(\pm 2)^9 \\
|
||||
(\pm 6)^{\phantom{0}}
|
||||
\end{gather*}$$""")],
|
||||
[5, f(r"""$$\begin{gather*}
|
||||
(0)^{12} (\pm 1)^6 (\pm 4) \\
|
||||
(x^2 -\ 5)^6 \\
|
||||
(x^2 -\ 5x + 5)^4
|
||||
(x^2 + 5x + 5)^4 \\
|
||||
(x^2 -\ 3x + 1)^4
|
||||
(x^2 + 3x + 1)^4 \\
|
||||
(x^2 -\ 2x -\ 1)^5
|
||||
(x^2 + 2x -\ 1)^5 \\
|
||||
(x^3 -\ 2x^2 -\ 5x + 4)^5 \\
|
||||
(x^3 + 2x^2 -\ 5x -\ 4)^5
|
||||
\end{gather*}$$"""), f(r"""$$\begin{gather*}
|
||||
(0)^{30} \\
|
||||
(\pm 1)^{4\phantom{0}} \\
|
||||
(\pm 2)^{28} \\
|
||||
(\pm 3)^{12} \\
|
||||
(\pm 4)^{\phantom{00}}
|
||||
\end{gather*}$$"""), f(r"""$$\begin{gather*}
|
||||
(0)^{36} \\
|
||||
(\pm 2)^{25} \\
|
||||
(\pm 5)^{16} \\
|
||||
(\pm 10)^{\phantom{00}}
|
||||
\end{gather*}$$""")],
|
||||
[6, f(r"""$$\begin{gather*}
|
||||
(0)^{20} (\pm 1)^{25} (\pm 2)^{15} \\
|
||||
(\pm 3)^5 (\pm 4)^5 (\pm 5) \\
|
||||
(x^2 -\ 3)^{20} \\
|
||||
\end{gather*}$$ <br>
|
||||
*Not shown: 558 other roots*"""), f(r"""$$\begin{gather*}
|
||||
(0)^{168} \\
|
||||
(\pm 1)^{30\phantom{0}} \\
|
||||
(\pm 2)^{120} \\
|
||||
(\pm 3)^{105} \\
|
||||
(\pm 4)^{20\phantom{0}} \\
|
||||
(\pm 5)^{\phantom{000}}
|
||||
\end{gather*}$$"""), f(r"""$$\begin{gather*}
|
||||
(0)^{256} \\
|
||||
(\pm 3)^{125} \\
|
||||
(\pm 5)^{81\phantom{0}} \\
|
||||
(\pm 9)^{25\phantom{0}} \\
|
||||
(\pm 15)^{\phantom{000}}
|
||||
\end{gather*}$$""")],
|
||||
[7, f(r"""
|
||||
$(0)^{35} (\pm 1)^{20} (\pm 2)^{45} (6)$ <br>
|
||||
*Not shown: 4873 other roots*
|
||||
"""), f(r"""
|
||||
$$\begin{gather*}
|
||||
(0)^{840} \\
|
||||
(\pm 1)^{468} \\
|
||||
(\pm 2)^{495} \\
|
||||
(\pm 3)^{830} \\
|
||||
(\pm 4)^{276} \\
|
||||
(\pm 5)^{30\phantom{0}} \\
|
||||
(\pm 6)^{\phantom{000}}
|
||||
\end{gather*}$$"""), f(r"""$$\begin{gather*}
|
||||
(0)^{400\phantom{0}} \\
|
||||
(\pm 1)^{441\phantom{0}} \\
|
||||
(\pm 3)^{1225} \\
|
||||
(\pm 6)^{196\phantom{0}} \\
|
||||
(\pm 7)^{225\phantom{0}} \\
|
||||
(\pm 9)^{196\phantom{0}} \\
|
||||
(\pm 14)^{36\phantom{00}} \\
|
||||
(\pm 21)^{\phantom{0000}}
|
||||
\end{gather*}$$
|
||||
""")],
|
||||
[8, f(r"""*Not shown: all 40320 roots*"""), f(r"""$$\begin{gather*}
|
||||
(0)^{3960} \\
|
||||
(\pm 1)^{5691} \\
|
||||
(\pm 2)^{2198} \\
|
||||
(\pm 3)^{6321} \\
|
||||
(\pm 4)^{3332} \\
|
||||
(\pm 5)^{595\phantom{0}} \\
|
||||
(\pm 6)^{42\phantom{00}} \\
|
||||
(\pm 7)^{\phantom{0000}}
|
||||
\end{gather*}$$"""), f(r"""$$\begin{gather*}
|
||||
(0)^{9864} \\
|
||||
(\pm 2)^{3136} \\
|
||||
(\pm 4)^{6125} \\
|
||||
(\pm 7)^{4096} \\
|
||||
(\pm 8)^{196\phantom{0}} \\
|
||||
(\pm 10)^{784\phantom{0}} \\
|
||||
(\pm 12)^{441\phantom{0}} \\
|
||||
(\pm 20)^{49\phantom{00}} \\
|
||||
(\pm 28)^{\phantom{0000}}
|
||||
\end{gather*}$$""")
|
||||
],
|
||||
],
|
||||
headers=[
|
||||
"*n*",
|
||||
r"$\text{Spec}(\exp( P_n ))$",
|
||||
r"$\text{Spec}(\exp( \bigstar_n)$",
|
||||
r"$\text{Spec}(\exp( K_n ))$"
|
||||
]
|
||||
))
|
||||
```
|
||||
|
||||
From what I have been able to identify, the spectrum of an exponential graph is symmetric about 0, by which I mean that the characteristic polynomial is even. This has been the case for all graphs I have tried testing, even outside these graph families.
|
||||
|
||||
Since all eigenvalues of $\exp( \bigstar_n )$ calculated are integers, it appears they are integral graphs, a fact of which I am reasonably sure because of the correspondence to permutation star graphs. Additionally, the eigenvalues are very conveniently the integers up to $n-1$ and down to $-n+1$. Unfortunately, despite the ease of reading the eigenvalues across, there isn't an OEIS entry for the multiplicities. I was able to identify the multiplicity of the 0 eigenvalue with [OEIS A217213](http://oeis.org/A217213), which counts orderings on Dyck paths. If this is truly the sequence being generated, it means there is a 1:1 correspondence between these orderings and a basis of the nullspace of the adjacency matrix.
|
||||
|
||||
It seems to be the case that $\exp( K_n )$ are also integral graphs. Perplexingly, the multiplicities for each of the eigenvalues appear to be perfect powers. This is the case until n = 8, which ruins the pattern because neither of $9864 = 2^3 \cdot 3^2 \cdot 137$ or $6125 = 5^3 \cdot 7^2$ are perfect powers. I find both this and the fact that 137 appears among the factorization of the former rather creepy -- some physicists are fond of this number for its closeness to the reciprocal of the fine structure constant (a bit of harmless numerology). Not only that, but this prime is so much larger than any of the primes appearing in the factorization of the other numbers (which are exclusively 2, 3, 5, and 7).
|
||||
|
||||
|
||||
#### Notes about Spectral Computation
|
||||
|
||||
For *n* = 3 through 6, exactly computing the spectrum (or more accurately, the characteristic polynomial) is possible, although it takes upwards of 10 minutes for *n* = 6 on my machine using sympy. The spectra of *n* = 7, 8 are marked with an asterisk because they were computed numerically, which still took nearly 8 hours in the case of the latter. In fact, these graphs grow so quickly that it becomes nearly impossible to compute the spectrum without an explicit formula.
|
||||
|
||||
For *n* = 8, even storing the adjacency matrix in memory is a problem. Assuming the use of single-precision floating point, this behemoth of a matrix is $(8!)^2 \cdot 4 \text{ bytes} = 6.5\text{GB}$. This doesn't even factor in additional space requirements for eigenvalue algorithms, and is the reason I certainly won't be attempting to compute the spectrum for *n* = 9.
|
||||
|
||||
|
||||
Gallery of Adjacency Matrices
|
||||
-----------------------------
|
||||
|
||||
The patterns in adjacency matrices depend on an enumeration of $S_n$ so that the vertices can be labelled from 1 to $n!$. While this is a fascinating topic unto itself, this post is already long enough as is, and I feel comfortable with just sharing the pictures.
|
||||
|
||||
|
||||
### [Plain Changes](https://en.wikipedia.org/wiki/Steinhaus%E2%80%93Johnson%E2%80%93Trotter_algorithm)
|
||||
|
||||
:::: {}
|
||||
::: {}
|
||||
![]()
|
||||
$P_5$
|
||||
:::
|
||||
|
||||
::: {}
|
||||
![]()
|
||||
$\bigstar_5$
|
||||
:::
|
||||
|
||||
::: {}
|
||||
![]()
|
||||
$K_5$
|
||||
:::
|
||||
|
||||
::: {}
|
||||
![]()
|
||||
$P_6$
|
||||
:::
|
||||
|
||||
::: {}
|
||||
![]()
|
||||
$\bigstar_6$
|
||||
:::
|
||||
|
||||
::: {}
|
||||
![]()
|
||||
$K_6$
|
||||
:::
|
||||
::::
|
||||
|
||||
|
||||
### [Heap's Algorithm](https://en.wikipedia.org/wiki/Heap%27s_algorithm)
|
||||
|
||||
:::: {}
|
||||
::: {}
|
||||
![]()
|
||||
$P_5$
|
||||
:::
|
||||
|
||||
::: {}
|
||||
![]()
|
||||
$\bigstar_5$
|
||||
:::
|
||||
|
||||
::: {}
|
||||
![]()
|
||||
$K_5$
|
||||
:::
|
||||
|
||||
::: {}
|
||||
![]()
|
||||
$P_6$
|
||||
:::
|
||||
|
||||
::: {}
|
||||
![]()
|
||||
$\bigstar_6$
|
||||
:::
|
||||
|
||||
::: {}
|
||||
![]()
|
||||
$K_6$
|
||||
:::
|
||||
|
||||
GHC's `Data.List.permutations` is slightly different from Heap's algorithm as displayed on Wikipedia
|
||||
::::
|
||||
|
||||
|
||||
Closing
|
||||
-------
|
||||
|
||||
As previously stated, I am only mostly sure of the validity of the exponential law for graphs. It *seems* too good to be true, but testing it directly on some graphs by comparing the spectra of the exponential of the sum against the product of the exponentials shows that they are at least cospectral. Try it yourself, preferably with a better tool than [the ones I made in Haskell](https://github.com/queue-miscreant/SymmetricGraph).
|
||||
|
||||
From the articles I was able to find, permutation star graphs have applications to parallel computing, which is somewhat ironic considering how little care I had for the topic when writing this article. If I needed ruthless efficiency, I probably could have used a library with GPU algorithms (or taken a stab at writing a shader myself). However, I *was* able to use this as a learning experience regarding mutable objects in Haskell. With only immutable objects (and enough garbage to create an island in the Pacific), I was running out of memory even with 16GB of RAM and 16GB of swap. Introducing mutability not only brought improvements in space, but also a great deal of speedup, enough to make rendering adjacency matrix images of order 8 graphs just barely doable within a reasonable time span.
|
||||
|
||||
Said images are cursed. Remember, as raw bitmaps, these files are on the order of *gigabytes* big. On a much weaker computer than I used to render the images, merely opening my file explorer to the folder containing *the folder containing* the images caused its all-too-eager thumbnailer to run. It started to consume all of my system resources, crashing all of my browser's tabs, distorting audio, and locking up the computer. Despite this, PNG is a wonderful format that is able to compress them down to just 4MB, which demonstrates just how sparse these matrices are.
|
||||
|
||||
Despite everything I was able to find about permutation star graphs and permutohedra, I was surprised that there is no information about the Cayley graphs generated by *all* 2-cycles (or at least information which is easy to find). This is especially disappointing considering the phantom pattern which gets destroyed by 137, and I would love to know more about why this happens in the first place.
|
||||
|
||||
Graph diagrams made with GeoGebra and NetworkX (GraphViz).
|
||||
|
||||
|
||||
### Additional Links
|
||||
|
||||
- [Whitney Numbers of the Second Kind for the Star Poset (Paper from ScienceDirect)](https://www.sciencedirect.com/science/article/pii/S0195669813801278)
|
||||
|
||||
- This article includes a section about representing a list of generators as a graph, making me wonder if someone has tried defining this operation before
|
||||
|
||||
- [Whitney Numbers (Josh Cooper's Mathpages)](https://people.math.sc.edu/cooper/graph.html)
|
||||
|
||||
- [The Many Faces of the Nauru Graph (Blogpost by David Eppstein)](https://11011110.github.io/blog/2007/12/12/many-faces-of.html)
|
||||
240
permutations/3/index.qmd
Normal file
@ -0,0 +1,240 @@
|
||||
---
|
||||
format:
|
||||
html:
|
||||
html-math-method: katex
|
||||
---
|
||||
|
||||
|
||||
A Game of Permutations, Part 3: With Apologies to H.S.M. Coxeter
|
||||
================================================================
|
||||
|
||||
This post assumes you have read the [first post](), which talks about swap diagrams and the symmetric group. The section about Cayley graphs from the [second post]() will also be useful.
|
||||
|
||||
To summarize, a swap diagram is a graph where each vertex represents a list index and each edge represents the permutation which swaps the two entries. I singled out three graph families for their symmetry:
|
||||
|
||||
- Paths, which link adjacent swaps
|
||||
- Stars, in which all swaps are "adjacent" to a distinguished index
|
||||
- Complete graphs, which contain all possible swaps
|
||||
|
||||
Swap diagrams provide a great deal of intrigue, but are ultimately limited by only being able to contain 2-cycles. If we wanted to include higher-order elements, we'd require a weaker mathematical structure called a [hypergraph](https://en.wikipedia.org/wiki/Hypergraph). These are even more difficult to draw than simple graphs, much less understand.
|
||||
|
||||
Another way we are limited is in the kinds of groups which can be encoded. One rather quickly brushes up with the limitation that swap diagrams can only generate symmetric groups and direct products thereof. Also, while edges are members of a generating set, the vertices contain information which is ultimately irrelevant to the group.
|
||||
|
||||
|
||||
Upgrading Diagrams
|
||||
------------------
|
||||
|
||||
What if we forgot the role of the vertices, allowed the role of the edges to take its place? Ideally, we'd still like to preserve some information about coincident edges. Graph-theoretically, we can elevate the role of the edges to that of the vertices by making a [line graph](https://en.wikipedia.org/wiki/Line_graph). This produces a new graph such that vertices in the new graph are connected if the edges they correspond to in the old graph share a vertex (i.e., are adjacent). In other words, it converts edge adjacency to vertex adjacency.
|
||||
|
||||
The line graph of a swap diagram results in a graph where the vertices are the 2-cycles. In a swap diagram, when two distinct 2-cycles share an index (vertex), their product has order 3. Thus, in the line graph, the edges mean that the product of the two vertices has order 3. Non-adjacent vertices still have a product with order 2, since they represent disjoint 2-cycles.
|
||||
|
||||
::: {}
|
||||
![]()
|
||||
While line graphs of paths simply shrink, $\bigstar_5$ shrinks to $K_4$ before expanding to $K_{2,2,2}$
|
||||
:::
|
||||
|
||||
To push the group-graph correspondence the furthest it can go, we can impose a final restriction. Namely, an induced subgraph (a subset of vertices and all edges whose endpoints are in this subset) must represent a (proper) sub*group*. This way, graphs have observable layers which tie neatly in with layers of group. Unfortunately, this disqualifies many of the line graphs of swap diagrams. At least beloved paths are left untouched, since $L(P_n) = P_{n-1}$.
|
||||
|
||||
As it turns out, these restrictions are significant and produce some very deep mathematical objects, known as *Coxeter diagrams* (named for the same Coxeter as in [Goldberg-Coxeter]()).
|
||||
|
||||
In this domain, the aforementioned rules about vertices and edges apply: each vertex corresponds to an order 2 element and each edge signifies that the product of two elements has order 3. Furthermore, *disconnected* vertices correspond to elements which commute with one another, just like disjoint 2-cycles. However, each vertex need not correspond to a single 2-cycle, and can instead be *any* element of order 2, i.e., a product of disjoint 2-cycles.
|
||||
|
||||
The most important Coxeter diagrams can be seen below. The $A_n$ diagrams are just the familiar path graphs.
|
||||
|
||||
::: {}
|
||||
<figure class="wp-block-image size-full">
|
||||
<a title="Rgugliel, CC BY-SA 3.0 <https://creativecommons.org/licenses/by-sa/3.0>, via Wikimedia Commons" href="https://commons.wikimedia.org/wiki/File:Finite_coxeter.svg#/media/File:Finite_coxeter.svg"><img src="https://upload.wikimedia.org/wikipedia/commons/thumb/e/e7/Finite_coxeter.svg/600px-Finite_coxeter.svg.png" style="background-color:white !important; border-radius: 5px; padding: 5px;" alt="Finite coxeter.svg"></a>
|
||||
<figcaption>
|
||||
Some important Coxeter diagrams
|
||||
<br>
|
||||
Source: Rgugliel, via Wikimedia Commons
|
||||
</figcaption>
|
||||
</figure>
|
||||
:::
|
||||
|
||||
Coxeter diagrams also allow one to describe higher-order products by labelling the edge. For example, the product between $(1 ~ 2)(3 ~ 4)$ and $(2 ~ 3)$ has order 4. Therefore, to make $B_2$, we draw two vertices (for these elements) and connect them with an edge labelled "4". Unlabelled edges still have order 3.
|
||||
|
||||
|
||||
How Big and What Shape?
|
||||
-----------------------
|
||||
|
||||
We know how big the group a swap diagram generates. For each connected component with n vertices, we generate the group $S_n$. They combine via the direct product to give a group of order
|
||||
|
||||
$$
|
||||
\left | \prod_i S_{n_i} \right | = \prod_i | S_{n_i} | = \prod_i n_i!
|
||||
$$
|
||||
|
||||
Removing an edge from a swap diagram will either leave the graph connected or disconnected. The latter case splits the graph into two parts, which map to $S_m$ and $S_n$. This tells us that $S_m \times S_n$ embeds in $S_{m+n}$, which on a Cayley table would appear as catty-cornered boxes.
|
||||
|
||||
The subgroup restriction makes Coxeter diagrams a lot more sensitive to changes. We at least know that if we remove a vertex, the resulting diagram is a subgroup of the whole diagram. What we need is some way to measure the effect this has on the rest of the group.
|
||||
|
||||
|
||||
### Coxeter-Todd Algorithm
|
||||
|
||||
The procedure for creating Cayley graphs contains a fragment of what we need. Namely, we convert products between group generators to paths in a graph. In this case, our generators are the vertices of the Coxeter diagram.
|
||||
|
||||
This procedure is known as the [*Coxeter-Todd algorithm*](https://en.wikipedia.org/wiki/Todd%E2%80%93Coxeter_algorithm). Let's apply the algorithm to the diagram $A_3$. First, we need to label our generators. Then, if we select a select a vertex to remove, we create a graph according to the following steps:
|
||||
|
||||
|
||||
#### 1. Initialization
|
||||
|
||||
Like in a Cayley graph, where we start out with a single vertex representing the identity, we also start off with a single vertex. It corresponds to the subdiagram formed by removing the Coxeter vertex being considered. In the future, I will distinguish between graphs by calling vertices (or edges) in the Coxeter diagram "generators".
|
||||
|
||||
For each of the generators in the subdiagram, we attach loops to the vertex. This is because the subgroup is closed -- when we multiply the set of all elements of the subgroup by any of its elements, it doesn't change the set. In other words, $hH = H, h \in H$.
|
||||
|
||||
The remaining vertex doesn't have this property, so we draw an edge connecting to a new vertex, which represents a new set of elements. These "sets" are cosets of the group, that is, disjoint partitions of the (groups corresponding to the) whole diagram by the subdiagram.
|
||||
|
||||
::: {}
|
||||
![]()
|
||||
Left: the Coxeter diagram $A_3$ <br>
|
||||
Right: the first step of generating a graph from removing vertex *a*. The *bc* subdiagram is represented by the vertex with the *b* and *c* loops.
|
||||
:::
|
||||
|
||||
Notably, all loops and edges we draw will be undirected, since all generators have order 2. Performing the same operation twice just takes us back to where we started.
|
||||
|
||||
|
||||
#### 2. Loop Transference
|
||||
|
||||
At the new vertex, we transfer over every loop whose label is not connected to the label of the edge. This is due to the rule that the product of non-adjacent generators has order 2. The generators are said to *commute*, since $acac = (ac)^2 = id = a^2 c^2$. In the graph, this means we can follow the path acac and see that we don't end up going anywhere.
|
||||
|
||||
![]()
|
||||
|
||||
|
||||
#### 3. Extension, Branching, and Rejoining
|
||||
|
||||
Adjacent Coxeter vertices have a product whose order is the label (*n*) on the edge connecting them (defaulting to 3 for unlabelled ones). This means we need to form a path alternating between the two generators, such that following it would loop back to the vertex we started at. That is,
|
||||
|
||||
$$
|
||||
(ab)^n = \stackrel{n \text{ times}}{\overbrace{(ab)(ab) ... (ab)(ab)}} = id
|
||||
$$
|
||||
|
||||
::: {}
|
||||
![]()
|
||||
Attaching a loop so that $ababab = id$
|
||||
:::
|
||||
|
||||
If the Coxeter diagram branches, then so does the graph. But the labels of pairs of branches have a product with a certain order, so following a path which alternates between them must return to the same vertex. This ends up including even-sided polygons in our graph; even since it alternates between the two labels *n* times. Commuting vertices form either a square or a pair of loops connected by an edge. The latter is actually a special case of the former, which can be seen by folding the square in half.
|
||||
|
||||
::: {}
|
||||
![]()
|
||||
Top: two nonadjacent vertices form a square <br>
|
||||
Bottom: two adjacent vertices form a hexagon
|
||||
:::
|
||||
|
||||
|
||||
#### 4. Finalization
|
||||
|
||||
If we ensure at each new vertex that we can follow a valid path for every pair of generators, then this process either terminates or continues indefinitely. A quick sanity check on the resulting graph is to add the number of loops and the number of edges at at a vertex. The sum should be the number of generators.
|
||||
|
||||
::: {}
|
||||
![]()
|
||||
Final graph to the middle right. The ***ab*** and ***bc*** paths are shown above and below.
|
||||
:::
|
||||
|
||||
As stated earlier, each vertex in the graph corresponds to a coset of the group under the subgroup being considered. The number of cosets is what we were after the whole time: the index of the subgroup. In this case, the index of the three-vertex diagram ($A_3$) on the two-vertex diagram ($A_2$, the same diagram without *a*) is 4.
|
||||
|
||||
|
||||
### Results
|
||||
|
||||
We can remove vertices one-by-one until we eventually reduce the graph to a single vertex, which we know has order 2. Multiplying all of the indices at each stage together gives us the order of the group we are after.
|
||||
|
||||
::: {}
|
||||
![]()
|
||||
Coxeter diagrams (right) and the graph generated by removing the a vertex (left). <br>
|
||||
Permutations shown above vertices which give a permutation group embedding.
|
||||
:::
|
||||
|
||||
It is readily shown that the group generated by $A_3$ has order $4 \cdot 3 \cdot 2 = 24$, which coincides with the order of $S_4$. We can assign a permutation to each of our generators, so long as the edge condition as it relates to their product is obeyed. In the diagrams above, $(1 ~ 2)$ and $(2 ~ 3)$ have a product of order 3, but $(1 ~ 2)$ and $(3 ~ 4)$ have a product of order 2, since the cycles (and in the diagram, the vertices) are disjoint. This entire argument nicely generalizes to higher $A_n$.
|
||||
|
||||
|
||||
Other Diagrams for $A_3$
|
||||
------------------------
|
||||
|
||||
A path is hardly the most interesting diagram. However, there are yet more graphs which can be produced from $A_3$.
|
||||
|
||||
|
||||
### Starting in the Middle
|
||||
|
||||
Selecting either endpoint of the diagram (vertex *a* or *c*) will generate the same vertex as shown above. This is easy to see if you read the graph from right-to-left rather than left-to-right. However, the center point *b* has two neighbors. If we try generating a graph by removing this vertex, our graph branches.
|
||||
|
||||
![]()
|
||||
|
||||
The index of 6 given by this graph is still correct, since $A_1 A_1$ has an order of $2 \cdot 2 = 4$. This diagram also shows us a bit of the [Klein four-group](https://en.wikipedia.org/wiki/Klein_four-group) within $S_4$, corresponding to $A_1 A_1$.
|
||||
|
||||
|
||||
### Removing Multiple Vertices
|
||||
|
||||
We can actually remove more than one vertex from the Coxeter diagram at once, as long as we follow all the rules. Instead, the initial vertex in the new graph has fewer loops and more than one outward edge. If we remove both vertices in $A_2$, we end up with a hexagon.
|
||||
|
||||
::: {}
|
||||
![]()
|
||||
Graph generated by removing vertices a and b from $A_2$. All starting vertices in the graph to the right are equivalent.
|
||||
:::
|
||||
|
||||
Similarly, removing two vertices from $A_3$ produces a figure with squares and hexagons:
|
||||
|
||||
::: {}
|
||||
![]()
|
||||
Graph generated by removing any two vertices from $A_3$. <br>
|
||||
The top diagram starts from either of the bottom two vertices with a c loop. <br>
|
||||
The middle diagram starts from either the leftmost or rightmost vertex, which both have a b loop. <br>
|
||||
The bottom diagram starts from either of the top two vertices with an a loop
|
||||
:::
|
||||
|
||||
Hopefully, a figure composed of squares and hexagons sounds familiar. Recalling permutahedra, the truncated octahedron also contains only squares and hexagons and is generated by $S_4$. In fact, the figure above is the truncated octahedron folded in half. In this case, the "half" comes from the single remaining vertex in the Coxeter diagram having order 2. Consequently, the number of vertices in the graph must be half that of the whole group (or complete permutahedron). In this way, the Cayley graph can be thought of as a sort of "limiting" graph of the Coxeter diagram, where each coset contains only a single element.
|
||||
|
||||
|
||||
The Traditional Explanation
|
||||
---------------------------
|
||||
|
||||
I must now admit that that I have not given anywhere near the whole explanation of Coxeter diagrams, and have only succeeded in leading us down the proverbial algebraic rabbit hole.
|
||||
|
||||
Coxeter diagrams also come equipped with a standard geometric interpretation. The "order 2 elements" we discussed previously are replaced with mirrors, and the edge labels are the angle between mirrors, interpreted as half of the central angle of a regular *n*-gon (digon: 90°, triangle: 60°, square: 45°, ...).
|
||||
|
||||
::: {}
|
||||
<figure class="wp-block-image size-full">
|
||||
<a title="Tomruen, CC BY-SA 4.0 <https://creativecommons.org/licenses/by-sa/4.0>, via Wikimedia Commons" href="https://commons.wikimedia.org/wiki/File:Dihedral_symmetry_domains_3.png"><img width="192" alt="Dihedral symmetry domains 3" src="https://upload.wikimedia.org/wikipedia/commons/e/e2/Dihedral_symmetry_domains_3.png"></a>
|
||||
<figcaption>
|
||||
Fundamental domains of Coxeter diagram <img src="https://zenzicubi.cowp-content/uploads/2022/05/coxeter-3.png" alt="" class="wp-image-2451" width="32" height="16" style="vertical-align: middle"><br>
|
||||
Source: Tomuren, via Wikimedia Commons
|
||||
</figcaption>
|
||||
</figure>
|
||||
:::
|
||||
|
||||
The image to the left is composed of the mirrors specified by $A_2$. One of the vertices is the red reflection and the other vertex is the the green reflection. It is clear that alternating between red and green three times will take one back to where they started, just like the algebra tells us.
|
||||
|
||||
All of the plane ends up assigned to one of the domains. Note also that points along mirrors which are equidistant from the center form a hexagon made up of six equilateral triangles, one in each domain.
|
||||
|
||||
$A_3$ has an additional vertex and edge. This means that an additional mirror needs to be placed in along every preexisting reflection. We end up reflecting into another dimension, and our domains echo out into space. It is easier to imagine the additional domains by rotating two of the axes around each other, so that the pairs will join together into equilateral triangular "cones".
|
||||
|
||||
::: {}
|
||||
![]()
|
||||
Mirror axes in 3D for $A_3$. The red, green, and blue lines all lie within the same plane, and correspond to $A_2$. The cyan line is perpendicular to the red one, and is formed by rotating either green about blue or blue about green by 60°.
|
||||
:::
|
||||
|
||||
While in 2D, equidistant points form a hexagon, in 3D, the points form a cuboctahedron. Connecting the triangular faces of the cuboctahedron to the origin gives a family of eight tetrahedra meeting at a point. At this point the reflections become clearer, since certain reflections do the same thing as in the plane above, while others will "double" a tetrahedron.
|
||||
|
||||
:::: {}
|
||||
::: {}
|
||||
![]()
|
||||
:::
|
||||
|
||||
::: {}
|
||||
![]()
|
||||
:::
|
||||
Left: Cuboctahedron <br>
|
||||
Right: Six of the eight tetrahedra formed by connecting equidistant points ("roots") to the origin. <br>
|
||||
Note how whole tetrahedra are reflected in a line.
|
||||
::::
|
||||
|
||||
Personally, I think the geometric way of thinking becomes very difficult in 3D. Every axis needs its own rotation, which is simple enough. But we're trying to create infinite cones of symmetry domains in 3D space, and we only have a 2D screen with which to attempt interacting. We'll certainly run out of room if we want to go to 4D space. Also, while the angle between two mirrors is 60°, I find it easy to slip into thinking about the dihedral angle between two faces (domains) of the cones, which is *not* 60°.
|
||||
|
||||
|
||||
Closing
|
||||
-------
|
||||
|
||||
When I initially wrote the article about swap diagrams (a name I hadn't given them at the time) I had no idea about how close I was to understanding something I didn't at the time. Now knowing better, I split the article and pushed the basics a little harder. I find it interesting how Coxeter diagrams are so close to swap diagrams, but, at the cost of simplicity, enable the ability to encode higher-order cycles and give rise to exceptional mathematical objects.
|
||||
|
||||
It was difficult for me to find information documenting how to understand the algebraic perspective. It also bears mentioning that I know very little about Lie Theory, another field of math where Coxeter diagrams turn up. When I finally found a group theory video by [Professor Richard Borcherds](https://www.youtube.com/watch?v=BHezLvEH1DU), I was dismayed that there seems to be even less material online which depicts the coset graphs. I have written [an appendix]() cataloguing some graphs that appear when applying the Coxeter-Todd algorithm, since I believe they are interesting in their own right.
|
||||
|
||||
Images from Wikimedia belong to their respective owners. All other diagrams created with GeoGebra.
|
||||
363
permutations/appendix/index.qmd
Normal file
@ -0,0 +1,363 @@
|
||||
---
|
||||
format:
|
||||
html:
|
||||
html-math-method: katex
|
||||
---
|
||||
|
||||
|
||||
Appendix: Partial Cayley Graphs of Coxeter Diagrams
|
||||
===================================================
|
||||
|
||||
This post is an appendix to [another post]() discussing the basics of Coxeter diagrams. It focuses on transforming path-like swap diagrams into proper $A_n$ Coxeter diagrams, which correspond to symmetric groups. This post focuses on the graphs made by the cosets made by removing a single generator (Coxeter diagram vertex).
|
||||
|
||||
For finite diagrams whose order is not prohibitively big, I will provide an embedding as a permutation group by labelling each generator in the Coxeter diagram. Since each generator is the product of disjoint swaps, I will also show their swap diagrams, as well as interactions via the edges.
|
||||
|
||||
|
||||
Platonic Symmetry
|
||||
-----------------
|
||||
|
||||
The symmetric group $S_n$ also happens to describe the symmetries of an $(n-1)$-dimensional simplex. The 3-simplex is simply a tetrahedron and has symmetry group $S_4$, also called $T_h$. We know that $S_4$ can be encoded by the diagram $A_3$. The string {3, 3} can be read across the edges of $A_3$, denoting the order of certain symmetries.
|
||||
|
||||
This happens to coincide with another description of the tetrahedron: its [Schläfli symbol](https://en.wikipedia.org/wiki/Schl%C3%A4fli_symbol). It describes triangles (the first 3) which meet in triples (the second 3) at a vertex. It may also be interpreted as the symmetry of the 2-dimensional components (faces) and the vertex-centered symmetry. [The Wikipedia article](https://en.wikipedia.org/wiki/Tetrahedron) on the tetrahedron presents both of these objects in its information column.
|
||||
|
||||
::: {}
|
||||
![]()
|
||||
|
||||
From the Wikipedia article on the tetrahedron. The Conway notation, Schläfli symbol, Coxeter diagram, and symmetry groups are shown.
|
||||
:::
|
||||
|
||||
The image above shows more sophisticated diagrams alongside $A_3$, which I will not attempt describing (mostly because I don't completely understand them myself). Other Platonic solids and their higher-dimensional analogues have different Schläfli symbols, and correspond to different Coxeter diagrams.
|
||||
|
||||
|
||||
### $B_3$: Octahedral Group
|
||||
|
||||
Adding an order-4 product into the mix makes things a lot more interesting. The cube ({4, 3}) and octahedron ({3, 4}) share a symmetry group, $O_h$, which corresponds to the Coxeter diagram $B_3$.
|
||||
|
||||
:::: {layout-ncol="3"}
|
||||
::: {}
|
||||
![]()
|
||||
:::
|
||||
|
||||
::: {}
|
||||
![]()
|
||||
:::
|
||||
|
||||
::: {}
|
||||
![]()
|
||||
:::
|
||||
::::
|
||||
|
||||
The third graph is entirely path-like, similar to the ones created by removing an endpoint from the $A_n$ diagrams. In the same vein, the graph for $B_3$ resembles the graph for $A_3$ made by removing the center vertex, albeit with two extra vertices. The center diagram is the first to have a hexagon created by removing a single vertex. Going across left to right, the order suggested by each index is
|
||||
|
||||
::: {}
|
||||
- $8 \cdot |A_2| = 8 \cdot 6 = 48$
|
||||
- $12 \cdot |A_1 A_1| = 12 \cdot 4 = 48$
|
||||
- $6 \cdot |B_2| = 6 \cdot 8 = 48$
|
||||
- $B_2$ describes the symmetry of a square, i.e., $Dih_4$, the dihedral group of order 8
|
||||
:::
|
||||
|
||||
Each diagram suggests the same order, which is good. A simple embedding which obeys the edge condition assigns $(1 ~ 2)(3 ~ 4)$ to *a*, $(2 ~ 3)$ to *b*, and $(1 ~ 2)$ to *c*. Then $ab = (1 ~ 2 ~ 4 ~ 3)$ and $bc = (1 ~ 3 ~ 2)$, with *ac* obviously having order 2.
|
||||
|
||||
There's a problem though. These generate a group of order 24 (actually, the rotational symmetries of a cube, $O \cong S_4 \cong T_h$). The group we want is $O_h \cong S_4 \times \mathbb{Z}_2$. If we want to embed a group of order 48 in a symmetric group, we need one for which 48 divides its order. $|S_6| = 720$ divides 48, and indeed, a quick fix is just to multiply each generator by $(5 ~ 6)$.
|
||||
|
||||
These two embeddings generate different (proper) Cayley graphs. The one for O has 24 vertices and is nonplanar. On the other hand, the one for $O_h$ is planar, and is the skeleton of the [truncated cuboctahedron](https://en.wikipedia.org/wiki/Truncated_cuboctahedron), a figure containing octagons, hexagons, and squares. This is exactly what is suggested by the orders of the products in the Coxeter diagram. Note also that the cuboctahedron is the rectification of the cube and octahedron, i.e., is midway between them with respect to the dual operation.
|
||||
|
||||
In either case, the products of adjacent generators (the permutations on the edges) are the same. When made into a Cayley graph, these products generate the [rhombicuboctahedron](https://en.wikipedia.org/wiki/Rhombicuboctahedron), which is another shape midway between the cube and octahedron. Since all of these generators are in $S_4$, it only has half the number of vertices as the truncated cuboctahedron.
|
||||
|
||||
:::: {layout-ncol="3"}
|
||||
::: {.column width="32%"}
|
||||
![]()
|
||||
|
||||
"Bad" embedding
|
||||
:::
|
||||
|
||||
::: {.column width="32%"}
|
||||
![]()
|
||||
|
||||
Good embedding
|
||||
:::
|
||||
|
||||
::: {.column width="32%"}
|
||||
![]()
|
||||
|
||||
Edge-generated
|
||||
:::
|
||||
::::
|
||||
|
||||
![]()
|
||||
|
||||
|
||||
### $H_3$: Icosahedral Group
|
||||
|
||||
Continuing with groups based on 3D shapes, the dodecahedron ({5, 3}) and icosahedron ({3, 5}) also share symmetry groups. It is known as $I_h$ and corresponds to Coxeter diagram $H_3$.
|
||||
|
||||
:::: {layout-ncol="3"}
|
||||
::: {.column width="32%"}
|
||||
![]()
|
||||
:::
|
||||
|
||||
::: {.column width="32%"}
|
||||
![]()
|
||||
:::
|
||||
|
||||
::: {.column width="32%"}
|
||||
![]()
|
||||
:::
|
||||
::::
|
||||
|
||||
Two of these graphs are similar to the cube/octahedron graphs. The other contains a decagon, corresponding to the order 5 product between *a* and *b*. We have the orders:
|
||||
|
||||
::: {}
|
||||
- $20 \cdot |A_2| = 20 \cdot 6 = 120$
|
||||
- Graph resembles an extension of $B_3 / A_1 A_1$, as hexagons joining blocks of squares
|
||||
- $30 \cdot |A_1 A_1| = 30 \cdot 4 = 120$
|
||||
- $12 \cdot |H_2| = 12 \cdot 10 = 120$
|
||||
- Graph resembles an extension of $B_3 / A_2$, as a single square joining paths
|
||||
:::
|
||||
|
||||
The order 120 is the same as the order of $S_5$, which corresponds to diagram $A_4$. However, these are not the same group, since $I_h \cong \text{Alt}_5 \times \mathbb{Z}_2 \ncong S_5$. A naive (though slightly less obvious) embedding, found similarly to $B_3$'s, incorrectly assigns the following:
|
||||
|
||||
::: {}
|
||||
- $a = (1 ~ 2)(3 ~ 4)$
|
||||
- $b = (2 ~ 3)(4 ~ 5)$
|
||||
- $c = (2 ~ 3)(1 ~ 4)$
|
||||
:::
|
||||
|
||||
This is certainly wrong, since all these permutations are within $S_5$. Actually, they are all even permutations and in fact generate $I \cong \text{Alt}_5$, with order 60. Yet again, multiplying $(6 ~ 7)$ to each vertex boosts the order to 120 and gives a proper embedding of $I_h$.
|
||||
|
||||
Similarly, the first, incorrect embedding gives a nonplanar Cayley graph. Correspondingly, the second one gives a planar graph, the skeleton of the [truncated icosidodecahedron](https://en.wikipedia.org/wiki/Truncated_icosidodecahedron). It consists of decagons, hexagons, and squares, just like those which appear in the graphs above. Again, note that icosidodecahedron is the rectification of the dodecahedron and icosahedron. In this case, the edges generate the [rhombicosidodecahedronal graph](https://en.wikipedia.org/wiki/Rhombicosidodecahedron).
|
||||
|
||||
:::: {layout-ncol="3"}
|
||||
::: {.column width="32%"}
|
||||
![]()
|
||||
|
||||
"Bad" embedding
|
||||
:::
|
||||
|
||||
::: {.column width="32%"}
|
||||
![]()
|
||||
|
||||
Good embedding
|
||||
:::
|
||||
|
||||
::: {.column width="32%"}
|
||||
![]()
|
||||
|
||||
Edge-generated
|
||||
:::
|
||||
::::
|
||||
|
||||
![]()
|
||||
|
||||
It is remarkable that the truncations of the rectifications (also called omnitruncation) have skeleta that are the same as the Cayley graphs generated by their respective Platonic solids' Coxeter diagrams. In a way, these figures describe their own symmetry. Notably, both of these figures belong to a class of polyhedra known as [zonohedra](https://en.wikipedia.org/wiki/Zonohedron).
|
||||
|
||||
|
||||
### $B_4$: Hyperoctahedral Group
|
||||
|
||||
Up a dimension from the cube and octahedron lie their 4D counterparts, the tesseract ({4, 3, 3}, interpreted as three cubes ({4, 3}) around an edge) and 16-cell ({3, 3, 4}). They correspond to Coxeter diagram $B_4$.
|
||||
|
||||
:::: {layout-ncol="2"}
|
||||
::: {.column width="49%"}
|
||||
![]()
|
||||
:::
|
||||
|
||||
::: {.column width="49%"}
|
||||
![]()
|
||||
:::
|
||||
::::
|
||||
|
||||
Three of these graphs are *also* similar to those encountered one dimension lower. The remaining graph is best understood in three dimensions, befitting the 4D symmetries it encodes. It appears to have similar regions to the [omnitruncated tesseract](https://en.wikipedia.org/wiki/Runcinated_tesseracts#Omnitruncated_tesseract), featuring both the truncated octahedron and hexagonal prism cells. We have the orders:
|
||||
|
||||
::: {}
|
||||
- $16 \cdot |A_3| = 16 \cdot 24 = 384$
|
||||
- Graph resembles an extension of $B_3 / A_2$, as squares connecting paths
|
||||
- $32 \cdot |A_1 A_2| = 32 \cdot 2 \cdot 6 = 384$
|
||||
- $24 \cdot |B_2 A_1| = 24 \cdot 8 \cdot 2 = 384$
|
||||
- Graph resembles an extension of $B_3 / A_1 A_1$, as hexagons joining blocks of squares
|
||||
- $8 \cdot |B_3| = 8 \cdot 48 = 384$
|
||||
- Graph resembles an extension of $B_3 / B_2$, a simple path
|
||||
:::
|
||||
|
||||
The order of the group, 384, suggests that it needs to be embedded in at least $S_8$ since $384 ~ \vert ~ 8! ~ ( = 40320)$. Indeed, such an embedding exists, found by computer search rather than by hand:
|
||||
|
||||
::: {}
|
||||
- $a = (1 ~ 3)$
|
||||
- $b = (1 ~ 2)(3 ~ 4)(5 ~ 6)(7 ~ 8)$
|
||||
- $c = (1 ~ 3)(2 ~ 6)(4 ~ 5)(7 ~ 8)$
|
||||
- $d = (1 ~ 3)(2 ~ 4)(5 ~ 7)(6 ~ 8)$
|
||||
:::
|
||||
|
||||
Notably, this embedding takes advantage of the possibility of the product of an order 2 and an order 4 element having order 4. A similar computer search yielded an insufficient embedding in $S_8$, with order 192:
|
||||
|
||||
::: {}
|
||||
- $a = (1 ~ 2)(3 ~ 4)(5 ~ 6)(7 ~ 8)$
|
||||
- $b = (1 ~ 3)(2 ~ 5)(4 ~ 7)(6 ~ 8)$
|
||||
- $c = (1 ~ 2)(3 ~ 4)(5 ~ 7)(6 ~ 8)$
|
||||
- $d = (1 ~ 2)(3 ~ 5)(4 ~ 6)(7 ~ 8)$
|
||||
:::
|
||||
|
||||
The latter embedding *cannot* be "fixed" by going to $S_{10}$, either by multiplying one or all elements by $(9 ~ 10)$. Only *a* is a viable choice for the former since its products with the rest of the generators have an order divisible by 2. Quickly "running" the generators shows that the order of the group is unchanged by this maneuver. Much of the structure permutations ensures that nonadjacent vertices still have order-2 products.
|
||||
|
||||
![]()
|
||||
|
||||
I won't try to identify either of these generating sets' Cayley graphs since they will in all likelihood correspond to a 4D object's skeleton and because it is impractical to try comparing graphs of this size. In fact, *H* appears to not be isomorphic to a subgroup of $W(B_4)$. The latter has at least 2 subgroups of order 192: one generated by the edges in the above embedding, and one containing only the even permutations. These are distinct from one another, since the number of elements of a particular order is different. The latter subgroup is closer to *H*, matching the number of elements of each order, but the even permutations have commutator subgroup has order 96 while *H* has a commutator subgroup of order 48.
|
||||
|
||||
|
||||
Other Finite Diagrams
|
||||
---------------------
|
||||
|
||||
Higher-dimensional Platonic solids are hardly the limits of what these diagrams can encode. The following three diagrams also give rise to finite graphs.
|
||||
|
||||
### $D_4$
|
||||
|
||||
$D_4$ is the first Coxeter diagram with a branch. Like $B_4$ before it, it is corresponds to the symmetries of a 4D object. We only really have two choices in which vertex to remove, which generate the following diagrams
|
||||
|
||||
:::: {layout-ncol="2"}
|
||||
::: {.column width="49%"}
|
||||
![]()
|
||||
:::
|
||||
|
||||
::: {.column width="49%"}
|
||||
![]()
|
||||
:::
|
||||
::::
|
||||
|
||||
While we could also remove *c* or *d*, this would just produce a graph identical to the one on the left, just with different labelling. The right diagram is rather interesting, as it can be described geometrically as two cubes attached to a triple of coaxial hexagons. Both of these cases give the order
|
||||
|
||||
::: {}
|
||||
- $8 \cdot |A_3| = 8 \cdot 24 = 192$
|
||||
- $24 \cdot |A_1 A_1 A_1| = 24 \cdot 8 = 192$
|
||||
:::
|
||||
|
||||
The order of 192 requires at minimum, $S_8$, since $192 ~ \vert ~ 40320$. Fortunately, a computer search yields a correct embedding immediately:
|
||||
|
||||
::: {}
|
||||
- $b = (1 ~ 2)(3 ~ 4)(5 ~ 6)(7 ~ 8)$
|
||||
- $a = (1 ~ 8)(2 ~ 3)(4 ~ 7)(5 ~ 6)$
|
||||
- $c = (1 ~ 5)(2 ~ 7)(3 ~ 4)(6 ~ 8)$
|
||||
- $d = (1 ~ 8)(2 ~ 4)(3 ~ 7)(5 ~ 6)$
|
||||
:::
|
||||
|
||||
::: {}
|
||||
![]()
|
||||
:::
|
||||
|
||||
In fact, the group generated by this diagram is isomorphic to the even permutation subgroup of $W(B_4)$. This can be verified by selecting order 2 elements from the latter which obey the laws in $D_4$. *H*, and the edge-generated subgroup, on the other hand do not satisfy this diagram.
|
||||
|
||||
|
||||
### $D_5$
|
||||
|
||||
D-type diagrams continue by elongating one of the paths. The next diagram, $D_5$ has really only four distinct graphs, of which I will show only two:
|
||||
|
||||
:::: {layout-ncol="2"}
|
||||
::: {.column width="49%"}
|
||||
![]()
|
||||
:::
|
||||
|
||||
::: {.column width="49%"}
|
||||
![]()
|
||||
:::
|
||||
::::
|
||||
|
||||
First, note how the graph to the right is generated by removing the vertex *e*, but the left and right sides of the diagram are asymmetrical. This is because *d* and *e* are equivalent with respect to the branch, and shows us that removing either vertex *d* or *e* results in the same graph. The order suggested by each is
|
||||
|
||||
::: {}
|
||||
- $10 \cdot |D_4| = 10 \cdot 192 = 1920$
|
||||
- $16 \cdot |A_4| = 16 \cdot 120 = 1920$
|
||||
:::
|
||||
|
||||
If we were to remove vertex b, we'd end up with the diagram $A_1 A_3$, which has order 48. The diagram would have 1920 / 48 = 40 vertices, which would be fairly difficult to render. Removing vertex c would be even worse, since the resulting diagram, $A_2 A_1 A_1$, has order 24, and would require 80 vertices, twice as many.
|
||||
|
||||
Finding an embedding at this point is difficult. The order of 1920 also divides $40320 = |S_8|$, but computer search has failed to find an embedding in up to $S_{11}$.
|
||||
|
||||
|
||||
### $E_6$
|
||||
|
||||
If one of the shorter paths of $D_5$ is extended, then we end up with the diagram $E_6$. I will only show one of its graphs.
|
||||
|
||||
![]()
|
||||
|
||||
Similarly to one of the graphs for $D_5$, this graph goes in with *a* and comes out with *e*, which are again symmetric with respect to the branch. I particularly like how on this graph, most of the squares are structured so that they can bridge to the *ae* commuting square in the middle.
|
||||
|
||||
The order of this group is $27 \cdot 1920 = 51840$, which is starting to be incomprehensible, if it hasn't been already. The graphs not shown would have the following number of vertices, which is precisely why I won't draw them out:
|
||||
|
||||
::: {}
|
||||
- Removing *f*: $[E_6 : A_5] = 51840 / 720 = 72$ vertices
|
||||
- Removing *b* or *d*: $[E_6 : A_1 A_4] = 51840 / 240 = 216$ vertices
|
||||
- Removing *c*: $[E_6 : A_2 A_2 A_1] = 51840 / 72 = 720$ vertices
|
||||
:::
|
||||
|
||||
Going by order alone, $E_6$ should embed in $S_9$ ($51840 ~ \vert ~ 9!$), but since $S_11$ was too small for its subgroup $D_5$, this too optimistic. I don't know what the minimum degree is required to embed $S_6$, but finding it directly it is beyond my computational power.
|
||||
|
||||
The E diagrams continue with $E_7$ and $E_8$. Each of the three corresponds to the symmetries of semi-regular higher-dimensional objects, whose significance and structure I can't even begin to comprehend. Their size alone makes continuing onward by hand a fool's errand, and I won't be attempting to draw them out right just now.
|
||||
|
||||
|
||||
Infinite (Affine) Diagrams
|
||||
--------------------------
|
||||
|
||||
Not every Coxeter diagram results in a closed graph. Instead, they may proliferate vertices forever. They are termed either "affine" or "hyperbolic", depending respectively on whether the diagrams join up with themselves or seem to require more and more room as the algorithm advances. This is also related to the collection of fundamental domains and roots that the diagram describes.
|
||||
|
||||
Since hyperbolic graphs are difficult to draw, I'll be restricting myself to the affine diagrams. Unlike hyperbolic diagrams, which are unnamed, affine ones are typically named by altering finite diagrams.
|
||||
|
||||
### $\widetilde A_2$
|
||||
|
||||
The Coxeter diagram associated to the triangle graph $K_3$ is called $\widetilde A_2$. This graph is also the line graph of $\bigstar_3$ so it might make sense to assign to the vertices the generators $(1 ~ 2)$, $(2 ~ 3)$, and $(1 ~ 3)$, which we know to generate $S_3$. However, $S_3$ already has a diagram, $A_2$, which is clearly a subdiagram of $\widetilde A_2$, so the new group must be larger.
|
||||
|
||||
![]()
|
||||
|
||||
Attempting to make a graph by following the generators results in an infinite tiling by hexagons. There are three distinct types of hexagon -- *ab*, *ac*, and *bc* -- since each pair of elements has a product of order 3. Removing a pair of vertices from the diagram would get rid of the initial edge (*a* in this case), and the "limiting case" where all three vertices are removed is just the true hexagonal tiling.
|
||||
|
||||
|
||||
### $\widetilde G_2$
|
||||
|
||||
The hexagonal tiling has a Schläfli symbol of {6, 3}, and is dual to the triangular tiling. As a Coxeter diagram, this symbol matches the Coxeter diagram $\widetilde G_2$.
|
||||
|
||||
![]()
|
||||
|
||||
The graph generated by removing a vertex is another infinite tiling, in this case the [truncated trihexagonal tiling](https://en.wikipedia.org/wiki/Truncated_trihexagonal_tiling). Once again, this tiling is the truncation of the rectification of the symmetry it typically describes. Each of the three figures corresponds to a unique pair of products: dodecagons to *ab*, squares to *ac*, and hexagons to *bc*.
|
||||
|
||||
|
||||
### $\widetilde C_2$
|
||||
|
||||
The only remaining regular 2D tiling is the square tiling ({4, 4}), whose Coxeter diagram is named $\widetilde C_2$.
|
||||
|
||||
![]()
|
||||
|
||||
The tiling generated by this diagram is known as the [truncated square tiling](https://en.wikipedia.org/wiki/Truncated_square_tiling). Mirroring the other cases, it is also the truncated *rectified* square tiling, since rectifying the square tiling merely rotates it by 45°. In this tiling, while the squares distinctly correspond to the product *ac*, the octagons are either order-4 product, *ab* or *bc*.
|
||||
|
||||
|
||||
### $\widetilde A_3$
|
||||
|
||||
The above diagrams are the only rank-2 affine diagrams. The simplest diagram of rank 3 is $\widetilde A_3$, which appears similar to 4-cyclic graph. Similar to how $\widetilde A_2$'s graph is the tiling of $A_2$'s, its Cayley graph is the honeycomb of $A_3$'s.
|
||||
|
||||
:::: {layout-ncol="2"}
|
||||
::: {.column width="49%"}
|
||||
![]()
|
||||
:::
|
||||
|
||||
::: {.column width="49%"}
|
||||
![]()
|
||||
:::
|
||||
::::
|
||||
|
||||
The left diagram shows the initial branches, while the left image shows the four distinct cells which form the honeycomb. From left to right, the diagrams contain only *abd*, *abc*, *bcd*, and *acd*. The squares always represent commuting pairs on opposite ends of the diagram: *ac* and *bd*.
|
||||
|
||||
I am not certain in general whether $\widetilde A_n$ generates the honeycomb formed by $A_n$, but this tessellation should always exist, since the solids formed by the generators of $A_n$ are always permutohedra.
|
||||
|
||||
|
||||
Closing
|
||||
-------
|
||||
|
||||
The diagrams I have studied here are only the smaller ones which I can either visualize or compute. I might have gotten carried away with studying the groups themselves in the 4D case, since there appears to be so much contention. Despite this, I examined only half of the available Platonic solids in 4D, missing out on the 24-cell ({3, 4, 3}, $F_4$), 120-cell ({5, 3, 3}, $H_4$), and 600-cell ({3, 3, 5}, $H_4$). If 4D symmetries are hard to understand, then things can only get worse in higher dimensions.
|
||||
|
||||
One of the things I'm curious about is the minimal degree of symmetric group needed to embed the finite diagrams (known as $\mu$). While $S_6$ is minimal for the octahedral group, it doesn't appear to be big enough for the icosahedral one. Certain groups obey $\mu(G \times H) = \mu(G) + \mu(H)$ (typically abelian ones), but I'm not sure whether that's the case here.
|
||||
|
||||
Coset and embedding diagrams made with GeoGebra. Cayley graph images made with NetworkX (GraphViz).
|
||||
|
||||
|
||||
### Additional Links
|
||||
|
||||
- [Point groups in three dimensions](https://en.wikipedia.org/wiki/Point_groups_in_three_dimensions) (Wikipedia)
|
||||
- [Point groups in four dimensions](https://en.wikipedia.org/wiki/Point_groups_in_four_dimensions) (Wikipedia)
|
||||
- [Finding the minimal n such that a given finite group G is a subgroup of Sn](https://math.stackexchange.com/questions/1597347/finding-the-minimal-n-such-that-a-given-finite-group-g-is-a-subgroup-of-s-n) (Mathematics Stack Exchange)
|
||||
- [Omnitruncated](https://community.wolfram.com/groups/-/m/t/774393), by Clayton Shonkwiler
|
||||