Students will be placed in groups based on projects chosen. These groups will work on their project through the first two thirds of the semester and present their results during the final exam
period. In order to get full credit for the project, your entire
group should understand your code. Your project is expected to consist of multiple Python functions and to
use iteration (`for`, `while` or recursion) and Boolean
logic (`if`, `else`).

Use any source you like; cite your sources and understand what you have taken from them. Your grade will depend on your group's total effort, so a group which copies an online solution may receive a lower grade than a group which reaches fewer conclusions but writes all their code from scratch.

These are open ended questions; you are not expected to answer them completely. If you think you've answered your question completely see me to explore possible extensions. It's better to end your presentation by describing one or two things you tried but didn't finish than to present an open and shut case.

If you find that your project is not working out for your group, or if you're excited about some other project, please see me as early as possible about making a change. The point is to use computers to facilitate mathematics, not to jump through pre-arranged hoops.

- (Factoring Polynomials) Write a Python program which takes a polynomial as input and tests different numbers to see if they are roots of that polynomial. This project may be extended by using the rational root theorem to generate numbers to test, by improving its user interface, by turning it into a teaching tool that checks student work, or by applying Newton's method to search for approximations of roots.
- (Calculus) Write a Python program to find the derivative of a polynomial. What format will your input be? What format will your output be? Start simple and add improvements such as improved user input, graphing capabilities, or tests for critical points.
- (Calculus) Write a Python program to find the integral of a polynomial. What format will your input be? What format will your output be? Start simple and add improvements such as improved user input, graphing capabilities, or integrals of other functions.
- (Cryptography/Linear Algebra) Use Python to encrypt a message using one or more techniques; for example, you might use the Hill substitution cypher, a Caesar cypher, or PGP encryption. If time permits, include an option to decrypt the message. You may also use this project as an introduction to file handling.
- (Number Theory) A Ducci sequence is a sequence of lists of integers. If [x1, x2, x3, ... xn] is a list in the sequence, the next list in the sequence is the list of differences [ |x2 - x1|, |x3 - x2|, |x4 - x3|, ... |xn - x1|]. Write a Python program which accepts a list as input and displays its Ducci sequence. What different long-term behaviors can you find in these sequences -- do they converge or diverge? It's recommended that you start with a short fixed-length sequence (e.g. 3 numbers) and modify your program to handle more complex sequences later.
- (Probability) Write a program which accepts an input n and generates a collection of n random points inside a square, then uses the number of points within distance 1 of the square's center to estimate the value of pi. You can extend this project by considering the accuracy of the estimate for different values of n, the efficiency of the method, and by comparing to other methods of estimating pi.
- (Fractals and Complex Numbers) Given a complex number c = a + bi, consider the sequence recursively defined by:
b If the terms of this sequence remain bounded (don't go off to infinity), then the complex number c is an element of the Mandelbrot set. Write a Python function to test whether a number is in the Mandelbrot set. This project could be extended to explore other dynamical systems or to explore the use of graphics in Python._{0}= 0

b_{n+1}= b_{n}^{2}+ c. - (History of Math) We use the Arabic numeral system to record numbers; internally, the computer uses a binary number system. Write a Python program to convert to and/or from Arabic numerals to Roman numerals, the Babylonian number system, Chinese numerals, or some other numeration system. This project could be extended to explore the use of images or special characters as output, or to develop a highly specialized user interface for entering numerals.
- (Education) Write a Python program to help a student study using virtual flash cards. You could use this as an opportunity to learn to read questions and answers from a file, to allow the user to enter a list of questions and responses, or to experiment with randomizing items in a list. Your final program should be more complex than a simple graded quiz.
- (Finance) Write a Python program to collect information about some type of loan (e.g. student loan, car loan, or mortgage). The program should prompt the user to type in information about the terms of the loan (rate, points, amount, payment schedule) then output information such as monthly payment, time required to pay off the loan, total amount borrowed (e.g. the price of the car) and total amount paid. Clearly state the source of your rate and payment schedule information. An extension to this project might include a comparison of different lenders or terms.
- (Simple game) Write a Python program to play several games of rock, paper, scissors against the user; you will need to research ways of choosing randomly between options in Python. Keep track of games won and lost and display the results when the user has finished. Design options to consider include deciding when to stop, storing information from games played, offering a two player version of the game, and including an option to load a series of "moves" from a file.
- (Elementary education) Investigate the computer programming language Scratch and plan a lesson around it. Your lesson plan should include outcomes (what you want your students to learn from the lesson), a detailed description of activities engaged in and materials presented during the lesson (writing, modifying or using a Scratch program), and a sample assessment to determine whether the students have achieved the stated outcomes. Your Scratch lesson is expected to somehow include a loop and a decision written in Scratch code.