Python in the Mathematics Curriculum

a talk prepared by
Kirby Urner
for
Pycon '04
March 24-26, 2004

Preamble

I thought it would be useful, at least in the written version of this talk, to attempt more overview and context. I've already posted a lot of example code and curriculum, in conjunction with others, to the web. Rather than include too much of that here, I'd like to take this opportunity to provide a snap shot of my current thinking, something to look back on later, partly to gauge how accurately I was reading the signs -- or how misled. Those mostly interested in reading source code should follow the links or run some searches.

Setting the Stage

Computer science used to be an exclusively university-based discipline, as universities were the only institutions, outside the government and big business, who could afford big iron. Then came the PC revolution, spearheaded by Apple and IBM, the latter in partnership with Microsoft. A generation of IT workers trained up on this equipment, while a separate and still university- based cadre continued in the Unix tradition. These last two trajectories converged thanks largely to the GNU and Linux projects, which brought a Unix-like operating system to the desktop. Apple has followed suit, basing OS X on FreeBSD.

The pre-college curriculum was somewhat indirectly impacted by the universities-only phase of the computer revolution in the 1960s, with the advent of the new mathematics in the United States. This included a hefty helping of boolean algebra, so-called truth tables, which have remained in most curricula to this day. "Computer programmer" entered the lexicon of school kids, as a new career possibility. Computers invaded science fiction and popularizations. The dream of a chess playing computer, first triggered by The Turk in Napoleon's day, was finally being realized.

With the PC revolution, Apple 2es and IBM PCs (and clones thereof) began infiltrating the classroom. MIT's Media Lab was a galvanizing influence, in the form of Logo spurred Seymour Papert's evangelism. BASIC was embedded in the ROM chip of the earliest PCs, with floppy-based versions to follow. But probably more than programming, education software began to exert its influence in the schools, based on the computer game model. Some were little more than electronic page turners. Others, such as Rocky's Boots, encouraged more open-ended discovery and play. In either case, the model was two or three computers in the classroom, and a library of software titles designed to guide students with a minimum of teacher supervision. The computer was a workstation on the sidelines, a way to keep a few kids occupied, while others did something else. This pattern remains popular to this day.

The PC revolution made it possible to set up computer labs, somewhat on the model of the typing classes of the preceding two or three generations, still included). Business applications, especially spreadsheets and wordprocessors, were given the most attention. Topics such as programming, computer architecture, database design, and system administration, were largely untouched.

The advent of the open source revolution and its migration to the most affordable computers, including ones too underpowered to run the latest Windows, is driving the curriculum in new directions which we're still working out.

Either as a product of this revolution, or as a simultaneous development, a more mature and full-blown computer science curriculum is migrating from the college level into K-12. A new track is being set up, leading towards in AP computer science test in many, but not all, cases. The emphasis is now shifting more towards actual programming, versus education software and business applications. In this regard, the Logo and BASIC threads of the late 1970s and early 1980s are being continued. Adding to this mix is web development, with initial emphasis on HTML and JavaScript, but likely with more CGI and web application development to follow.

Of course this historic progression of computing from larger to smaller does not mean that the impact of the larger, more expensive systems has gone away even as the smaller ones have become more affordable. Kids now grow up knowing that cartoons and special effects, both central to media culture, have everything to do with computers, in part thanks to the "making of" featurettes added to most DVDs. TV and film are also edited using software. So kids are getting the message that many creative fields, from architecture to zoology, involve digital media, and that usually means computers in some way or another, and often computers that are still too expensive for the average home user. All this helps drive both student and parent demand for more relevant exposure to the technology -- and not just calculators.

The Impact of Open Source

From the standpoint of a computer science curriculum, learning on an open source platform simply makes sense from a pedagogical point of view, economic considerations aside. Students are allowed to poke around inside the guts of a sophisticated operating system, to get a sense of how it works. The details are only thinly concealed, and yield to concerted digging, especially if supplemented with expert guidance.

The cultural message embedded in the open source process is clear: we see you as equals, we trust you to understand us and join us, even if we've never met you. On a closed source platform, the message is more: you are just the end user, we make life easy for you, and we hide the inner workings, which aren't your business. Except in computer science, what's happening behind the scenes is our business.

But it's not only the operating system which is open source, and the kernel is not where the majority of would-be programmers would even want to start. Of greater interest are the applications, the MP3 players and arcade games, or the web application servers. And so many come to Python by way of Zope, Pygame etc.

