| ... | ... | @@ -971,6 +971,84 @@ test "big.int mul large" { |
| 971 | 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 | 1052 | test "big.int div single-single no rem" { |
| 975 | 1053 | var a = try Managed.initSet(testing.allocator, 50); |
| 976 | 1054 | defer a.deinit(); |
| ... | ... | @@ -1623,7 +1701,6 @@ test "big.int saturate multi unsigned zero" { |
| 1623 | 1701 | try testing.expect(a.eqZero()); |
| 1624 | 1702 | } |
| 1625 | 1703 | |
| 1626 | | |
| 1627 | 1704 | test "big.int saturate multi unsigned" { |
| 1628 | 1705 | var a = try Managed.initSet(testing.allocator, maxInt(Limb) << @bitSizeOf(DoubleLimb)); |
| 1629 | 1706 | defer a.deinit(); |