The following instructions are for installing and programming `Ada` on Arch Linux.

## Prerequisites

Install the `Ada` compiler `GNAT` with the following command:

``````\$ pacman -S gcc-ada
``````

After `pacman` has finished the install the `gnat` command will be available to compile `Ada` programs.

## Hello, World!

The first thing to do in any new language is the classic "Hello, World!" program. This will introduce us to the feel of `Ada` and give us an idea of what we can expect.

Lets get started. First we will create a new directory for this program.

``````\$ mkdir ~/src/hello_world
\$ cd ~/src/hello_world
``````

Now get started writing the program in a new file called `hello_world.adb`.

``````with Ada.Text_IO;

procedure Hello_World is
begin
end Hello_World;
``````

Compile and run:

``````\$ gnat make hello_world.adb
\$ ./hello_world
Hello, World!
``````

Great, we finsihed our first Ada program! Next up is the first problem from Project Euler.

Find the sum of all the multiples of 3 or 5 below 1000.

Open a new file called `euler1.adb` and type the following text inside:

``````with Ada.Integer_Text_IO;

procedure Euler1 is
Sum : Integer;
begin

Sum := 0;

for I in Integer range 1..999 loop
if I mod 3 = 0 then
Sum := Sum + I;
elsif I mod 5 = 0 then
Sum := Sum + I;
end if;
end loop;

IO.Put(Sum);
end Euler1;
``````

Again, compile and run:

``````\$ gnat make euler1.adb
\$ ./euler1
233168
``````

Great! 233168 is the correct answer. Now on to problem number 2! This problem is a little harder, but it is still just counting numbers.

Find the sum of all the even-valued terms in the Fibonacci sequence which do not exceed four million.

Start another file titled `euler2.adb` and type the following text:

``````with Ada.Integer_Text_IO;

procedure Euler2 is

Fib1 : Natural;
Fib2 : Natural;
Sum : Natural;

begin
Sum := 0;
Fib1 := 1;
Fib2 := 2;

while Fib1 < 4_000_000 and Fib2 < 4_000_000 loop

if Fib1 > Fib2 then
if Fib1 mod 2 = 0 then
Sum := Sum + Fib1;
end if;
Fib2 := Fib1 + Fib2;
else
if Fib2 mod 2 = 0 then
Sum := Sum + Fib2;
end if;
Fib1 := Fib1 + Fib2;
end if;
end loop;

Integer_Text_IO.Put(Sum);

end Euler2;
``````

Compile and run to get the result:

``````\$ gnat make euler2.adb
\$ ./euler2
4613732
``````

And this concludes the short tangent into `Ada`. The compile is up and running and we are solving some problems. Go ahead and do a few more at Project Euler.

## Update

Problem number 2 of Project Euler actually has a more efficient solution.

The Fibonacci sequence actually has even integers every third number.

``````Fibonacci   1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610...
Even / Odd  O, O, E, O, O, E,  O,  O,  E,  O,  O,   E,   O,   O,   E...
``````

With this knowlege, the only calculations that need to be done are for every third number in the sequence. The sequence in terms of `x` and `y` is:

``````x, y, x + y, x + 2y, 2x + 3y, 3x + 5y...
``````

Now for the source text:

``````with Ada.Integer_Text_IO;

procedure Euler2 is

X : Natural;
Y : Natural;
Sum : Natural;
Old_X : Natural;

begin

Sum := 0;
X := 1;
Y := 1;

while Y < 4_000_000 loop
Sum := Sum + X + Y;
Old_X := X;
X := X + 2 * Y;
Y := 2 * Old_X + 3 * Y;
end loop;

Integer_Text_IO.Put(Sum);

end Euler2;
``````

Compile and run. The result should be the same.

``````\$ gnat make euler2.adb
\$ ./euler2
4613732
``````