Tag: math
Blog Entry (c) Friday, April 11, 2025, by James Pate Williams, Jr. Multiplication and Division of Finite Power Series
x = 0.25
N = 5
Series Cosine(x) = 0.968912421711
C++ cos(x) = 0.968912421711
Series sine(x) = 0.247403959255
C++ sin(x) = 0.247403959255
Series Tangent(x) = 0.255341921221
C++ tan(x) = 0.255341921221
Series sin(2x) = 0.479425538604
C++ sin(2x) = 0.479425538604
C++ 2sin(x)cos(x) = 0.479425538604
End app ? y = yes = n
x = 0.5
N = 5
Series Cosine(x) = 0.877582561890
C++ cos(x) = 0.877582561890
Series sine(x) = 0.479425538604
C++ sin(x) = 0.479425538604
Series Tangent(x) = 0.546302489844
C++ tan(x) = 0.546302489844
Series sin(2x) = 0.841470984807
C++ sin(2x) = 0.841470984808
C++ 2sin(x)cos(x) = 0.841470984808
End app ? y = yes = y
x = 0.75
N = 5
Series Cosine(x) = 0.731688868808
C++ cos(x) = 0.731688868874
Series sine(x) = 0.681638760020
C++ sin(x) = 0.681638760023
Series Tangent(x) = 0.931596460023
C++ tan(x) = 0.931596459944
Series sin(2x) = 0.997494986509
C++ sin(2x) = 0.997494986604
C++ 2sin(x)cos(x) = 0.997494986604
End app ? y = yes = n
x = 1.00
N = 5
Series Cosine(x) = 0.540302303792
C++ cos(x) = 0.540302305868
Series sine(x) = 0.841470984648
C++ sin(x) = 0.841470984808
Series Tangent(x) = 1.557407730344
C++ tan(x) = 1.557407724655
Series sin(2x) = 0.909297423159
C++ sin(2x) = 0.909297426826
C++ 2sin(x)cos(x) = 0.909297426826
End app ? y = yes = n
x = 1.25
N = 5
Series Cosine(x) = 0.315322332275
C++ cos(x) = 0.315322362395
Series sine(x) = 0.948984616456
C++ sin(x) = 0.948984619356
Series Tangent(x) = 3.009569952151
C++ tan(x) = 3.009569673863
Series sin(2x) = 0.598472085108
C++ sin(2x) = 0.598472144104
C++ 2sin(x)cos(x) = 0.598472144104
End app ? y = yes = n
x = 1.50
N = 5
Series Cosine(x) = 0.070736934117
C++ cos(x) = 0.070737201668
Series sine(x) = 0.997494955682
C++ sin(x) = 0.997494986604
Series Tangent(x) = 14.101472846329
C++ tan(x) = 14.101419947172
Series sin(2x) = 0.141119469924
C++ sin(2x) = 0.141120008060
C++ 2sin(x)cos(x) = 0.141120008060
End app ? y = yes = y
// DivMulPowerSeries.cpp (c) Tuesday, April 8, 2025
// by James Pate Williams, Jr.
// https://math.libretexts.org/Bookshelves/Calculus/Calculus_(OpenStax)/10%3A_Power_Series/10.02%3A_Properties_of_Power_Series
// https://en.wikipedia.org/wiki/Formal_power_series
#include <iostream>
#include <iomanip>
#include <string>
#include <vector>
std::vector<double> Multiplication(
std::vector<double> c,
std::vector<double> d,
int N) {
std::vector<double> e(N + 1);
for (int n = 0; n <= N; n++) {
double sum = 0.0;
for (int k = 0; k <= n; k++) {
sum += c[k] * d[n - k];
}
e[n] = sum;
}
return e;
}
std::vector<double> Division(
std::vector<double> a,
std::vector<double> b,
int N) {
double a0 = a[0];
std::vector<double> c(N + 1);
for (int n = 0; n <= N; n++) {
double sum = 0.0;
for (int k = 1; k <= n; k++) {
sum += a[k] * c[n - k];
}
c[n] = (b[n] - sum) / a0;
}
return c;
}
double Factorial(int n) {
double nf = 1.0;
for (int i = 2; i <= n; i++) {
nf *= i;
}
return nf;
}
std::vector<double> Cosine(double x, int N, double& fx) {
std::vector<double> series(N + 1);
fx = 0.0;
for (int n = 0; n <= N; n++) {
int argument = 2 * n;
double coeff = pow(-1, n) / Factorial(argument);
series[n] = coeff;
fx += coeff * pow(x, argument);
}
return series;
}
std::vector<double> Sine(double x, int N, double& fx) {
std::vector<double> series(N + 1);
fx = 0.0;
for (int n = 0; n <= N; n++) {
int argument = 2 * n + 1;
double coeff = pow(-1, n) / Factorial(argument);
series[n] = coeff;
fx += coeff * pow(x, argument);
}
return series;
}
std::vector<double> Tangent(double x, int N, double& fx) {
double fc = 0.0, fs = 0.0;
std::vector<double> seriesC = Cosine(x, N, fc);
std::vector<double> seriesS = Sine(x, N, fs);
std::vector<double> seriesT = Division(seriesS, seriesC, N);
fx = fs / fc;
return seriesT;
}
std::vector<double> Sine2x(double x, int N, double& fx) {
double fc = 0.0, fs = 0.0;
std::vector<double> seriesC = Cosine(x, N, fc);
std::vector<double> seriesS = Sine(x, N, fs);
std::vector<double> series2 = Multiplication(seriesS, seriesC, N);
fx = 2.0 * fs * fc;
return series2;
}
int main()
{
while (true) {
char line[128] = { };
std::cout << "x = ";
std::cin.getline(line, 127);
std::string str1(line);
double x = std::stod(str1);
std::cout << "N = ";
std::cin.getline(line, 127);
std::string str2(line);
int N = std::stoi(str2);
double cx = 0.0, sx = 0.0, tx = 0.0, xx = 0.0;
std::vector<double> cSeries = Cosine(x, N, cx);
std::vector<double> sSeries = Sine(x, N, sx);
std::vector<double> tSeries = Tangent(x, N, tx);
std::vector<double> xSeries = Sine2x(x, N, xx);
std::cout << std::fixed << std::setprecision(12);
std::cout << "Series Cosine(x) = " << cx << std::endl;
std::cout << "C++ cos(x) = " << cos(x) << std::endl;
std::cout << "Series sine(x) = " << sx << std::endl;
std::cout << "C++ sin(x) = " << sin(x) << std::endl;
std::cout << "Series Tangent(x) = " << tx << std::endl;
std::cout << "C++ tan(x) = " << tan(x) << std::endl;
std::cout << "Series sin(2x) = " << xx << std::endl;
std::cout << "C++ sin(2x) = " << sin(x + x) << std::endl;
std::cout << "C++ 2sin(x)cos(x) = " << 2.0 * sin(x) * cos(x);
std::cout << std::endl;
std::cout << "End app ? y = yes = ";
std::cin.getline(line, 127);
if (line[0] == 'Y' || line[0] == 'y') {
break;
}
}
return 0;
}
Blog Entry © Sunday, March 29, 2025, by James Pate Williams, Jr., BA, BS, Master of Software Engineering, PhD Slater Determinant Coefficients for Z = 2 to 4
Enter the atomic number Z (2 to 6 or 0 to quit): 2
2 1 1 + a(1)b(2)
1 0 0 - a(2)b(1)
# Even Permutations = 1
Enter the atomic number Z (2 to 6 or 0 to quit): 3
6 3 1 + a(1)b(2)c(3)
5 2 0 - a(1)b(3)c(2)
4 2 0 - a(2)b(1)c(3)
3 1 1 + a(2)b(3)c(1)
2 1 1 + a(3)b(1)c(2)
1 0 0 - a(3)b(2)c(1)
# Even Permutations = 3
Enter the atomic number Z (2 to 6 or 0 to quit): 4
24 12 0 + a(1)b(2)c(3)d(4)
23 11 1 - a(1)b(2)c(4)d(3)
22 11 1 - a(1)b(3)c(2)d(4)
21 10 0 + a(1)b(3)c(4)d(2)
20 10 0 + a(1)b(4)c(2)d(3)
19 9 1 - a(1)b(4)c(3)d(2)
18 9 1 - a(2)b(1)c(3)d(4)
17 8 0 + a(2)b(1)c(4)d(3)
16 8 0 + a(2)b(3)c(1)d(4)
15 7 1 - a(2)b(3)c(4)d(1)
14 7 1 - a(2)b(4)c(1)d(3)
13 6 0 + a(2)b(4)c(3)d(1)
12 6 0 + a(3)b(1)c(2)d(4)
11 5 1 - a(3)b(1)c(4)d(2)
10 5 1 - a(3)b(2)c(1)d(4)
9 4 0 + a(3)b(2)c(4)d(1)
8 4 0 + a(3)b(4)c(1)d(2)
7 3 1 - a(3)b(4)c(2)d(1)
6 3 1 - a(4)b(1)c(2)d(3)
5 2 0 + a(4)b(1)c(3)d(2)
4 2 0 + a(4)b(2)c(1)d(3)
3 1 1 - a(4)b(2)c(3)d(1)
2 1 1 - a(4)b(3)c(1)d(2)
1 0 0 + a(4)b(3)c(2)d(1)
# Even Permutations = 12
Enter the atomic number Z (2 to 6 or 0 to quit):
// AOPermutations.cpp : This file contains the 'main' function.
// Program execution begins and ends there.
// Copyright (c) Saturday, March 29, 2025
// by James Pate Williams, Jr., BA, BS, MSwE, PhD
// Signs of the atomic orbitals in a Slater Determinant
#include <algorithm>
#include <iostream>
#include <string>
#include <vector>
int main()
{
char alpha[] = { 'a', 'b', 'c', 'd', 'e', 'f' }, line[128] = {};
int factorial[7] = { 1, 1, 2, 6, 24, 120, 720 };
while (true)
{
int col = 0, counter = 0, row = 0, sign = 1, t = 0, Z = 0, zfact = 0;
int numberEven = 0;
std::cout << "Enter the atomic number Z (2 to 6 or 0 to quit): ";
std::cin.getline(line, 127);
std::string str(line);
Z = std::stoi(str);
if (Z == 0)
{
break;
}
if (Z < 2 || Z > 6)
{
std::cout << "Illegal Z, please try again" << std::endl;
continue;
}
zfact = factorial[Z];
std::vector<char> orb(Z);
std::vector<int> tmp(Z), vec(Z);
for (int i = 0; i < Z; i++)
{
orb[i] = alpha[i];
vec[i] = i + 1;
}
do
{
for (int i = 0; i < (int)vec.size(); i++)
{
tmp[i] = vec[i];
}
t = 0;
do
{
t++;
} while (std::next_permutation(tmp.begin(), tmp.end()));
std::cout << t << '\t' << t / 2 << '\t';
std::cout << (t / 2 & 1) << '\t';
if (Z == 2 || Z == 3)
{
if ((t / 2 & 1) == 0)
{
std::cout << "-\t";
}
else
{
std::cout << "+\t";
numberEven++;
}
}
else
{
if ((t / 2 & 1) == 1)
{
std::cout << "-\t";
}
else
{
std::cout << "+\t";
numberEven++;
}
}
for (int i = 0; i < Z; i++)
{
std::cout << orb[i] << '(' << vec[i] << ')';
}
row++;
std::cout << std::endl;
if (zfact != 2 && row == zfact)
{
std::cout << std::endl;
break;
}
row %= Z;
} while (std::next_permutation(vec.begin(), vec.end()));
std::cout << "# Even Permutations = ";
std::cout << numberEven << std::endl;
}
return 0;
}
Blog Entry (c) Tuesday, July 23, 2024, by James Pate Williams, Jr. Mueller’s Method for Finding the Complex and/or Real Roots of a Complex and/or Real Polynomial
I originally implemented this algorithm in FORTRAN IV in the Summer Quarter of 1982 at the Georgia Institute of Technology. I was taking a course named “Scientific Computing I” taught by Professor Gunter Meyer. I made a B in the class. Later in 2015 I re-implemented the recipe in C# using Visual Studio 2008 Professional. VS 2015 did not have support for complex numbers nor large integers. In December of 2015 I upgraded to Visual Studio 2015 Professional which has support for big integers and complex numbers. I used Visual Studio 2019 Community version for this project. Root below should be function.
Degree (0 to quit) = 2
coefficient[2].real = 1
coefficient[2].imag = 0
coefficient[1].real = 1
coefficient[1].imag = 0
coefficient[0].real = 1
coefficient[0].imag = 0
zero[0].real = -5.0000000000e-01 zero[0].imag = 8.6602540378e-01
zero[1].real = -5.0000000000e-01 zero[1].imag = -8.6602540378e-01
root[0].real = 0.0000000000e+00 root[0].imag = -2.2204460493e-16
root[1].real = 3.3306690739e-16 root[1].imag = -7.7715611724e-16
Degree (0 to quit) = 3
coefficient[3].real = 1
coefficient[3].imag = 0
coefficient[2].real = 0
coefficient[2].imag = 0
coefficient[1].real = -18.1
coefficient[1].imag = 0
coefficient[0].real = -34.8
coefficient[0].imag = 0
zero[0].real = -2.5026325486e+00 zero[0].imag = -8.3036679880e-01
zero[1].real = -2.5026325486e+00 zero[1].imag = 8.3036679880e-01
zero[2].real = 5.0052650973e+00 zero[2].imag = 2.7417672687e-15
root[0].real = 0.0000000000e+00 root[0].imag = 1.7763568394e-15
root[1].real = 3.5527136788e-14 root[1].imag = -1.7763568394e-14
root[2].real = 2.8421709430e-14 root[2].imag = 1.5643985575e-13
Degree (0 to quit) = 5
coefficient[5].real = 1
coefficient[5].imag = 0
coefficient[4].real = 2
coefficient[4].imag = 0
coefficient[3].real = 3
coefficient[3].imag = 0
coefficient[2].real = 4
coefficient[2].imag = 0
coefficient[1].real = 5
coefficient[1].imag = 0
coefficient[0].real = 6
coefficient[0].imag = 0
zero[0].real = -8.0578646939e-01 zero[0].imag = 1.2229047134e+00
zero[1].real = -8.0578646939e-01 zero[1].imag = -1.2229047134e+00
zero[2].real = 5.5168546346e-01 zero[2].imag = 1.2533488603e+00
zero[3].real = 5.5168546346e-01 zero[3].imag = -1.2533488603e+00
zero[4].real = -1.4917979881e+00 zero[4].imag = 1.8329656063e-15
root[0].real = 8.8817841970e-16 root[0].imag = 4.4408920985e-16
root[1].real = -2.6645352591e-15 root[1].imag = -4.4408920985e-16
root[2].real = 8.8817841970e-16 root[2].imag = 1.7763568394e-15
root[3].real = 3.4638958368e-14 root[3].imag = -1.4210854715e-14
root[4].real = 8.8817841970e-16 root[4].imag = 2.0710031449e-14
Blog Entry Wednesday, July 10, 2024, © James Pate Williams, Jr. My Dual Interests in Cryptography and Number Theory
I became fascinated with secret key cryptography as a child. Later, as an adult, in around 1979, I started creating crude symmetric cryptographic algorithms. I became further enthralled with cryptography and number theory in 1996 upon reading Applied Cryptography, Second Edition: Protocols, Algorithms, and Source Code in C by Bruce Schneier and later the Handbook of Applied Cryptography by Alfred J. Menezes, Paul C. van Oorschot, and Scott A. Vanstone. After implementing many of the algorithms in both tomes, I communicated my results to two of the authors namely Bruce Schneier and Professor Alfred J. Menezes. In 1997 I developed a website devoted to constraint satisfaction problems and their solutions, cryptography, and number theory. I posted legal C and C++ source code. Professor Menezes advertised my website along with his treatise. See the following blurb:

In the spirit of my twin scientific infatuations, I offer yet another C integer factoring implementation utilizing the Free Large Integer Package (known more widely as lip) which was created by Arjen K. Lenstra (now a Professor Emeritus). This implementation includes Henri Cohen’s Trial Division algorithm, the Brent-Cohen-Pollard rho method, the Cohen-Pollard p – 1 stage 1 method, and the Lenstra lip Elliptic Curve Method. If I can get the proper authorization, I will later post the source code.
total time required for initialization: 0.056000 seconds
enter number below:
2^111+2
== Menu ==
1 Trial Division
2 Pollard-Brent-Cohen rho
3 p - 1 Pollard-Cohen
4 Lenstra's Elliptic Curve Method
5 Pollard-Lenstra rho
1
2596148429267413814265248164610050
number is composite
factors:
total time required factoring: 0.014000 seconds:
2
5 ^ 2
41
397
2113
enter number below:
0
total time required for initialization: 0.056000 seconds
enter number below:
2^111+2
== Menu ==
1 Trial Division
2 Pollard-Brent-Cohen rho
3 p - 1 Pollard-Cohen
4 Lenstra's Elliptic Curve Method
5 Pollard-Lenstra rho
2
2596148429267413814265248164610050
number is composite
factors:
total time required factoring: 1.531000 seconds:
2
5 ^ 2
41
397
2113
415878438361
3630105520141
enter number below:
0
total time required for initialization: 0.055000 seconds
enter number below:
2^111+2
== Menu ==
1 Trial Division
2 Pollard-Brent-Cohen rho
3 p - 1 Pollard-Cohen
4 Lenstra's Elliptic Curve Method
5 Pollard-Lenstra rho
3
2596148429267413814265248164610050
number is composite
factors:
total time required factoring: 0.066000 seconds:
2
5 ^ 2
41
838861
415878438361
3630105520141
enter number below:
0
total time required for initialization: 0.056000 seconds
enter number below:
2^111+2
== Menu ==
1 Trial Division
2 Pollard-Brent-Cohen rho
3 p - 1 Pollard-Cohen
4 Lenstra's Elliptic Curve Method
5 Pollard-Lenstra rho
4
2596148429267413814265248164610050
number is composite
factors:
total time required factoring: 0.013000 seconds:
2
5
205
838861
415878438361
3630105520141
enter number below:
0