The exploration of pre-existing code in user space is what brings many students into first contact with the so-called scripting languages. They find out about Perl, Python and PHP when wrapping their heads around some LAMP installation (Linux Apache MySQL and any of the above). But this pattern is still quite atypical in high school, especially with respect to the formal curriculum. Open source is only beginning to make inroads, and client-server setups such as LAMP do not yet appear on the average high schooler's radar. However, this status quo is unlikely to persist.

Additionally, I think a key cultural phenomenon is the evolving perception of geek culture as a whole. What many students discover is a global network of loosely organized, yet talented individuals, including many free spirits. The network is cosmopolitan and guided by some newly articulated principles regarding how some forms of intellectual assets should remain freely accessible and reusable. While these values might seem another ideological pipe dream, were they expressed in merely political terms, in this case the lingua franca of the movement is source code, and licensing agreements designed to protect it against leaking off into the proprietary sector. Even though Python may be used in proprietary ways, Python itself remains free.

Despite SCO's attempts to paint this as an "us versus them" conflict between the original pioneers of Unix, and an unauthorized band of software pirates who merely exploit what has come before, people in the know realize that "they are us" i.e. the core developers consciously adopted an open source route, because it makes the most sense from an engineering standpoint. Every developer needs an operating system -- so why not develop one together and keep it open?

The Linux and FreeBSD developers are continuing a venerable tradition, not hijacking it. Techies rule, while those mainly looking for a quick buck are finding themselves marginalized. Those with a longer term strategy have hopped aboard the open source bandwagon, even if, as is the case with IBM, proprietary software remains a core source of revenue. Given how many chip sets are covered by Linux, maintenance on top of a common OS leads to great savings, fewer headaches, and an improved customer experience.

This arising of a global culture, typified by ethical values, connects to the hopes of the third world to develop high tech economies around indigenous talent, without suffering so much of a brain drain and colonization by outsider corporations. Governments are eyeing open source partly out of an inate sense of nationalism, which in more economic terms means keeping relevant know-how local and indigenous. How exactly the new policies pan out remains to be seen, but the fact remains that geekdom has become a place to channel one's nationalism, altruism and idealism, somewhat outside the scope of traditional politics.

From the standpoint of a Buckminster Fuller enthusiast such as myself, the open source movement has many of the hallmarks of what he projected as a "design science revolution," which would be global and focused on actual artifacts over political rhetoric.

Meanwhile, Back in the Classroom

So how are all of these social trends and pressures likely to play out in the school, in some ways a microcosm of society? To some extent, we see a rise in geekdom, a shedding of some of the negative stereotypes and memes. The glamour of high tech has not worn off, despite the dot-com crash. New, useful gadgets keep coming to market (many of them first appearing in Japan) and technology skills remain relevant in the market. The pressure to continually update one's skills has not slackened.

Increasingly, there's also the sense that knowing about computers is an essential aspect of knowing "how things work" in general, just as having some knowledge of the internal combustion engine was (and still is) a standard aspect of general literacy.

On the curriculum front, new synapses are being formed as we speak. The AP computer science test is driving schools to scrounge up new faculties, likely not math teachers, as math teachers are still in short supply and need to stick to their traditional role. Shop teachers, who might have done things around machine tools and electronics before, are moving to computers by way of robotics. Even some music and art teachers are being pressed into learning Java, as their job descriptions radically change in accordance with tight budgets. The more recent graduates, usually younger teachers, are coming to teaching with more of the formal training and background already in place. More teachers actually majoring in computer science will soon be lining up to teach it at the high school level.

Meanwhile, computer science text books aimed at high schoolers are hitting the market, in many cases derived from college-focused counterparts. Many of these focus on Java because this language has recently displaced C++ as the language of the AP test. But not all schools are focused on the AP test (it is still not recognized by state schools in some states -- Oregon for example), and even many that are building towards Java do not start with it, but keep some earlier language in the picture, such as Visual Basic or Pascal. At this time, few are using Python, and many high school faculty members haven't yet heard about it. The idea of starting with Python and transitioning to Java through Jython is not even on the radar screen of most high school faculties at this point.

Python's relative obscurity has partly to do with the fact that open source culture is still at the beginning stages of making inroads, in the form of computer labs with diskless workstations and such. Based on my own informal polls and research, teachers already using open source are much more likely to already know about Python, even though Python is quite happy running on Windows (it's not part of the Windows "distro," except from a few vendors such as HP, who don't advertise its presence to end users -- which fact leads to a lot of emails to the webmaster@python.org, and hence the FAQ).

