 coming to my talk, I know it's a tough choice. There's a bunch of good stuff I'd love to be seeing right now. This is not just a talk about the Manderbrot set and the math behind it. I would just describe this as kind of the discovery channel version of this talk. There's not a lot of heavy math at all. But this is also a talk about why this talk exists. And it starts about three years ago with my boys. These are my triplets. And I volunteer at their, they're in third grade now. I volunteer at their elementary school quite a bit. Through a program called Watchdog Dads. And I'd like to encourage everybody, the sequence I'm about to show here is about how I've gotten involved in some education in my county. And I'd love to be an inspiration. I'd love to have this a call to action to use well. Through Watchdog Dads, I volunteered for school occasionally. And two years ago, I took a week off of work and ran about 400 third, fourth, and fifth graders through the Hour of Code for Computer Science Education week. And let me tell you something. That was a blast. That was so beneficial to me, not just to the kids. But I got a great quote from a fifth grade girl who said, oh, so computers aren't smart. They're just dumb, really, really fast. And that was so awesome to have that kind of influence and over kids. And I got some great material for talks, didn't I? And after I did this Hour of Code, the principals talked to me about volunteering at the high school level through a program called TEALS. This is a nationwide organization where they're taking computer science professionals, just like us, and putting us in classrooms with math teachers who are not necessarily educating computer science to bring the math teachers and the students up to speed over a year or two to the point where the math teachers can take it over. And in my counter, we already have a pretty active computer science department in high school. So I have a great teacher that I get to work with. And one morning before school, I'm there an hour before classes begin a couple days a week so we can go over homework and people can ask questions. A student of mine comes in and asks the math teacher from a previous class another topic the day before. He goes, what is I good for anyway? Is it something useful? And you can see the teacher with that deer in the headlights look, oh, no, the students asked me a real world question. What do I do? So I jumped in. I'll tell that story in a minute. But the encouraging thing, another thing I'm doing in the county, last year we had 20 of my high school students volunteer to go back to their elementary schools and do the Hour of Code. So we had influence over some 2,000 kids in my county last year. This year, Computer Science Education Week is doing an Hour of Code with Star Wars characters. The kids don't need to know anything. All they need is a browser. It's a little thing where you drag and drop blocks of code together and control stuff on graph paper. And it is so much fun. I'd encourage all of you to try to get involved in doing something with this with a local school. So the student asked, what is I good for anyway? And the teacher was like, well, it's used in some real world engineering, mathematics stuff. And I jumped in. I was like, oh, well, first of all, if you do anything with analog circuitry, you need to know I to count imaginary numbers. This is what this is about. To calculate some of the waveforms, some of the way the circuitry evolves over time. It's used in real time weather navigation to do the calculations based on Doppler radar, things like that. And of course, my favorite topic, the reason we're here to talk about the Mandelbrot set. But I was like, but there's not enough time to talk about that now. It would take me a little bit of time to talk about it. And the math teacher said, well, Friday we have our Computer Science Club. Do you want to talk about it there? And it was Wednesday. And I was like, oh, OK, I'll throw something together. That's where this talk came from. First, I want to show a few slides and talk about just the concepts we're going to go into. The Mandelbrot set, the reason it's fascinating, is because there are a few simple rules that we're going to talk about to generate it. But it generates infinite complexity. If you saw that video that was playing as you walked in, you can keep zooming and zooming and zooming, and there is never a bottom. There's a top, which is this. And we'll talk about where that comes from. But as we zoom in, you see just more and more rich detail. And you see the same shapes reappear in mixed up ways. Like you see this thing. This is called the Mandelbrot beetle, that shape up top, or the bulb. The various parts of the diagram have names that go over. And as you zoom in, you just find these shapes all over and over. I mean, we're looking at something. You'll understand what we're looking at in a minute. But this is the notion of self-similarity. And this is the fractal geometry of nature. You look at something like a galaxy. That has a lot in common, even though it's completely different forces at work to create a hurricane. And again, it looks very similar, but completely different forces at work to create the foam in the top of our latte. It's the fractal geometry of nature controls how plants grow, controls how the shape of broccoli happens to look a little bit like your lungs and the way it branches out. All that stuff is the fractal geometry of nature. There are three of three concepts I want to talk about. One is trending from zero to infinity. The other is imaginary numbers. And the other is mapping to a plane. So let's talk about trending. Two times two, what's that? Multiply it again, what's that? Hey, we keep doing that over and over. We trend towards infinity. That's third grade math. Interesting to generate case here is at one. We can multiply by one forever, and it just stays at one. What happens if we 0.5 times 0.5 over and over and over? That trends to zero. Does it ever get there? No, we just get smaller and smaller numbers. So let's talk about velocities. 0.9, where does that trend? So on this side of one, it trends towards zero over 9.9, 0.9 goes to 0.81, 0.73, something, blah, blah, blah. What about 0.99999? That also trends to zero, but it does it more slowly if we were to somehow take into account how many times it takes to cross some threshold. Again, slower still. What about that one? That's trending towards infinity, but very slowly. So here's the concept of trending. Numbers other than one will trend towards zero or infinity at different velocities. And for real numbers like 0.5, 1.2, 7.3, it's pretty straightforward. Now we know one's the boundary condition. I can throw a number out and you know what it is. So let's set that aside for a minute. That's the first idea we need to know. Let's talk about squaring numbers. So 2 times 2 is 4. We can also write that little mathematical notation here. We can say 3 squared is 9. Negative 3 squared is also 9. That's interesting. We'll come back to that. Let's talk about square roots. We have 9, of course, 3 squared. We saw that written the other way a second ago. But we have the reverse notation, just like we can add and subtract as kind of an undo button for math. We can multiply and divide as kind of an undo button for math. Well, squaring has an undo operation, and that's a square root. And we write it like this. So the square root of 9 is 3. It means 3 squared is 9. What about the square root of negative 9? What can we multiply together to get a negative number? There isn't anything. Even if we had negative 3 and multiplied it by itself, we get 9, because a negative times a negative is a positive. This is almost nonsensical, which is a little disturbing, isn't it? That, wow, square roots only work for the first half of the number line. Well, we have a trick up our sleeve. This is square root of 9, negative 3. Not really. It doesn't fit. Stand back. We're going to try science. We start with the square root of negative 9. We can rewrite that as a square root of 9 times the square root of negative 1. We know what the square root of 9 is. It's 3. So now we have this thing left over, this square root of negative 1 that doesn't make any kind of sense. With the math that's already built into our head, maybe up to a junior high, first year high school level, this doesn't make any sense. We can just define that and say, you know what? It doesn't make any sense, but we're going to put a label on it and start using it anyway. We're going to call it i, an imaginary number. That, to me, is one of the powerful things of mathematics, that we have something that we don't understand, so we just slap a label on it and start to use it anyway. We can now say that the square root of negative 9 is 3i. And we can say that 3i squared is now negative 9. We have a way to go back and forth. So here are the rules for working with i. If you can ever refactor something down to, wow, first time in this conference, I bet that was actually used for the math instead of the code term, if we can refactor something to a negative 1 and need to make the square root, we can just call it i. If we ever run into i squared, we can just call it negative 1. That is this mind-blowing thing about math, is that we run into something that feels like a roadblock. And if you look at the history of i, there were centuries where that was kind of a roadblock for people running into until somebody just slapped a label on it and started using it. Now watch what we can do with that knowledge. Of course, we can't just add 5 plus 3i. We don't know what this i thing is. It's like mixing apples and oranges. So we just invent a new concept called a complex number. It has both a real part and an imaginary part. That's a complex number, 7.32 plus 3.04i. We can have negative i's 2, negative 6, 4 minus 0.32i. Let's set that aside. I'm going to put these two concepts together now. If we define a value to 1.2 plus 6.3i, does that trend toward 0 or infinity if we start doing this to it? So instead of just on a number line like we could do before, we're going to take that number and we're going to put it on this complex plane. It fits right there where this red dot is. Now the neat thing, so we have the 1.2 is the real part and the 0.63i is the imaginary part. And it points right there. And we can imagine splitting this plane up into infinitely number many of positions. There's a way to figure out what's called the absolute value of a complex number. And that is just its distance from 0 on this plane. So we can use Pythagorean theorem. Maybe I should put that in my bullet point list up front to be able to determine the distance. So even if it's negative 3 plus negative 2i, we know it's distance from 0. So does it trend toward 0 or infinity? That's hard to know. We can do this complex operation over and over where we're going to say C0 is the point on this complex plane. And we're going to say C1 is the square of that and we're going to add C0 back into it. And C2 is C1 squared. We're going to add C0 back into it. We just keep doing that. If it trends towards 0, we're going to color it black. And that's part of the Mandelbrot set. If it trends towards infinity, we're going to color it based on the velocity. Now we had this notion of velocity before, but we didn't really have a way to measure it. We're going to measure it now by how many iterations it takes for that absolute value to get greater than 2. We can prove that if the absolute value is ever greater than 2, we know it's going to accelerate towards infinity. How long does it take to get there? Is the interesting part of the question. Ruby has a complex class. So this makes this kind of stuff super easy. We take a complex value. You can imagine splitting that point up into everything from negative 2 to 2 on one range and 2 to negative 2 on the other, split it up into all these little pieces, and then testing each point to see what its velocity is. And then just do this equation over and over. In fact, that's what this code does. We're going to test the depth to infinity by passing in one of those complex numbers. We have a max depth defined that's just going to go over and over and over. And if we ever exceed the absolute value of 2, we're just going to return our depth. Otherwise, we return max depth. And believe it or not, that is all the code we're going to need. That's the depth to infinity. And here's where we split up the plane, right? The width and the height, we take a left and a top value and we multiply it by this little fractional delta to generate every complex number. We're going to do depth to infinity. And we're going to color a point, X and Y, with whatever the depth is. Little bit of play time. I have over here, Mandelrask, which will be up on GitHub after this talk at Bachman slash Mandelrask. And I can say rake dash t. And we have a few things to take a look at. I can say rake beetle. So now, right now, that is drawing an 800 by 800 square, testing depths, I think, up to 128 I have it set to right now. On the ranges from negative 2 to 2 for the real part, and 1.2 to negative 1.2 on the imaginary part. And look at that. With just a real number on a number line, it was pretty easy to guess what would happen, right? Greater than 1 turns towards infinity at an ever-increasing rate, turning towards zero faster and faster at an ever-increasing rate to zero with 1 stuck in the middle. Well, this, just by adding in this complex notion that I was able to walk you through in a few minutes, complex numbers, we get very different rates here of trending towards infinity. This circle out here, this is the circle for greater than 2. So that's like one iteration. In one iteration, it was done. This blue, well, it took two iterations to get there. This one took three. This one took four. This one took five. This one took six. This one took seven. More and more into all this stuff that at this resolution looks like static. Now, in here, we never trended towards infinity. We just stuck around the zero point or trended towards zero. So we color that black. I'm gonna zoom in now on this part. That is called Seahorse Valley. Rick, Seahorse. Now, this one's gonna take a little bit longer to calculate because there is more black area and we're going a little deeper. So let's talk about what's happening here. We are, for an 800 by 800 square, so 64,000 points, we are iterating up to 128 times, creating a new complex number every time. I'm creating, what, a million different objects here, doing a bunch of math to get this color point. This takes a long time. The first time I ran this in Ruby, I was actually blown away with how long it took. Because the first time I ever messed with generating Mandelbrot fractals was 1991. I did it on a room full of Macintosh LCs in my college lab. They were for a networking project using the program to program communication toolbox on system seven. I wrote all these client machines that would calculate little squares. And then a master machine that would take all the little squares and assemble them together. Drawing that Mandelbrot on a 512 by 314 image took 14 minutes for a room to calculate. Yeah. Yeah, I know exactly where the issue is. It's actually on the object creation of complex. There are things I could do, not use the complex type, not create so many objects. In fact, Charlie Nutter, it's a little faster on JRuby as you'd expect. It's not faster, interestingly, using the Jakarta Commons collections complex from their math stuff, the Commons math. And in Charlie Nutter's JRuby talk yesterday, he was talking about how they're avoiding object creation in some cases. So we were talking about this at a break yesterday. And he's anxious to see this code, because this will, you know, we can possibly make this much faster on JRuby by avoiding the object creation with a complex. So that didn't take too long to create. I mean, compared to 14 minutes with less resolution, a bank of computers, and this is Ruby. You know, we rewrite this in Java or C, and it's a lot faster. Let's zoom in one more time. This time with a Seahorse 2. That video that I was showing you as you walked in, that is available on YouTube. I have a link at the end of the slides. And that was four weeks of computer time to calculate that video. There was a question over here? Okay, good question. So the question is why is that called Seahorse Valley? On the main beetle, also called the cardoid, that valley, you might actually see it here in a second. You'll see it in another app I'm gonna show in a second. The things that spiral off look kind of Seahorsy. So somebody stuck the name Seahorse Valley just to have a name, because otherwise you're talking about this infinitely large space that's hard to know. The butt of that beetle is called Elephant Valley. So this will be evident why it's called Seahorse Valley in another program I'm about to use. But down in this static, depending on how you color it, these things spiral off and look like Seahorsy's clinging to stuff. Now I mean, this looks a little color frightening here, right? There's a lot going on. Let me show you Fractal Maker. This is an OS 10 download. It was like four bucks. I can reposition where I am by looking at this part of the screen. Zoom in on Seahorse Valley, and I can zoom. And for lack of anything better, that's called Seahorse Valley. All of a sudden there's another one of these beetles zooming in. I'm now at 1,000 times magnification. 5,000, 25,000, lost it just a bit. Now notice how it's getting kind of, the edge is not defined anymore? This has to do with iterations. This is how many times I'm testing before I decide whether it trends towards infinity or zero. Otherwise I have to decide at some point when we're gonna color this thing or else we could just go on forever. So instead of 1,200 iterations, let's do 2,500 iterations. Still a lot of time. Oh, that's weird. It went back to 1,200 on me. 1,500, and it went back to 1,200 on me. I don't know. I didn't write it. I just bought it. So we'll demo fail on that, but we'll move on. The neat thing about this app, this app has a lot of other cool things. We can play around with how the color levels are picked, because the colors on our part of the Mandobrot Fractal at all. We're just assigning colors to stuff so we know how to look at it, so we can somehow have depth. The colors are something we just make up entirely on our own. Totally ignoring the values I tend to type. And there's a palette chooser. Let me, I'm just gonna pick a quick one. That's probably off the edge of my screen. Well, that's Fractal Maker. And the thing is you could sit there, I've done this, you sit there for quite some time exploring what's in that corner of the Mandobrot Fractal. You zoom in, and I'm not necessarily a person of faith, but you sit there, you zoom in, and you're like, is there ever gonna get to a point where it says, Dave, what took you so long? Signed God. It's just, there's so much complexity. Why should something, I mean, it's philosophical. Why should something that is so simple, right? I could explain these concepts to my eight year olds. They might not get the negative one, but the basic, we're gonna do this a bunch of bunch of times, right? And something that is understandable, something that fits in my head in the first 20 minutes of this talk, can generate infinite complexity. So you might be wondering, what practical use is this stuff? Because after all, he did ask me what is I good for? And yeah, this looks kinda cool. Maybe it's a bit philosophical, but it doesn't really show what's good. Saw the YouTube video in the beginning, there are dozens of YouTube videos of people showing off their processor prowess, generating Mando brought videos and coloring skills. But this is also used in all kinds of other real world ways. There's a documentary in fact, about the, not the third from my childhood, but the third Star Wars movies from the early 2000s, where they talk about all the lava in that end scene, how they generated all that via fractal math. And I have an example here of realistic terrain generation. So blog entry, there's a link to it on my notes. Talking about realistic terrain and 130 lines of JavaScript. This technique was pioneered by Boeing, who was trying to make computer animated videos of their planes in flight. And they wanted realistic mountains and backgrounds and all that kind of stuff in the background. There's a great documentary on that stuff, on Netflix as well, it's called The Code. That's not what I want. I want the, explore the otherworldly terrain. Gives me a little chunk that is completely generated in JavaScript. That looks, you know, realistic enough to me. That kind of bumpiness, that is generated in the movie Toy Story. They would make plastic look slightly worn and edged with this exact same technique. Let's generate it again. Minecraft uses exactly this technique to generate worlds based on a simple seed. I mean, it's stunningly beautiful. If Bob Ross had drawn that, we'd be like, oh, good job, thanks. Let's see what else do I add to my slides. Okay, so I was talking briefly there about some of the other uses of this. Of course, every talk at RubyConf needs a cat in it, right? So unexpected fractal result in the Schrodinger experiment. The fractal cats all the way down. So, the first inkling of the complexity behind this mathematics wasn't discovered by Mandelbrot. It was actually discovered by Edward Lawrence. He was doing weather simulations and, you know, huge iron in the 1950s. And he was trying to, you know, figure out weather over the period of days. How far can we realistically predict weather? And one time he decided to run a simulation that ran overnight, you know, probably a fraction of a second on our modern computers. And he ran that overnight two nights in a row with slightly different parameters and got wildly different results. It's like, why would the 10th decimal place of the wind speed in this quadrant suddenly generate a tornado when it didn't yesterday? Our weather is a complex system like this. This is where the quote, he published this paper. 1972 in the American Association, the Advancement of Science, 139th meeting. Predictability. Does the flap of a butterfly's wings in Brazil set off a tornado in Texas? I'm sure you've heard this analogy, right? Now, he's not saying that that butterfly yesterday is gonna create a tornado tomorrow here in Texas. He's talking about whether initial conditions, read this, the question that was really interesting is whether, for example, two particular weather situations differing by as little as an immediate influence of a single butterfly will generally alter sufficient time over, after sufficient time, evolve into two situations differing by as much as the presence of a tornado. Now, what does that have to do with the Mandelbrot set? The Mandelbrot set shows us this. We're looking at the 1,000-foot beetle at the top and we see a point that's colored green. Or better yet, let me describe the edge of the Mandelbrot set. We see a point that is colored green right next to the point colored black. Let's zoom in on that. Let's figure out where that boundary between the green and the black is. And all of a sudden, in that boundary, it's not green and black. There's green, pink, blue, purple, and black. What happened there? So zoom in again, now between the purple edge and you keep zooming, and you keep zooming infinitely and you can never find the bottom. You can never find the edge. Just all this complexity comes out of it. So, altering something by one gazillionth of a Googleplex of a point of a value can generate wildly different results in what the Mandelbrot set looks like. With a complex system of variables that's evolving over time, they're very sensitive to initial conditions. A pinball machine is like this too. Over time, that ball can go radically different places based on the simplest things. The Mandelbrot set has no edge. That big black area in the middle, it has no discrete edge that I can say, this point is in, this point is out. The more I zoom in, I just find more and more points and more and more complexity. It has an infinite perimeter, which is kind of mind blowing. It has a set area, it fits on my screen, but an infinite perimeter. Rookie mistake, Dave. Another example of this in the real world of nature is the question of how long is the coast of Britain? Coastlines are fractal, which is one of the reasons why we can generate them in 130 lines of JavaScript, and they look realistic to us. It triggers that sense of realism to us. If I measure, this is a famous paper by Ben Wall Mandelbrot. If I'm using a satellite image and a ruler that is about a mile in length and measure the coastline of Britain, I get one answer. I zoom in a little bit now, and I'm using something that's maybe a 10th of a mile in length because I'm on a boat on the shore and try to measure it, I get a longer coastline. I zoom in further still, I get a longer coastline still. I'm just always continually using something smaller. So I'm at grains of sand trying to measure the coastline of Britain. Every time I increase or decrease the resolution of my measuring device, I get an increase in resolution because I'm measuring more and more of those little eddies and little holes in the coastline. Ben Wall Mandelbrot has written a lot of books about this. Unfortunately, he died about two years ago. The B in Ben Wall Mandelbrot, that allegedly stands for Ben Wall B Mandelbrot. So you can just keep tunneling down on his name. Here are my links to some of the information I've shared so far today. Mandelbrot Madness, which is a fantastic blog, a great book called Chaos. There is a documentary called The Code, BBC. It was on Netflix. I believe now it's on a service called Curiosity Stream. I think it's also up on YouTube. It comes and goes all over the place. The paper How Long Is a Coastline of Britain and Predictability about the Flap of the Butterflies Wings. There's a ton more information out there, but this is sufficient to satisfy a curiosity until you decide to go into this as a field of study. All my work is licensed under Creative Commons. You're free to use this. Use it for your own educational purposes. Please take it to classrooms. And in closing, as I take any questions, we'll just watch this deep zoom video again. The song is Jonathan Colton. Any questions? Sorry, what was that again? Yes, I did. Yes, I actually also tried increasing my size of my heap, tried switching between various versions of Java, various versions of Ruby. In fact, I will show you one quick thing. We're supposed to be beyond Ruby, but I'll actually show you the code briefly. This was originally written to illustrate a couple different concepts. Where is my, there we go. First of all, I have an open source project called RASC, which is the rake application starter kit. I have, when I was consulting, I solved a lot of business problems with a combination of rake and cron, right? Right, a rake task to do something set up on cron and woo, they're happy the report runs every night. The ETL runs between Salesforce and the database every night kind of thing. We did that so often at my company. We created this thing called the rake application starter kit, because one time we were like, we started with a bunch of rake tasks. By the time we were done, we were saying, we just should have done a Rails app and never actually started the Rails server, because we wanted active record, we wanted the concept of a development environment and something out, a production environment. We wanted all the common directory structure, so that's what we did. RASC is basically that directory structure similar to a Rails app built in testing and all that stuff for doing rake tasks. Second, this application senses whether we're on Ruby or JRuby and uses different persistors to write out the file. So Ruby persistor uses our magic and the JRuby persistor loads in a Java canvas and saves it up. So I can switch easily between Ruby and JRuby. I was doing that for performance testing between 187, 193, 21, 22, 223, JRuby 9000 with different garbage collection settings and amazingly, Ruby as of 187 was pretty slow, but right now we have parity between Ruby and JRuby and Charlie yesterday was like, if we're just on parity, we can do better than that. So that's, if you check my Twitter stream, we were talking about it this morning, he wants the code. So yes, I've been doing some performance optimization on it. Right now the bottleneck is definitely object creation. Anything else? Ah, the question is, how did I determine what complex numbers to use? Let me show you the beetle in my rake task. See where it's two. The beetle, and this is well known, just the way the Mandelbrot set is defined. The left edge is 2.0, I'm sorry, the top edge, left edge is negative 2.0, the right edge is 2.0. The top edge is negative two, the bottom edge is 1.2. So that's where the numbers come from. The way this syntax works is I say what's the length I want and it parses that up into little bitty parts. The code that actually does that is right here when I'm drawing. We pass in a length, and this is in an object so we have a little bit of state here. I have a left and a top, which we pass in. It figures out this little bit of delta and then just does 800 times, 800 times for X and Y. Gives us a complex, and then does this depth to infinity. So yep, the Mandelbrot set is a map over the complex plane. And now, I should also say that there are algorithms to compute this faster than this. Like you can do, make certain assumptions that if you're in the Mandelbrot set area and you do a complete perimeter around it and it's all the same color, you can fill that square with that color. You've also seen that it has reflective symmetry over the imaginary axis. So we could just compute the top and reflect it down. There are tricks like that to speed up the processing that Mandelbrot set. This brute force kind of shows the intent of what the algorithm's really doing. It doesn't hide it behind any tricks. Any other questions? Yes? How did the kids respond? How did the kids respond? They loved it. I've since done it for Arlington Ruby and a few other places and decided to submit here. But I'm in the school a couple days a week now and they wrote their own version in Java which is what they're learning in class. They've talked to me about it over and over on all kinds of stuff. In general, I've worked with those students in a lot of various ways, not just the little bit of time we've done in the classroom. This summer, well shortly before school it out last year, one of my students said to me, Mr. Buck, I wanna build a computer this summer. And I thought I was talking about ordering parts off of New Egg. And he said, no, actually, I wanna go old school. I wanna build something with chips and design it myself, design the motherboard myself. And I was like, wow. I don't know if you can do that with modern stuff. It's so sensitive to the timings and everything. I did something like that in the 80s with a book called Build Your Own Z80 Microcomputer by Steve C. Garcia. We did a Google search and people still reference that book, use that book and there are kits available based on that book. So we bought a kit and we built, he built one, I built one. We can actually boot CPM up on it. And we got to prototype. We got to take individual chips out of it and put it on a breadboard and prototype. So I got to show him with LEDs how a 2K memory chip worked. It was really cool. Then my students are also involved in some high school coding competitions that take place at colleges. So it's a high school level, but sponsored by colleges. Really tough questions. They have teams of four, four hours, 10 questions to solve pretty difficult problems. And we took a Coursera course on algorithms this summer to prepare some of the teams for that material. And it's great when you have people that are so into something they're willing to spend their summer on it when they're supposed to be off. And in so many ways, I don't call them kids, at least I try not to. They're my students, but it's kind of scary that I'm teaching these high schools that are only eight years older than my eight year olds. And they're like young adults. It's like, what's gonna happen to my kids in the next eight years? It's scary. They are a few years away from being a peer or a mentor, a protégé on a team I might work with. And they are really mature. And in some ways I feel, especially since I'm not a teacher at the school, I'm a TA. I'm officially a badged employee of the school, but I volunteer on my time. And the background check and all that happens through TEALS. But in some ways I feel like they're more just young friends I have than somebody I have an official relationship with. They work around town. The elementary school kids I teach, I see in the grocery store, and they're like, mom, mom, it's the computer guy. And my high school students, I run into jobs they have in town. It's just really neat. I'm really looking forward to the first crop of my students ending up in the workplace where I can run into them. I had a group of them to Ruby Nation last year, which was from the conference I run in DC. Any other questions? I know I could. The question was if I looked into using the GPU for generation. There's actually quite a few libraries out there for doing Mandelbrot set generation. But that would, from this perspective of the code, turn it into a black box. I'd give it parameters, I'd get an image back that I could display on a screen. And I really wanted to go into what's happening, what's the meat? The speed wasn't the, you know, oftentimes when you optimize for speed, you obfuscate for clarity. And this was about the lesson, not the speed. And the thing is, once you have the understanding, it's like, you know, you can write this in 20 minutes. Anything else? Let's take that last one. Fractal math does not necessarily involve imaginary. Oh, the question is, what is the difference between fractal math and the Mandelbrot set? Summarizing that. The Mandelbrot set is a subset of the world of fractals. And fractals in general came about even before we had math to describe them with things like the Serpinski gasket, the coach's curve, and the snowflake, where, let me pull up, I think I have it in an entry here. There we go. I'm gonna jump to fractals. I did not write this. This is somebody else's material that is awesome. It was a series by Zander, a series of blog articles about the Mandelbrot set. So let's say we start with a, this is the coach's snowflake, or coach's snowflake. Let's start with a triangle. And now every line segment, we're gonna replace a third line, third triangle, third line to make that shape. We keep doing that, and we get these shapes that get pointier and pointier. And mathematically, he goes into this in the article, and mathematically we can prove that these have an infinite perimeter but a finite area. And mathematics knew about this hundreds of years ago, and it was kind of like, that's an aberration of what we wanna study with math. Let's not worry about it. But there are a lot of these fractals that are self-similar is the real key there. The math of the shape of how broccoli grows versus how your lung is put together versus your nervous system, possibly even the connectome of our brain when we're born. How is that complexity wired? If you look at your lung, for instance, it has a trachea, it branches into two. Little bit further down, it branches into two. Little bit further, branches into two, and it just keeps branching, branching, branching, branching, branching. Tree's the same way. Do you think all that is programmed like hard coded in our DNA? Or do you think our DNA probably has 30 lines of code that describe that's what a little lung looks like? I don't know, by the way, we're gonna reuse that to generate what the blood vessels in your foot look like. That's where that math comes in. I is not necessarily involved in all of it, but the mapping of the complex plane involves the Mandebrun set, the Julia set, a few degenerate cases of where we're, we can use that spatial relationship on the complex plane to do stuff.