Recent

Author Topic: Math Book for Computer Fans  (Read 688 times)

Curt Carpenter

  • Hero Member
  • *****
  • Posts: 747
Math Book for Computer Fans
« on: July 11, 2025, 04:40:16 am »
For a delightful math book that covers a huge amount of ground of interest to programmers and computer scientists, let me recommend Discrete Mathematics with Proof by Eric Gossett.  You can examine the index online. 

Thaddy

  • Hero Member
  • *****
  • Posts: 18911
  • Glad to be alive.
Re: Math Book for Computer Fans
« Reply #1 on: July 11, 2025, 12:22:25 pm »
Good book, I happen to have it.
Example what I learned from it, putting theory into practice:
Code: Pascal  [Select][+][-]
  1. program GaleShapley2;
  2.  
  3. type
  4.   range = 1..4;
  5.   TPreferences = array[range, range] of Integer;
  6.   TMatches = array[range] of Integer;
  7.   TProposed = array[range, range] of Boolean;
  8.  
  9. var
  10.    menPreferences:TPreferences = (
  11.     (1, 2, 3, 4),
  12.     (2, 3, 1, 4),
  13.     (3, 1, 2, 4),
  14.     (4, 2, 1, 3)
  15.   );
  16.  
  17.   womenPreferences:TPreferences =  (
  18.     (2, 1, 3, 4),
  19.     (1, 2, 3, 4),
  20.     (3, 2, 1, 4),
  21.     (4, 3, 2, 1)
  22.   );
  23.  
  24.   womenMatches: TMatches;
  25.   proposals: TProposed;
  26.   freeMen: array[range] of Boolean;
  27.  
  28. function Rank(woman, man: Integer): Integer;
  29. var i: Integer;
  30. begin
  31.   for i in range do
  32.     if womenPreferences[woman, i] = man then
  33.     begin
  34.       Rank := i;
  35.       exit;
  36.     end;
  37. end;
  38.  
  39. procedure StableMarriage;
  40. var
  41.   m, w, i, currentPartner, rankNew, rankCurrent: Integer;
  42.   done: Boolean;
  43. begin
  44.   for i in range do
  45.   begin
  46.     freeMen[i] := True;
  47.     womenMatches[i] := 0;
  48.   end;
  49.  
  50.   while True do
  51.   begin
  52.     done := True;
  53.     for m in range do
  54.     begin
  55.       if freeMen[m] then
  56.       begin
  57.         for i in range do
  58.         begin
  59.           w := menPreferences[m, i];
  60.           if not proposals[m, w] then
  61.           begin
  62.             proposals[m, w] := True;
  63.             if womenMatches[w] = 0 then
  64.             begin
  65.               womenMatches[w] := m;
  66.               freeMen[m] := False;
  67.             end
  68.             else
  69.             begin
  70.               currentPartner := womenMatches[w];
  71.               rankNew := Rank(w, m);
  72.               rankCurrent := Rank(w, currentPartner);
  73.  
  74.               if rankNew < rankCurrent then
  75.               begin
  76.                 womenMatches[w] := m;
  77.                 freeMen[m] := False;
  78.                 freeMen[currentPartner] := True;
  79.               end;
  80.             end;
  81.             break;
  82.           end;
  83.         end;
  84.         done := False;
  85.       end;
  86.     end;
  87.     if done then break;
  88.   end;
  89. end;
  90.  
  91. var
  92.   w:integer;
  93. begin
  94.   StableMarriage;
  95.   for w in range do
  96.     writeln('Woman ', w, ' is matched with Man ', womenMatches[w]);
  97. end.
I have improved my original, which you made me do  >:(  :D
You should pay for my coffee....
It really is a good book, but I suggest it is not for beginners:
You need to be versed in theory to make examples like the above.

(This example was again improved and modified aided by AI, in this case CoPilot,  to review correctness quickly and verified by deepseek)

p.s. I am trying to always state if my code is helped by AI. Everybody should do so.
I wrote the original code but adapted it slightly because of good pointers.
Two models agree it is good code.
« Last Edit: July 11, 2025, 12:44:17 pm by Thaddy »
Recovered from removal of tumor in tongue following tongue reconstruction with a part from my leg.

 

TinyPortal © 2005-2018