| ... | @@ -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 | } |
| 973 | | 973 | |
| | 974 | test "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 | |
| | 987 | test "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 | |
| | 1000 | test "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 | |
| | 1015 | test "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 | |
| | 1028 | test "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 | |
| 974 | test "big.int div single-single no rem" { | 1052 | test "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 | } |
| 1625 | | 1703 | |
| 1626 | | | |
| 1627 | test "big.int saturate multi unsigned" { | 1704 | test "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(); |