I plan to put up a number of interesting algorithms on this site, the first of which is the correct way to do mortgage calculations.
I have written two Ruby programs that carry out Shor's factoring algorithm. One is an inefficient implementation, useful mostly for illustration. For a more efficient program, this a complete implementation of Shor's algorithm, the best that can be done on a classical computer, i.e., I had to fake the "quantum entanglement".
After the 2012 presidential election I got interested in combining polls to predict the elections. My Predicting Elections page lets the user combine any number of polls to make election predictions.
My son, David, and I published an encryption algorithm which allows multiple messages to be encrypted in one transmission, each message having its own passphrase. Our algorithm is based on Ron Rivest's Chaffing and Winnowing scheme and also Rivest's package algorithm. Our method, called MMPC for Multi-Message Package Chaffing, has some unusual applications. One could, for example, send the same file to several recipients but with different passphrases for each so that each recipient would not only see a different message, but no one but the sender would know that there was more than one message contained in the file. Or the sender could put two messages in one file, the intended message and a fake one, so that if the "password" was demanded, the sender could reveal the password paired with the fake message to satisfy the person or authority demanding to see the contents of the message.
I took an online course on Bitcoins, only because I was interested in the technology of decentralization. The block-chain used by Bitcoin has a couple of nice schemes for ensuring that the chain has not been modified, and that may lead to other uses of the chain technology, besides as a crypto-currency. With the "other uses" in mind, I wrote a program that uses Bitcoin's Merkle tree scheme and the combining of each block's hash with its successor's head to keep a running hash. The chain's head hash, typically 256 bits, can serve as a sentinel that the chain has not been modified. Here is my Ruby implementation of a Bitcoin-like block chain and here it is in Python.
I like to dabble in number theory and encryption. If you do, too, or even if you are only interested in seeing how things like testing a number to see if it is prime, or perhaps finding the multiplicative inverse of a number work, take a look at my number theory library in Ruby or number theory module in Haskell or number theory module in Python code.
I have started a statistical applications module in Haskell with the well-known "birthday" problem. And here it is in Python. Here is a graph that shows how the probability of a match on any birthday in a group of n people varies with n. The probability exceeds 1/2 when n = 23. Matching on a specific birthday, say yours, in a group of n other people varies with n like this and exceeds 1/2 when n = 253.
Quadrature using Simpson's rule is well known, but there is a way to improve the accuracy. The trick is to vary the interval size with the function. When the function is smooth, longer intervals will suffice and when the function is changing rapidly, shorter intervals will be needed. Here is Python code for adaptive Simpson integration. The test code integrates the normal curve and uses the result to approximate pi, approximates 5! by integrating the gamma function, and integrates cosine from 0 to pi / 2 which should yield an area of 1.
Is it possible to flip a coin electronically? You might think it would not be possible to do a trusted random coin flip between two parties in different locations. There is an ingenious mathematical algorithm that is titled "Coin Flipping by Telephone" and dates to 1982, i.e. before we were all using the internet. Here is an explanation of this algorithm, followed by an implementation in Ruby and some examples. And here is the same thing written in Python.
But, there is an even simpler way to flip a coin fairly using cryptographic hash functions. The trick is for one party to make a random heads/tails choice and to send, i.e., commit that choice hashed with a random string to the other party. The second party then guesses the choice the first party made. It's easy to confirm the first party's choice to the second in the event of a mismatch. Here is Ruby and Python code for coin flipping using a cryptographic hash.
I have a great interest in electric vehicles and own a 2015 Nissan Leaf. It's possible, but perhaps not obvious, to track the Leaf's efficiency. There are two ways using the car's instrumentation and I initially used one of those methods. More recently I set up an integrating power meter to accurately measure the energy supplied with each charge. My Leaf spreadsheets, before and after incorporating the 240 VAC kWh meter, are here. If you click on the cells you can see the formulas I use. (There is even a worksheet for my gas-powered 2000 Toyota MR2.)
Ever wonder where you spend your time and money? Me too, so I wrote a Ruby program to keep track of things. It requires a data file, which takes some time to construct, but little effort to maintain. There is a Driver file, a Class file, a Partial data file, and a Partial output file. I call this program 'lv' for Life Value.
My books, How Things Mathematical Work and In Your Head, are available from Amazon.
To comment or report errors in my code, you can reach me here.