program Berechnung_ggT;

uses
arithmetik;

procedure teiler(n :  integer);
var
   i	 : integer;
   first : boolean;
	 
begin
   first:=true;
   write('\{');
   for i:=1 to n do
      if (n mod i=0) then begin
	 if (first) then write(' ',i) else write(',',i);
	 first:=false;
      end;
  write(' \}');
end; { teiler }


procedure teilerzwei(n, m :  integer);
var
   i	 : integer;
   first : boolean;
   min	 : integer;
	 
begin
   if (n < m) then
      min := n
   else
      min := m;
   first:=true;
   write('\{');
   for i:=1 to min do
      if ((n mod i=0) and (m mod i=0)) then begin
	 if (first) then write(' ',i) else write(',',i);
	 first:=false;
      end;
   write(' \}');
end; { teilerzwei }


procedure teilerdrei(n, m, p:  integer);
var
   i	 : integer;
   first : boolean;
   min	 : integer;
	 
begin
   if (n < m) then
      min := n
   else
      min := m;
   
   if (min < p) then
      min := min
   else
      min:=p;
   
   first:=true;
   write('\{');
   for i:=1 to min do
      if ((n mod i=0) and (m mod i=0) and (p mod i = 0)) then begin
	 if (first) then write(' ',i) else write(',',i);
	 first:=false;
      end;
   write(' \}');
end; { teilerdrei }

procedure primfaktorzerlegung(n  :  integer);
var
   i	 : integer;
   first : boolean;
	 
begin
   if (n<=1) then writeln(n);
   if (n>2) then begin
      i:=2;
      first:=true;
      while (n>1) do begin
	 if (n mod i=0) then begin
	    n:=n div i;
	    if first then write(i) else write(' \* ',i);
	    first:=false;
	 end else i:=i+1;
      end;
   end;
end; { primfaktorzerlegung }


procedure vielfach(n,m :  integer);
var
   i	 : integer;
   first : boolean;
	 
begin
   first:=true;
   write('\{');
   for i:=1 to m do
   begin
      if (first) then write(' ',i*n) else write(',',i*n);
      first:=false;
   end;
   write(',\dots \}');
end; { vielfach }

procedure rechne_ggt(a,b :  integer);
begin
   writeln('\begin{figure}[H]');
   writeln('\centerline{');
   writeln('\xymatrix@R=3pt{');
   writeln('&&& \txt{Rechnung} \\');
   while (a<>b) do begin
      
      write('\txt{$\ggT(',a,';',b,')$} &\txt{$=$} &');
      if (a<b) then begin
	 write('\txt{$\ggT(',a,';',b-a,')$}\ar@{->}[dll] &');
	 writeln('\txt{$',b,'-',a,'=',b-a,'$} \\');
	 b:=b-a;
      end else begin
	 write('\txt{$\ggT(',a-b,';',b,')$}\ar@{->}[dll] &');
	 writeln('\txt{$',a,'-',b,'=',a-b,'$} \\');
	 a:=a-b;
      end;
   end;
   writeln('\txt{$\ggT(',a,';',b,')$} &\txt{$=$} & \txt{$',a,'$} \\');
   writeln('}}');
   writeln('\end{figure}');
   
end; { rechne_ggt }

var
   x,y,z,t : integer;
   eingabe : char;
   i,k	   : integer;
	   
