Loop a quintic's coefficients and its roots braid, swap and refuse to come home.
The roots of z^5 + c4 z^4 + ... + c0 are tracked continuously as the coefficients move: every frame Durand-Kerner iteration restarts from the previous roots, and the step is halved recursively whenever a root would travel more than a quarter of the gap to its neighbor, so roots never swap identities by accident. When the coefficients return home the roots return as a set but possibly permuted, and the braid strip records how their strands crossed (height is the real part, the strand with the larger imaginary part passes in front). The scripted loops follow Arnold's topological proof that the quintic has no formula in radicals: a commutator of two swaps leaves the square root of the discriminant back home but the roots in a 3-cycle, and a commutator of commutators brings a nested cube root home as well while the roots stay permuted. Because the alternating group A5 is perfect, this continues at every depth, so no formula built from arithmetic and nested radicals can follow the five roots.
Try it. Drag any coefficient in the panel and bring it back to its dashed ring (it snaps home) to see which permutation you made, or drag a root directly to reshape the polynomial. Buttons or keys 1 to 4 play a swap, a commutator, a commutator of commutators and a loop of c0 around the origin; Space pauses and R resets. Left alone it tours all four.
Paste this into Claude Code, Codex or any coding agent to get a simple version running, then take it wherever you like.
Build an interactive "root braids" toy with JavaScript and the HTML canvas element: drag the coefficients of a polynomial and watch its roots move and swap places. Put everything in a single index.html file with no libraries or build step, so I can open it directly in a browser.
Start simple:
- Use a cubic p(z) = z^3 + a z^2 + b z + c with complex coefficients. Pick three starting roots, expand them into a, b, c, and keep the roots in an array.
- Split the canvas in two: a small panel on the right shows a, b, c as draggable dots, and the main area shows the roots as large colored, numbered dots.
- When a coefficient moves, update the roots with Durand-Kerner iteration started from the previous roots: repeat r_i = r_i - p(r_i) / product over j != i of (r_i - r_j) a dozen times. Starting from the old roots keeps each root's identity, so root 1 stays root 1.
- If any root would move more than about a quarter of the distance to its nearest neighbor, split the coefficient change in half and do two smaller steps. This is what keeps roots from swapping identity by accident.
- Draw a fading trail behind each root and a dashed ring where each coefficient started.
Once that works, make it beautiful:
- When a dragged coefficient comes back near its ring, snap it exactly home, then match each root to the nearest starting position and show the permutation in cycle notation, like (1 2).
- Add a button that animates a loop automatically: pick two roots, rotate them half a turn around their midpoint, and recompute the coefficients from the moving roots. Then play the loop with the tracker above and watch the two roots trade places.
- Add a braid strip along the bottom: plot each root's real part against time as a colored strand, so crossings show up as a braid.
Explain the key ideas in short code comments. When you're done, tell me how to open it and suggest three directions I could take it next, such as going to degree five, playing a commutator A B A^-1 B^-1 of two swap loops, or tracking the square root of the discriminant along the path to see that it comes home even when the roots do not.