All pastes #246431 Raw Edit

Unnamed

public text v1 · immutable
#246431 ·published 2006-11-12 05:21 UTC
rendered paste body
package Sieve is
	type Primes is array ( Natural range <> ) of Boolean;
	procedure Make_Sieve ( Sieve : in out Primes );
	procedure Work_Sieve ( Sieve : in out Primes );
	procedure Find_Bounds ( Sieve : in Primes; Low : in out Integer; High : in out Integer );
	procedure Show_Twins ( Sieve : in Primes; Low : in Integer; High : in Integer );
end Sieve;

with Ada.Text_IO;
with Ada.Integer_Text_IO;
with Ada.Numerics.Elementary_Functions;

package body Sieve is
	procedure Make_Sieve ( Sieve : in out Primes ) is
	begin
		Sieve := ( 0 | 1 => false, others => true );
	end Make_Sieve;

	procedure Work_Sieve ( Sieve : in out Primes ) is
		use Ada.Numerics.Elementary_Functions;

		Highest_Factor : Integer := Integer ( Sqrt ( Float ( Sieve'Last ) ) );
	begin
		for Iterator_1 in 2 .. Highest_Factor loop
			if Sieve ( Iterator_1 ) = true then
				for Iterator_2 in Iterator_1 + 1 .. Sieve'Last loop
					if Iterator_2 mod Iterator_1 = 0 then
						Sieve ( Iterator_2 ) := false;
					end if;
				end loop;
			end if;
		end loop;
	end Work_Sieve;

	procedure Find_Bounds ( Sieve : in Primes; Low : in out Integer; High : in out Integer ) is
		use Ada.Text_IO;
		use Ada.Integer_Text_IO;
	begin
		loop
			loop
				Put ( "Upper Bound : " );
				Get ( High );
				exit when High /= 0 and High /= Sieve'Last;
			end loop;

			loop
				Put ( "Lower Bound : " );
				Get ( Low );
				exit when Low /= 0 and Low /= Sieve'Last;
			end loop;
			exit when Low < High;
			Put_Line ( "Upper Bound !> Lower Bound" );
		end loop;
	end Find_Bounds;

	procedure Show_Twins ( Sieve : in Primes; Low : in Integer; High : in Integer ) is
		use Ada.Text_IO;
		use Ada.Integer_Text_IO;

		Count : Integer := 0;
	begin
		for Iterator in Low .. High loop
			if Sieve ( Iterator ) = true and Sieve ( Iterator + 2 ) = true then
				Count := Count + 1;
				Put ( Iterator, 6 ); Put ( " and " ); Put ( Iterator + 2, 6 ); New_Line;
			end if;
		end loop;
		Put_Line ( Integer'Image ( Count ) & " twin pairs in range" & Integer'Image ( Low ) & " .." & Integer'Image ( High ) & "." );
	end Show_Twins;
end Sieve;

with Sieve;
with Ada.Integer_Text_IO; use Ada.Integer_Text_IO;

procedure Main is
	use Sieve;

	The_Array : Primes ( 0 .. 250_001 );
	Low, High : Integer;
begin
	Make_Sieve ( The_Array );
	Work_Sieve ( The_Array );
	Find_Bounds ( The_Array, Low, High );
	Show_Twins ( The_Array, Low, High );
end Main;