← Back to the tour

Relevant coursework

Some classes at Exeter, and what I built in them.

Applied mathematics · 2026

Fourier Series

A square wave, reconstructed with odd sine harmonics.

Square wave

Odd sine harmonics reconstruct the wave; the overshoot at each jump persists as more terms are added.

SN(x)=4π∑k=0N−1sin⁡((2k+1)x)2k+1

Dashed: target function · Solid: partial sum · All functions have period 2π.

CSC590 · 2026

Creating & Cracking Secret Codes

Design project: ECDSA Blockchain

I rebuilt my cryptography design project as a Python mini-blockchain, implementing elliptic-curve arithmetic and ECDSA from scratch.

Project on GitHub ↗
  • Python
  • Cryptography
  • Algorithms
Arithmeticinverse · add · double
Keys & signaturesscalar multiplication · ECDSA
Blockchainwallets · mined blocks · hashes

The rebuild

This is my rebuilt Python implementation of the course project. I implemented modular inversion, secp256k1 point addition and doubling, scalar multiplication, key generation, and ECDSA signing and verification. The curve and signature code uses only the Python standard library; SHA-256 comes from hashlib.

Signed transactions bind the sender, receiver, amount, and transaction nonce. The chain validates balances and proof-of-work blocks, rejecting overspends, replayed payments within the chain, and altered transaction data. Chain state can be saved and reloaded as JSON.

Try signing a transaction

Wallet A → Wallet B

Sign, change the amount, then verify again.

The signature will appear here.

Interactive companion using Web Crypto’s ECDSA P-256. The linked Python rebuild implements secp256k1 from scratch.

CSC590 · 2026

Game Playing AI

Course project: Connect Four

My minimax agent for a course Connect Four project, with alpha–beta pruning, iterative deepening, and a center-weighted heuristic.

  • Python
  • NumPy

Your move. You’re red.

Browser companion to my Python agent, using the same run weights, center preference, and depth-four alpha–beta search.

The agent

I implemented minimax with alpha–beta pruning and iterative deepening. Center-first move ordering makes promising moves available early, while a 4.8-second deadline bounds the original Python search.

The heuristic rewards my two- and three-piece runs, penalizes the opponent’s runs more strongly, and adds a center-column preference. An eight-entry opening book handles the empty board and first replies.

This was one of the projects throughout Game Playing AI, rather than a final design project. My work is the agent and opening-book builder within the supplied course game framework.

CSC590 · 2025

Database & Back-End Web Development

Design project: CarMaximum

A collectible-car marketplace with accounts, a garage, buying and selling, trades, messaging, and rotating 3D car previews.

  • Express
  • MySQL
  • A-Frame
CarMaximum
A model included in the original CarMaximum project. Drag to rotate it.

The application

Express routes connect the interface to MySQL. The schema links users, cars, ownership records, trade requests, and messages. Joins assemble a user’s garage and trade dashboard.

The application includes bcrypt password hashing and session-based login, car purchases and sales, trade requests, and user-to-user messaging. A-Frame supplies rotating 3D previews of the cars.

CSC505 · 2024

Data Structures & Algorithms

Design project: Hollow Chamber

My CSC505 design project: a roulette-inspired Pygame game with a six-chamber state, dice-driven turns, and five opponents with different decision policies.

Project on GitHub ↗
  • Python
  • Pygame
  • Algorithms
1234566
A view of the project’s six-position circular state.

How it plays

My CSC505 design project is a roulette-inspired Pygame game. A dice roll advances the circular chamber index, and turn handling, cooldowns, and restart logic keep the state connected to the interface.

Five opponents use different stochastic decision policies. Mathy Martha estimates a remaining-chamber probability and adds noise to her decisions.