Author Topic: Programming as Mathematics  (Read 1347 times)

0 Members and 0 Guests are viewing this topic.

Haywire Baboonery

  • { }
  • { ∅, { ∅ } }
  • Posts: 3157
  • The Last of My Mohicans
Re: Programming AND Mathematics: HyperNotes!
« Reply #15 on: March 14, 2016, 10:03:38 pm »
Runge Kutta in C++

This code approximates e to 2.71828 which is close to the value which is close to the value of

e = 2.7182818284590452353602874713527

Interesting ...

This is why I find it so much more relaxing studying at my leisure, since, rather than racing through problems, I can go on a tangent in the midst of one little exercise.

Quote from: amiruddin
Can you solve this equation ?Given the first order differential equations below which is derived from series RLC circuit. Write a program to solve it using Runge-Kutta 4th order method. The output should be in graphical form, i.e. plot of i and q versus t.

Quote from: Bernard Hsu
Hi amiruddin,

you should be able to solve this using the first order differential equation derived from RLC circuit, which was likely covered in your class and lecture. put that equation into

static double dt_dt(double x, double y) { /* your equation here */ }

The output will only give the answer it converges on. If you want graphical output, you can write a method to write to a .csv file and graph from a spreadsheet program.


The output will be numerical and fed into the iteration process.

Anyway, there is a little typo in their code.  I wonder if it is even worth troubling them over.

I fixed it in the attached text file.  Just save as rk4.cpp and complie.

The little error is when they define halfdx = 0.5 * x;

It should be halfdx = 0.5 * dx;

It was a nasty little typo. I kept getting wrong results when I changed the code to handle a different differential.  So I stepped through it with gdb and I noticed halfdx kept coming up as zero when it should have been half of what dx was.

Also, when comparing the results to results I got by hand and with other programs and spreadsheets, the results were different.  I even checked definitions of Runge-Kutta method in textbooks to verify there is a slight error in their algorithm. I made the following three changes:

