| ... | ... | @@ -2133,10 +2133,10 @@ fn llnormalize(a: []const Limb) usize { |
| 2133 | 2133 | } |
| 2134 | 2134 | |
| 2135 | 2135 | /// Knuth 4.3.1, Algorithm S. |
| 2136 | | fn llsub(r: []Limb, a: []const Limb, b: []const Limb) void { |
| 2136 | fn llsubcarry(r: []Limb, a: []const Limb, b: []const Limb) Limb { |
| 2137 | 2137 | @setRuntimeSafety(debug_safety); |
| 2138 | 2138 | 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); |
| 2140 | 2140 | assert(r.len >= a.len); |
| 2141 | 2141 | |
| 2142 | 2142 | var i: usize = 0; |
| ... | ... | @@ -2153,15 +2153,21 @@ fn llsub(r: []Limb, a: []const Limb, b: []const Limb) void { |
| 2153 | 2153 | borrow = @boolToInt(@subWithOverflow(Limb, a[i], borrow, &r[i])); |
| 2154 | 2154 | } |
| 2155 | 2155 | |
| 2156 | | assert(borrow == 0); |
| 2156 | return borrow; |
| 2157 | } |
| 2158 | |
| 2159 | fn 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); |
| 2157 | 2163 | } |
| 2158 | 2164 | |
| 2159 | 2165 | /// Knuth 4.3.1, Algorithm A. |
| 2160 | | fn lladd(r: []Limb, a: []const Limb, b: []const Limb) void { |
| 2166 | fn lladdcarry(r: []Limb, a: []const Limb, b: []const Limb) Limb { |
| 2161 | 2167 | @setRuntimeSafety(debug_safety); |
| 2162 | 2168 | assert(a.len != 0 and b.len != 0); |
| 2163 | 2169 | assert(a.len >= b.len); |
| 2164 | | assert(r.len >= a.len + 1); |
| 2170 | assert(r.len >= a.len); |
| 2165 | 2171 | |
| 2166 | 2172 | var i: usize = 0; |
| 2167 | 2173 | var carry: Limb = 0; |
| ... | ... | @@ -2177,7 +2183,13 @@ fn lladd(r: []Limb, a: []const Limb, b: []const Limb) void { |
| 2177 | 2183 | carry = @boolToInt(@addWithOverflow(Limb, a[i], carry, &r[i])); |
| 2178 | 2184 | } |
| 2179 | 2185 | |
| 2180 | | r[i] = carry; |
| 2186 | return carry; |
| 2187 | } |
| 2188 | |
| 2189 | fn 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); |
| 2181 | 2193 | } |
| 2182 | 2194 | |
| 2183 | 2195 | /// Knuth 4.3.1, Exercise 16. |