with Ada.Strings; use Ada.Strings; with Ada.Strings.Unbounded; use Ada.Strings.Unbounded; package body Module is function factorial(n : Natural) return Natural is result : Natural := 1; begin for i in 1 .. n loop result := result * i; end loop; return result; end factorial; function gcd(a : Natural; b : Natural) return Natural is r : Natural; aa : Natural := a; bb : Natural := b; begin if a = 0 then return b; end if; while bb > 0 loop r := aa mod bb; aa := bb; bb := r; end loop; return aa; end gcd; function gcdExtended(a : Integer; b : Integer; x : out Integer; y : out Integer) return Integer is x1 : Integer := 0; y1 : Integer := 1; q : Integer; tempX, tempY, tempB : Integer; aa : Integer := a; bb : Integer := b; begin x := 1; y := 0; while bb /= 0 loop q := aa / bb; tempX := x - q * x1; tempY := y - q * y1; x := x1; y := y1; x1 := tempX; y1 := tempY; tempB := aa - q * bb; aa := bb; bb := tempB; end loop; return aa; end gcdExtended; function diophantine(a : Integer; b : Integer; c : Integer) return Result is r : Result; x0 : Integer := 0; y0 : Integer := 0; g : Integer := gcdExtended(abs a, abs b, x0, y0); begin r.n := 0; r.m := 0; r.resultExists := False; if a = 0 and b = 0 then return r; end if; if (c rem g) /= 0 then return r; end if; x0 := x0 * (c / g); y0 := y0 * (c / g); if a < 0 then x0 := -x0; end if; if b < 0 then y0 := -y0; end if; r.n := x0; r.m := y0; r.resultExists := True; return r; end diophantine; end Module;