In the short term, I see this rewriting of college level text books for the high school context as the core response of publishers. Having worked in a publishing company in the 1980s, I know that the most profitable way to go is to recycle what's already in inventory, changing it in various ways, but not rewriting from scratch.

In the longer term, what I wonder about is the unavoidable duplication this approach entails, between what's going on in introductory computer science, and what's being taught within the traditional mathematics curriculum. And to a somewhat lesser extent, I wonder about the impact of computer science on how we teach the humanities, such as grammar and writing.

A poet friend of mine, Gene Fowler, is adamant that XML should be viewed as an extension of our system of punctuation, and become the purview of all literati. He takes this design goal that XML be "human readable" very literally in other words, and I can well imagine a kind of poetry which combined words with markup. We shall see. Plus I think the Document Object Model (DOM) might relevantly be studied in language class, right along with outlines, tables of contents, indexes and other literary infrastructure. Should regular expressions be taught in language class as well?

My more limited focus here is more on dovetailing computer science with traditional mathematics at the high school level. I see it as inevitable that computer science will be making deeper inroads, based on the trends and pressures narrated above. And I also think this cannot help but impact our approach to mathematics teaching, which is currently making do with calculators (albeit of increasing sophistication), and focusing on the AP calculus test, and not the AP computer science test, as its guiding objective.

Transforming K-12 Mathematics into a Math/CompSci Hybrid

Hybridization would be one way to go, and I think something along these lines is likely to evolve. Computer science is going to drive high school mathematics to reform. This will be a new pressure, somewhat different from the NCTM's vague lip service in favor of "technology in the classroom," a phrase referring to calculators, or applications such as Geometer's Sketchpad -- but not real programming.

The math teaching community, here in the USA and to some extent in the UK, is already in the throws of "math wars" pitting more traditional pedagogues against those experimenting with new content and techniques (was it ever any different?). What's noticably absent from the math wars debates is any serious attempt to grapple with the advance of computer science into the K-12 curriculum.

Math teachers I encounter via internet discussion lists and newsgroups are still mostly debating about calculators, their use and abuse. Computers tend to be viewed in the way that many mathematicians view them, as platforms for Mathematica or MathCad. As high end calculators become more able to evaluate integrals or differentiate in symbolic terms, the distinction between calculators and computers begins to fade -- and the content of computer science is again not discussed.

So let's look at computer science. What does it entail. Some computer language is chosen, for illustrative purposes, be that MMX pseudo-code or something higher level, like Pascal or, these days, Java (or, I would of course suggest, Python).

Some of the topics typically investigated would then include: data structures (array, tree, queue, stack), sets, functions and relations, combinatorics, algorithms, recursion, sequences and series, sets, unary and binary operations, closure, graphs (as in networks), plotting, bytes and words, classes and objects, tuples and relations (in the database sense), hardware architecture, protocols, bases 2, 8 and 16.

The above paragraph is a "bag" i.e. an unordered list or hodge-podge, a pseudo-random sprinkling of nodes on the curriculum neo-cortex (the topic of pseudo-random numbers should be added to the bag). It's easy to come up with such lists by looking at such titles as Concrete Mathematics (Graham, Knuth, Patashnik), The Art of Computer Programming (Knuth), or any other computer science text book (Mathematical Structures for Computer Science by Gersting is another good example) -- not that any of these are directed specifically towards high schoolers.

But just throwing out these topics is sufficient to make my point, which is that computer science does not intersect with the math curriculum simply in terms of shared hardware, but rather the intersection is at the level of core content. To put it differently: computer science is already exemplary of a kind of mathematics curriculum in which computers are incorporated. So in this sense we're not waiting to find out how mathematics will absorb computers -- we're already seeing how this is done, in the form of computer science.

And so I see the encroachment of computer science into the high schools as at least initially somewhat competetive with the traditional curriculum. For the first time in a very long time, the pre-college mathematics curriculum is getting a makeover from a neighboring discipline. The ecology is being disrupted. For example, there's potential here for computer science to be cast as an underdog, recruiting students (and teachers) who are dissatisfied with a mathematics track that seems to lack immediate relevance. Whereas the calculus will remain important, it's somewhat debatable whether a high degree of proficiency in integration by parts by the end of high school, is any more worthy a goal than mastery of regular expressions (both technical skills), especially if a conceptual grasp of the calculus is an element in both scenarios.

