Schwarzschild Orbit by James Pate Williams, Jr.

The Rosette motion of the perihelion precession of a massive object orbiting a black hole (Schwarzschild solution Einstein’s general relativity field equations is illustrated by the graphs below for varying values of eccentricity of the ellipsoidal orbit 0.00, 0.01, 0.02, 0.03, 0.04, and 0.05. The angular momentum constant is B = 1, and the mass is M = 10.

using System;
using System.Drawing;
using System.Windows.Forms;

namespace SchwarzschildOrbit
{
    public partial class GraphForm : Form
    {
        private double B, B2, B4, M, M2, M3, epsilon;

        public GraphForm(double B, double M, double epsilon)
        {
            InitializeComponent();
            this.B = B;
            this.M = M;
            this.epsilon = epsilon;
            B2 = B * B;
            B4 = B2 * B2;
            M2 = M * M;
            M3 = M * M2;
            panel1.Paint += Panel1_Paint;
        }

        private double u0(double phi)
        {
            return M * (1.0 + epsilon * Math.Cos(phi)) / B2;
        }

        private double u1(double phi)
        {
            return u0(phi) + 3.0 * M3 * (1.0 + epsilon * phi * Math.Sin(phi)
                + epsilon * epsilon * (0.5 - Math.Cos(2.0 * phi) / 6.0)) / B4;
        }

        private double X(double r, double phi)
        {
            return r * Math.Cos(phi);
        }

        private double Y(double r, double phi)
        {
            return r * Math.Sin(phi);
        }

        private void Maximums(out double maxR, out double maxPhi,
            out double XMax, out double XMin, out double YMax, out double YMin)
        {
            double phi = 0.0, r = 0.0, XC = 0.0, YC = 0.0;

            maxPhi = 0.0;
            maxR = double.MinValue;
            XMax = double.MinValue;
            YMax = double.MinValue;
            XMin = double.MaxValue;
            YMin = double.MaxValue;

            while (phi <= 8.0 * Math.PI)
            {
                r = 1.0 / u1(phi);

                if (r > maxR)
                {
                    maxR = r;
                    maxPhi = phi;
                }

                XC = X(r, phi);

                if (XC > XMax)
                    XMax = XC;

                YC = Y(r, phi);

                if (YC > YMax)
                    YMax = YC;

                if (XC < XMin)
                    XMin = XC;

                if (YC < YMin)
                    YMin = YC;

                phi += 0.001;
            }
        }

        private void Minimums(out double minR, out double minPhi,
            out double XMax, out double XMin, out double YMax, out double YMin)
        { 
            double phi = 0.0, r = 0.0, XC = 0.0, YC = 0.0;

            minPhi = 0.0;
            minR = double.MaxValue;
            XMax = double.MinValue;
            YMax = double.MinValue;
            XMin = double.MaxValue;
            YMin = double.MaxValue;

            while (phi <= 8.0 * Math.PI)
            {
                r = 1.0 / u1(phi);

                if (r < minR)
                {
                    minR = r;
                    minPhi = phi;
                }

                XC = X(r, phi);

                if (XC > XMax)
                    XMax = XC;

                YC = Y(r, phi);

                if (YC > YMax)
                    YMax = YC;

                if (XC < XMin)
                    XMin = XC;

                if (YC < YMin)
                    YMin = YC;

                phi += 0.001;
            }
        }

        private void Panel1_Paint(object sender, PaintEventArgs e)
        {
            panel1.Size = ClientSize;
            int width = ClientSize.Width;
            int height = ClientSize.Height;
            int deltaX = width / 6;
            int deltaY = height / 6;
            int minX = deltaX;
            int maxX = 5 * deltaX;
            int minY = deltaY;
            int maxY = 5 * deltaY;
            double maxPhi, minPhi, maxR, minR;
            double XMax, XMin, YMax, YMin;
            double UMax, UMin, VMax, VMin;

            Maximums(out maxR, out maxPhi, out XMax, out XMin, out YMax, out YMin);
            Minimums(out minR, out minPhi, out UMax, out UMin, out VMax, out VMin);
            
            double slopeX = (maxX - minX) / (XMax - XMin);
            double slopeY = (minY - maxY) / (YMax - YMin);
            double interX = minX - slopeX * XMin;
            double interY = maxY - slopeY * YMin;
            double chi = 0.0, eta = 0.0, phi = 0.0, r = 0.0, x, y;
            Graphics g = e.Graphics;
            Pen bp = new Pen(Color.Black);
            SolidBrush rb = new SolidBrush(Color.Red);

            g.Clip = new Region(new Rectangle(minX, minY, maxX - minX + 1, maxY - minY + 1));

            for (int i = 0; i < 5; i++)
                g.DrawLine(bp, (i + 1) * deltaX, minY, (i + 1) * deltaX, maxY);

            for (int i = 0; i < 5; i++)
                g.DrawLine(bp, minX, (i + 1) * deltaY, maxX, (i + 1) * deltaY);

            while (phi <= 8.0 * Math.PI)
            {
                r = 1.0 / u1(phi);
                x = X(r, phi);
                y = Y(r, phi);
                chi = slopeX * x + interX;
                eta = slopeY * y + interY;
                g.FillEllipse(rb, (float)chi, (float)eta, 1, 1);
                phi += 0.001;
            }
        }
    }
}

Word to Word Game by James Pate Williams, Jr.

I implemented a computerized version of a game similar to the board game Boggle. Given a jumble of letters find as many words as possible. Suppose we have the jumbled letters “sldfie” then my C++ program outputs:

Now suppose the scrambled letters are “nifrsmo”:

The program uses permutations and power sets. All permutations of the set of three numbers 1, 2, and 3 are:

123 132 213 231 312 321

The total number of permutations of n objects is n! where n! = n * (n – 1) * … * 2 * 1. So we have 3! = 3 * 2 * 1 = 6 and 4! = 4 * 3 * 2 * 1 = 24.


A power set of three objects can generated by using the binary representation of all binary numbers 0 to 2 * 2 * 2 – 1 = 8 – 1 = 7.

0 = 000, 1 = 001, 2 = 010, 3 = 011, 4 = 100, 5 = 101, 6 = 110, and 7 = 111

My main C++ function in the implementation is as follows:

vector<string> PowerSet(char cstr[], int len)
{
    vector<int> index;
    vector<string> match;

    for (long ps = 0; ps <= pow(2, len); ps++)
    {
        string str = ConvertBase2(cstr, ps, len);
        int psf = 1;

        for (int i = 2; i <= len; i++)
            psf *= i;

        for (int i = 0; i < psf; i++)
        {
            if (binary_search(dictWords.begin(), dictWords.end(), str))
            {
                if (!binary_search(match.begin(), match.end(), str))
                {
                    match.push_back(str);
                    sort(match.begin(), match.end());
                }
            }

            next_permutation(str.begin(), str.end());
        }
    }

    return match;
}

Maya Cipher System by James Pate Williams, Jr.

Number of External Keys = 2 ^ 31 – 1 = 2,147,483,647 Possibilities

Number  of the Internal Keys = n-Rotors (8) * 128 (# of standard ASCII characters) = 1024 Internal Keys

Beaufort Internal Cipher with 8 alphabets of 128 internal keys

The system is weak in its current configuration

Here is the 4 A, 8 A, and 12 A cases

I need to strengthen the external key length to at least 2^192 key possibilities by adding a cryptographic secure random number generator instead of a standard weak C type pseudorandom number generator. Another way of strengthening the system would be to rotate each rotor after a one character or one block use. The block length is 8 ASCII characters.

More Tests of two Selection Sort Implementations

In our last blog we introduced two algorithms for implementing the selection sort which differed by the number of swap operations involved. The two required the same number of comparisons n * (n – 1) / 2 = 45 for n = 10, where n is the length of the array to be sorted and different number of swaps. We notice about a two-fold speed up in sorting using the minimal number of swaps version. Also make sure the number of swaps is implemented by a 64-bit integer since 100,000 * 99,999 = 9,999,899,999 which overflows a 32-bit integer. I learned about overflow while trying to sort large arrays of integers.

Who Knew? Better Code for Selection Sort

I have been using inferior code for the Selection Sort since 1979. Last night I found the more efficient pseudo code:

Data Structure and Algorithms Selection Sort – Tutorialspoint

Here is my old code for the Selection Sort in C#:

Old Code for the Algorithm

And my new code from the more efficient pseudo code found online:

New and Better Code
Common Swap Function (Procedure)

Both implementations require n * (n – 1) / 2 comparisons which for an array of length 15 is 15 * 14 /2 = 15 * 7 = 105. The second implementation requires typically fewer calls to the swap function.

Selection Sort Test 15-Element Random Array
Selection Sort Test 15-Element Reverse Ordered Array
Selection Sort Test 15-Element Sorted Array

The first number after the unsorted array is the number of comparisons which is always 105 in our 15-element test cases. The second number is the tally of the swap function calls.

An Anamnesis by James Pate Williams, Jr.

My Pathways counselor seems to believe I would be a good person to enter the Positive Options rehabilitation program at the Troup County Mental Health Clinic. The reason I am not attending the adult daycare and supportive living training  program Pathways, Positive Options, is that I do not see that I would derive any benefit from the program. The program seems to be geared towards the recently or current homeless population with mental aberrations. When I unilaterally stop taking my anti-psychotic medication, I might be a good candidate for the Pathways program. I am pretty much asymptomatic when I take my medication on my own schedule or more likely as prescribed.

I have been under the care of the Troup County Pathways Mental Health Clinic since around 1988 or 1989. I have been under psychiatric care since late 1972 or early 1973. I have sojourned in a good number of hospitals both private and state of Georgia operated:

  1. Peachtree-Parkwood Hospital in Atlanta, private a few months of care in the period 1973 to 1975 1999 Cliff Valley Way
  2. Central State Regional Hospital in Milledgeville, state, a couple of weeks in 1975
  3. West Central Georgia Regional Hospital in Columbus, state, about a month in 1975
  4. Renewal House in Atlanta, state, drug rehab, a few months in 1975 until sometime in early 1976
  5. Bradley Center Hospital in Columbus, private, a few months in late 1986 until early in 1987
  6. Troup County Pathways Mental Health Clinic beginning in probably 1988 or early 1989
  7. New Ventures, state, vocational rehabilitation late 1988 until almost Fall Quarter 1990
  8. Pathways Second Season in LaGrange, two weeks in March 2010
  9. Northwest Regional Hospital in Rome, state, a couple of months in the spring of 2010
  10. Northwest Regional Hospital in Rome, state, two or three weeks in June – July 2010
  11. Troup County Jail from May 8, 2019 until June 12, 2019 and from October 17, 2019 until November 26, 2019
  12. I was shuttled from Troup Count Jail to Pathways Second Season on June 12, 2019. I stayed at that locale from June 12, 2019 until October 17, 2019, a record setting 127 days

Now for my academic records:

I barely graduated from LaGrange High School. I was caught with a marijuana cigarette (joint) in my pocket by the assistant principal Mr. Sturdivant, one day in late Winter 1971. I had to perform a mea culpa before the Board of Education to return to school in time to graduate. I think that my dad and the Chairman of the Board, Charles Hudson, were influential in my graduation. I was a teenage abuser of alcohol and drugs.

I entered LaGrange College in Fall Quarter 1971 and I performed increasingly abysmal in my studies. At the end of Spring Quarter my GPA was a terrible 0.75 out of 4.00. I did not return to the college until Fall Quarter 1976. My drug abuse helped make me a poor student.

I graduated from LaGrange College on June 2, 1979. I earned A Bachelor of Arts in Chemistry with a low 3.00+ GPA. I applied and was accepted to be a teaching assistant in Chemistry at the Georgia Institute of Technology in Fall Quarter 1980. I left Georgia Tech after the Summer Quarter of 1983 sans a degree and with a poor GPA of 2.79 out of 4.00.

I returned to LaGrange College in the Spring Quarter of 1990. I graduated on June 2, 1994 with a Bachelor of Science in Computer Science. I had a 4.00 out of 4.00 in all my computer classes from 1990 until 1994.

I matriculated at Auburn University as a Computer Science graduate student in Fall Quarter 1998. I believe the Professor Alfred J. Menezes was instrumental in getting me accepted at Auburn University. Professor Menezes left Auburn University in the 1990s and went to his old University, the University of Waterloo in Ontario, Canada. I graduated with a Master of Software Engineering in Summer Quarter 2000. I had a GPA of 3.880 out of 4.000. I went onto attain a Doctor of Philosophy in Computer Science in the Fall Semester 2005 with a 3.871 GPA.

My work for dollars record is very spotty and chock full of gaps. However, in my defense, I have done a lot of pro bono work and open-source public domain software development. I designed, implemented, and maintained a cryptography, constraint satisfaction problem, and number theory website that was widely viewed in the period 1997 until 2010 or 2011. I did a lot of sophisticated and some mundane volunteer work for the First Methodist Church of LaGrange, Georgia from 2008 to about 2011. Also, at the advanced age of 65 and 66, I had three live interviews for civilian jobs with the United States Department of Defense in 2018 and early 2019. During the period 2011 until 2018 I had two or three phone interviews and did tests for the Department of Defense.

Another bad idea suggested by my Pathways counselor was for me to volunteer to help at the local food pantry handing out grocery items to the disenfranchised in the community. If I am to volunteer again, I want my unique cognitive skills engaged. I could tutor GED or college students in chemistry, computer science, mathematics, or general science. I could help individuals learn computer programming as a hobby or vocational skill and/or teach Digital Audio Workstation operation and arranging and recording music.  Last but not least I could demonstrate the use of a MIDI keyboard and accompanying synthesizer.