program Cantor; { This software has been designed and it is CopyLefted by Han de Bruijn: (===) @-O^O-@ #/_\# ### } type integers = array of integer; const { MathJax items for red font } start : string = '\color{red}{'; einde : string = '}'; procedure Schudden(grens : integer; var rij : integers); { Shuffle numbers in Random Order } var k,boven,plaats,effe : integer; begin SetLength(rij,grens); grens := grens-1; for k := 0 to grens do rij[k] := k; for k := 0 to grens do begin boven := grens-k; plaats := Round(Random(boven)); effe := rij[plaats]; rij[plaats] := rij[boven]; rij[boven] := effe; end; end; function tweede(macht : integer) : integer; { Compute 2^macht } var k : integer; h : integer; begin h := 1; for k := 1 to macht do h := h shl 1; tweede := h; end; function Bits(log2,n : integer) : string; { Visualize bits in a number } var k,L,m,b : integer; S : string; begin L := log2; SetLength(S,L); m := n; for k := 0 to L-1 do begin b := m and 1; m := m shr 1; S[L-k] := '0'; if b = 1 then S[L-k] := '1'; end; Bits := S; end; procedure diagonaal(n : integer; var deze : string); { Cantor's Diagonal } var die : array of string; L,k : integer; uit : string; begin L := Length(deze); SetLength(die,L); uit := ''; for k := 0 to L-1 do begin if k = n then die[k] := start+deze[k+1]+einde { red } else die[k] := deze[k+1]; { black } uit := uit + die[k]; end; deze := uit; end; procedure doe(n : integer; var bestand : TextFile); { Cantor's argument for an initial segment of the naturals [0,n-1] } var k,D,T : integer; rij : integers; deze : string; begin D := 0; SetLength(rij,0); T := tweede(n); Schudden(T,rij); for k := 0 to n-1 do begin D := D or (rij[k] and (1 shl (n-1-k))); deze := Bits(n,rij[k]); diagonaal(k,deze); Writeln(bestand,k,' & 0.',deze,' \\'); end; { Two's complement } D := -D-1; for k := n to T-1 do begin if Bits(n,D) = Bits(n,rij[k]) then Writeln(bestand,k,' & 0.',start+Bits(n,rij[k])+einde,' \\') else Writeln(bestand,k,' & 0.',Bits(n,rij[k]),' \\'); end; end; procedure test(n : integer); { Just a Test } var bestand : TextFile; k : integer; regel : array[0..12] of string; begin { Copy MathJax header from file } AssignFile(bestand,'kopje.htm'); Reset(bestand); for k := 0 to 12 do Readln(bestand,regel[k]); CloseFile(bestand); { HTML/MathJax Output } AssignFile(bestand,'Cantor.htm'); Rewrite(bestand); for k := 0 to 12 do Writeln(bestand,regel[k]); Writeln(bestand,'\begin{matrix}'); Random; Random; for k := 2 to n do begin doe(k,bestand); Writeln(bestand,'\\'); end; Writeln(bestand,'\end{matrix}'); Writeln(bestand,''); Writeln(bestand,''); CloseFile(bestand); end; begin test(7); end.