Created
April 3, 2026 18:35
-
-
Save jmikedupont2/c350d5684246918be7dd39a5b9663694 to your computer and use it in GitHub Desktop.
Monster Moonshine Matrix HTML
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| <!DOCTYPE html> | |
| <html lang="en"> | |
| <head> | |
| <meta charset="UTF-8"> | |
| <meta name="viewport" content="width=device-width, initial-scale=1.0"> | |
| <title>Monster Moonshine Matrix - SSP × 194 Irreps</title> | |
| <style> | |
| @import url('https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@300;400;600&display=swap'); | |
| :root { | |
| --bg: #0a0a0f; | |
| --text: #e8e8f0; | |
| --accent: #6366f1; | |
| } | |
| * { margin: 0; padding: 0; box-sizing: border-box; } | |
| body { | |
| font-family: 'JetBrains Mono', monospace; | |
| background: var(--bg); | |
| color: var(--text); | |
| min-height: 100vh; | |
| padding: 1rem; | |
| } | |
| h1 { | |
| font-size: 1.5rem; | |
| margin-bottom: 0.5rem; | |
| color: var(--accent); | |
| } | |
| .subtitle { | |
| color: #666; | |
| font-size: 0.8rem; | |
| margin-bottom: 1rem; | |
| } | |
| #matrix { | |
| width: 100%; | |
| overflow-x: auto; | |
| } | |
| svg { | |
| background: #0f0f15; | |
| border-radius: 8px; | |
| } | |
| .tooltip { | |
| position: fixed; | |
| background: #1a1a25; | |
| border: 1px solid rgba(255,255,255,0.2); | |
| border-radius: 6px; | |
| padding: 0.5rem; | |
| pointer-events: none; | |
| opacity: 0; | |
| z-index: 1000; | |
| font-size: 0.75rem; | |
| display: block; | |
| } | |
| .tooltip.visible { opacity: 1; } | |
| .tooltip-title { | |
| font-weight: 600; | |
| color: var(--accent); | |
| } | |
| </style> | |
| </head> | |
| <body> | |
| <h1>MONSTER MOONSHINE MATRIX</h1> | |
| <p class="subtitle">15 SSP Primes × 194 Irreducible Representations</p> | |
| <div id="matrix"> | |
| <svg id="svg" viewBox="0 0 1400 400"></svg> | |
| </div> | |
| <div class="tooltip" id="tooltip"></div> | |
| <script> | |
| const PRIME_COLORS = { | |
| 2: '#E74C3C', 3: '#3498DB', 5: '#2ECC71', 7: '#F39C12', | |
| 11: '#9B59B6', 13: '#1ABC9C', 17: '#E91E63', 19: '#00BCD4', | |
| 23: '#FF5722', 29: '#673AB7', 31: '#795548', 41: '#607D8B', | |
| 47: '#FF9800', 59: '#4CAF50', 71: '#3F51B5' | |
| }; | |
| const SSP = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 41, 47, 59, 71]; | |
| const MONSTER_REPS = [ | |
| 1, 196883, 21296876, 842609326, 18538750076, 19360062527, 293553734298, | |
| 3879214937598, 36173193327999, 125510727015275, 190292345709543, 222879856734249, | |
| 1044868466775133, 1109944460516150, 2374124840062976, 8980616927734375, 8980616927734375, | |
| 15178147608537368, 39660520552077425, 60359800576579350, 251098487132187500, 290568421805921077, | |
| 336041615485626050, 2500435234254428856, 2986480825407204125, 3503434660075044981, 3503434660075044981, | |
| 3605718753596953125, 8456836343580310400, 8754193822112578125, 28585990950721640625, 30815545786259524745, | |
| 31569817307122699605, 47377503606648784400, 49609712911192813665, 77316619273928125000, 130415350420342968750, | |
| 155943076739182582850, 172399434201593354756, 172399434201593354756, 286243267692724486144, | |
| 286243267692724486144, 379913824694312370176, 640558364167263622626, 640558364167263622626, | |
| 643356925889917747200, 691170144025469730622, 691170144025469730622, 776097192277137500000, | |
| 918438233727730974720, 1201241700908448332364, 1353006807137391674268, 1480279477146615234375, | |
| 1480279477146615234375, 1768130802583126953125, 1768130802583126953125, 2351753641814605348320, | |
| 2382987417506242421875, 4567199176912486400000, 4567199176912486400000, 5578077210155766091776, | |
| 6566555764392010419123, 7226910362631220625000, 10145274012943412428800, 12810005542623250817856, | |
| 19795913912408993711352, 21803647757861753437500, 24670833602960142274950, 31714653744947491918600, | |
| 41209556844092914062500, 42940402913709544921875, 42940402913709544921875, 60683762052057587326065, | |
| 70660346341309333984375, 70660346341309333984375, 86551489469233273849000, 91068387388302451493925, | |
| 114212876389603002704448, 115192831837135016250000, 146575737439884098045700, 149614794149226010902528, | |
| 149614794149226010902528, 161649111002260792968750, 161649111002260792968750, 191259085113459945312500, | |
| 191259085113459945312500, 218028402153522030021875, 220326476909636307378168, 260799524107083767968750, | |
| 260799524107083767968750, 261575621299360905468750, 277540481294528814140625, 303379038247015811718750, | |
| 331150814995116217581480, 351532203382732066094400, 391009081837477378329600, 392611651975065600000000, | |
| 433528694560598978525184, 597787522207315571077947, 597787522207315571077947, 600020772685064502392907, | |
| 626877403613887304040448, 626877403613887304040448, 655159231073705404921875, 689763222744895005949242, | |
| 689763222744895005949242, 689766726179555080994223, 689766726179555080994223, 1037605886984697481755304, | |
| 1361549126105752982272875, 1599110387863558882812500, 1662686180483865572016128, 2181694185821505680397072, | |
| 2216343020913351966796875, 2477548750555298068681032, 3282510540283631442175104, 3537292796538741415074900, | |
| 3619209050774375426792424, 4004308274823270400000000, 4239315652979009728125000, 4926670174323484069683200, | |
| 5334046162969208352215625, 5514132424881463208443904, 5514132424881463208443904, 5514132424881463208443904, | |
| 7118465328761788475375616, 7375892500409609408203125, 7567151576542452425781250, 7567151576542452425781250, | |
| 7850934959207940600000000, 8394037047155083487634450, 8874260875527017936065100, 9416031858681585751556096, | |
| 9479495745805305653125000, 9592298143650890255171584, 9592298143650890255171584, 9592584386918582979657728, | |
| 10023854998171489083984375, 12650882100466187033706250, 14930164283563048960000000, 16109407269221032565630370, | |
| 22626621365160537099927552, 24546384719289825598186695, 27501917609709102247187500, 29734941419909382162874368, | |
| 33684388830359981044531200, 33722191327002668157047380, 37310715211546624000000000, 38471795739256565080575180, | |
| 41738941151243953804687500, 41762322738385820195625000, 42001454087954515167503490, 42601474860639579669896397, | |
| 43527130990147981755651072, 50572542024949598403750000, 51324350389558097414062500, 56356433273146675005489152, | |
| 58437394633227526183321600, 62038057486792249132974080, 63750812845035828079008441, 64326163427522624205703125, | |
| 66550339514356152000000000, 69084859008005036431224066, 74612213529720383654779356, 77423398454853064646282250, | |
| 83974774459050335630859375, 86206621680977834911875000, 88943820620288343261672393, 103354104243912727763091456, | |
| 115165062362004433625000000, 121170799240938738783416925, 124058385593021471188320256, 124982156072747647257292800, | |
| 125517264890136048242396811, 129572518017902934396764160, 130287135266837289237316743, 135226984222789977095703125, | |
| 136107644194473772613203125, 136574874874360806036041889, 136574874874360806036041889, 138988549876584520148320256, | |
| 161561864971171113287540625, 163216709667196367710937500, 172248852397651745653437500, 173865305251972140447265625, | |
| 175867626988794162227008203, 177966317773633111417870812, 198203900044423845494482560, 200390867219082687273984375, | |
| 203314261261157852274218750, 207467089840006711558593750, 212490247553365721772656250, 241866941438795926688759808, | |
| 258823477531055064045234375 | |
| ]; | |
| function factorize(n) { | |
| const factors = {}; | |
| let d = 2; | |
| while (d * d <= n) { | |
| while (n % d === 0) { | |
| factors[d] = (factors[d] || 0) + 1; | |
| n /= d; | |
| } | |
| d++; | |
| } | |
| if (n > 1) factors[n] = 1; | |
| return factors; | |
| } | |
| function createMatrix() { | |
| const svg = document.getElementById('svg'); | |
| const width = 1400; | |
| const height = 600; | |
| const marginT = 30, marginL = 45; | |
| const cellW = (width - marginL) / 15; | |
| const cellH = (height - marginT) / 194; | |
| svg.setAttribute('viewBox', `0 0 ${width} ${height}`); | |
| // Header - SSP primes on top (as columns) | |
| SSP.forEach((p, i) => { | |
| const label = document.createElementNS('http://www.w3.org/2000/svg', 'text'); | |
| label.setAttribute('x', marginL + i * cellW + cellW/2); | |
| label.setAttribute('y', 22); | |
| label.setAttribute('fill', PRIME_COLORS[p]); | |
| label.setAttribute('font-size', '9'); | |
| label.setAttribute('text-anchor', 'middle'); | |
| label.setAttribute('font-family', 'JetBrains Mono'); | |
| label.textContent = p; | |
| svg.appendChild(label); | |
| }); | |
| // Pre-compute all factorizations | |
| const allFactors = MONSTER_REPS.map(rep => factorize(rep)); | |
| // Matrix: SSP cols × Irrep rows | |
| SSP.forEach((p, colIdx) => { | |
| MONSTER_REPS.forEach((rep, rowIdx) => { | |
| const exp = (allFactors[rowIdx][p]) || 0; | |
| const rect = document.createElementNS('http://www.w3.org/2000/svg', 'rect'); | |
| rect.setAttribute('x', marginL + colIdx * cellW + 1); | |
| rect.setAttribute('y', marginT + rowIdx * cellH); | |
| rect.setAttribute('width', cellW - 1); | |
| rect.setAttribute('height', cellH - 0.5); | |
| rect.setAttribute('fill', exp > 0 ? PRIME_COLORS[p] : '#15151f'); | |
| rect.setAttribute('rx', '1'); | |
| if (exp > 0) { | |
| rect.setAttribute('fill-opacity', Math.min(0.3 + exp * 0.15, 1)); | |
| rect.style.cursor = 'pointer'; | |
| rect.onmouseenter = function(e) { | |
| const tooltip = document.getElementById('tooltip'); | |
| tooltip.innerHTML = '<div class="tooltip-title">Irrep ' + rowIdx + ': ' + rep.toLocaleString() + '</div><div style="color:' + PRIME_COLORS[p] + '">' + p + '^' + exp + '</div>'; | |
| tooltip.style.left = (e.clientX + 15) + 'px'; | |
| tooltip.style.top = (e.clientY + 15) + 'px'; | |
| tooltip.classList.add('visible'); | |
| }; | |
| rect.onmouseleave = function() { | |
| document.getElementById('tooltip').classList.remove('visible'); | |
| }; | |
| } | |
| svg.appendChild(rect); | |
| }); | |
| }); | |
| // Left header - irrep indices (as rows) | |
| [0, 20, 40, 60, 80, 100, 120, 140, 160, 180, 193].forEach(idx => { | |
| const label = document.createElementNS('http://www.w3.org/2000/svg', 'text'); | |
| label.setAttribute('x', 30); | |
| label.setAttribute('y', marginT + idx * cellH + cellH/2 + 3); | |
| label.setAttribute('fill', '#555'); | |
| label.setAttribute('font-size', '8'); | |
| label.setAttribute('text-anchor', 'end'); | |
| label.textContent = idx; | |
| svg.appendChild(label); | |
| }); | |
| } | |
| createMatrix(); | |
| </script> | |
| </body> | |
| </html> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment