The Mandelbrot Set Viewed through Precalculus

I’ve given this presentation in November 2014 at AMTNYS in Syracuse, and in April 2015 at NCTM in Boston. I’ll be giving the presentation in May 2015 at the NY Master Teacher Conference, and in July 2015 at Twitter Math Camp in Claremont CA. 


Why use the Mandelbrot fractal to get the students to learn some Precalculus topics?

  • How often do students study math that less than 40 years old? Think about it.
    What’s the most recently developed math topic that happens in your classroom? The Mandelbrot fractal was developed (discovered?) in the late 1970’s by Benoit Mandelbrot (amongst others, more information here) while working at IBM and through working with the Julia sets. His collegues at SUNY Stony Brook* used computers to create the first image of the Mandelbrot Set:
    The first picture of the Mandelbrot set, by Robert W. Brooks and Peter Matelski in 1978/1979*.
  • There are so many great Precalculus topics addressed by the Mandelbrot set, namely:
    • Complex numbers
    • Arithmetic with Complex numbers
    • Complex plane and Argand diagrams
    • Recursive sequences
    • Polar Form of Complex numbers
    • Graphing using the Polar plane
    • DeMoivre’s Theorem

    By themselves they are interesting topics with many diverse uses, but together they can do marvelous things.

  • The utter beauty and mysterious nature of the Mandelbrot set (and other related sets). It seems so inapproachable. Scary. It’s an infinite complex process and has all the crazy fractal properties of self-similarity, but not really. You can zoom in forever and get more and more detail as you go. You can create (and understand?) images like so (all of these images came from my amateur code).
    But these images are only finitely interesting. They are just pixel representations of the actual fractal. We can zoom in and get as much detail as we can handle (or more correctly, as a 32bit decimal float can handle – duh).
  • Lastly, be selfish, wouldn’t you like to learn something new alongside your students? Isn’t trying new things inherently a sign of youth? This might not be your thing, but if you’re interested in bringing it back to the classroom, the students will be that much more interested to see the teacher learning alongside their students.


Here are several good videos that can help you get started with the Mandelbrot set:

Next, you can walk through the lesson outline that I’ve made (pdf) and through the presentation that I gave for NCTM Boston (pdf).

Here are links to all the interactives:

Everything is also found here:, including all the presentation material, the walkthrough, the interactives (and all the source code).

I had a ton of fun with this project and presentation, and I hope the students did too. Please let me know if you have any questions or comments. Thanks!

*Errors fixed thanks to a comment by J. Peter Matelski (one of the original Mandelbrot developers!) 

Using the arctan Power Series to Calculate Pi

(Note: this post is an extension on the calculating pi with python post from a couple of years back. Also here’s another way to inefficiently calculate pi with Buffon’s Needles.)

We’re currently working with Power series and Taylor series in Calculus.
One particularity pretty derivation is going from the series for \frac{1}{(1-x)} = 1 + x + x^2 + x^3 ... to the series for arctan(x) = 1 - \frac{x^3}{3} + \frac{x^5}{5} - \frac{x^7}{7} + ...
Even better you can use this formula to calculate pi, since arctan(1) = \frac{\pi}{4}, so \pi = 4 ( 1 - \frac{1}{3} + \frac{1}{5} - \frac{1}{7} + ...).
How quickly does this converge to pi? Let’s find out.
Here’s the first ten partial sums:

n= 0 and the partial sum is 4.0
n= 1 and the partial sum is 2.666666666666667
n= 2 and the partial sum is 3.466666666666667
n= 3 and the partial sum is 2.8952380952380956
n= 4 and the partial sum is 3.3396825396825403
n= 5 and the partial sum is 2.9760461760461765
n= 6 and the partial sum is 3.2837384837384844
n= 7 and the partial sum is 3.017071817071818
n= 8 and the partial sum is 3.2523659347188767
n= 9 and the partial sum is 3.0418396189294032
n= 10 and the partial sum is 3.232315809405594

Ok, that’s slow.
Here’s the first 100 terms:

n= 0 and the partial sum is 4.0
n= 10 and the partial sum is 3.232315809405594
n= 20 and the partial sum is 3.189184782277596
n= 30 and the partial sum is 3.1738423371907505
n= 40 and the partial sum is 3.1659792728432157
n= 50 and the partial sum is 3.1611986129870506
n= 60 and the partial sum is 3.157984995168666
n= 70 and the partial sum is 3.155676462307475
n= 80 and the partial sum is 3.1539378622726155
n= 90 and the partial sum is 3.1525813328751204
n= 100 and the partial sum is 3.1514934010709914

Still not to 3.14 even after adding 100 terms of this sequence?
Here’s the first 10,000 terms:

n= 0 and the partial sum is 4.0
n= 1000 and the partial sum is 3.1425916543395442
n= 2000 and the partial sum is 3.1420924036835256
n= 3000 and the partial sum is 3.1419258758397897
n= 4000 and the partial sum is 3.1418425911015158
n= 5000 and the partial sum is 3.1417926135957908
n= 6000 and the partial sum is 3.1417592924821482
n= 7000 and the partial sum is 3.141735490326666
n= 8000 and the partial sum is 3.1417176379662446
n= 9000 and the partial sum is 3.1417037523562383
n= 10000 and the partial sum is 3.1416926435905346

Two factors of ten more than the last set and still not to 5 digits of precision?
Lastly, here’s the first ten million approximations:

