authorgravatar for robin@voetter.nlRobin Voetter <robin@voetter.nl> 2021-09-25 00:49:45+02:00
committergravatar for robin@voetter.nlRobin Voetter <robin@voetter.nl> 2021-10-04 11:25:29+02:00
log616b23c8159a5b643253299ce2493d3a5abd2b81
treeb08c956dc0569007865bf86d939867e9befc0559
parentc41b989ab8c553bdba8e1aab606edbe27d730a3a

big ints: split lladd/llsub into carry variants

lladd is now implemented in terms of lladdcarry, which returns the carry limb. Similarly, llsub is implemented using llsubcarry, which returns the borrow limb.

1 files changed, 18 insertions(+), 6 deletions(-)

lib/std/math/big/int.zig+18-6
......@@ -2133,10 +2133,10 @@ fn llnormalize(a: []const Limb) usize {
21332133}
21342134
21352135/// Knuth 4.3.1, Algorithm S.
2136fn llsub(r: []Limb, a: []const Limb, b: []const Limb) void {
2136fn llsubcarry(r: []Limb, a: []const Limb, b: []const Limb) Limb {
21372137 @setRuntimeSafety(debug_safety);
21382138 assert(a.len != 0 and b.len != 0);
2139 assert(a.len > b.len or (a.len == b.len and a[a.len - 1] >= b[b.len - 1]));
2139 assert(a.len >= b.len);
21402140 assert(r.len >= a.len);
21412141
21422142 var i: usize = 0;
......@@ -2153,15 +2153,21 @@ fn llsub(r: []Limb, a: []const Limb, b: []const Limb) void {
21532153 borrow = @boolToInt(@subWithOverflow(Limb, a[i], borrow, &r[i]));
21542154 }
21552155
2156 assert(borrow == 0);
2156 return borrow;
2157}
2158
2159fn llsub(r: []Limb, a: []const Limb, b: []const Limb) void {
2160 @setRuntimeSafety(debug_safety);
2161 assert(a.len > b.len or (a.len == b.len and a[a.len - 1] >= b[b.len - 1]));
2162 assert(llsubcarry(r, a, b) == 0);
21572163}
21582164
21592165/// Knuth 4.3.1, Algorithm A.
2160fn lladd(r: []Limb, a: []const Limb, b: []const Limb) void {
2166fn lladdcarry(r: []Limb, a: []const Limb, b: []const Limb) Limb {
21612167 @setRuntimeSafety(debug_safety);
21622168 assert(a.len != 0 and b.len != 0);
21632169 assert(a.len >= b.len);
2164 assert(r.len >= a.len + 1);
2170 assert(r.len >= a.len);
21652171
21662172 var i: usize = 0;
21672173 var carry: Limb = 0;
......@@ -2177,7 +2183,13 @@ fn lladd(r: []Limb, a: []const Limb, b: []const Limb) void {
21772183 carry = @boolToInt(@addWithOverflow(Limb, a[i], carry, &r[i]));
21782184 }
21792185
2180 r[i] = carry;
2186 return carry;
2187}
2188
2189fn lladd(r: []Limb, a: []const Limb, b: []const Limb) void {
2190 @setRuntimeSafety(debug_safety);
2191 assert(r.len >= a.len + 1);
2192 r[a.len] = lladdcarry(r, a, b);
21812193}
21822194
21832195/// Knuth 4.3.1, Exercise 16.