| author | |
| committer | |
| log | 03abac382457e071540314d050e21799b59b1d5b |
| tree | bc8e2c54c58260deae68122b1199e69a278a3ea5 |
| parent | b3462b7cec9931cd3747f10714954eb8efe00c04 |
2 files changed, 38 insertions(+), 1 deletions(-)
lib/std/math/big/int.zig+12-1| ... | @@ -3228,8 +3228,19 @@ pub const Managed = struct { | ... | @@ -3228,8 +3228,19 @@ pub const Managed = struct { |
| 3228 | 3228 | ||
| 3229 | /// r = ⌊√a⌋ | 3229 | /// r = ⌊√a⌋ |
| 3230 | pub fn sqrt(rma: *Managed, a: *const Managed) !void { | 3230 | pub fn sqrt(rma: *Managed, a: *const Managed) !void { |
| 3231 | const needed_limbs = calcSqrtLimbsBufferLen(a.bitCountAbs()); | 3231 | const bit_count = a.bitCountAbs(); |
| 3232 | 3232 | ||
| 3233 | if (bit_count == 0) { | ||
| 3234 | try rma.set(0); | ||
| 3235 | rma.setMetadata(a.isPositive(), rma.len()); | ||
| 3236 | return; | ||
| 3237 | } | ||
| 3238 | |||
| 3239 | if (!a.isPositive()) { | ||
| 3240 | return error.SqrtOfNegativeNumber; | ||
| 3241 | } | ||
| 3242 | |||
| 3243 | const needed_limbs = calcSqrtLimbsBufferLen(bit_count); | ||
| 3233 | const limbs_buffer = try rma.allocator.alloc(Limb, needed_limbs); | 3244 | const limbs_buffer = try rma.allocator.alloc(Limb, needed_limbs); |
| 3234 | defer rma.allocator.free(limbs_buffer); | 3245 | defer rma.allocator.free(limbs_buffer); |
| 3235 | 3246 |
lib/std/math/big/int_test.zig+26| ... | @@ -3149,3 +3149,29 @@ test "big.int.Const.order 0 == -0" { | ... | @@ -3149,3 +3149,29 @@ test "big.int.Const.order 0 == -0" { |
| 3149 | }; | 3149 | }; |
| 3150 | try std.testing.expectEqual(std.math.Order.eq, a.order(b)); | 3150 | try std.testing.expectEqual(std.math.Order.eq, a.order(b)); |
| 3151 | } | 3151 | } |
| 3152 | |||
| 3153 | test "big.int.Managed sqrt(0) = 0" { | ||
| 3154 | const allocator = testing.allocator; | ||
| 3155 | var a = try Managed.initSet(allocator, 1); | ||
| 3156 | defer a.deinit(); | ||
| 3157 | |||
| 3158 | var res = try Managed.initSet(allocator, 1); | ||
| 3159 | defer res.deinit(); | ||
| 3160 | |||
| 3161 | try a.setString(10, "0"); | ||
| 3162 | |||
| 3163 | try res.sqrt(&a); | ||
| 3164 | } | ||
| 3165 | |||
| 3166 | test "big.int.Managed sqrt(-1) = error" { | ||
| 3167 | const allocator = testing.allocator; | ||
| 3168 | var a = try Managed.initSet(allocator, 1); | ||
| 3169 | defer a.deinit(); | ||
| 3170 | |||
| 3171 | var res = try Managed.initSet(allocator, 1); | ||
| 3172 | defer res.deinit(); | ||
| 3173 | |||
| 3174 | try a.setString(10, "-1"); | ||
| 3175 | |||
| 3176 | try testing.expectError(error.SqrtOfNegativeNumber, res.sqrt(&a)); | ||
| 3177 | } |