3Blue1Brown
By structuring parity checks across binary grid subsets rather than duplicating entire messages, systems isolate and repair single-bit corruptions while detecting two-bit failures at a fraction of traditional redundancy cost.
AI-assisted summary of But what are Hamming codes? The origin of error correction — original source. Check the original for full context.
Source published:
Key ideas
- Unlike naive triplication schemes that consume two-thirds of storage capacity with redundant copies, Hamming codes dramatically reduce overhead—for example, requiring only 9 redundancy bits to protect 247 payload bits in a 256-bit block. (0:03)
- Richard Hamming pioneered the first error-correcting code in the 1940s at Bell Labs after recurring single-bit read errors repeatedly crashed his scheduled punch-card batch computations. (2:07)
- By distributing multiple parity checks over structured subsets corresponding to powers of 2, a receiver can perform a binary search akin to '20 questions' to pinpoint and correct the coordinate of a flipped bit. (7:17)
- An extended 16-bit Hamming code assigns position 0 as an overarching parity check, enabling systems to reliably locate and fix single-bit errors while independently flagging double-bit errors. (14:00)
Detailed notes
## Background Published on YouTube by Grant Sanderson on the channel 3Blue1Brown on September 4, 2020, this video offers a discovery-oriented introduction to error-correcting codes. The video description frames the lesson as an intuitive exploration of Richard Hamming's pioneering work, connecting viewers to an interactive web tool, a related chessboard puzzle, and Ben Eater's breadboard demonstration.
## TL;DR Rather than relying on wasteful brute-force methods like triplicating data, Hamming codes introduce a highly efficient strategy for locating and repairing corrupted bits using mathematically coordinated parity checks. By placing parity bits at indices that are powers of two, the system functions like a game of twenty questions, systematically halving the search space to isolate the row and column of any single flipped bit. Because parity bits fall within the same grid, they inherently protect themselves against noise just like message payload bits. Expanding the grid with an overarching parity bit at position zero yields an extended Hamming code that reliably fixes single-bit errors while detecting two-bit corruptions.
## Atmosphere & style The presentation carries 3Blue1Brown's hallmark meditative clarity, blending Grant Sanderson's gentle, curious narration with methodical geometric visualizations. It feels less like a dry lecture and more like an intellectual puzzle hunt, inviting viewers to actively reinvent Hamming's original thought process from scratch. The arc progresses smoothly from the practical frustration of corrupted punch cards to moments of genuine aesthetic appreciation, culminating in quiet wonder at how binary counting can turn messy data corruption into an elegant, self-healing system.
## Bulletin - [00:03](https://www.youtube.com/watch?v=X8jsijhllIA&t=3s) Unlike naive triplication schemes that consume two-thirds of storage capacity with redundant copies, Hamming codes dramatically reduce overhead—for example, requiring only 9 redundancy bits to protect 247 payload bits in a 256-bit block. - [02:07](https://www.youtube.com/watch?v=X8jsijhllIA&t=127s) Richard Hamming pioneered the first error-correcting code in the 1940s at Bell Labs after recurring single-bit read errors repeatedly crashed his scheduled punch-card batch computations. - [07:17](https://www.youtube.com/watch?v=X8jsijhllIA&t=437s) By distributing multiple parity checks over structured subsets corresponding to powers of 2, a receiver can perform a binary search akin to '20 questions' to pinpoint and correct the coordinate of a flipped bit. - [14:00](https://www.youtube.com/watch?v=X8jsijhllIA&t=840s) An extended 16-bit Hamming code assigns position 0 as an overarching parity check, enabling systems to reliably locate and fix single-bit errors while independently flagging double-bit errors.
## Key takeaways - [00:03](https://www.youtube.com/watch?v=X8jsijhllIA&t=3s) Everyday digital storage formats, such as scratched CDs and DVDs, rely on error correction to reconstruct perturbed bitstreams into bit-for-bit replicas of the original files. - [00:03](https://www.youtube.com/watch?v=X8jsijhllIA&t=3s) Naive triplication corrects errors by taking the best two out of three bits, but it incurs a prohibitive 66.7% redundancy overhead. - [02:07](https://www.youtube.com/watch?v=X8jsijhllIA&t=127s) Error-correcting codes constrain valid data transmissions to a tiny subset within the broader space of possible bit configurations, mapping corrupted patterns back to the nearest valid neighbor. - [02:07](https://www.youtube.com/watch?v=X8jsijhllIA&t=127s) Richard Hamming developed the technique at Bell Labs in the 1940s out of frustration with single-bit punch-card misreads halting his batch computations. - [04:16](https://www.youtube.com/watch?v=X8jsijhllIA&t=256s) A standard parity bit forces the total count of 1s in a block to be even, providing a simple way to detect an odd number of altered bits using a single check bit. - [07:17](https://www.youtube.com/watch?v=X8jsijhllIA&t=437s) A solitary global parity check cannot locate where an error occurred, nor can it detect an even number of bit flips. - [07:17](https://www.youtube.com/watch?v=X8jsijhllIA&t=437s) Hamming codes query targeted subsets of bit positions across the block, operating like a game of 20 questions that halves the space of suspect bit coordinates with each check. - [10:07](https://www.youtube.com/watch?v=X8jsijhllIA&t=607s) Arranging a 16-bit block into a 4x4 grid allows two parity checks to isolate the error's column and two additional parity checks to isolate its row. - [12:30](https://www.youtube.com/watch?v=X8jsijhllIA&t=750s) Because parity bits are embedded directly within the grid's power-of-two coordinates, any flip in a parity bit is self-corrected by the exact same group of checks. - [12:30](https://www.youtube.com/watch?v=X8jsijhllIA&t=750s) Hamming codes scale logarithmically: a 256-bit block requires only 8 parity bits to pinpoint any single-bit error across 248 payload bits. - [14:00](https://www.youtube.com/watch?v=X8jsijhllIA&t=840s) Discarding index 0 produces a 15-11 Hamming code, allowing an all-even check syndrome to unambiguously represent zero transmission errors. - [14:00](https://www.youtube.com/watch?v=X8jsijhllIA&t=840s) An extended Hamming code reserves index 0 to enforce parity over the entire block, allowing the system to distinguish clean data, correct single-bit flips, and detect double-bit errors. - [16:06](https://www.youtube.com/watch?v=X8jsijhllIA&t=966s) Encoding an 11-bit message requires placing data bits into non-parity indices (3, 5-7, 9-15) and sequentially computing parity bits at indices 1, 2, 4, 8, and finally index 0. - [17:48](https://www.youtube.com/watch?v=X8jsijhllIA&t=1068s) Decoding evaluates the internal subset parities to intersect the row and column of a flipped bit, while the full-block parity verifies that only a single error occurred.
## Detailed walkthrough ### [00:03](https://www.youtube.com/watch?v=X8jsijhllIA&t=3s) The Magic of Error Correction and the Problem of Redundancy
A scratched CD or DVD illustrates an everyday marvel: despite physical scratches modifying the zeros and ones read off the disc, consumer electronics can decode the perturbed signal into a flawless, bit-for-bit recreation of the original file. While digital files of every kind—video, audio, text, executable code, and images—are ultimately sequences of bits, protecting them against corruption is fundamentally a question of efficiency. A naive strategy would be simple triplication: store three identical copies of every single bit, examine them on playback, and take the best two out of three whenever an inconsistency appears. However, this brute-force method forces two-thirds of all available capacity to be consumed by pure redundancy, and it still fails to offer strong guarantees if multiple bit flips strike the same group.
```mermaid flowchart TD accTitle: Trade-off between naive repetition and Hamming error correction accDescr: Contrasts triplication yielding 66 percent overhead against a 256-bit Hamming block using only 9 redundancy bits.
subgraph Naive["Naive 3x Repetition"] N1["1 Data Bit"] --> N2["Store 3 Copies"] N2 --> N3["Overhead: 66.7% Redundancy"] end
subgraph Hamming["Hamming Approach"] H1["247 Data Bits"] --> H2["Combine with 9 Parity Bits"] H2 --> H3["Total: 256-Bit Block<br/>Overhead: ~3.5%"] H3 --> H4["Fixes any 1 bit flip<br/>Detects any 2 bit flips"] end ```
The mathematical problem is how to guarantee error correction while surrendering as little capacity as possible. For instance, in a 256-bit block constructed with the method presented here, only 9 bits need to act as redundancy, leaving 247 bits entirely open for substantive data. From just this single block alone, an automated system can determine whether a bit flipped and isolate its exact coordinate to restore it.
- Triplication consumes $66.\overline{6}\%$ of total storage space for redundancy. - A 256-bit block under this scheme requires only 9 redundancy bits, leaving 247 bits for payload. - Single-bit flips can be both located and corrected; two-bit flips can be reliably detected as errors, even though the receiver cannot resolve where they occurred. - As the speaker reflects on the ability to pinpoint an error from an isolated block: “And honestly, that feels like magic.”
---
[02:07](https://www.youtube.com/watch?v=X8jsijhllIA&t=127s) Richard Hamming and the Principles of Error-Correcting Codes
Error-correcting codes have spent the better part of the last century supplying deep mathematical ideas to real-world hardware. While modern applications often lean toward more sophisticated schemes such as Reed-Solomon algorithms, Hamming codes provide an exceptionally intuitive introduction to the discipline. Conceptually, all error correction rests on restricting valid transmissions to a small subset within the expansive space of all possible bit arrangements. In the same way human readers spot a typographical error in an incorrectly spelled word and intuitively map it to the nearest valid word in a dictionary, an error-correcting receiver maps an invalid received pattern back to the closest permissible neighbor.
The historical origin traces back to the 1940s at Bell Labs. A young Richard Hamming was allocated precious, limited runtime on a large, costly punch-card computer. His batch-processing jobs routinely crashed when single bits were misread from the cards. As the speaker highlights this turning point: “Frustration being the crucible of invention, he got so fed up that he invented the world's first error correction code.” Rather than explaining the technique purely by rote, the conceptual roadmap is aimed at guiding learners to actively reinvent the mechanism themselves, mirroring the hardware implementation featured in Ben Eater's breadboard demonstration.
---
[04:16](https://www.youtube.com/watch?v=X8jsijhllIA&t=256s) Setting Up the 16-Bit Block and the Parity Check
To explore Hamming's logic, consider a 16-bit block whose positions are indexed from 0 through 15. Instead of clustering redundant bits together at the end of the block, four specific positions are earmarked for redundancy, placed squarely at indices that are powers of 2. Although this technically leaves 11 bits of actual payload due to a minor nuance at position 0, these four bits do not blindly clone data; they act as a coordinated system of checks managed by a "sender" and verified by a "receiver" (which equally models reading data across time from storage).
```mermaid flowchart LR accTitle: The 16-bit grid indexing and role assignment accDescr: Displays a 4x4 matrix indexed from 0 to 15, distinguishing parity bit indices from data indices.
subgraph Grid["16-Bit Block Indexing (Positions 0-15)"] direction TB subgraph Row0["Row 0"] P0["0 (Special)"] --- P1["1 (Parity: 2^0)"] --- P2["2 (Parity: 2^1)"] --- D3["3 (Data)"] end subgraph Row1["Row 1"] P4["4 (Parity: 2^2)"] --- D5["5 (Data)"] --- D6["6 (Data)"] --- D7["7 (Data)"] end subgraph Row2["Row 2"] P8["8 (Parity: 2^3)"] --- D9["9 (Data)"] --- D10["10 (Data)"] --- D11["11 (Data)"] end subgraph Row3["Row 3"] D12["12 (Data)"] --- D13["13 (Data)"] --- D14["14 (Data)"] --- D15["15 (Data)"] end end ```
The bedrock of this system is the classic single-bit parity check. In a standard parity check, a sender reserves a single bit to constrain the entire block so that the total count of 1s across the message is an even number. If the count of 1s in the data starts out odd (such as 7), the parity bit is flipped to 1 to force the total sum to be even; if the count is already even, the parity bit remains 0. Parity can thus be represented numerically as 0 (even) or 1 (odd).
- Bit positions run from index 0 to 15. - Parity bit positions are allocated at powers of 2 ($1, 2, 4, 8$). - Position 0 serves a nuanced auxiliary role, yielding an 11-bit user data capacity out of 16 total bits. - Flipping any single bit inevitably shifts the total sum from even to odd (or vice versa), allowing immediate detection of an odd number of faults. - As the speaker notes regarding this mechanism: “This is pretty simple, deceptively simple, but it's an incredibly elegant way to distill the idea of change anywhere in a message to be reflected in a single bit of information.”
---
[07:17](https://www.youtube.com/watch?v=X8jsijhllIA&t=437s) Limitations of Parity and the "20 Questions" Subsets
A solitary parity bit suffers from severe limitations: an even number of errors (such as two flipped bits) cancels out the parity shift, masquerading as a perfectly valid, error-free block. Furthermore, an odd parity reveals only that an error exists somewhere in the block, without giving any indication of its location. Because intense random noise can always theoretically transform one legitimate block into another, no error control scheme can offer absolute certainty; the practical goal is bounding vulnerability within a threshold of bit flips.
```mermaid flowchart TD accTitle: Hamming parity subset strategy accDescr: Shows how multiple targeted parity queries narrow down the position of an error like twenty questions.
E["Single Bit Error Occurs"] --> Q1{"Parity Check 1<br/>Odd positions: 1, 3, 5, 7, 9, 11, 13, 15<br/>Parity bit: Index 1"} Q1 -->|"Parity Fails (Odd)"| O["Error is in an ODD position"] Q1 -->|"Parity Passes (Even)"| EV["Error is in an EVEN position (or no error)"]
O --> Q2{"Parity Check 2<br/>Right-hand columns: 2, 3, 6, 7, 10, 11, 14, 15<br/>Parity bit: Index 2"} EV --> Q2
Q2 -->|"Combined Checks"| LOC["Successive queries chop space of possibilities in half"] ```
Hamming's breakthrough was to avoid applying parity globally to the whole block, instead distributing separate parity checks across specifically structured subsets of the bits. This operates like a game of 20 questions, where each parity query asks a binary yes/no question that halves the search space.
- **Check 1 (Odd Indices):** Covers positions 1, 3, 5, 7, 9, 11, 13, and 15, using position 1 as its governing parity bit. If this group tests odd, the receiver knows the error lies within an odd index; if even, it lies among the even indices (or no error occurred). - **Check 2 (Right Half of Grid):** Covers indices located on the right half of the 4x4 representation (positions 2, 3, 6, 7, 10, 11, 14, and 15), regulated by position 2. If its parity is already even, the sender leaves bit 2 at 0. - As the speaker describes the search strategy: “The overall feeling is a bit like playing a game of 20 questions, asking yes or no queries that chop the space of possibilities in half.”
[10:07](https://www.youtube.com/watch?v=X8jsijhllIA&t=607s) Pinpointing the Column and Row with Parity Checks
On the receiving end of a transmission, checking the parity of the right half of the four-by-four grid immediately establishes whether an error exists among those eight bits. If that group evaluates to odd, the receiver knows an error occurred somewhere on the right; if even, either no error occurred or it sits on the left half. For the moment, the scheme assumes at most one single-bit error across the entire block, as multiple errors cause this basic premise to break down completely. Combining this check with the first test—which tests the odd columns—allows the receiver to isolate the exact column of the error. If an error is detected in both the odd columns and the right half, the error must lie in the final column; an error in the right half without an odd-column error points to the second-to-last column; an odd-column error without a right-half error points to the second column; and if neither check flags anything, any potential error is confined to the leftmost column (or there is no error at all). As Grant Sanderson notes: “Which is all a rather belabored way to say that two parity checks let us pin down the column.”
```mermaid flowchart TD accTitle: Two-Dimensional Parity Check Isolation accDescr: Flowchart showing how four parity checks combine to determine the exact column and row of a single-bit error. subgraph ColGroup["Column Detection"] C1["Odd Columns Check<br>(Bit 1)"] C2["Right-Half Check<br>(Bit 2)"] ColOut["Target Column Identified"] C1 --> ColOut C2 --> ColOut end
subgraph RowGroup["Row Detection"] R1["Odd Rows Check<br>(Bit 4)"] R2["Bottom-Half Check<br>(Bit 8)"] RowOut["Target Row Identified"] R1 --> RowOut R2 --> RowOut end
ColOut --> Intersect["Target Position (Row, Column)"] RowOut --> Intersect ```
Following the exact same logic, the sender and receiver use two additional parity checks to isolate the row. Position 4 serves as the parity bit to enforce even parity across the odd rows, while position 8 acts as the parity bit across the bottom two rows. If an error occurs during transmission at position 3, it flips the parity of the odd-column group and the right-half group, immediately signaling to the receiver that the error is in the rightmost column. However, position 3 leaves the odd-row check and the bottom-half check completely unaffected, pinning the error to the top row. The intersection of that row and column uniquely identifies bit 3, allowing the receiver to flip it back and correct the data. This reveals an underlying connection between the four questions and binary counting.
[12:30](https://www.youtube.com/watch?v=X8jsijhllIA&t=750s) Self-Correcting Parity Bits and Scaling Efficiency
A common concern is what happens if noise flips one of the error-correcting parity bits themselves rather than a message bit. Because parity bits are included in the grid just like any other bit, the four parity questions automatically track down a flipped parity bit in the exact same manner. While the primary goal is solely to safeguard the payload bits—with the parity bits simply along for the ride—protecting the parity bits emerges naturally as a structural byproduct of the layout. Grant Sanderson emphasizes this symmetry: “Take a moment to think about how any error among these four special bits is going to be tracked down just like any other, with the same group of four questions.”
The true power of this scheme lies in how efficiently it scales: - In a 256-bit block, locating any specific bit requires only eight yes-or-no questions, effectively performing a binary search down to an individual coordinate. - Implementing those eight questions requires sacrificing only eight bits out of the 256 to serve as parity bits. - The remaining 248 bits are entirely free to carry arbitrary message data, achieving a high data-to-overhead ratio. - Rather than redundantly duplicating the entire transmission, the parity bits are smartly determined by mathematical subsets, achieving robust single-error correction at minimal cost.
[14:00](https://www.youtube.com/watch?v=X8jsijhllIA&t=840s) The 15-11 Code and the Extended Hamming Code
A subtle edge case arises when all four parity checks evaluate to even. Under four yes-or-no tests, exactly $2^4 = 16$ distinct outcomes are possible, which neatly matches the 16 positions in a four-by-four grid. However, the system also needs to represent a seventeenth outcome: the condition where no error has occurred. If all four checks pass as even, the receiver cannot distinguish between a clean transmission and a bit flip located at position 0. The most straightforward workaround is simply discarding index 0 entirely. Working with a 15-bit block gives 11 message bits and 4 parity bits, producing what is standardly known as a 15-11 Hamming code, where an all-even test unambiguously means zero errors.
```mermaid flowchart TD accTitle: Extended Hamming Code Error Classification accDescr: Decision logic using four internal parity checks alongside the overall zeroth parity bit to separate zero errors, single-bit errors, and two-bit errors. Checks{"Four Parity Checks<br>Detect Error?"} Overall{"Overall Bit 0<br>Parity Odd?"}
Checks -->|"No (All Even)"| O1{"Overall Bit 0<br>Parity Odd?"} O1 -->|"No (Even)"| NoErr["No Errors Detected"] O1 -->|"Yes (Odd)"| P0Err["Single Error at Bit 0"]
Checks -->|"Yes (Non-zero syndrome)"| Overall Overall -->|"Yes (Odd)"| SingleErr["Single-Bit Error<br>(Locate & Correct)"] Overall -->|"No (Even)"| DoubleErr["Two-Bit Error Detected<br>(Cannot Correct)"] ```
Instead of discarding position 0, an extended Hamming code puts that bit to work as an overarching parity bit that covers the entire 16-bit block: - After computing and setting the four internal error-correcting bits (at powers of 2), bit 0 is set so the total count of 1s in the entire 16-bit block is even. - If a single-bit error strikes anywhere in the block, the overall parity toggles to odd, and the internal four checks pinpoint the exact bit to fix. - If two bits flip, the overall block parity toggles twice, returning to an even state; however, the four internal checks will still flag an error condition. - Seeing an even overall block parity accompanied by non-zero flags in the internal parity checks informs the receiver that at least two errors occurred, allowing two-bit error detection even though two-bit errors cannot be corrected. Reflecting on this dual-purpose design, Sanderson remarks: “Isn't that clever?”
[16:06](https://www.youtube.com/watch?v=X8jsijhllIA&t=966s) Walkthrough: Encoding an 11-Bit Message
To prepare a message for transmission or storage, the raw data stream is first split into 11-bit chunks, with each chunk mapped into a 16-bit block. Positions corresponding to index 0 and powers of 2 (indices 1, 2, 4, and 8) are set aside for redundancy, leaving indices 3, 5, 6, 7, 9, 10, 11, 12, 13, 14, and 15 to hold the 11 message bits. Grant Sanderson directs viewers through the manual construction: “Remember, position 0 along with the other powers of 2 are reserved for error correction duty, so you start by placing the message bits in all of the remaining spots, in order.”
The sender then computes each parity bit sequentially: - Group 1 (odd columns, governed by bit 1): The message bits in this subset already exhibit an even parity, so parity bit 1 is set to `0`. - Group 2 (right two columns, governed by bit 2): The message bits in this subset start with an odd count of 1s, requiring bit 2 to be set to `1` to achieve even parity. - Group 3 (odd rows, governed by bit 4): The message bits here sum to an odd count, so bit 4 is set to `1`. - Group 4 (bottom two rows, governed by bit 8): The message bits in the bottom two rows also total an odd parity, meaning bit 8 is set to `1`. - Overall parity bit (position 0): With the four internal parity bits assigned, the parity of all bits across the full 16-bit block is checked. Because the entire block already has an even parity, bit 0 is set to `0`. Once dispatched, the overarching block and all four constituent subsets evaluate to an even parity of `0`.
[17:48](https://www.youtube.com/watch?v=X8jsijhllIA&t=1068s) Walkthrough: Receiving, Correcting, and the Python Teaser
Simulating the receiver's perspective illustrates how decoding operates blind to the original contents. Upon receiving an altered block where one or two bits may have flipped, the receiver evaluates each parity rule in sequence: - Parity check 1 evaluates to even, indicating that any error must be restricted to the even columns. - Parity check 2 evaluates to odd, proving an error exists and narrowing the column down to the third column. - Parity check 3 evaluates to even, eliminating the odd rows from suspicion. - Parity check 4 evaluates to odd, establishing that the error resides in the bottom half.
Matching the intersection of the third column and the bottom rows isolates the fault precisely to position 10. Evaluating the overarching parity across all 16 bits yields an odd count, verifying that exactly one flip occurred rather than two. As Sanderson cautions regarding multi-bit limitations: “If it's three or more, all bets are off.” After flipping bit 10 back to its correct state, extracting the 11 payload bits completely restores the sender's original message. The core logic of this entire error-locating sequence can be condensed into a single line of Python, an elegant unified operation explored in part 2.
## Mentioned Richard Hamming, Bell Labs, Reed-Solomon, Ben Eater, Matt Parker, Harry Li, Vincent Rubinetti, The Art of Doing Science and Engineering, Python, Manim
## Video description A discovery-oriented introduction to error correction codes. Part 2: https://youtu.be/b3NxrZOu_CE Ben Eater:'s take: https://youtu.be/h0jloehRKas Help fund future projects: https://www.patreon.com/3blue1brown An equally valuable form of support is to simply share some of the videos. Special thanks to these supporters: https://3b1b.co/hamming-thanks
Heavily related is the chessboard puzzle I did with Matt Parker: https://youtu.be/as7Gkm7Y7h4
You can read Hamming's own perspective on his discovery of these codes in chapter 12 of "The Art of Doing Science and Engineering". https://amzn.to/3lwcnmh
The viewer Harry Li made an interactive on this topic: https://harryli0088.github.io/hamming-code/
Thanks to these viewers for their contributions to translations Hebrew: Omer Tuchfeld Hungarian: Fabó Bence Spanish: agustin-j
------------------
These animations are largely made using manim, a scrappy open-source python library: https://github.com/3b1b/manim
If you want to check it out, I feel compelled to warn you that it's not the most well-documented tool, and it has many other quirks you might expect in a library someone wrote with only their own use in mind.
Music by Vincent Rubinetti. Download the music on Bandcamp: https://vincerubinetti.bandcamp.com/album/the-music-of-3blue1brown
Stream the music on Spotify: https://open.spotify.com/album/1dVyjwS8FBqXhRunaG5W5u
------------------
3blue1brown is a channel about animating math, in all senses of the word animate. And you know the drill with YouTube, if you want to stay posted on new videos, subscribe: http://3b1b.co/subscribe
Various social media links: Website: https://www.3blue1brown.com Twitter: https://twitter.com/3blue1brown Reddit: https://www.reddit.com/r/3blue1brown Instagram: https://www.instagram.com/3blue1brown_animations/ Patreon: https://patreon.com/3blue1brown Facebook: https://www.facebook.com/3blue1brown
[Source](https://www.youtube.com/watch?v=X8jsijhllIA)