# Old Creations

Matrix Inversion (1988)

The algorithm is primarily based on this identity: `(AT)-1 = (A-1)T`, which says "the inverse of the transpose of a matrix is equal to the transpose of the inverse of the same matrix", and a few other identities for factoring matrices. It may not sound like much, but this allows us to perform simultaneous Gaussian-style row and column operations on any matrix. It doesn't matter if the matrix is singular or if it has more rows or more columns. This algorithm has never failed to produce a good answer, and I have implemented it in several languages. The one on the Demo page is written in JavaScript and runs on your computer.

MPI + IoC (2009)

Message Passing Interface (MPI) is a library of routines for coordinating the execution of copies of an executable on separate cores or networked computers. It is frequently used to divide a problem into pieces that run concurrently, and so speed the overall execution. Inversion of Control is a software idea that takes control from the software written by the user and puts it in the framework that is used by the user's application. The framework coordinates all the (mouse, keyboard, timer, file, or other system) events and calls methods the user registers for handling the events. This is most commonly done for UI systems (Qt, Swing, embedded). The combination of these two ideas leads to a framework that simplifies the creation of software that uses multiple cores and multiple networked machines (especially supercomputers and large clusters). It allows a program to make better use of its resources and even achieve a greater throughput than the usual "divide and conquer" method usually employed for such problems.

This framework is presented in Python, Fortran, and C - source code and demonstration applications for each of these languages.

Bandwidth Reduction (1991)

Inverting a sparse matrix is typically less accurate than inverting a tightly banded matrix. This is a small test routine I wrote while bored. It takes a matrix that represents the connections in a finite-element grid and reduces the bandwidth to what should be the minimum possible, and gives the numbering that should be used for the points to achieve this minimum bandwidth.

Sorting (Selection) (1985)

Sorting isn't always necessary in numerical modeling. Often it's only necessary to select the most applicable pieces of data; sorting a long list can be a waste of CPU. This little routine selects the top matching items from a list.

The Royal Game of Ur (2017)

I just wanted to play this old game. This is one of the oldest board games in the world, dating back about 5000 years. It's a "race game" where each player tries to get their pieces through the path of the board first. But just having the board, the pieces, and the "dice" is insufficient to reconstruct the play. Fortunately there are some ideas preserved in ancient texts that describe some of the rules - see the wikipedia article for more information.

Random Selection (2017)

A friend requested an algorithm for selecting items based on probabilities; this was my solution. Given an array of probabilities (that total 1.0), select the indices according to the probabilities. If the probability at index position 2 of the given array of probabilities is 0.12, that indes should be selected 12% of the time (as the limit of selected items approaches infinity.)