begin
   writeln;
   writeln('Berechnung des ggT und kgV auf verschiedene Arten');
   writeln('-------------------------------------------------');
   writeln('Eingabe für ggT = g, Teilermengen = t, Primfaktorzerlegung = p und kgV = k');
   readln(eingabe);
   
   case (eingabe) of
     'p', 'P' : begin
	writeln('Primfaktorzerlegung');
	while (not eof) do begin
	   readln(x);
	   write('\item ');
	   write(' $ ',x, ' = ');
	   primfaktorzerlegung(x);
	   writeln('$');
	end;
     end;
     
     'k', 'K' : begin
	writeln('kgv normal = 1');
	writeln('kgv schnell = 2');
	writeln('kgv prim = 3');
	readln(i);
	case (i) of
	  1 : begin
		 while (not eof) do
		 begin
		    readln(x);
		    readln(y);
		    if ( x <= 0) or (y <= 0)
		       then writeln('dies ist keine ordentliche Eingabe')
		    else
		    begin
		       write('\item ');
		       write(' $V_{' ,x, '} = ');
		       vielfach(x,(2*kgv(x,y) ) div x);
		       writeln('$, \\ ');
		       write(' $V_{' ,y, '} = ');
		       vielfach(y,(2*kgv(x,y) ) div y);
		       writeln('$, \\ ');
		       write('$V = ');
		       vielfach(kgv(x,y),3);
		       writeln('$, \\ ');
		       write('$\kgV( ' ,x, '; ', y, ') = ' ,kgv(x,y), '$');
		       writeln;
		    end;
		 end;
	      end;
	  2 : begin
		 while (not eof) do
		 begin
		    readln(x);
		    readln(y);
		    if ( x <= 0) or (y <= 0)
		       then writeln('dies ist keine ordentliche Eingabe')
		    else
		    begin
		       write('\item');
		       writeln('$\kgV(',x,';',y,') = ?$ \\');
		       z:=max(x,y);
		       i:=z;
		       writeln('Wähle ' ,z,'. \\');
		       while (i< kgv(x,y)) do
		       begin
			  writeln('Ist ',i,' Vielfaches von ' ,min(x,y),'? \quad nein \\');
			  i:=i+z;
		       end;
		       writeln('Ist ',kgv(x,y),' Vielfaches von ' ,min(x,y),'? \quad ja \\');
		       writeln('Also ist:  \\');
		       writeln('$\kgV( ' ,x, '; ', y, ') = ' ,kgv(x,y), '$');
		       writeln;
		    end;
		 end;
	      end;
	  3 : begin
		 while (not eof) do
		 begin
		    readln(x);
		    readln(y);
		    if ( x <= 0) or (y <= 0)
		       then writeln('dies ist keine ordentliche Eingabe')
		    else
		    begin
		       write('\item ');
		       write(' $ ',x, ' = ');
		       primfaktorzerlegung(x);
		       writeln('$, \\ ');
		       write('$ ',y, ' = ');
		       primfaktorzerlegung(y);
		       writeln('$, \\ ');
		       z:= kgv(x,y);
		       write('$\kgV( ' ,x, '; ', y, ') = ');
		       primfaktorzerlegung(z);
		       write(' = ' ,kgv(x,y), '$');
		       writeln;
		       writeln;
		    end;
		 end;
		 
	      end;
	end; { case }
     end;
     't', 'T' : begin
	writeln('Teilermengen normal = 1');
	writeln('Schnittmengen von zwei = 2');
	writeln('Schnittmengen von drei = 3');
	readln(i);
	writeln;
	case (i) of
	  1 : begin
		 while (not eof) do
		 begin
		    readln(x);
		    write('\item');
		    write(' $T_{' ,x, '} = ');
		    teiler(x);
		    write('$');
		    writeln;
		 end;
	      end;
	  2 : begin
		 while (not eof) do
		 begin
		    readln(x);
		    readln(y);
		    write('\item');
		    write(' $T_{' ,x, '} = ');
		    teiler(x);
		    write('$ \\');
		    writeln;
		    write(' $T_{' ,y, '} = ');
		    teiler(y);
		    write('$ \\');
		    writeln;
		    write('$T_{' ,x, ' \cap ' ,y,'} = ');
		    teilerzwei(x,y);
		    writeln('$');
		 end;
	      end;
	  3 : begin
		 while (not eof) do
		 begin
		    readln(x);
		    readln(y);
		    readln(z);
		    write('\item');
		    write(' $T_{' ,x, '} = ');
		    teiler(x);
		    write('$ \\');
		    writeln;
		    write(' $T_{' ,y, '} = ');
		    teiler(y);
		    write('$ \\');
		    writeln;
		    write(' $T_{' ,z, '} = ');
		    teiler(z);
		    write('$ \\');
		    writeln;
		    write('$T_{' ,x, ' \cap ' ,y,' \cap ' ,z,'} = ');
		    teilerdrei(x,y,z);
		    writeln('$');
		 end;
	      end;
	end; { case }
     end;
   else
      writeln('ggT normal = 1');
     writeln('ggT schnell = 2');
     writeln('ggT prim = 3');
     writeln('ggT euklid = 4');
     writeln('ggT für drei Zahlen (normal) = 5');
     writeln('ggT für drei Zahlen (prim) = 6');
     writeln('ggT teilerfremd = 7');
     readln(i);
     writeln;

     case (i) of
       1 : begin
	      while (not eof) do
	      begin
		 readln(x);
		 readln(y);
		 if ( x <= 0) or (y <= 0)
		    then writeln('dies ist keine ordentliche Eingabe')
		 else
		 begin
		    write('\item ');
		    write(' $T_{' ,x, '} = ');
		    teiler(x);
		    writeln('$, \\ ');
		    write(' $T_{' ,y, '} = ');
		    teiler(y);
		    writeln('$, \\ ');
		    write('$T_{' ,x, ' \cap ' ,y,'} = ');
		    teilerzwei(x,y);
		    writeln('$, \\ ');
		    write('$\ggT( ' ,x, '; ', y, ') = ' ,ggt(x,y), '$');
		    writeln;
		 end;
	      end;
	   end;
       2 : begin
	      while (not eof) do
	      begin
		 readln(x);
		 readln(y);
		 if ( x <= 0) or (y <= 0)
		    then writeln('dies ist keine ordentliche Eingabe')
		 else
		 begin
		    write('\item ');
		    writeln('$\ggT(',x,';',y,') = ?$');
		    writeln('\begin{enumerate}[1)]');
		    write('\item ');
		    write('$T_{' ,min(x,y), '} = ');
		    teiler(min(x,y));
		    write('$');
		    writeln;
		    write('\item ');
		    k:=teilersuche(min(x,y),min(x,y));
		    while (max(x,y) mod k <> 0) do
		    begin
		       writeln('Ist ',k,' Teiler von ' ,max(x,y),'? \quad nein \\');
		       k:=teilersuche(min(x,y),k-1);
		    end;
		    writeln('Ist ',ggt(x,y),' Teiler von ' ,max(x,y),'? \quad ja');
		    writeln;
		    write('Also ist: ');
		    writeln('$\ggT( ' ,x, '; ', y, ') = ' ,ggt(x,y), '$');
		    writeln('\end{enumerate}');
		    
		 end;
	      end;
	      
	   end;
       3 : begin
	      while (not eof) do
	      begin
		 readln(x);
		 readln(y);
		 if ( x <= 0) or (y <= 0)
        then writeln('dies ist keine or	dentliche Eingabe')
		 else
		 begin
		    write('\item ');
		    write('$ ',x, ' = ');
		    primfaktorzerlegung(x);
		    writeln('$, \\ ');
		    write('$ ',y, ' = ');
		    primfaktorzerlegung(y);
		    writeln('$, \\ ');
		    z:= ggT(x,y);
		    write('$\ggT( ' ,x, '; ', y, ') = ');
		    primfaktorzerlegung(z);
		    write(' = ' ,ggt(x,y), '$');
		    writeln;
		 end;
	      end;
	   end;
       4 : begin
	      while (not eof) do
	      begin
		 readln(x);
		 readln(y);
		 if ( x <= 0) or (y <= 0)
		    then writeln('dies ist keine ordentliche Eingabe')
		 else begin
		    rechne_ggt(x,y);
		 end;
	      end;
	   end;
       5 : begin
	      while (not eof) do
	      begin
		 readln(x);
		 readln(y);
		 readln(z);
		 if ( x <= 0) or (y <= 0) or (z <= 0)
		    then writeln('dies ist keine ordentliche Eingabe')
		 else
		 begin
		    write('\item ');
		    write(' $T_{' ,x, '} = ');
		    teiler(x);
		    write('$, \\ ');
		    write(' $T_{' ,y, '} = ');
		    teiler(y);
		    writeln('$, \\ ');
		    write(' $T_{' ,z, '} = ');
		    teiler(z);
		    writeln('$, \\ ');
		    write('$T_{' ,x, ' \cap ' ,y,' \cap ' ,z,'} = ');
		    teilerdrei(x,y,z);
		    writeln('$, \\ ');
		    write('$\ggT( ' ,x, '; ', y, '; ', z, ') = ' ,ggt(ggt(x,y), z), '$');
		    writeln;
		 end;
	      end;
	      
	   end;
       6 : begin
	      while (not eof) do
	      begin
		 readln(x);
		 readln(y);
		 readln(t);
		 if ( x <= 0) or (y <= 0) or (t<= 0)
		    then writeln('dies ist keine ordentliche Eingabe')
		 else
		 begin
		    write('\item ');
		    write(' $ ',x, ' = ');
		    primfaktorzerlegung(x);
		    writeln('$, \\ ');
		    write('$ ',y, ' = ');
		    primfaktorzerlegung(y);
		    writeln('$, \\ ');
		    write(' $ ',t, ' = ');
		    primfaktorzerlegung(t);
		    writeln('$, \\ ');
		    z:= ggT(ggT(x,y),t);
		    write('$\ggT( ' ,x, '; ', y, '; ' ,t,') = ');
		    primfaktorzerlegung(z);
		    write(' = ' ,ggT(ggt(x,y),t), '$');
		    writeln;
		    writeln;
		 end;
	      end;
	      
	   end;
       7 : begin
	      readln(y);
	      for x:=1 to y do
	      begin
		 if ( x <= 0) or (y <= 0)
		    then writeln('dies ist keine ordentliche Eingabe')
		 else
		    if ggt(x,y) = 1 then
		    begin
		       write('\item ');
		       write(' $T_{' ,x, '} = ');
		       teiler(x);
		       write('$, \\ ');
		       write(' $T_{' ,y, '} = ');
		       teiler(y);
		       write('$, \\ ');
		       write('$\ggT( ' ,x, '; ', y, ') = ' ,ggt(x,y), '$');
		       writeln;
		       writeln;
		    end;
	      end;
	      
	   end;
     end; { case }
     
   end; { case }
   
end.
