Ada中的任意长度整数

Arn*_*rne 6 ada

我目前正在教自己Ada,虽然我可以从解决一些更传统的问题开始.

更具体地说,我尝试计算阶乘n !,而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;
Run Code Online (Sandbox Code Playgroud)

问题很明显,即使Long_Long_Integer可能太小,也会因为n> 20而抛出CONTRAINT_ERROR异常.

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

谢谢!

PS:我确实选择了反对递归,因为我想在这个练习中探索循环.但否则请评论代码的所有方面(样式,最佳实践,错误..)

小智 8

Ada Crypto Library支持大的无符号数字(Big_Numbers).您可以从http://sourceforge.net/projects/libadacrypt-dev/下载lib .我建议查看svn.当前版本的Big_Numbers乘法函数有一个小错误.

您可以使用AdaCore Libre站点中的当前GNAT编译器编译lib .

由于gcc中的错误, lib不会在gcc-4.3或gcc-4.4下编译.

最后,我将给你一个小例子,如何将两个512位Big_Numbers从LibAdaCrypt中相乘.

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;
Run Code Online (Sandbox Code Playgroud)
 
Best regards
   Christian