Mathematics is a huge body of literature, and technical proficiency is possible only with regard to a smattering of topics by the end of high school. What should these proficiencies be? Of course one might aim for high marks on both the AP calculus and AP computer science tests. However, my view is that we will be forming a kind of Y (a fork), with arithmetic as the common stem, a technology focused math branching up one prong of the Y, and a more traditional and somewhat more technophobic prong heading off towards AP calculus.

So where's the hybridization in this picture? I think the technology focused math will have to shoulder more of the burden of teaching mathematics itself, as a larger pool of students (including many talented and gifted), choose this path over the more traditional one. Given high school doesn't presume foreknowledge of the basic mathematics (as a college course might), but provides initial exposure, the hybrid track will need to simultaneously impart the basics, and apply it in a computer science context.

Which brings me to Python. I think this language, above just about all others at the time of this writing, is accessible enough to not get in the way, not consume too many brain cycles, even as we're trying to get through quite a lot of material. It will become the student's friend, less his frustrating foe, helping her or him to gain insights into the material, versus obfuscating it with a lot of clutter and extraneous syntax.

Math Through Programming

Let me wipe the slate clean for the moment and take the wild liberty of sketching in some of the elements I would think would make for a viable and vital math-compsci hybrid, suitable for high schoolers.

First, I think it's obvious that geometry segues into computer graphics. The analytic geometry we already teach will be transposed to the screen, as happened to some extent with Logo. As I believe Arthur Siegel will demonstrate in the next presentation, this transposition does not necessarily mean losing touch with Euclidean roots, in the sense of deriving theorems from axioms. Euclid's Elements has traditionally entered the curriculum as the prime example of a mathematical system, and that's certainly still one of its useful roles.

However, as a student of R. Buckminster Fuller, I have to say that I've been impressed with the early accessibility and relevance of spatial geometry if taught in conjunction with alternative concepts, by which I mean his concentric hierarchy of polyhedra and closest sphere packing arrangements.

For those who find Fuller's writings too obscure, I point then to The Book of Numbers by Conway and Guy, both well-established mathematicians. In this book, as in Fuller's magnum opus, Synergetics, polyhedra are built up by packing spherical elements together, with counts taken at each step. This is akin to the figurate numbers in the plane, most obviously the triangular and square numbers, but here moving into volume to examine octahedral, icosahedral and cuboctahedral numbers.

What I like about this approach is the connection between rule-driven (program driven) number sequences, such as 1, 3, 6, 10.., or 1, 13, 55, 147 and the corresponding, visually appealing shapes. This forges connections between algebra and visualizations, but in a way more basic than by means of Cartesian coordinates (or any coordinates). Moreover such sequences provide an ideal beginning for learning to program. For example, take the triangular numbers in Python:

def tri(n):  return n*(n+1)/2  # return the nth triangular number

It would be harder to think of a much simpler program, and yet this sequence is already packed with relevance. It represents the number of ways a n+1 things might interconnect, i.e. to n other objects, dividing by two because we want to count A-to-B and B-to-A as the same edge.

When dealing the spatial shapes, we have the surface counts versus the cumulative volumetric counts, and will be able to find second and third powering relationships in the respective sequences. Understanding that radial, areal and volumetric growth correspond to 1st, 2nd and 3rd power sequences is a key curriculum goal (according to the current California standard, to be achieved by the 8th grade).

 
def cubocta(n):
     "Shell counts -- a growing cuboctahedron" 
     if n==1: return 1
     else:    return 10 * n**2 - 20*n + 12

>>> [cubocta(i) for i in range(1,10)]
[1, 12, 42, 92, 162, 252, 362, 492, 642] def cumcubocta(n): "Cumulative count (all shells + nucleus), of a cuboctahedral packing" return int((10/3)*n**3 - 5*n**2 + (11/3)*n - 1)

And on this topic of volume, Fuller stands out for providing an elegant streamlining of relationships between polyhedra, which he develops by connecting centers of tightly packed spheres in a CCP matrix. His tetrahedron, cube, octahedron, rhombic dodecahedron, cuboctahedron progression comes down to volume numbers of 1,3,4,6 and 20 respectively.

Computer graphics makes this easy to visualize, and the simple integers make it easy to memorize. In going with spatial figures, we're using computers for what they're good at -- high quality spatial renderings, as seen in the movies.

On this topic of sequences, I do not consider it necessary to leave the idea of "generators" for an advanced lesson. Python makes generators easy to think about, with the yield behaving like a print statement -- providing a result without actually returning, and therefore remaining ready for a next cycle. The fact that Python is bringing generators into the foreground with a variant of list comprehension syntax further argues on the side of making "lazy evaluation" or "just in time evaluation" part of the everyday conceptual apparatus of your average Python user.

