pragma Ada_2022; with Ada.Text_IO; use Ada.Text_IO; with Ada.Numerics.Big_Numbers.Big_Integers; use Ada.Numerics.Big_Numbers.Big_Integers; with Interfaces; use Interfaces; procedure Combs_Perms is function U64_Perm (N, K : Unsigned_64) return Unsigned_64 is P : Unsigned_64 := 1; begin if K = 0 then P := 0; else for I in 0 .. K - 1 loop P := P * (N - I); end loop; end if; return P; end U64_Perm; function Big_Perm (N, K : Natural) return Big_Natural is P : Big_Natural := 1; begin if K = 0 then P := 0; else for I in 0 .. K - 1 loop P := P * To_Big_Integer (N - I); end loop; end if; return P; end Big_Perm; function U64_Comb (N, K : Unsigned_64) return Unsigned_64 is Adj_K : constant Unsigned_64 := (if N - K < K then N - K else K); C : Unsigned_64 := U64_Perm (N, Adj_K); begin if K = 0 then C := 0; else for I in reverse 1 .. Adj_K loop C := C / I; end loop; end if; return C; end U64_Comb; function Big_Comb (N, K : Natural) return Big_Natural is Adj_K : constant Natural := (if N - K < K then N - K else K); C : Big_Natural := Big_Perm (N, Adj_K); begin for I in reverse 1 .. Adj_K loop C := C / To_Big_Integer (I); end loop; return C; end Big_Comb; begin Put_Line ("P(1, 0) =" & U64_Perm (1, 0)'Image); Put_Line ("P(12, 4) =" & U64_Perm (12, 4)'Image); Put_Line ("P(60, 20) =" & U64_Perm (60, 20)'Image); Put_Line ("P(105, 103) =" & Big_Perm (105, 103)'Image); Put_Line ("P(15000, 333) =" & Big_Perm (10000, 333)'Image); Put_Line ("C(10, 5) =" & U64_Comb (10, 5)'Image); Put_Line ("C(60, 30) =" & Big_Comb (60, 30)'Image); Put_Line ("C(900, 674) =" & Big_Comb (900, 674)'Image); end Combs_Perms;