authorgravatar for robin@voetter.nlRobin Voetter <robin@voetter.nl> 2021-10-04 00:05:10+02:00
committergravatar for robin@voetter.nlRobin Voetter <robin@voetter.nl> 2021-10-04 11:25:29+02:00
loga62ce87f1f8874cf9c6bcf197afc638e8321f692
treef0b3e9b3fd173c6b459c0268ef5289ad7d9f4e4f
parentb352564b36052053260696809ba19a7497e25940

big ints: mulWrap tests


1 files changed, 78 insertions(+), 1 deletions(-)

lib/std/math/big/int_test.zig+78-1
...@@ -971,6 +971,84 @@ test "big.int mul large" {...@@ -971,6 +971,84 @@ test "big.int mul large" {
971 try testing.expect(b.eq(c));971 try testing.expect(b.eq(c));
972}972}
973973
974test "big.int mulWrap single-single unsigned" {
975 var a = try Managed.initSet(testing.allocator, 1234);
976 defer a.deinit();
977 var b = try Managed.initSet(testing.allocator, 5678);
978 defer b.deinit();
979
980 var c = try Managed.init(testing.allocator);
981 defer c.deinit();
982 try c.mulWrap(a.toConst(), b.toConst(), .unsigned, 17);
983
984 try testing.expect((try c.to(u17)) == 59836);
985}
986
987test "big.int mulWrap single-single signed" {
988 var a = try Managed.initSet(testing.allocator, 1234);
989 defer a.deinit();
990 var b = try Managed.initSet(testing.allocator, -5678);
991 defer b.deinit();
992
993 var c = try Managed.init(testing.allocator);
994 defer c.deinit();
995 try c.mulWrap(a.toConst(), b.toConst(), .signed, 17);
996
997 try testing.expect((try c.to(i17)) == -59836);
998}
999
1000test "big.int mulWrap multi-multi unsigned" {
1001 const op1 = 0x998888efefefefefefefef;
1002 const op2 = 0x333000abababababababab;
1003 var a = try Managed.initSet(testing.allocator, op1);
1004 defer a.deinit();
1005 var b = try Managed.initSet(testing.allocator, op2);
1006 defer b.deinit();
1007
1008 var c = try Managed.init(testing.allocator);
1009 defer c.deinit();
1010 try c.mulWrap(a.toConst(), b.toConst(), .unsigned, 65);
1011
1012 try testing.expect((try c.to(u256)) == (op1 * op2) & ((1 << 65) - 1));
1013}
1014
1015test "big.int mulWrap multi-multi signed" {
1016 var a = try Managed.initSet(testing.allocator, maxInt(SignedDoubleLimb) - 1);
1017 defer a.deinit();
1018 var b = try Managed.initSet(testing.allocator, maxInt(SignedDoubleLimb));
1019 defer b.deinit();
1020
1021 var c = try Managed.init(testing.allocator);
1022 defer c.deinit();
1023 try c.mulWrap(a.toConst(), b.toConst(), .signed, 128);
1024
1025 try testing.expect((try c.to(SignedDoubleLimb)) == minInt(SignedDoubleLimb) + 2);
1026}
1027
1028test "big.int mulWrap large" {
1029 var a = try Managed.initCapacity(testing.allocator, 50);
1030 defer a.deinit();
1031 var b = try Managed.initCapacity(testing.allocator, 100);
1032 defer b.deinit();
1033 var c = try Managed.initCapacity(testing.allocator, 100);
1034 defer c.deinit();
1035
1036 // Generate a number that's large enough to cross the thresholds for the use
1037 // of subquadratic algorithms
1038 for (a.limbs) |*p| {
1039 p.* = std.math.maxInt(Limb);
1040 }
1041 a.setMetadata(true, 50);
1042
1043 const testbits = @bitSizeOf(Limb) * 64 + 45;
1044
1045 try b.mulWrap(a.toConst(), a.toConst(), .signed, testbits);
1046 try c.sqr(a.toConst());
1047 try c.truncate(c.toConst(), .signed, testbits);
1048
1049 try testing.expect(b.eq(c));
1050}
1051
974test "big.int div single-single no rem" {1052test "big.int div single-single no rem" {
975 var a = try Managed.initSet(testing.allocator, 50);1053 var a = try Managed.initSet(testing.allocator, 50);
976 defer a.deinit();1054 defer a.deinit();
...@@ -1623,7 +1701,6 @@ test "big.int saturate multi unsigned zero" {...@@ -1623,7 +1701,6 @@ test "big.int saturate multi unsigned zero" {
1623 try testing.expect(a.eqZero());1701 try testing.expect(a.eqZero());
1624}1702}
16251703
1626
1627test "big.int saturate multi unsigned" {1704test "big.int saturate multi unsigned" {
1628 var a = try Managed.initSet(testing.allocator, maxInt(Limb) << @bitSizeOf(DoubleLimb));1705 var a = try Managed.initSet(testing.allocator, maxInt(Limb) << @bitSizeOf(DoubleLimb));
1629 defer a.deinit();1706 defer a.deinit();