def pascal():
    "Generate rows of Pascals Triangle"
    row = [1]
    while True:
        yield row
        row = [i+j for (i,j) in zip(row + [0], [0] + row)]

>>> for i in range(10):  print k.next()

[1]
[1, 1]
[1, 2, 1]
[1, 3, 3, 1]
[1, 4, 6, 4, 1]
[1, 5, 10, 10, 5, 1]
[1, 6, 15, 20, 15, 6, 1]
[1, 7, 21, 35, 35, 21, 7, 1]
[1, 8, 28, 56, 70, 56, 28, 8, 1]
[1, 9, 36, 84, 126, 126, 84, 36, 9, 1]		
	  

And on this topic of functions, Python makes it very easy to consider their composition, as functions may be passed to other functions as arguments. Furthermore, functions may be returned as results. With operator overloading, we might make the multiplication symbol do the work of composing two functions to return a function. This is a powerful mathematical idea, which segues directly into permutations in a group theory context (which in turn links to cryptography). The traditional K-12 mathematics curriculum is, I would argue, less able to drive the abstractions because it doesn't have anything so concrete to stand on as the interactive Python shell and operator overloading constructs.

The concept of addressing should be approached with coordinate systems as particular examples of addressing schemes. In addition, we have labeling, a way of associating points with letters. Python makes it easy to associate letters with tuples, using dictionary syntax. Triangle ABC may be represented as a dictionary of three letter keys associated with 3 xy pairs, or points. Or we might number the points if we don't want to use letters (many geometric file formats take this approach). Or we might name our points New York, Calcutta and Tokyo -- because we have many ways of addressing spatial locations, including geographic names, which key to latitude and longitude coordinates (another addressing scheme, perhaps read off some hand-held GPS device).

A general idea here is to relate graph theory, networks, to geography. In looking at polyhedra as wireframes, we're setting up an easy transition to the vocabulary of edges and nodes as applied to global infrastructure, such as the internet itself, or transportation systems in general. How do we uniquely identify all the airports in this world? A system of 3-letter codes. Again, the theme here is addressing -- which will later join us to the topic of computer memory and the addressing thereof. Addressing schemes (e.g. URLs) and coordinate systems -- these two topics belong in close proximity.

In a second pass through coordinate geometry, we'll swap out tuples and substutite vectors, which internalize the tuples as data, but also supply a host of vector methods, such as addition, subtraction, scaling, dot product and cross product. From vectors we'll move to matrices, rotation matrices in particular, again using Python, but writing to some API for the resulting graphics (such as VPython, VRML or POV-Ray).

However, before we get to vectors, with operator overloading, we need previous experience building other more familiar math objects. And so I move from my geometry track back to the algebra track, where we were learning the basics by programming simple sequences.

A next type we might build is the rational number type. For this, we will need to review the concepts of gcd and lcm. One hallmark of a computer science curriculum, versus the traditional math curriculum, is inclusion of the Euclidean Algorithm for the gcd. Python expresses Euclid's Algorithm every simply:

def gcd(a,b):
    while b:
        a,b = b, a % b
    return a

And the lcm:

def lcm(a,b):  return (a*b)/gcd(a,b)

But now I would swerve from the traditional curriculum and more in the direction of abstract algebra, with its focus on groups, rings and fields. This is considered college level stuff, but the Algebra II text books try to hint at it, I think usually ineffectively. With Python's operator overloading, these topics are just too good to pass up, by means of integers modulo N. Another hallmark of a computer science math, versus a more traditional one, is the importance of modulo arithmetic early on (in part because registers tend to wrap around to 0, if you keep adding 1 to them).

In addition to integers modulo N, Python may be easily used to introduce the concept of permutations and their multiplication in finite groups. The expression of a permutation in cyclic notation becomes a useful programming exercise.

This topics will again connect us to the gcd and the concepts of totative, totient and relative primality. This delving into group and number theory, in the context of learning to program, will provide students in this curriculum with a deeper theoretical understanding of algebraic systems than their counterparts currently pursuing the traditional sequence. High school computer science, as envisioned here, does not leave students poorly prepared to go further in mathematics.

def totatives(n):
    return [i for i in range(1,n) if gcd(i,n)==1]
	
def totient(n):  return len(totatives(n))


>>> [totient(i) for i in (45,64,75,100)]
[24, 32, 40, 40]	

