diff --git a/lib/std/math/big/int.zig b/lib/std/math/big/int.zig index 181615ec0c..0303aa12f7 100644 --- a/lib/std/math/big/int.zig +++ b/lib/std/math/big/int.zig @@ -1576,10 +1576,6 @@ pub const Mutable = struct { // for i from n down to t + 1, do var i = n; while (i >= t + 1) : (i -= 1) { - if (x.eqZero()) { - break; - } - const k = i - t - 1; // 3.1. // if x_i == y_t: @@ -1630,7 +1626,6 @@ pub const Mutable = struct { // Note, we multiply by a single limb here. // The shift doesn't need to be performed if we add the result of the first multiplication // to x[i - t - 1]. - // mem.set(Limb, x.limbs, 0); const underflow = llmulLimb(.sub, x.limbs[k..x.len], y.limbs[0..y.len], q.limbs[k]); // 3.4. @@ -1643,10 +1638,9 @@ pub const Mutable = struct { llaccum(.add, x.limbs[k..x.len], y.limbs[0..y.len]); q.limbs[k] -= 1; } - - x.normalize(x.len); } + x.normalize(x.len); q.normalize(q.len); // De-normalize r and y. diff --git a/lib/std/math/big/int_test.zig b/lib/std/math/big/int_test.zig index 73b549d204..790cc10775 100644 --- a/lib/std/math/big/int_test.zig +++ b/lib/std/math/big/int_test.zig @@ -1369,6 +1369,33 @@ test "big.int divFloor #10932" { try testing.expect((try mod.to(i32)) == 0); } +test "big.int divFloor #11166" { + var a = try Managed.init(testing.allocator); + defer a.deinit(); + + var b = try Managed.init(testing.allocator); + defer b.deinit(); + + var res = try Managed.init(testing.allocator); + defer res.deinit(); + + try a.setString(10, "10000007000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000870000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"); + try b.setString(10, "10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"); + + var mod = try Managed.init(testing.allocator); + defer mod.deinit(); + + try res.divFloor(&mod, a.toConst(), b.toConst()); + + const ress = try res.toString(testing.allocator, 10, .lower); + defer testing.allocator.free(ress); + try testing.expect(std.mem.eql(u8, ress, "1000000700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000")); + + const mods = try mod.toString(testing.allocator, 10, .lower); + defer testing.allocator.free(mods); + try testing.expect(std.mem.eql(u8, mods, "870000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000")); +} + test "big.int gcd #10932" { var a = try Managed.init(testing.allocator); defer a.deinit();