54 lines
1.4 KiB
Ada
54 lines
1.4 KiB
Ada
with Ada.Text_IO; use Ada.Text_IO;
|
|
|
|
procedure Main is
|
|
package real_io is new Float_IO (Long_Float);
|
|
use real_io;
|
|
|
|
type Vector is array (Natural range <>) of Long_Float;
|
|
|
|
function deconv (g, f : Vector) return Vector is
|
|
len : Positive :=
|
|
Integer'Max ((g'Length - f'length), (f'length - g'length));
|
|
h : Vector (0 .. len);
|
|
Lower : Natural := 0;
|
|
begin
|
|
for n in h'range loop
|
|
h (n) := g (n);
|
|
if n >= f'length then
|
|
Lower := n - f'length + 1;
|
|
end if;
|
|
for i in Lower .. n - 1 loop
|
|
h (n) := h (n) - (h (i) * f (n - i));
|
|
end loop;
|
|
h (n) := h (n) / f (0);
|
|
end loop;
|
|
return h;
|
|
end deconv;
|
|
|
|
procedure print (v : Vector) is
|
|
begin
|
|
Put ("(");
|
|
for I in v'range loop
|
|
Put (Item => v (I), Fore => 1, Aft => 1, Exp => 0);
|
|
if I < v'Last then
|
|
Put (" ");
|
|
else
|
|
Put_Line (")");
|
|
end if;
|
|
end loop;
|
|
end print;
|
|
|
|
h : Vector := (-8.0, -9.0, -3.0, -1.0, -6.0, 7.0);
|
|
f : Vector :=
|
|
(-3.0, -6.0, -1.0, 8.0, -6.0, 3.0, -1.0, -9.0, -9.0, 3.0, -2.0, 5.0, 2.0,
|
|
-2.0, -7.0, -1.0);
|
|
g : Vector :=
|
|
(24.0, 75.0, 71.0, -34.0, 3.0, 22.0, -45.0, 23.0, 245.0, 25.0, 52.0, 25.0,
|
|
-67.0, -96.0, 96.0, 31.0, 55.0, 36.0, 29.0, -43.0, -7.0);
|
|
begin
|
|
print (h);
|
|
print (deconv (g, f));
|
|
print (f);
|
|
print (deconv (g, h));
|
|
end Main;
|