Another object we'll want to build is the Polynomial. Having covered groups, rings and fields to some extent, we'll be ready for the idea that polynomials form a ring, meaning they form a group under addition, but not under multiplication. Multiplication of single-variable polynomials by algorithm has the advantage of getting us away from FOIL to a more comprehensive approach:

class Poly (object):


    def __init__ (self,coeffs): 
        self.coeffs = coeffs
		 
    def __call__ (self,x):
        return sum([b*x**i for i,b in enumerate(self.coeffs)])
		
    def __repr__ (self):
        r = ' + '.join(["(%s * x**%s)" % (b,i) 
	               for i,b in enumerate(self.coeffs) if b<>0])
        return r.replace(' * x**0','')
		
    def __mul__ (self, other):
        outerp = [(e1+e2, c1*c2) for e1,c1 in enumerate(self.coeffs) 
		                         for e2,c2 in enumerate(other.coeffs)]
        sums = {} # add like terms in dictionary
        for t in outerp:
             sums[t[0]] = sums.get(t[0],0) + t[1]
        return Poly([sums[i] for i in range(len(sums))])

>>> p = Poly([1,2,3,4,0,5])
>>> p
(1) + (2 * x**1) + (3 * x**2) + (4 * x**3) + (5 * x**5)
>>> q = Poly([0,3,0,0,1])
>>> q
(3 * x**1) + (1 * x**4)
>>> p*q
(3 * x**1) + (6 * x**2) + (9 * x**3) + (13 * x**4) + 
(2 * x**5) + (18 * x**6) + (4 * x**7) + (5 * x**9)

From polynomials, we might move on to Vectors. By this time, if not before, it will be seeming natural to think of "math objects" as extending a kind of type system. The newer, often more complicated types, incorporate the older ones. For example, the "vector field" recycles the reals (or floats), by incorporating them into a new kind of object. If Clifford Algebra eventually catches on at the high school level, as some anticipate, then the vector type will be subsumed within another yet more elaborate kind of object, the multi-vector. Or, we might simply make do with quaternions.

Calculus will also get some treatment in Python. We can add symbolic differentiation to our Polynomial object without much effort. The generic concepts of derivative and integral may be communicated using the fact that Python functions are top-level objects, passable as arguments to other functions. What many high school calculus students have trouble getting, because in point of fact the notation isn't always clear about this, is that the derivative operator works on functions to return functions. Python will help make this clear.

A theme running through all this is the emergence of "dot notation" in the context of mathematics.

Summary of Main Points

Probably the more controversial aspect of my thesis here is that computer science is likely to compete with traditional mathematics at the high school level. The more common view is that mathematics will chug along as is, making do with chalk boards and calculators, and computer science will have a relatively marginal existence on the side, more of a vocational track, like shop.

However, I think the more common analysis overlooks the content of a bona fide computer science curriculum, what's needed to make sense of the higher level languages now appearing on the AP computer science test -- first C++ and, most recently, Java. I also think the more common view does not accurately weigh student demand, including dissatisfaction with the mathematics of postponed gratification, a sense that "relevance" is deferred year after year. Computer skills, on the other hand, offer more immediate payoff, if only in the form of some JavaScript on a personal web page.

The emphasis, and notation (if we consider a computer language as notation, albeit an interactive one) is different enough along this new track, that it cannot be easily blended in to the traditional mathematics track as another thread, much as some early math texts attempted to do with BASIC or Logo. The field has grown too much in the mean time, commensurate with its accessibility, affordability and relevance to youth.

And so rather than solving the problem with new threads within the traditional math curriculum, I see that we're headed for a fork. The computer science track will branch off from the precalc/calc track, and carry enough math threads along with it to compete as an alternative math track, but with more technology in the picture, and a different sequence and mix of topics. It's in this sense that I speak of hybridization: the new track will incorporate quite a bit of basic math content, because especially at the high school level, it needs to be introduced, not presumed.

This competing technological track, increasingly centered around open source tools, will take many important math concepts further and deeper than has been traditionally accomplished pre college. In other words, it need not be typecast as a pale imitation of a math curriculum with only shallow samplings. We could think of it as "math from Mars," to register its somewhat alien, and I think surprising invasion of what, hitherto, has been a semi-protected sanctuary.

It is in this context (among many) that I think Python is well positioned to move forward, as both the general purpose programming language it already is, and as an expressive notation well suited to capturing the imaginations of young people, ready to embark on new adventures.