n= 0 and the partial sum is 4.0
n= 1000000 and the partial sum is 3.1415936535887745
n= 2000000 and the partial sum is 3.1415931535894743
n= 3000000 and the partial sum is 3.1415929869229293
n= 4000000 and the partial sum is 3.1415929035895926
n= 5000000 and the partial sum is 3.1415928535897395
n= 6000000 and the partial sum is 3.141592820256488
n= 7000000 and the partial sum is 3.1415927964468655
n= 8000000 and the partial sum is 3.141592778589681
n= 9000000 and the partial sum is 3.141592764700862
n= 10000000 and the partial sum is 3.1415927535897814

I really don’t want to calculate this by hand if after 10,000,000 additions, we only have 7 digits of precision.

(Question: why are all these even terms an over-estimate of pi?)

Graph of the first 1000 partial sums:

Let’s compare that to Chudnovsky’s algorithm:

n= 1 3.1415926535897342076684535915782983407622332609156
n= 2 3.1415926535897932384626433835873506884758663459963
n= 3 3.1415926535897932384626433832795028841971676788547
n= 4 3.1415926535897932384626433832795028841971693993750
n= 5 3.1415926535897932384626433832795028841971693993750
n= 6 3.1415926535897932384626433832795028841971693993750
n= 7 3.1415926535897932384626433832795028841971693993750

Wow, this algorithm maxed out the 51 digits of precision after 4 iterations. Crazy.

Here’s the python code for using arctan to approximate pi:

from decimal import *

#Sets decimal to 50 digits of precision
getcontext().prec = 50

#This program uses the power series for arctan to calculate pi
#arctan(x) = sum (n = 0 to infinity) (-1)^n * (x^(2n+1))/(2n+1)
#So to calculate pi, compute (arctan (1)) = pi/4 = 1 - 1/3 + 1/5 - 1/7 +...

quarterpi = Decimal(0)
n = 0

while True:
    quarterpi = quarterpi + Decimal(-1)**n / (Decimal(2*n + 1))
    #this line allows the code to print only every 10 lines, increase this number
    #to speed up the calculations and reduce the printing
    if (n % 10 == 0):
    n += 1

And here’s the chudnovsky python code:

from decimal import *

#Sets decimal to 50 digits of precision
getcontext().prec = 50

def factorial(n):
    if n<1:
        return 1
        return n * factorial(n-1)

def chudnovskyBig(n): #
    pi = Decimal(0)
    k = 0
    while k < n:
        pi += (Decimal(-1)**k)*(Decimal(factorial(6*k))/((factorial(k)**3)*(factorial(3*k)))* (13591409+545140134*k)/(640320**(3*k)))
        k += 1
    pi = pi * Decimal(10005).sqrt()/4270934400
    pi = pi**(-1)
    return pi
print ("Chudnovsky")
for i in range(1,50):
    print ("n=",i," ", chudnovskyBig(i))

Car Talk Gone Fishing Puzzler

From Car Talk:

TOM: Three guys go out fishing. They decide in advance that whatever they catch, they’re going to divvy it up equally.
So, they finish fishing for the day. They pull back into port, and they’re going to sleep on the boat overnight. They’re going to get up in the morning, divvy up the fish, and go home. In the middle of the night, however, one of the guys has a severe hemorrhoidal flare-up, and he’s got to get to the drugstore right away to buy some stuff.

RAY: Right.

TOM: So, he goes to take his third of the fish, and he notices that the number that they caught is not divisible by three, unless he throws one of the fish overboard. So, he throws one of the fish overboard, takes his third and leaves. A few hours later, in the middle of the night, another guy wakes up with horrible stomach pains. He’s gotta have the Kaopectate. So he goes to take his third of the fish, and he notices, interestingly, the same thing — he can’t take a third unless he throws one fish overboard. He throws one fish overboard, takes his third, and goes home.

Third guy gets up in the morning and figures the other guys are still sleeping. So he figures, “I’ll just take my third, and I’ll go. When they wake up, they can take their third.” However, he realizes that he can’t take a third. It’s not divisible by three.

RAY: Sonja Henie’s…! What are the chances of that?

TOM: He throws one fish overboard, takes his third, and leaves. Question: What is the smallest number of fish by which this little scenario could have taken place?

Can this happen with 4 people? 5? 6? n?

How do I start Programming?

These excerpts are from a response to a reader on the wonderful tumblr by Jerome Herr, Experiments In Processing.

Learning to code is like learning a natural language: it’s quite hard and slow at first but if you hold on just a little then suddenly you start seeing all the beauty of it and you’re amazed about how you suddenly understand what’s going on and how you can create stuff (designs or sentences) on your own!

Start with something that you understand and then, VERY IMPORTANT, play with it! What I often do is that I simply add a new instruction, maybe one from a previous tutorial or sketch, to see how that will look. Or I wonder: what will the animation look like if I use very big ellipses? or very small ones? only 10 of them? or a 1000? What if I make this rectangles rotate a bit? A lot? What if I apply this to only some of them?

So it’s not just about staring at the screen. It’s also about sketching stuff on paper and about letting yourself be inspired by everything you see in the world around you! Look at all the patterns that you can see in the natural world, day in and day out: in buildings, on the sidewalks, in the behaviour of cars or birds. Try to recreate those patterns. Start with the easy ones, obviously 😉 Look at Muslim art, lots of patterns to be found there. Or the art of Sol Levitt. And go to art museums, they can be very inspiring anyway!

Car Talk Product Placement Puzzler


RAY: There are a lot of our little children who listen to Car Talk who are studying Algebra, so I thought I would ask them to simplify the following polynomial.

TOM: Let me just write this down. OK.

RAY: X plus A in parentheses times X minus B in parentheses times X plus C in parentheses, dot, dot, dot, times X minus Z.

Here’s how it looks: (X+A)(X-B)(X+C) … (X-Z)

TOM: So you want —

RAY: I want the product of all those terms.