annotate gcc/ada/libgnat/a-nbnbin.adb @ 145:1830386684a0

gcc-9.2.0
author anatofuz
date Thu, 13 Feb 2020 11:34:05 +0900
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
145
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1 ------------------------------------------------------------------------------
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2 -- --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3 -- GNAT RUN-TIME COMPONENTS --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
4 -- --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
5 -- ADA.NUMERICS.BIG_NUMBERS.BIG_INTEGERS --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
6 -- --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
7 -- B o d y --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
8 -- --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
9 -- Copyright (C) 2019, Free Software Foundation, Inc. --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
10 -- --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
11 -- GNAT is free software; you can redistribute it and/or modify it under --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
12 -- terms of the GNU General Public License as published by the Free Soft- --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
13 -- ware Foundation; either version 3, or (at your option) any later ver- --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
14 -- sion. GNAT is distributed in the hope that it will be useful, but WITH- --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
15 -- OUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
16 -- or FITNESS FOR A PARTICULAR PURPOSE. --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
17 -- --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
18 -- As a special exception under Section 7 of GPL version 3, you are granted --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
19 -- additional permissions described in the GCC Runtime Library Exception, --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
20 -- version 3.1, as published by the Free Software Foundation. --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
21 -- --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
22 -- You should have received a copy of the GNU General Public License and --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
23 -- a copy of the GCC Runtime Library Exception along with this program; --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
24 -- see the files COPYING3 and COPYING.RUNTIME respectively. If not, see --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
25 -- <http://www.gnu.org/licenses/>. --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
26 -- --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
27 -- GNAT was originally developed by the GNAT team at New York University. --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
28 -- Extensive contributions were provided by Ada Core Technologies Inc. --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
29 -- --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
30 ------------------------------------------------------------------------------
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
31
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
32 with Ada.Unchecked_Deallocation;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
33 with Ada.Characters.Conversions; use Ada.Characters.Conversions;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
34
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
35 with Interfaces; use Interfaces;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
36
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
37 with System.Generic_Bignums;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
38
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
39 package body Ada.Numerics.Big_Numbers.Big_Integers is
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
40
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
41 package Bignums is new
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
42 System.Generic_Bignums (Use_Secondary_Stack => False);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
43 use Bignums, System;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
44
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
45 procedure Free is new Ada.Unchecked_Deallocation (Bignum_Data, Bignum);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
46
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
47 function Get_Bignum (Arg : Big_Integer) return Bignum is
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
48 (if Arg.Value.C = System.Null_Address
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
49 then raise Constraint_Error with "invalid big integer"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
50 else To_Bignum (Arg.Value.C));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
51 -- Check for validity of Arg and return the Bignum value stored in Arg.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
52 -- Raise Constraint_Error if Arg is uninitialized.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
53
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
54 procedure Set_Bignum (Arg : out Big_Integer; Value : Bignum)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
55 with Inline;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
56 -- Set the Bignum value stored in Arg to Value
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
57
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
58 ----------------
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
59 -- Set_Bignum --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
60 ----------------
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
61
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
62 procedure Set_Bignum (Arg : out Big_Integer; Value : Bignum) is
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
63 begin
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
64 Arg.Value.C := To_Address (Value);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
65 end Set_Bignum;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
66
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
67 --------------
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
68 -- Is_Valid --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
69 --------------
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
70
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
71 function Is_Valid (Arg : Big_Integer) return Boolean is
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
72 (Arg.Value.C /= System.Null_Address);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
73
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
74 ---------
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
75 -- "=" --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
76 ---------
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
77
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
78 function "=" (L, R : Big_Integer) return Boolean is
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
79 begin
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
80 return Big_EQ (Get_Bignum (L), Get_Bignum (R));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
81 end "=";
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
82
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
83 ---------
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
84 -- "<" --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
85 ---------
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
86
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
87 function "<" (L, R : Big_Integer) return Boolean is
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
88 begin
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
89 return Big_LT (Get_Bignum (L), Get_Bignum (R));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
90 end "<";
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
91
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
92 ----------
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
93 -- "<=" --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
94 ----------
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
95
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
96 function "<=" (L, R : Big_Integer) return Boolean is
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
97 begin
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
98 return Big_LE (Get_Bignum (L), Get_Bignum (R));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
99 end "<=";
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
100
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
101 ---------
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
102 -- ">" --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
103 ---------
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
104
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
105 function ">" (L, R : Big_Integer) return Boolean is
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
106 begin
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
107 return Big_GT (Get_Bignum (L), Get_Bignum (R));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
108 end ">";
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
109
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
110 ----------
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
111 -- ">=" --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
112 ----------
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
113
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
114 function ">=" (L, R : Big_Integer) return Boolean is
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
115 begin
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
116 return Big_GE (Get_Bignum (L), Get_Bignum (R));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
117 end ">=";
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
118
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
119 --------------------
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
120 -- To_Big_Integer --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
121 --------------------
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
122
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
123 function To_Big_Integer (Arg : Integer) return Big_Integer is
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
124 Result : Big_Integer;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
125 begin
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
126 Set_Bignum (Result, To_Bignum (Long_Long_Integer (Arg)));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
127 return Result;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
128 end To_Big_Integer;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
129
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
130 ----------------
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
131 -- To_Integer --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
132 ----------------
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
133
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
134 function To_Integer (Arg : Big_Integer) return Integer is
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
135 begin
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
136 return Integer (From_Bignum (Get_Bignum (Arg)));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
137 end To_Integer;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
138
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
139 ------------------------
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
140 -- Signed_Conversions --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
141 ------------------------
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
142
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
143 package body Signed_Conversions is
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
144
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
145 --------------------
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
146 -- To_Big_Integer --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
147 --------------------
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
148
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
149 function To_Big_Integer (Arg : Int) return Big_Integer is
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
150 Result : Big_Integer;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
151 begin
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
152 Set_Bignum (Result, To_Bignum (Long_Long_Integer (Arg)));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
153 return Result;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
154 end To_Big_Integer;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
155
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
156 ----------------------
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
157 -- From_Big_Integer --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
158 ----------------------
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
159
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
160 function From_Big_Integer (Arg : Big_Integer) return Int is
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
161 begin
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
162 return Int (From_Bignum (Get_Bignum (Arg)));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
163 end From_Big_Integer;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
164
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
165 end Signed_Conversions;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
166
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
167 --------------------------
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
168 -- Unsigned_Conversions --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
169 --------------------------
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
170
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
171 package body Unsigned_Conversions is
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
172
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
173 --------------------
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
174 -- To_Big_Integer --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
175 --------------------
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
176
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
177 function To_Big_Integer (Arg : Int) return Big_Integer is
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
178 Result : Big_Integer;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
179 begin
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
180 Set_Bignum (Result, To_Bignum (Unsigned_64 (Arg)));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
181 return Result;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
182 end To_Big_Integer;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
183
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
184 ----------------------
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
185 -- From_Big_Integer --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
186 ----------------------
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
187
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
188 function From_Big_Integer (Arg : Big_Integer) return Int is
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
189 begin
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
190 return Int (From_Bignum (Get_Bignum (Arg)));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
191 end From_Big_Integer;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
192
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
193 end Unsigned_Conversions;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
194
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
195 ---------------
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
196 -- To_String --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
197 ---------------
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
198
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
199 Hex_Chars : constant array (0 .. 15) of Character := "0123456789ABCDEF";
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
200
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
201 function To_String
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
202 (Arg : Big_Integer; Width : Field := 0; Base : Number_Base := 10)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
203 return String
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
204 is
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
205 Big_Base : constant Big_Integer := To_Big_Integer (Integer (Base));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
206
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
207 function Add_Base (S : String) return String;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
208 -- Add base information if Base /= 10
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
209
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
210 function Leading_Padding
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
211 (Str : String;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
212 Min_Length : Field;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
213 Char : Character := ' ') return String;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
214 -- Return padding of Char concatenated with Str so that the resulting
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
215 -- string is at least Min_Length long.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
216
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
217 function Image (Arg : Big_Integer) return String;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
218 -- Return image of Arg, assuming Arg is positive.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
219
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
220 function Image (N : Natural) return String;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
221 -- Return image of N, with no leading space.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
222
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
223 --------------
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
224 -- Add_Base --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
225 --------------
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
226
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
227 function Add_Base (S : String) return String is
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
228 begin
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
229 if Base = 10 then
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
230 return S;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
231 else
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
232 return Image (Base) & "#" & S & "#";
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
233 end if;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
234 end Add_Base;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
235
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
236 -----------
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
237 -- Image --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
238 -----------
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
239
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
240 function Image (N : Natural) return String is
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
241 S : constant String := Natural'Image (N);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
242 begin
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
243 return S (2 .. S'Last);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
244 end Image;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
245
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
246 function Image (Arg : Big_Integer) return String is
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
247 begin
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
248 if Arg < Big_Base then
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
249 return (1 => Hex_Chars (To_Integer (Arg)));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
250 else
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
251 return Image (Arg / Big_Base)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
252 & Hex_Chars (To_Integer (Arg rem Big_Base));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
253 end if;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
254 end Image;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
255
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
256 ---------------------
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
257 -- Leading_Padding --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
258 ---------------------
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
259
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
260 function Leading_Padding
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
261 (Str : String;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
262 Min_Length : Field;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
263 Char : Character := ' ') return String is
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
264 begin
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
265 return (1 .. Integer'Max (Integer (Min_Length) - Str'Length, 0)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
266 => Char) & Str;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
267 end Leading_Padding;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
268
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
269 begin
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
270 if Arg < To_Big_Integer (0) then
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
271 return Leading_Padding ("-" & Add_Base (Image (-Arg)), Width);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
272 else
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
273 return Leading_Padding (" " & Add_Base (Image (Arg)), Width);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
274 end if;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
275 end To_String;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
276
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
277 -----------------
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
278 -- From_String --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
279 -----------------
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
280
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
281 function From_String (Arg : String) return Big_Integer is
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
282 Result : Big_Integer;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
283 begin
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
284 -- ??? only support Long_Long_Integer, good enough for now
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
285 Set_Bignum (Result, To_Bignum (Long_Long_Integer'Value (Arg)));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
286 return Result;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
287 end From_String;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
288
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
289 ---------------
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
290 -- Put_Image --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
291 ---------------
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
292
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
293 procedure Put_Image
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
294 (Stream : not null access Ada.Streams.Root_Stream_Type'Class;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
295 Arg : Big_Integer) is
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
296 begin
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
297 Wide_Wide_String'Write (Stream, To_Wide_Wide_String (To_String (Arg)));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
298 end Put_Image;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
299
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
300 ---------
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
301 -- "+" --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
302 ---------
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
303
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
304 function "+" (L : Big_Integer) return Big_Integer is
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
305 Result : Big_Integer;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
306 begin
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
307 Set_Bignum (Result, new Bignum_Data'(Get_Bignum (L).all));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
308 return Result;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
309 end "+";
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
310
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
311 ---------
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
312 -- "-" --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
313 ---------
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
314
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
315 function "-" (L : Big_Integer) return Big_Integer is
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
316 Result : Big_Integer;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
317 begin
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
318 Set_Bignum (Result, Big_Neg (Get_Bignum (L)));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
319 return Result;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
320 end "-";
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
321
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
322 -----------
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
323 -- "abs" --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
324 -----------
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
325
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
326 function "abs" (L : Big_Integer) return Big_Integer is
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
327 Result : Big_Integer;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
328 begin
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
329 Set_Bignum (Result, Big_Abs (Get_Bignum (L)));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
330 return Result;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
331 end "abs";
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
332
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
333 ---------
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
334 -- "+" --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
335 ---------
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
336
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
337 function "+" (L, R : Big_Integer) return Big_Integer is
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
338 Result : Big_Integer;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
339 begin
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
340 Set_Bignum (Result, Big_Add (Get_Bignum (L), Get_Bignum (R)));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
341 return Result;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
342 end "+";
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
343
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
344 ---------
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
345 -- "-" --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
346 ---------
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
347
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
348 function "-" (L, R : Big_Integer) return Big_Integer is
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
349 Result : Big_Integer;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
350 begin
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
351 Set_Bignum (Result, Big_Sub (Get_Bignum (L), Get_Bignum (R)));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
352 return Result;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
353 end "-";
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
354
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
355 ---------
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
356 -- "*" --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
357 ---------
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
358
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
359 function "*" (L, R : Big_Integer) return Big_Integer is
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
360 Result : Big_Integer;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
361 begin
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
362 Set_Bignum (Result, Big_Mul (Get_Bignum (L), Get_Bignum (R)));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
363 return Result;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
364 end "*";
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
365
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
366 ---------
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
367 -- "/" --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
368 ---------
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
369
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
370 function "/" (L, R : Big_Integer) return Big_Integer is
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
371 Result : Big_Integer;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
372 begin
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
373 Set_Bignum (Result, Big_Div (Get_Bignum (L), Get_Bignum (R)));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
374 return Result;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
375 end "/";
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
376
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
377 -----------
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
378 -- "mod" --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
379 -----------
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
380
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
381 function "mod" (L, R : Big_Integer) return Big_Integer is
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
382 Result : Big_Integer;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
383 begin
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
384 Set_Bignum (Result, Big_Mod (Get_Bignum (L), Get_Bignum (R)));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
385 return Result;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
386 end "mod";
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
387
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
388 -----------
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
389 -- "rem" --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
390 -----------
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
391
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
392 function "rem" (L, R : Big_Integer) return Big_Integer is
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
393 Result : Big_Integer;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
394 begin
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
395 Set_Bignum (Result, Big_Rem (Get_Bignum (L), Get_Bignum (R)));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
396 return Result;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
397 end "rem";
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
398
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
399 ----------
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
400 -- "**" --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
401 ----------
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
402
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
403 function "**" (L : Big_Integer; R : Natural) return Big_Integer is
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
404 begin
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
405 -- Explicitly check for validity before allocating Exp so that
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
406 -- the call to Get_Bignum below cannot raise an exception before
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
407 -- we get a chance to free Exp.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
408
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
409 if not Is_Valid (L) then
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
410 raise Constraint_Error with "invalid big integer";
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
411 end if;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
412
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
413 declare
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
414 Exp : Bignum := To_Bignum (Long_Long_Integer (R));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
415 Result : Big_Integer;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
416 begin
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
417 Set_Bignum (Result, Big_Exp (Get_Bignum (L), Exp));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
418 Free (Exp);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
419 return Result;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
420 end;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
421 end "**";
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
422
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
423 ---------
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
424 -- Min --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
425 ---------
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
426
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
427 function Min (L, R : Big_Integer) return Big_Integer is
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
428 (if L < R then L else R);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
429
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
430 ---------
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
431 -- Max --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
432 ---------
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
433
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
434 function Max (L, R : Big_Integer) return Big_Integer is
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
435 (if L > R then L else R);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
436
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
437 -----------------------------
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
438 -- Greatest_Common_Divisor --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
439 -----------------------------
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
440
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
441 function Greatest_Common_Divisor (L, R : Big_Integer) return Big_Positive is
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
442 function GCD (A, B : Big_Integer) return Big_Integer;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
443 -- Recursive internal version
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
444
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
445 ---------
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
446 -- GCD --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
447 ---------
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
448
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
449 function GCD (A, B : Big_Integer) return Big_Integer is
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
450 begin
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
451 if Is_Zero (Get_Bignum (B)) then
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
452 return A;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
453 else
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
454 return GCD (B, A rem B);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
455 end if;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
456 end GCD;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
457
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
458 begin
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
459 return GCD (abs L, abs R);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
460 end Greatest_Common_Divisor;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
461
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
462 ------------
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
463 -- Adjust --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
464 ------------
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
465
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
466 procedure Adjust (This : in out Controlled_Bignum) is
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
467 begin
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
468 if This.C /= System.Null_Address then
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
469 This.C := To_Address (new Bignum_Data'(To_Bignum (This.C).all));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
470 end if;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
471 end Adjust;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
472
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
473 --------------
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
474 -- Finalize --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
475 --------------
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
476
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
477 procedure Finalize (This : in out Controlled_Bignum) is
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
478 Tmp : Bignum := To_Bignum (This.C);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
479 begin
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
480 Free (Tmp);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
481 This.C := System.Null_Address;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
482 end Finalize;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
483
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
484 end Ada.Numerics.Big_Numbers.Big_Integers;