[Edu-sig] Algebra + Python

Kirby Urner pdx4d@teleport.com
Fri, 27 Apr 2001 21:20:15 -0700


I like to imagine a fictional but possible world in which 
computer programming for everybody (CP4E) means smoother 
integration of math and computer science in the lower 
grades.

In the real world, there's a push to make the teaching of
algebra more widespread at the 8th grade level.  What I 
imagine is that this is the grade level where we might 
formally begin using some programming language (e.g. Python, 
Scheme) in the classroom -- in the sense of having students 
look at and write source code.  In 7th grade, they might 
watch the teacher project some command line stuff, but 
getting under the hood wouldn't happen quite as much.

A link between programming and algebra is in this concept
of variables.  A polynomial in the 2nd degree is typically
written as Ax^2 + Bx + C, which in Python is more like
A*x**2 + B*x + C.  The capital letters are called constant
coefficients and they "fix" a polynomial, give it its 
characteristic "call letters" (like in radio:  the is 
KQPD...).  Then x is what varies -- you might stipulate 
over some domain, e.g. from in [-10,10] (square brackets 
means inclusive).

At the command line, 8th graders would have one kind of 
function called a "polynomial factory" that turned out 
polynomials with a specific set of coefficients.  These
would then be floated as functions in their own right, 
ready to take in x domain values and spit out f(x) range
values.

There may be a better way to write the factory function than
I've shown below.  I'd like to see other solutions:

 >>> def makepoly(A,B,C):	
        """
        Build a polynomial function from coefficients
        """
  	  return eval("lambda x: %s*x**2 + %s*x + %s" % (A,B,C))

 >>> f = makepoly(2,3,4)  # pass coefficients as arguments
 >>> f(10)                # f is now a function of x
 234
 >>> 2*10**2 + 3*10 + 4   # check
 234
 >>> f(-10)
 174
 >>> [f(x) for x in range(-10,11)]  # remember, 2nd arg is non-inclusive
 [174, 139, 108, 81, 58, 39, 24, 13, 6, 3, 4, 9, 18, 31, 
  48, 69, 94, 123, 156, 193, 234]
 >>> g = makepoly(1,-2,-7)  # make a new polynomial
 >>> g(5)  
 8
 >>> g(f(5))                # composition of functions
 4616
 >>> f(g(5))                # f(g(x)) is not equal to g(f(x))
 156

The same technique might be applied to a sinewave function.  Here
the coefficients may appear is follows:

  f(x) = A sin(Bx + C) + D

You can imagine doing the factory function, based on the above
example, or using some (better?) strategy.

Below is a web resource that implements some of these same ideas,
also using a computer language, but to my eye it all looks less 
intuitive in the J language (what the text says is featured).
Is it just me?  Is this just because I've spent more time with
Python?  I'm sure that's partly it.

        http://www.jsoftware.com/pubs/mftl/mftl.htm

Moving beyond 8th grade, we want students to understand what's
meant be D(f(x)) at point x, i.e. dy/dx at x -- the derivative.
Again, Python makes this easy in that we can write a generic 
derivative taker:

  >>> def deriv(f,x):
        """
        Return approximate value of dy/dx at f(x)
        """
  	  h = .0001
	  return (f(x+h)-f(x))/h

  >>> deriv(f,2)       # f(x) = 2*x**2 + 3*x + 4
  11.000200000026439
  >>> deriv(g,2)       # g(x) = x**2 - 2*x - 7
  2.0001000000036129

If you remember how to take the derivative of a polynomial, you'll
know that f'(x) = 4*x + 3 and g'(x) = 2*x - 2 -- so these are pretty
good approximations.

Somebody challenged us on math-teach to think of how we might teach
crypto and number theory to 7th graders.  My suggestions are in this
thread (Number Theory question, reply to Wayne Bishop, 25 Apr 2001
http://www.mathforum.com/epigone/math-teach/zilbangkan ).  I use 
the IDLE CLI quite a bit, along with my ciphers.py

Another post re Python + Intro Calculus, as per the above is at:
http://www.mathforum.com/epigone/math-learn/wonbloryeh

I think any of us who know some Python, and some math, can write
this kind of stuff.  It's not esoteric.  I'd just like to see 
more of it, is all, coming from a lot of different corners.  That's 
because I think a CP4E world would have some major advantages over 
the current one, including more students motivated to comprehend 
technology at deeper levels (I think adding more computer stuff 
to math will make it less of a turn off for many students, if 
done in a cool and interesting way (which doesn't have to mean
super glitzy at every turn -- a bare bones CLI ala IDLE can be 
part of it)).

Kirby