[Edu-sig] More pythonic math

Kirby Urner urnerk at qwest.net
Sat Oct 15 01:14:50 CEST 2005


Another example of Pythonic mathematics, two posts so far at:
http://mathforum.org/kb/message.jspa?messageID=4019537&tstart=0

Here's a new edition, better formatting, typo fixed:

========

I've got a gig coming up, so thought I'd do some notes here. It's a Python
class, and I'll be using math topics to motivate problem solving. For
example, there's no factorial built-in = an opportunity to program:

 from operator import mul

 def factorial(n): 
     return reduce(mul, range(1,n+1))

 >>> factorial(10)
 3628800
 >>> factorial(100)
 93326215443944152681699238856266700490715968264381621468592963
 89521759999322991560894146397615651828625369792082722375825118
 5210916864000000000000000000000000L

The course starts out with data structures, a foundation on which to build.
Data structures are for storing and later accessing information. In Python,
this might involve pickling, i.e. serialization of objects. Or we might
write out to text files, use a SQL engine, save to the ZODB, or pipe out
through sockets to some unspecified receiver with a TCP/IP address (an IP
number). We might use Twisted for this latter purpose.

On the math side, the data structure we call a dictionary is a collection
type known as a mapping, in that it associates or pairs keys with values. We
may pick our keys and values from the same domain and codomain, in which
case we have a mapping of maybe integers into integers, or floats into
floats, or characters into characters.

This last mapping (characters into characters) is a jumping off point to
simple encryption by means of letter substitution (we treat the space as
just one more letter):

 >>> import string
 >>> string.uppercase
 'ABCDEFGHIJKLMNOPQRSTUVWXYZ\x8a\x8c\x8e\x9f\xc0\xc1\xc2\xc3\xc4\xc5\xc6\
 xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd8\xd9\
 xda\xdb\xdc\xdd\xde'
 >>> myset = string.uppercase[:26]+' '
 >>> myset
 'ABCDEFGHIJKLMNOPQRSTUVWXYZ '
 >>> from random import shuffle
 >>> domain = list(myset)
 >>> shuffle(myset)

 Traceback (most recent call last):
 File "<pyshell#15>", line 1, in -toplevel-
 shuffle(myset)
 File "c:\python24\lib\random.py", line 269, in shuffle
 x[i], x[j] = x[j], x[i]
 TypeError: object does not support item assignment
 >>> shuffle(list(myset))
 >>> myset
 'ABCDEFGHIJKLMNOPQRSTUVWXYZ '
 >>> outputs = domain[:]
 >>> shuffle(outputs)
 >>> myfunc = dict(zip(domain,outputs))
 >>> myfunc
 {' ': 'C', 'A': 'R', 'C': 'V', 'B': 'P', 'E': 'N', 'D': 'I', 'G': 'K', 
 'F' : 'A', 'I': 'Q', 'H': 'Y', 'K': 'X', 'J': 'G', 'M': 'D', 'L': 'O', 
 'O': 'W',  'N': 'F', 'Q': 'S', 'P': 'J', 'S': ' ', 'R': 'E', 'U': 'B', 
 'T': 'U', 'W':  'Z', 'V': 'L', 'Y': 'H', 'X': 'M', 'Z': 'T'}
 >>> p = 'THE RAIN IN SPAIN STAYS MAINLY IN THE PLAIN'
 >>> def encrypt(p, subdict):
         e = ''
         for c in p:
              e = e + subdict[c]
         return e

 >>> encrypt(p)

 Traceback (most recent call last):
 File "<pyshell#29>", line 1, in -toplevel-
 encrypt(p)
 TypeError: encrypt() takes exactly 2 arguments (1 given)
 >>> encrypt(p, myfunc)
 'UYNCERQFCQFC JRQFC URH CDRQFOHCQFCUYNCJORQF'

Where we're going with this is towards the relations and functions concepts.
Relations pair members in two sets, perhaps the same key (domain element)
with two or more different values (range element), while functions guarantee
a unique and determined value for a given key.

OK for Relation, but not Function:
R(r) --> b
R(r) --> c

OK for Function, and for Relation:
f(r) --> b
f(s) --> b

In addition to defining functions by roster (explicit pairing), we'll be
defining functions according to rules, which is where we transition from
exploring data structures to writing short top-level functions.  Or
functions will often be about sequences, e.g. figurate and polyhedral,
Fibonacci, maybe chaotic.[1]

===== ADDENDUM:  Note to the Teacher ====== [2]

The Python community is in a sense an ethnicity, in that there's a lot of
shared jargon and concepts. This is true in mathematics as well
(sub-ethnicities within ethnicities, e.g. topologists). Per an earlier
thread here at the Math Forum: all math is ethnomath.

This math/CS hybrid involves mixing heroes from disparate domains. We learn
about Descartes and Fermat, sure, but also about Von Neumann, Dijkstra, Ada
Byron.

http://ei.cs.vt.edu/~history/VonNeumann.html
http://en.wikipedia.org/wiki/Edsger_Dijkstra
http://www.google.com/search?hl=en&q=Ada+Byron&btnG=Google+Search

We will also explore the historical beginnings of the World Wide Web:  e.g.
Vannevar Bush (MEMEX), Ted Nelson (Xanadu), and Tim Berners-Lee (W3).[3]

http://en.wikipedia.org/wiki/Vannevar_Bush
http://xanadu.com/
http://www.w3.org/People/Berners-Lee/

I'm suggesting this as an alternative to precalc/calc, i.e. a discrete math
track in K-12, perhaps leading to a different mix of majors, but still
college prep and still an on ramp into engineering and the sciences for the
most part, although these skills also transfer to art/design majors in other
departments as well.

Kirby

[1] added paragraph for edu-sig edition
[2] this was a separate post, originally.
[3] http://worldgame.blogspot.com/2004/12/dj-vu.html




More information about the Edu-sig mailing list