| ... | @@ -2133,10 +2133,10 @@ fn llnormalize(a: []const Limb) usize { | ... | @@ -2133,10 +2133,10 @@ fn llnormalize(a: []const Limb) usize { |
| 2133 | } | 2133 | } |
| 2134 | | 2134 | |
| 2135 | /// Knuth 4.3.1, Algorithm S. | 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 | @setRuntimeSafety(debug_safety); | 2137 | @setRuntimeSafety(debug_safety); |
| 2138 | assert(a.len != 0 and b.len != 0); | 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 | assert(r.len >= a.len); | 2140 | assert(r.len >= a.len); |
| 2141 | | 2141 | |
| 2142 | var i: usize = 0; | 2142 | var i: usize = 0; |
| ... | @@ -2153,15 +2153,21 @@ fn llsub(r: []Limb, a: []const Limb, b: []const Limb) void { | ... | @@ -2153,15 +2153,21 @@ fn llsub(r: []Limb, a: []const Limb, b: []const Limb) void { |
| 2153 | borrow = @boolToInt(@subWithOverflow(Limb, a[i], borrow, &r[i])); | 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 | /// Knuth 4.3.1, Algorithm A. | 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 | @setRuntimeSafety(debug_safety); | 2167 | @setRuntimeSafety(debug_safety); |
| 2162 | assert(a.len != 0 and b.len != 0); | 2168 | assert(a.len != 0 and b.len != 0); |
| 2163 | assert(a.len >= b.len); | 2169 | assert(a.len >= b.len); |
| 2164 | assert(r.len >= a.len + 1); | 2170 | assert(r.len >= a.len); |
| 2165 | | 2171 | |
| 2166 | var i: usize = 0; | 2172 | var i: usize = 0; |
| 2167 | var carry: Limb = 0; | 2173 | var carry: Limb = 0; |
| ... | @@ -2177,7 +2183,13 @@ fn lladd(r: []Limb, a: []const Limb, b: []const Limb) void { | ... | @@ -2177,7 +2183,13 @@ fn lladd(r: []Limb, a: []const Limb, b: []const Limb) void { |
| 2177 | carry = @boolToInt(@addWithOverflow(Limb, a[i], carry, &r[i])); | 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 | /// Knuth 4.3.1, Exercise 16. | 2195 | /// Knuth 4.3.1, Exercise 16. |