在阿达任意长度整数(Arbitrary length integer in Ada)

2019-08-02 00:10发布

我目前自学阿达虽然我可以解决一些比较常规的问题上手开始。

更具体地讲我尝试计算阶乘ñ!,而N> 100。 我的实现至今是:

with Ada.Text_IO;
with Ada.Integer_Text_IO;

use Ada.Text_IO;

procedure Factorial is 
    -- define a type covering the range beginning at 1 up to which faculty is to
    -- be computed.
    subtype Argument is Long_Long_Integer range 1..100;

    -- define a type that is large enough to hold the result
    subtype Result is Long_Long_Integer range 1..Long_Long_Integer'Last;
    package Result_IO is new Ada.Text_IO.Integer_IO(Result); use Result_IO;

    -- variable holding the faculty calculated.
    fac : Result := 1;

begin
    -- loop over whole range of ARGUMENT and calculate n!
    for n in ARGUMENT loop
        fac := (fac * n);
    end loop;
end;

显然,问题甚至Long_Long_Integer是可能太小,无法并引发对n> 20 CONTRAINT_ERROR例外。

有没有实现任意大小的整数一个包?

谢谢!

PS:我确实对递归选择,因为我想探索这个练习循环。 但是,否则请在代码的各个方面提出意见(风格,最佳实践,错误..)

Answer 1:

阿达加密库支持大无符号数( Big_Numbers )。 您可以从下载的lib http://sourceforge.net/projects/libadacrypt-dev/ 。 我建议检查出SVN。 当前版本的Big_Numbers乘法函数有一个小错误。

你可以编译从目前GNAT编译器的lib 的AdaCore自由报网站 。

的lib不会下GCC-4.3或GCC-4.4编译由于在gcc中的一个错误 。

最后,我会给你一个小exmple如何从LibAdaCrypt乘两个512位Big_Numbers。

package Test.Big_Numbers is

with Crypto.Types.Big_Numbers;

pragma Elaborate_All(Crypto.Types.Big_Numbers);

package Big is new Crypto.Types.Big_Numbers(512);
    use Big;
    use Big.Utils;
end Test.Big_Numbers;



package body Test.Big_Numbers is

x : Big_Unsigned := To_Big_Unsigned("16#57C19F8F7866F8633AC1D25B92FC83B4#");
Y : Big_Unsigned := To_Big_Unsigned("16#FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF60#");

x := X * Y;
Put_Line(X);

end Test.Big_Numbers;
 
Best regards
   Christian


Answer 2:

从我所收集,每一个Ada编译带有任意长度的算术内置。 它需要支持已命名的数字(无类型的数字常量)的语言他们定义方式。

鉴于此,它的一个耻辱的标准并没有提供给我们的用户标准访问该设施。 话又说回来,可用于什么编译器需要,并可用于一般用途可能经常两回事。



文章来源: Arbitrary length integer in Ada
标签: ada