double rk4(double x, double y, double dx, double(*f)(double, double)) {
   double halfdx = 0.5 * dx;
   double k1 = dx * f(x, y);
   double k2 = dx * f(x + halfdx, y + k1/2.0);// changed from y + k1 * halfdx
   double k3 = dx * f(x + halfdx, y + k2/2.0); // changed from y + k2 * halfdx
   double k4 = dx * f(x + dx, y + k3); // changed from  y + k3 * dx
   return (y + sixth * (k1 + 2 * k2 + 2 * k3 + k4));

I also made the code interactive by changing main():

int main(int argc, const char * argv[]) {
  double x, y, dx, target;
  std::cout << "\nEnter initial value of dependent variable x: ";
  std::cin >> x;
  std::cout << "Enter inintial value of [dependent] function y: ";
  std::cin >> y;
  std::cout << "Enter the step size dx: ";
  std::cin >> dx;
  std::cout << "Enter the target value y(x): ";
  std::cin >> target;

  Equation eq(x, y, dx, target);
   return 0;
Other than that, this code is cool since it approximates differentials that might not be solvable by quantitative methods.  What's more, it is short and elegant.  The Runge-Kutta method is surprisingly accurate, even with with ridiculously large step-size.  I appreciate code that does a little task ... as I do not want to become too distracted with libraries such as boost.numeric.odeint ... although, if I live long enough, I would love to learn to use it.  First, I want to concentrate on understanding the mathematical concepts ... so I appreciate Python modules like SymPy as well as Sage which is built upon so much ...

Still, it is more than a little humbling to see that there is certainly no need to reinvent any wheels.  It will take a lifetime to explore, but this gives me even more motivation to continue to devote my energies to mathematical explorations ... god willin' and the crick don't rise ...  :-\

HyperNotes (sleepy time):

Computational Physics Programs C/C++


Runge-Kutta 4th Order ODE Solver

Shampine and Gordon ODE Solver

odeint in boost?

Holy Fuuck, coders are busy bees out there ... It blows my mind.

Solving ODEs in C++

Peter Gottschling: Odient and MTL4

« Last Edit: March 16, 2016, 02:58:55 pm by H »
He [Arthur Schopenhauer] has been the most radical of all troublemakers. He was defiant. ~ (Marcuse?)

"Learning math is never a waste of time." ~ Ivan Savov

"Programming is understanding."  ~ Kristen Nygaard

Haywire Baboonery

  • { }
  • { ∅, { ∅ } }
  • Posts: 3157
  • The Last of My Mohicans
math code and the will to know ...
« Reply #16 on: March 15, 2016, 10:35:02 am »
Looking through the boost libraries, you may sympathize with why I just like to make my own simple rudimentary code that does what I need it to do so I don't have to deal with the learning curve of compiling code that depends on huge libraries.

Now, I prefer to focus on the mathematics and keep my "mathematical code" as simple as possible.

For the Runge-Kutta method, I found that it was more efficient as far as time and learning curve to use LibreOffice Calc (spreadsheet) using a similar method as A Spreadsheet Solution Using the Fourth-Order Runge-Kutta Method

setting cell A1 as step size, h, I can easily just change that as I wrote each formula using $A$1

For other formulas, using syntax such as $C4 would update the row number (4) but leave column (C) constant.

I could analyse the data in a grid.

Now, I am not saying I am not at all interested in the ODE libraries for C++.  I just have to use self-restraint when it comes to my "Will to Know".

To get sidetracked into troubleshooting compile errors just to use odeint or mtl (boost) libraries would only frustrate me.  I want to stay focused on the textbooks working through problem sets, trying out the projects, and basically using CAS, graphing calculator, spreadsheets, tables, and even some home grown rudimentary C++ code ON THE FLY ---- spontaneously in a calm manner.

This is, after all, the benefit of not having to be subjected to some professor's or supervisor's arbitrary agenda!

I think it is ok to learn by reading other people's code ...


« Last Edit: March 16, 2016, 12:00:58 am by H »
He [Arthur Schopenhauer] has been the most radical of all troublemakers. He was defiant. ~ (Marcuse?)

"Learning math is never a waste of time." ~ Ivan Savov

"Programming is understanding."  ~ Kristen Nygaard

Haywire Baboonery

  • { }
  • { ∅, { ∅ } }
  • Posts: 3157
  • The Last of My Mohicans
Re: math code ---> euler and runge-kutta
« Reply #17 on: March 16, 2016, 12:00:28 am »
I find it very satisfying to understand just enough about code and math to be able to find source code and alter it to suit my needs.  For instance, when in the start of a problem set in one of the DE texts, the authors suggest one use a computer algebra system, or, alternatively writing a program for solving initial value problems, I am thankful that I at least have the confidence to tweak the code ...

If someone's code is written for working with input and output files, I like to alter it to interact with me at the console.  Also, I don't mind redefining the differential equation for each case right in the source code and recompile it each time.  I just comment out all the equations in case I need one again.  Oh, and lest I pull the kind of thing Sickmind Fraud pulled (not acknowledging Schopenhauer's influence on his theories), I better mention that euler3.cpp was more than a little inspired by code written  Alex Godunov. Last revision - March 2007. I found it here, (Computational Physics Programs C/C++)

Also, at compile time, sometimes it is just something as simple as adding a flag such as -static or -std=c++11 to get it to run ...

When I wake up in the morning, I will be glad I tinkered on some code BEFORE diving into the exercises with pencil and paper.  Often, I like to transcribe the working source code into a notebook in pencil since the code itself basically explains the algorithms.   For years I have always liked to make code look as much like the mathematics as possible, calling functions simply f(x, t) or what have you.

Rather than have 3 separate programs to help me check some problems in a numerical methods section, this code (euler3.cpp) gives a menu:

 Solver for first order Ordinary Differential Equations
 x'(t) = f1(x,t)   equation
 x(ti) = xi        initial condition
 Methods (select one by a key)
 key = 0; simple Euler
 key = 1; modified Euler (predictor-corrector)
 key = 2; 4-th order Runge-Kutta

to compile with gnu gcc:

g++ -g euler3.cpp -o e3 -static

then, to run: ./e3

I like to slow down long enough to compare results with the "spreadsheet versions."

Actually, I find writing simple C++ code, even if spending a little extra time formatting the output so it's easier to read, ends up being more fun than using the spreadsheet method.  With the code, you just have to define the differential equation and recompile, whereas with a spreadsheet, you have to change the cell for y', and then copy and fill down - rather tedious. 

So, in the version I am using, I formatted the output for the console, even placing an increment counter n on both sides of the values of "independent variable" t and "dependent function" x.

I swear, 20 years ago, when I began studying programming in earnest and returning to college to start over with Calculus and Physics, this really is what I envisioned ... growing older by the day and being able to tinker around with computer programs that helped me analyze* mathematical problems.  This is all I ever wanted, so, even though I may appear to be the classic "loser" who has lived an uneventful life, at least, along the way, I have been able to take just enough interest in what the "eggheads" have been up to so as to ... well .. how else to phrase this? ... to be mentally stimulated.

I could not have asked for more from or for myself.  I think I may actually be content.   :-\

* analyze vs. analyse?

You will notice I use the "American English" as opposed to the "British English".  I'm always doubting myself when the editor puts those squiggly red lines under such words.  I kept thinking I forgot how to spell humor or endeavor when it is just the absence of the British u.

I beg forgiveness of the creators of the freeboards free forum software for my lack of manners.  I'm not confused, just stubborn.   I don't take orders from software.  ;)

One of these days, Holden, you might catch this math-code fever ... then you will surely not want to report to a boss ... since you will become a mathematical madman.   :D
« Last Edit: March 16, 2016, 11:36:47 pm by H »
He [Arthur Schopenhauer] has been the most radical of all troublemakers. He was defiant. ~ (Marcuse?)

"Learning math is never a waste of time." ~ Ivan Savov

"Programming is understanding."  ~ Kristen Nygaard


  • { ∅, { ∅ } }
  • Posts: 2615
  • Hentrichian Philosophical Pessimist
Introversion- Mathematics-Schopenhauer
« Reply #18 on: March 16, 2016, 01:52:38 pm »
I think you like math primarily because you are sick of "people".And so am I.So was Schopenhauer.I literally talk to no one during my off-duty time ,except with you,because I am extremely introverted.With Cioran, I say:
As far as I am concerned, I resign from humanity. I no longer want to be, nor can still be, a man. What should I do? Work for a social and political system, make a girl miserable? Hunt for weaknesses in philosophical systems, fight for moral and esthetic ideals? It’s all too little. I renounce my humanity even though I may find myself alone. But am I not already alone in this world from which I no longer expect anything?

I just wanna do a bit of math & then kick the bucket.That's all.And I think you are also very introverted.That's perhaps your greatest quality.
That's it, I think.Why should I live in history, huh? I don’t want to know anything anymore. Except mathematics.You are right, again.
« Last Edit: March 16, 2016, 01:56:21 pm by Holden »
I am just a sad little green  tortoise  who crawls and crawls..

Haywire Baboonery

  • { }
  • { ∅, { ∅ } }
  • Posts: 3157
  • The Last of My Mohicans
do math then kick bucket
« Reply #19 on: March 17, 2016, 10:06:16 am »
Quote from: Holden
I just wanna do a bit of math & then kick the bucket.That's all.


Out of nowhere, you have spontaneously suggested a possible solution to my Inquiry into How to Get Through a Life Not Worth Living.

This also puts to rest the question as to whether hypothetical eternal life would even be something desirable.   ::)

While I am trying to fall asleep, there are parts of the mind that do not "shut down." 

Quote from: Cioran
I no longer want to be, nor can still be, a man. What should I do? Work for a social and political system, make a girl miserable? Hunt for weaknesses in philosophical systems, fight for moral and esthetic ideals?

I have found it is easier to view oneself as a chimpanzee-like organism.  There are many creatures whose lives are sustained by the gargantuan artifice of modern technological industrialized mass society.  Not all creatures succumb to the slaughterhouse or zoo. 

I want to spend as much time going through enough of the core subjects so that no matter where I end up, I might be able to convince someone to send me a particular book of problems to work on. 

Maybe this activity gives consciousness enough to keep itself occupied so that it doesn't turn the focus of its laser beam of attention on  the problem of existence itself.  We will continue to think about the problem of existence itself, but as long as we exist, there is definitely some kind of psychological comfort in becoming more comfortable with "a bit of mathematics."

Finding where one is at is a solitary affair.  One has to defend against having one's consciousness assaulted by mass society.  Around 2AM, just before trying to shut my eyes, I was reading that Proust book, Swann's way, and I was struck by a comment about "journalism."   It's gotten far worse with television and what they have transformed some aspects of the Internet into.

I wonder if I can access the passage through "the cloud" ...

There is no "Kindle for PC" that runs on Linux, which is what I am in.

There is only ...

Let's see ... Here it is.  I'll have to type this (oh, the agony!  I am being rushed out the door ... I will skip breakfast.

"The fault I find with our journalism is that it forces us to take an interest in some fresh triviality or other every day, whereas only three or four books in a lifetime give us anything that is of real importance."
« Last Edit: March 17, 2016, 11:13:25 am by H »
He [Arthur Schopenhauer] has been the most radical of all troublemakers. He was defiant. ~ (Marcuse?)

"Learning math is never a waste of time." ~ Ivan Savov

"Programming is understanding."  ~ Kristen Nygaard

Haywire Baboonery

  • { }
  • { ∅, { ∅ } }
  • Posts: 3157
  • The Last of My Mohicans
Re: Programming as Mathematics
« Reply #20 on: March 19, 2016, 08:56:55 am »
I think you like math primarily because you are sick of "people"

Perhaps this is true.  While I am sleeping, my mind scans the feelings of its organism.  It processes subtle observations, such as what a rip-off farce "anger management" is ... the mind sees more than I can ever hope to write about.  I should save this for the thread about the Unconscious.

Anyway, this sense of disgust and disdain, this sickness of "people" ... I try not to write down or focus on any particular individual.  I suppose I dislike quite many, if not most people I have met and have not met.   This is not something that I need to be concerned about.  I don't think I have to like anyone.  I suppose most animals are a-s-s-holes as well.  I probably don't want to be in close quarters with most individual organisms on the planet.  It's horrible to consider, no?

At least here, on this message board (and others like it, I'm sure there are countless other groups of two and three or five), we can transcend all the happy-hippy horseshiit, and articulate an honest appraisal of what it means to exist, not some mumbo-jumbo narrative we like to tell ourselves.

So, yes, I might like to engage in the study of mathematics because I want to have as little as possible to do with other people, including the telephone.

One wakes in the morning and must endure time.  Both mathematics and programming require a considerable amount of concentration.  One can study for years and have nothing to really show for it, whereas a professional athlete can earn a great deal of money in one year.  It is nearly impossible to explain why anyone would be interested in these activities if one does not receive some kind of monetary pay-off. 

The first thing one hears is, "Why don't you go back to school and get another diploma or find some kind of "job".  People don't get it.  Formal education has a way of destroying my interest in a subject. 

As you will see when you receive the flash drive with the H Diaries, I have spent a lifetime writing about the details of getting through a life not worth living.  Now I am filling notebooks with notes on mathematics and programs associated with mathematical operations.  I have written enough about how I feel about life in general.  I don't want to write my life story or some kind of existential novel.  I want to slow down long enough to explain details of solving a problem without feeling under pressure to move along to the next problem.

I want to force myself to concentrate on math problems and try to enjoy implementing some methods with code.  That's all.  That life is not worth living is not really a topic of conversation that is going to attract many participants.  Yes, I am sick of people, it's true.  I would not have the patience to sit through lectures in a university, knowing what I know about the slow nature of the learning process.  One may resist using words as strong as "hate," but I hate the thought of needing transportation to a building where one is supposedly learning when one could get further along cracking open the books in isolation.

I use the word hate because this best describes my sentiments.  I hate Career Days.  I hate "Group Projects" ... I hate exams.  I hate student loans.  I hate the farce of society.  I don't need any stamps of approval or recognition from society.   They only keep track of the police records, anyway.  Never in a court of law has "graduating with honors at the university" ever been acknowledged by a judge.  He only brings up my altercations with the police! 

For me, Holden, the game is over.  My only goal is to remain an honest student of mathematics, programming, and pessimistic antinatalist depressive philosophy.

Fortunately, for me, anyway, approaching the age of 50 insures I don't entertain any ideas about making some kind of career out of mathematics or programming.  Fuuck the world.  They can't lock me out of my own brain.  I realize that none of this leads anywhere.  I get that part.

This is a solitary project, and the satisfaction I get from it is impossible to quantify.  To be blunt, I want to devote a couple of years to 3 specific subjects simultaneously.  This is in total defiance of covering the material in robo-mode in a couple semesters.  Hell, if I devote more than 2 years, so be it ... the slower the better as far as I'm concerned.

Perhaps studying these disciplines is an alternative to suicide, an alternative to "spectator sports and automobile worship", an alternative to "gainful employment and therapy", an alternative to "participating in some kind of political protest". 

Daily I have to convince myself to eat food.

Mathematics gives me something to write about other than the pointlessness of existence in general.  So what if it doesn't lead anywhere.  What does lead anywhere but the to the grave, anyway?

What I like most about our correspondence here on this message board, as opposed to jotting down these daily frustrations in a private notebook, is that I can shed some light on daily aggravations that are most likely common to all but hardly ever articulated in such a shameless manner. 

The drudgery involved in feeding the creature ...

I devote myself to studying as a way to endure time.

I am tinkering my life away ... Thankfully, I don't need anyone's permission to crack open a textbook.  Shall I write about the chains of biological necessity?

If I do not crack a couple eggs, there will be no energy ...

It is best to isolate.  Why do we bother to eat food?  I eat food so I can continue to study math.


Most people do not dare to articulate their complaints about everyday existence because of the conspiracy which pressures people to preserve some kind of public image.  Keep your complaints to yourself of be accused of whining.  Thomas Ligotti explains this phenomenon very well in Conspiracy Against the Human Race.  No wonder I found that work so appealing.

May we continue to defiantly express our complaints here.

Hell, if I may be brutally honest here, it is quite often the case that studying mathematics makes me long for death even more intensely, since, after all, I wonder what the point is.   :-\
« Last Edit: March 19, 2016, 11:05:34 pm by H »
He [Arthur Schopenhauer] has been the most radical of all troublemakers. He was defiant. ~ (Marcuse?)

"Learning math is never a waste of time." ~ Ivan Savov

"Programming is understanding."  ~ Kristen Nygaard

Haywire Baboonery

  • { }
  • { ∅, { ∅ } }
  • Posts: 3157
  • The Last of My Mohicans
Re: Programming as Mathematics
« Reply #21 on: August 07, 2019, 08:30:20 am »
A Programmer's Introduction to Mathematics

This looks extremely interesting.

"Programmers are in a privileged position to engage with mathematics."
« Last Edit: August 07, 2019, 10:44:04 pm by gorticide »
He [Arthur Schopenhauer] has been the most radical of all troublemakers. He was defiant. ~ (Marcuse?)

"Learning math is never a waste of time." ~ Ivan Savov

"Programming is understanding."  ~ Kristen Nygaard

Haywire Baboonery

  • { }
  • { ∅, { ∅ } }
  • Posts: 3157
  • The Last of My Mohicans
Re: Programming as Mathematics
« Reply #22 on: August 26, 2019, 11:31:05 am »
I feel obligated to part of myself to type up some notes from my "exploratory investigations."   Some of these notes are from a 1200 page text book mixed with other sources.    I feel a need to articulate what I find so interesting about "generic programming."

First of all, may I suggest From Mathematics to Generic Programming" by Alex Stepanov and Daniel Rose, a book I mentioned in the "Generic Programming" thread: (very related to this thread).

My apologies for putting on my "technician's hat."   Just remember that the creature who types is still this frustrated, albeit philosophical, animal with forever-growling stomach, rotten teeth, bad breath, and excrement quite nasty!   

From a 2006 paper by Peter Gottschling, "Fundamental Algebraic Concepts in Concept-Enabled C++":

symbiosis - the relation between two different species, where each gains benefits from the other.

Using generic programming concepts to define algebraic structures is an organic symbiosis between generic programming and abstract algebra.  At first, the idea of concepts was adapted from algebra to generic programming.  Now, algebraic structures are specified with the generic programming concepts. 

In Bjarne Stroustrup's textbook, Programming:  Principles and Practice Using C++, early on in chapter 20, he writes, "We look at the STL [Standard Template Library] not just as a useful set of facilities, but also as an example of a library designed for maximal flexibility and performance.  The STL was desgined by Alex Stepanov to provide a framework for general, correct, and efficient algorithms operating on data structures.

The ideal was the simplicity, generality, and elegance of mathematics. 

From page 681, chapter 19:


Templates are the basis for generic programming in C++. In fact, the simplest definition of “generic programming” in C++ is “using templates.” That definition is a bit too simpleminded, though. We should not define fundamental programming concepts in terms of programming language features. Programming language features exist to support programming techniques — not the other way around. As with most popular notions, there are many definitions of "generic programming.” We think that the most useful simple definition is

Generic programming: Writing code that works with a variety of types presented as arguments, as long as those argument types meet specific syntactic and semantic requirements.

When what we parameterize is a class, we get a class template, what is often called a parameterized type or a parameterized class. When what we parameterize is a function, we get a function template, what is often called a parameterized function and sometimes also called an algorithm. Thus, generic programming is sometimes referred to as “algorithm-oriented programming”; the focus of the design is more the algorithms than the data types they use.

Since the notion of parameterized types is so central to programming, let’s explore the somewhat bewildering terminology a bit further. That way we have a chance of not getting too confused when we meet such notions in other contexts.  This form of generic programming relying on explicit template parameters is often called parametric polymorphism. In contrast, the polymorphism you get from using class hierarchies and virtual functions is called ad hoc polymorphism and that style of programming is called object-oriented programming.

The reason that both styles of programming are called polymorphism is that each style relies on the programmer to present many versions of a concept by a single interface. Polymorphism is Greek for “many shapes,” referring to the many different types you can manipulate through a common interface. 

There are several differences between object-oriented programming (using class hierarchies and virtual functions) and generic programming (using templates). The most obvious is that the choice of function invoked when you use generic programming is determined by the compiler at compile time, whereas for object-oriented programming, it is not determined until run time.

So — assuming you have had your fill of philosophy for now — what do people actually use templates for?

 For unsurpassed flexibility and performance:
• Use templates where performance is essential (e.g., numerics and hard real time)

• Use templates where flexibility in combining information from several
   types is essential.


As usual, the benefits have corresponding weaknesses. For templates, the main problem is that the flexibility and performance come at the cost of poor separation between the “inside” of a template (its definition) and its interface (its declaration). This manifests itself in poor error diagnostics — often spectacularly poor error messages. Sometimes, these error messages come much later in the compilation process than we would prefer.

When compiling a use of a template, the compiler “looks into” the template and also into the template arguments. It does so to get the information to generate optimal code. To have all that information available, current compilers tend to require that a template must be fully defined wherever it is used. That includes all of its member functions and all template functions called from those. Consequently, template writers tend to place template definitions in header files. This is not actually required by the standard, but until radically improved implementations are widely available, we recommend that you do so for your own templates: place the definition of any template that is to be used in more than one translation unit in a header file.

(This means you don't have a separate .h and .cpp file for declarations and definitions, respectively; but define everything in one .h file.)

C++14 provides a mechanism for vastly improved checking of template interfaces.  For example, in C++11, we write:

template<typename T> // for all types T
class My_Vector {
 // ...

We cannot precisely state what is expected of an argument type T.  The standard says what these requirements are, but only in English, rather than in code that the compiler can understand.  We call a set of requirements on a template argument a concept

A template argument must meet the requirements, the concepts, of the template to which it is applied.  For example, a vector requires that its elements can be copied or moved, can have their address taken, and be default constructed (if needed). In other words, an element must meet a set of requirements, which we could call Element.

 In C++14, we can make that explicit:

template<typename T>    // for all types T
requires Element<T>()     // such that T is an Element

class vector {
// . . .

This shows that a concept is really a type predicate, that is, a compile-time-evaluated (constexpr) function that returns true if the type argument (here, T) has the properties required by the concept (here, Element) and false if it does not.

This is a bit long-winded, but a shorthand notation brings us to

template<Element T>   // for all types T, such that Element<T>() is true
class vector {
      // . . .

The compiler doesn’t understand our names or read our comments, but being
explicit about concepts helps us think about our code, improves our design of
generic code, and helps other programmers understand our code. As we go along,
we will use some common and useful concepts:

• Element<E>(): E can be an element in a container.

• Container<C>(): C can hold Elements and be accessed as a [begin():end())

• Forward_iterator<For>(): For can be used to traverse a sequence [b:e)
  (like a linked list, a vector, or an array).

• Input_iterator<In>(): In can be used to read a sequence [b:e) once only
  (like an input stream).

• Output_iterator<Out>(): A sequence can be output using Out.

• Random_access_iterator<Ran>(): Ran can be used to read and write a
   sequence [b:e) repeatedly and supports subscripting using [ ].

• Allocator<A>(): A can be used to acquire and release memory (like the
  free store).

• Equal_comparable<T>(): We can compare two Ts for equality using == to
  get a Boolean result.

• Equal_comparable<T,U>(): We can compare a T to a U for equality using
   == to get a Boolean result.

• Predicate<P,T>(): We can call P with an argument of type T to get a Boolean result.

• Binary_predicate<P,T>(): We can call P with two arguments of type T to
  get a Boolean result.

• Binary_predicate<P,T,U>(): We can call P with arguments of types T and
  U to get a Boolean result.

• Less_comparable<L,T>(): We can use L to compare two Ts for less than
  using < to get a Boolean result.

• Less_comparable<L,T,U>(): We can use L to compare a T to a U for less
  than using < to get a Boolean result.

• Binary_operation<B,T,U>(): We can use B to do an operation on two Ts.

• Binary_operation<B,T,U>(): We can use B to do an operation on a T and a U.

• Number<N>(): N behaves like a number, supporting +, -, *, and /.


This is a more philosophical treatment of a technical subject than is usually available, so I thought it worthy to be stored here on our "old school message board" for posterity (or just to continue to daydream of ways to bring together my interests in abstract algebra and computing ...

When my stomache growls, I catch myself wishing I were dead and no longer needed to eat food and shiit.   Not much interests me in this world ... and I foresee myself spending the remainder of my days on earth sulking and brooding, with some moments of delight upon grasping such abstractions.

I apologize again for such technical posts.   I am still quite philosophical, but the thoughts I have been "entertaining" have been too dark to verbalize.   Perhaps my heart is finally going bad.   I mean, I don't want to feel so much distress and anguish.  I don't want to make this life any harder than it actually is.

I thank each of you for your philosophical and often poetic prose.

Being a human animal, well, as each of you know, has a very tragic element to it.

« Last Edit: September 23, 2019, 05:35:45 pm by Haywire Baboonery »
He [Arthur Schopenhauer] has been the most radical of all troublemakers. He was defiant. ~ (Marcuse?)

"Learning math is never a waste of time." ~ Ivan Savov

"Programming is understanding."  ~ Kristen Nygaard

Haywire Baboonery

  • { }
  • { ∅, { ∅ } }
  • Posts: 3157
  • The Last of My Mohicans
Re: Programming as Mathematics
« Reply #23 on: September 23, 2019, 01:14:44 pm »
I am building another specialized command-line activated, but Menu Driven old-style, calculator, this time, a [GENERIC] templated Polynomial calculator which introduces the concept of a "Field" by allowing polynomial operations over various fields or rings, such as real, rational, and complex.

[as I type these words, this woman who spawned me is nagging me to do something I was planning to do anyway : wash windows of domicile.   I scrubbed mold from tub and cleaned liners with bleach/water spray last night, pulled dead flowers this morning].  I pay heavy rent and food and am also a live-in janitor+geek_squad+SystemAdmin::ROOT ??  ? ]

it's a long project

Thanks for the posts.  I'm an avid reader when not "adding content" - mostly, our board is a kind of international smoke signal, so I am merely being polite reporting my activities. 

I am a living man, with all that this entails.

I want to want to scrub the windows as a "spiritual Kata," and not as a job "the Subject, I" is commanded to perform by a demanding, squirrelly-brained parent [ I := 52, womb := 77].

in Spontaneous-and-Perpetual-Misery,
Haywire HenTric AKA Mudslide Mike

The bottom line is that "Maintenance" is my middle name ...
« Last Edit: September 24, 2019, 09:46:12 pm by Haywire Baboonery »
He [Arthur Schopenhauer] has been the most radical of all troublemakers. He was defiant. ~ (Marcuse?)

"Learning math is never a waste of time." ~ Ivan Savov

"Programming is understanding."  ~ Kristen Nygaard

Haywire Baboonery

  • { }
  • { ∅, { ∅ } }
  • Posts: 3157
  • The Last of My Mohicans
Re: Programming as Mathematics
« Reply #24 on: September 23, 2019, 04:02:23 pm »
Previous version of polycalc (polymath.cpp) built with Schniederman's (c.2006) templated Polynomial.h, but only implemented with reals (double in C++).  That was written awhile back. 

The current project, this [command-line activated] Generic Polynomial Calculator, originated as an attempt to illustrate some fundamental concepts of algebra with generic-concepts; that is, I wanted to test the robustness of "templated" nature of Schneiderman's Polynomial class.  Moreover, I wanted to test C++ std::complex and my own personal Fraction class, which I have implemented in several other programs/projects to satisfy my lust for displaying the rational form of anything, if possible. 

Likewise, I prefer the algebraic form of complex numbers, z = a + i b, as opposed to the native C++ (STL: #include <complex>), displayed as (a, b), so I was motivated to create various istream >> helper functions for dealing with input of Fractions and std::complex<double>.

I wanted to add to the menu an option to display old school synthetic division process, even though there are built in functions to deal with just that, the Quotient and Remainder (polynomials) after polynomial division.   While +, -, and * are straight-forward to code, / is more complicated.

Long story short, while I have great versions that display fractions and reals, and then even reals and fractions, where the work in the synthetic division process is displayed according to the type (computer programming term) to signify a particular data-structure, whether built into the language, or created from scratch, of the coefficient; that is, according to which Field (a mathematical concept) the coefficients of the polynomial are "over" - I was getting errors while compiling that had to do with difficult things to explain.

I could always use boost library, but I found one particularly basic, well-documented, library created as an assignment at some University called Polynom-Nom has breathed some curiosity into my brain.   I am replacing parts of my code that use my Fraction with its Rational, and parts of my code that use std::complex<double> will be made to use its Complex.

This code hints at the intimate threshold where mathematical phenomena manifests itself, such as mathematical fields and programming data-types, eg:

char choose_Field()  {
   char field = 'R';
   std::cout << "\n-----------------------------------------------------------------------\n";
   std::cout << "Polynomials over which field?"<< std::endl;
   std::cout << "\n-----------------------------------------------------------------------\n";
   std::cout << "   Q (Polynomial over the field of rational numbers x = a/b)\n"
             << "   R (Polynomial over the field of real numbers x = a.)\n"
             << "   C (Polynomial over the field of complex numbers x = a + i b)\n"
             << "\n-----------------------------------------------------------------------\n"
             << "This polynomial is over :  ";

 std::cin >> field;
 std::cout << std::endl;
 return field;

So, I investigated other libraries that might better implement the main Polynomial, and I found:

There is a slight grammatical error in the first sentence/statement of the, but I am otherwise enjoying incorporating this educational library into my "generic polynomial calculator" code.   It keeps expanding in my mind, and I keep adjusting and changing it according to my needs, borrowing key parts from previous versions, and transforming the interface code after inspecting and studying the STRUCTURE of the "mathematical phenomena."

Oh, the grammatical error is significant as it has to do with multiplicity versus unity, mathematical concepts in their own right. 

Polynom-Nom Synopsis

Polynom-Nom is a C++ library, based mainly around implementing the concept of polynomials and various discrete mathematical phenomenon. The code was used to deepen my understanding in the field but most importantly to practice implementation in C++.
________________________________________* should be _____________________
                                                          phenomena, as in mathematical phenomena (plural of
phenomenon, which is one thing)

Suddenly I feel like the Henry Fool of Computer Science.

I'll let you know when I get something substantial compiled.   I'm taking it as it goes, all the while incorporating it into documenting a presentation of "The Fundamental Theorem of Algebra," which I plan to use Computer Algebra System, SageMath, to explore factorization of polynomials over Fields:  Real x ---> element of Real Numbers R,
Rational f = a/b ---> element of Rational Numbers Q,
 and Complex z = a + i b ---> element of Complex Numbers C.

There is a function, is_irreducible which will come in handy, and I will want to use Jupyter Notebook as a medium for documenting the exploration.

But, now, back to applying generic=ALGORITHM-based programming to implementing algebraic phenomena.

Hey, Holden, what would you think of an imaginary discipline called "Mathematical Phenomenology" ?   (fixed typo)

It sounds like a symptom of too much LSD.   :-[

Haywire Baboonery

see general theory of polynomials  - an "abstract algebraical approach" ...
« Last Edit: September 24, 2019, 06:32:50 pm by Haywire Baboonery »
He [Arthur Schopenhauer] has been the most radical of all troublemakers. He was defiant. ~ (Marcuse?)

"Learning math is never a waste of time." ~ Ivan Savov

"Programming is understanding."  ~ Kristen Nygaard

Haywire Baboonery

  • { }
  • { ∅, { ∅ } }
  • Posts: 3157
  • The Last of My Mohicans
Programming as Mathematics: Got Sanity?
« Reply #25 on: October 09, 2019, 05:14:12 am »
Programming-Mathematical-Concepts as a Sanity Check

There is a great deal of Madness in this world.  Codemonkeys slaving away on code they may not even care about for 80+ hours per week.   If they are lucky they might code with pure thought and nobel intentions one day ... if they can ever find or program their way out of that maze.

Got sanity?

Where oh where might a little sanity be hiding in this mad world?

With a lot of luck, you might be able to squeeze a few drops of sanity out of your Lifeworld.

Start with mathematics.  Try tinkering around with arithmetic and textual operations, making custom designed command line "operations" - your own personal arsenal of computer algebra ...

If any Sanity is to be had in this or your Lifeworld, it will be found (or not) directly between the ears and nowhere else.
« Last Edit: October 09, 2019, 05:27:34 am by Haywire Baboonery »
He [Arthur Schopenhauer] has been the most radical of all troublemakers. He was defiant. ~ (Marcuse?)

"Learning math is never a waste of time." ~ Ivan Savov

"Programming is understanding."  ~ Kristen Nygaard