eratosthenes.adb

Denna kod är public domain. Om ni hittar fel eller vill ändra något i koden blir jag jätteglad om ni skickar dessa ändringar till jesper [at] fantasi [punkt] se.


with Ada.Text_IO;         use Ada.Text_IO;
with Ada.Integer_Text_IO; use Ada.Integer_Text_IO;

-- Eratosthenes såll är en gammal grekisk algoritm som hittar alla primtal
-- upp till en given gräns.

procedure Eratosthenes is
Max                      : constant Integer := 20000;
Count, K, Prime, Maxsize : Integer;
Mark                     : Boolean;
Flags                    : array(0 .. Max) of Boolean;

begin
   Put("Ange övre gräns (max " & Integer'Image(Max) & "): ");
   Get(Maxsize);
   if Maxsize > Max then
      Put_Line("Jag vill inte räkna länge än till " &
                 Integer'Image(Max) & ".");
      return;
   end if;
   New_Line(1);
   Put_Line("I intervallet 3 .. " & Integer'Image(Maxsize) &
            " finns följande primtal:");
   Put_Line("-----------------------------------------------");

   Maxsize := (Maxsize - 1) / 2;
   Count := 0;
   Mark := true;
   for I in Integer range 0 .. Maxsize loop
      Flags(I) := true;
   end loop;

   for I in Integer range 1 .. Maxsize loop
      if Flags(I) then
         prime := I + I + 1;
         Put(Prime, Width=>8);
         Count := Count + 1;
         if Mark then
            K := (I + I) * (I + 1);
            if (K > Maxsize) or (K < 0) then
               Mark := False;
            else
               while (K <= Maxsize) and (K > 0) loop
                  Flags(K) := false;
                  K := K + Prime;
               end loop;
            end if;
         end if;
      end if;
   end loop;
   New_Line(2);
   Put_Line("Totalt " & Integer'Image(Count) & " primtal.");
end Eratosthenes;