#include "big.h" #include #include "gtest/gtest.h" static int bign_compare_to(const struct bign *b, const char *ref) { if (b->data == nullptr) { return 4242; } struct bign bref; bign_create_from_string(&bref, ref); int cmp = bign_cmp(b, &bref); bign_destroy(&bref); return cmp; } static void bign_create_random(struct bign *self) { static const int SizeMin = 3; static const int SizeMax = 50; int size = SizeMin + std::rand() / (RAND_MAX / (SizeMax - SizeMin)); assert(SizeMin <= size && size <= SizeMax); self->size = size; self->capacity = size; self->data = static_cast(std::calloc(size, sizeof(uint32_t))); for (int i = 0; i < size; ++i) { self->data[i] = (rand() << 16) + rand(); } if (self->data[size - 1] == 0) { self->data[size - 1] = 1; } } static int bigz_compare_to(const struct bigz *b, const char *ref, unsigned base) { if (b->n.data == nullptr) { return 4242; } struct bigz bref; bigz_create_from_string(&bref, ref, base); int cmp = bigz_cmp(b, &bref); bigz_destroy(&bref); return cmp; } TEST(BigN, CreateEmpty) { struct bign b1; bign_create_empty(&b1); EXPECT_EQ(b1.size, 0u); EXPECT_EQ(b1.data, nullptr); bign_destroy(&b1); } TEST(BigN, CreateFromValue) { struct bign b1; bign_create_from_value(&b1, UINT32_C(42)); EXPECT_EQ(b1.size, 1u); EXPECT_EQ(b1.data[0], UINT32_C(42)); bign_destroy(&b1); } TEST(BigN, CreateFromStringZero) { struct bign b1; bign_create_from_string(&b1, "0"); EXPECT_EQ(b1.size, 1u); EXPECT_EQ(b1.data[0], UINT32_C(0)); bign_destroy(&b1); } TEST(BigN, CreateFromStringZeroes) { struct bign b1; bign_create_from_string(&b1, "00000000"); EXPECT_EQ(b1.size, 1u); EXPECT_EQ(b1.data[0], UINT32_C(0)); bign_destroy(&b1); } TEST(BigN, CreateFromStringDigit) { struct bign b1; bign_create_from_string(&b1, "29A"); EXPECT_EQ(b1.size, 1u); EXPECT_EQ(b1.data[0], UINT32_C(0x29A)); bign_destroy(&b1); } TEST(BigN, CreateFromStringLong) { struct bign b1; bign_create_from_string(&b1, "E38C3BA948CDEA5673926BFFDBAECBF782B3F2C332F1C3F2"); EXPECT_EQ(b1.size, 6u); EXPECT_EQ(b1.data[5], UINT32_C(0xE38C3BA9)); EXPECT_EQ(b1.data[4], UINT32_C(0x48CDEA56)); EXPECT_EQ(b1.data[3], UINT32_C(0x73926BFF)); EXPECT_EQ(b1.data[2], UINT32_C(0xDBAECBF7)); EXPECT_EQ(b1.data[1], UINT32_C(0x82B3F2C3)); EXPECT_EQ(b1.data[0], UINT32_C(0x32F1C3F2)); bign_destroy(&b1); } TEST(BigN, CreateFromStringAllDigit) { struct bign b1; bign_create_from_string(&b1, "0123456789ABCDEFabcdef"); EXPECT_EQ(b1.size, 3u); EXPECT_EQ(b1.data[2], UINT32_C(0x012345)); EXPECT_EQ(b1.data[1], UINT32_C(0x6789ABCD)); EXPECT_EQ(b1.data[0], UINT32_C(0xEFABCDEF)); bign_destroy(&b1); } TEST(BigN, CreateFromStringWithZero) { struct bign b1; bign_create_from_string(&b1, "0000000000000042"); EXPECT_EQ(b1.size, 1u); EXPECT_EQ(b1.data[0], UINT32_C(0x42)); bign_destroy(&b1); } TEST(BigN, CmpSame) { struct bign b1; bign_create_from_string(&b1, "E38C3BA948CDEA5673926BFFDBAECBF782B3F2C332F1C3F2"); int cmp = bign_cmp(&b1, &b1); EXPECT_EQ(cmp, 0); bign_destroy(&b1); } TEST(BigN, CmpEqual) { struct bign b1; bign_create_from_string(&b1, "E38C3BA948CDEA5673926BFFDBAECBF782B3F2C332F1C3F2"); struct bign b2; bign_create_from_string(&b2, "E38C3BA948CDEA5673926BFFDBAECBF782B3F2C332F1C3F2"); int cmp = bign_cmp(&b1, &b2); EXPECT_EQ(cmp, 0); bign_destroy(&b2); bign_destroy(&b1); } TEST(BigN, CmpSameSizeGreater) { struct bign b1; bign_create_from_string(&b1, "E38C3BA948CDEA5673926BFFDBAECBF782B3F2C332F1C3F2"); struct bign b2; bign_create_from_string(&b2, "E38C3BA948CDEA5673926BFFDBAECBF782B3F2C332F1C3F1"); int cmp = bign_cmp(&b1, &b2); EXPECT_GT(cmp, 0); bign_destroy(&b2); bign_destroy(&b1); } TEST(BigN, CmpSameSizeLower) { struct bign b1; bign_create_from_string(&b1, "E38C3BA948CDEA5673926BFFDBAECBF782B3F2C332F1C3F2"); struct bign b2; bign_create_from_string(&b2, "E38C3BA948CDEA5673926BFFDBAECBF782B3F2C332F1C3F3"); int cmp = bign_cmp(&b1, &b2); EXPECT_LT(cmp, 0); bign_destroy(&b2); bign_destroy(&b1); } TEST(BigN, CmpDifferentSize) { struct bign b1; bign_create_from_string(&b1, "E38C3BA948CDEA5673926BFFDBAECBF782B3F2C332F1C3F2"); struct bign b2; bign_create_from_value(&b2, UINT32_C(42)); { int cmp = bign_cmp(&b1, &b2); EXPECT_GT(cmp, 0); } { int cmp = bign_cmp(&b2, &b1); EXPECT_LT(cmp, 0); } bign_destroy(&b2); bign_destroy(&b1); } TEST(BigN, CmpToZero) { struct bign b1; bign_create_from_string(&b1, "0000000000000000"); struct bign b2; bign_create_from_string(&b2, "0000000100000000"); int cmp = bign_cmp(&b1, &b2); EXPECT_LT(cmp, 0); bign_destroy(&b2); bign_destroy(&b1); } TEST(BigN, CmpZeroEqual) { struct bign b1; bign_create_from_string(&b1, "0"); int cmp = bign_cmp_zero(&b1); EXPECT_EQ(cmp, 0); bign_destroy(&b1); } TEST(BigN, CmpZeroZeroEqual) { struct bign b1; bign_create_from_string(&b1, "0000000000000000"); int cmp = bign_cmp_zero(&b1); EXPECT_EQ(cmp, 0); bign_destroy(&b1); } TEST(BigN, CmpZeroDifferent) { struct bign b1; bign_create_from_string(&b1, "E38C3BA948CDEA5673926BFFDBAECBF782B3F2C332F1C3F2"); int cmp = bign_cmp_zero(&b1); EXPECT_GT(cmp, 0); bign_destroy(&b1); } TEST(BigN, Copy) { struct bign b1; bign_create_from_string(&b1, "E38C3BA948CDEA5673926BFFDBAECBF782B3F2C332F1C3F2"); struct bign b2; bign_create_empty(&b2); bign_copy_from_other(&b2, &b1); EXPECT_EQ(b2.size, 6u); if (b2.size == 6u) { EXPECT_EQ(b2.data[5], UINT32_C(0xE38C3BA9)); EXPECT_EQ(b2.data[4], UINT32_C(0x48CDEA56)); EXPECT_EQ(b2.data[3], UINT32_C(0x73926BFF)); EXPECT_EQ(b2.data[2], UINT32_C(0xDBAECBF7)); EXPECT_EQ(b2.data[1], UINT32_C(0x82B3F2C3)); EXPECT_EQ(b2.data[0], UINT32_C(0x32F1C3F2)); EXPECT_EQ(bign_cmp(&b1, &b2), 0); } bign_destroy(&b2); bign_destroy(&b1); } TEST(BigN, CopyInNonEmpty) { struct bign b1; bign_create_from_string(&b1, "E38C3BA948CDEA5673926BFFDBAECBF782B3F2C332F1C3F2"); struct bign b2; bign_create_from_string(&b2, "158EFA739BFA8362FBCD"); bign_copy_from_other(&b2, &b1); EXPECT_EQ(b2.size, 6u); if (b2.size == 6u) { EXPECT_EQ(b2.data[5], UINT32_C(0xE38C3BA9)); EXPECT_EQ(b2.data[4], UINT32_C(0x48CDEA56)); EXPECT_EQ(b2.data[3], UINT32_C(0x73926BFF)); EXPECT_EQ(b2.data[2], UINT32_C(0xDBAECBF7)); EXPECT_EQ(b2.data[1], UINT32_C(0x82B3F2C3)); EXPECT_EQ(b2.data[0], UINT32_C(0x32F1C3F2)); EXPECT_EQ(bign_cmp(&b1, &b2), 0); } bign_destroy(&b2); bign_destroy(&b1); } TEST(BigN, Move) { struct bign b1; bign_create_from_string(&b1, "E38C3BA948CDEA5673926BFFDBAECBF782B3F2C332F1C3F2"); uint32_t *ptr = b1.data; struct bign b2; bign_create_empty(&b2); bign_move_from_other(&b2, &b1); EXPECT_EQ(b2.size, 6u); if (b2.size == 6u) { EXPECT_EQ(b2.data[5], UINT32_C(0xE38C3BA9)); EXPECT_EQ(b2.data[4], UINT32_C(0x48CDEA56)); EXPECT_EQ(b2.data[3], UINT32_C(0x73926BFF)); EXPECT_EQ(b2.data[2], UINT32_C(0xDBAECBF7)); EXPECT_EQ(b2.data[1], UINT32_C(0x82B3F2C3)); EXPECT_EQ(b2.data[0], UINT32_C(0x32F1C3F2)); EXPECT_EQ(ptr, b2.data); EXPECT_EQ(b1.size, 0u); EXPECT_EQ(b1.capacity, 0u); EXPECT_EQ(b1.data, nullptr); } bign_destroy(&b2); bign_destroy(&b1); } TEST(BigN, MoveInNonEmpty) { struct bign b1; bign_create_from_string(&b1, "E38C3BA948CDEA5673926BFFDBAECBF782B3F2C332F1C3F2"); uint32_t *ptr = b1.data; struct bign b2; bign_create_from_string(&b2, "158EFA739BFA8362FBCD"); bign_move_from_other(&b2, &b1); EXPECT_EQ(b2.size, 6u); if (b2.size == 6u) { EXPECT_EQ(b2.data[5], UINT32_C(0xE38C3BA9)); EXPECT_EQ(b2.data[4], UINT32_C(0x48CDEA56)); EXPECT_EQ(b2.data[3], UINT32_C(0x73926BFF)); EXPECT_EQ(b2.data[2], UINT32_C(0xDBAECBF7)); EXPECT_EQ(b2.data[1], UINT32_C(0x82B3F2C3)); EXPECT_EQ(b2.data[0], UINT32_C(0x32F1C3F2)); EXPECT_EQ(ptr, b2.data); EXPECT_EQ(b1.size, 0u); EXPECT_EQ(b1.capacity, 0u); EXPECT_EQ(b1.data, nullptr); } bign_destroy(&b2); bign_destroy(&b1); } TEST(BigN, Print) { struct bign b1; bign_create_from_string(&b1, "0000000000000000A948CDEA56730000000BFF0782B30000000032F1C3F2"); bign_print(&b1); puts(""); bign_destroy(&b1); } /* * add */ TEST(BigN, AddSingleDigit) { struct bign b1; bign_create_from_string(&b1, "12"); struct bign b2; bign_create_from_string(&b2, "34"); struct bign b3; bign_create_empty(&b3); bign_add(&b3, &b1, &b2); int cmp = bign_compare_to(&b3, "46"); EXPECT_EQ(cmp, 0); bign_destroy(&b3); bign_destroy(&b2); bign_destroy(&b1); } TEST(BigN, AddSingleDigitToSelf) { struct bign b1; bign_create_from_string(&b1, "12"); struct bign b2; bign_create_from_string(&b2, "34"); bign_add(&b1, &b1, &b2); int cmp = bign_compare_to(&b1, "46"); EXPECT_EQ(cmp, 0); bign_destroy(&b2); bign_destroy(&b1); } TEST(BigN, AddManyDigits) { struct bign b1; bign_create_from_string(&b1, "1212121212121212"); struct bign b2; bign_create_from_string(&b2, "3434343434343434"); struct bign b3; bign_create_empty(&b3); bign_add(&b3, &b1, &b2); int cmp = bign_compare_to(&b3, "4646464646464646"); EXPECT_EQ(cmp, 0); bign_destroy(&b3); bign_destroy(&b2); bign_destroy(&b1); } TEST(BigN, AddManyDigitsToSelf) { struct bign b1; bign_create_from_string(&b1, "1212121212121212"); struct bign b2; bign_create_from_string(&b2, "3434343434343434"); bign_add(&b1, &b1, &b2); int cmp = bign_compare_to(&b1, "4646464646464646"); EXPECT_EQ(cmp, 0); bign_destroy(&b2); bign_destroy(&b1); } TEST(BigN, AddManyDigitsWithCarry) { struct bign b1; bign_create_from_string(&b1, "FFFFFFFFFFFFFFFF"); struct bign b2; bign_create_from_string(&b2, "1"); struct bign b3; bign_create_empty(&b3); bign_add(&b3, &b1, &b2); int cmp = bign_compare_to(&b3, "10000000000000000"); EXPECT_EQ(cmp, 0); bign_destroy(&b3); bign_destroy(&b2); bign_destroy(&b1); } TEST(BigN, AddManyDigitsWithCarryToSelf) { struct bign b1; bign_create_from_string(&b1, "FFFFFFFFFFFFFFFF"); struct bign b2; bign_create_from_string(&b2, "1"); bign_add(&b1, &b1, &b2); int cmp = bign_compare_to(&b1, "10000000000000000"); EXPECT_EQ(cmp, 0); bign_destroy(&b2); bign_destroy(&b1); } TEST(BigN, AddMax) { struct bign b1; bign_create_from_string(&b1, "FFFFFFFFFFFFFFFF"); struct bign b2; bign_create_from_string(&b2, "FFFFFFFFFFFFFFFF"); struct bign b3; bign_create_empty(&b3); bign_add(&b3, &b1, &b2); int cmp = bign_compare_to(&b3, "1fffffffffffffffe"); EXPECT_EQ(cmp, 0); bign_destroy(&b3); bign_destroy(&b2); bign_destroy(&b1); } /* * sub */ TEST(BigN, SubSingleDigit) { struct bign b1; bign_create_from_string(&b1, "46"); struct bign b2; bign_create_from_string(&b2, "34"); struct bign b3; bign_create_empty(&b3); bign_sub(&b3, &b1, &b2); int cmp = bign_compare_to(&b3, "12"); EXPECT_EQ(cmp, 0); bign_destroy(&b3); bign_destroy(&b2); bign_destroy(&b1); } TEST(BigN, SubSingleDigitToSelf) { struct bign b1; bign_create_from_string(&b1, "46"); struct bign b2; bign_create_from_string(&b2, "34"); bign_sub(&b1, &b1, &b2); int cmp = bign_compare_to(&b1, "12"); EXPECT_EQ(cmp, 0); bign_destroy(&b2); bign_destroy(&b1); } TEST(BigN, SubManyDigits) { struct bign b1; bign_create_from_string(&b1, "4646464646464646"); struct bign b2; bign_create_from_string(&b2, "3434343434343434"); struct bign b3; bign_create_empty(&b3); bign_sub(&b3, &b1, &b2); int cmp = bign_compare_to(&b3, "1212121212121212"); EXPECT_EQ(cmp, 0); bign_destroy(&b3); bign_destroy(&b2); bign_destroy(&b1); } TEST(BigN, SubManyDigitsToSelf) { struct bign b1; bign_create_from_string(&b1, "4646464646464646"); struct bign b2; bign_create_from_string(&b2, "3434343434343434"); bign_sub(&b1, &b1, &b2); int cmp = bign_compare_to(&b1, "1212121212121212"); EXPECT_EQ(cmp, 0); bign_destroy(&b2); bign_destroy(&b1); } TEST(BigN, SubManyDigitsWithCarry) { struct bign b1; bign_create_from_string(&b1, "10000000000000000"); struct bign b2; bign_create_from_string(&b2, "1"); struct bign b3; bign_create_empty(&b3); bign_sub(&b3, &b1, &b2); int cmp = bign_compare_to(&b3, "FFFFFFFFFFFFFFFF"); EXPECT_EQ(cmp, 0); bign_destroy(&b3); bign_destroy(&b2); bign_destroy(&b1); } TEST(BigN, SubManyDigitsWithCarryToSelf) { struct bign b1; bign_create_from_string(&b1, "10000000000000000"); struct bign b2; bign_create_from_string(&b2, "1"); bign_sub(&b1, &b1, &b2); int cmp = bign_compare_to(&b1, "FFFFFFFFFFFFFFFF"); EXPECT_EQ(cmp, 0); bign_destroy(&b2); bign_destroy(&b1); } TEST(BigN, SubMax) { struct bign b1; bign_create_from_string(&b1, "10000000000000000"); struct bign b2; bign_create_from_string(&b2, "FFFFFFFFFFFFFFFF"); struct bign b3; bign_create_empty(&b3); bign_sub(&b3, &b1, &b2); int cmp = bign_compare_to(&b3, "1"); EXPECT_EQ(cmp, 0); bign_destroy(&b3); bign_destroy(&b2); bign_destroy(&b1); } // TODO: X - 0 /* * mul */ TEST(BigN, MulSingleDigit) { struct bign b1; bign_create_from_string(&b1, "42"); struct bign b2; bign_create_from_string(&b2, "69"); struct bign b3; bign_create_empty(&b3); bign_mul(&b3, &b1, &b2); int cmp = bign_compare_to(&b3, "1b12"); EXPECT_EQ(cmp, 0); bign_destroy(&b3); bign_destroy(&b2); bign_destroy(&b1); } TEST(BigN, MulSingleDigitToSelf) { struct bign b1; bign_create_from_string(&b1, "42"); struct bign b2; bign_create_from_string(&b2, "69"); bign_mul(&b1, &b1, &b2); int cmp = bign_compare_to(&b1, "1b12"); EXPECT_EQ(cmp, 0); bign_destroy(&b2); bign_destroy(&b1); } TEST(BigN, MulManyDigits) { struct bign b1; bign_create_from_string(&b1, "69426942694269"); struct bign b2; bign_create_from_string(&b2, "12"); { struct bign b3; bign_create_empty(&b3); bign_mul(&b3, &b1, &b2); int cmp = bign_compare_to(&b3, "766ab66ab66ab62"); EXPECT_EQ(cmp, 0); bign_destroy(&b3); } { struct bign b3; bign_create_empty(&b3); bign_mul(&b3, &b2, &b1); int cmp = bign_compare_to(&b3, "766ab66ab66ab62"); EXPECT_EQ(cmp, 0); bign_destroy(&b3); } bign_destroy(&b2); bign_destroy(&b1); } TEST(BigN, MulManyDigitsToSelf) { struct bign b1; bign_create_from_string(&b1, "69426942694269"); struct bign b2; bign_create_from_string(&b2, "12"); bign_mul(&b1, &b1, &b2); int cmp = bign_compare_to(&b1, "766ab66ab66ab62"); EXPECT_EQ(cmp, 0); bign_destroy(&b2); bign_destroy(&b1); } TEST(BigN, MulManyDigitsWithCarry) { struct bign b1; bign_create_from_string(&b1, "4269426942694269"); struct bign b2; bign_create_from_string(&b2, "1200000012"); struct bign b3; bign_create_empty(&b3); bign_mul(&b3, &b1, &b2); int cmp = bign_compare_to(&b3, "4ab66ab6b56cd56c8ab66ab62"); EXPECT_EQ(cmp, 0); bign_destroy(&b3); bign_destroy(&b2); bign_destroy(&b1); } TEST(BigN, MulManyDigitsWithCarryToSelf) { struct bign b1; bign_create_from_string(&b1, "4269426942694269"); struct bign b2; bign_create_from_string(&b2, "1200000012"); bign_mul(&b1, &b1, &b2); int cmp = bign_compare_to(&b1, "4ab66ab6b56cd56c8ab66ab62"); EXPECT_EQ(cmp, 0); bign_destroy(&b2); bign_destroy(&b1); } TEST(BigN, MulMax) { struct bign b1; bign_create_from_string(&b1, "FFFFFFFFFFFFFFFF"); struct bign b2; bign_create_from_string(&b2, "FFFFFFFFFFFFFFFF"); struct bign b3; bign_create_empty(&b3); bign_mul(&b3, &b1, &b2); int cmp = bign_compare_to(&b3, "fffffffffffffffe0000000000000001"); EXPECT_EQ(cmp, 0); bign_destroy(&b3); bign_destroy(&b2); bign_destroy(&b1); } TEST(BigN, MulRsa768) { struct bign b1; bign_create_from_string(&b1, "d982ec7b440e2869d2535e51f91bacc3eb6eba042e106e6f875c3d17e53db65fffd6e4e9a36084ce60f83d754dd7f701"); struct bign b2; bign_create_from_string(&b2, "eebe6dd23ce7e99c0e2249fecc4418c34af74e418bfa714c3791828414ab18f32fd7e093062a49b030225cc845f99ab5"); struct bign b3; bign_create_empty(&b3); bign_mul(&b3, &b1, &b2); int cmp = bign_compare_to(&b3, "cad984557c97e039431a226ad727f0c6d43ef3d418469f1b375049b229843ee9f83b1f97738ac274f5f61f401f21f1913e4b64bb31b55a38d398c0dfed00b1392f0889711c44b359e7976c617fcc734f06e3e95c26476091b52f462e79413db5"); EXPECT_EQ(cmp, 0); bign_destroy(&b3); bign_destroy(&b2); bign_destroy(&b1); } /* * mul short TODO */ /* * mul karatsuba */ TEST(BigN, MulKaratsubaSingleDigit) { struct bign b1; bign_create_from_string(&b1, "42"); struct bign b2; bign_create_from_string(&b2, "69"); struct bign b3; bign_create_empty(&b3); bign_mul_karatsuba(&b3, &b1, &b2); int cmp = bign_compare_to(&b3, "1b12"); EXPECT_EQ(cmp, 0); bign_destroy(&b3); bign_destroy(&b2); bign_destroy(&b1); } TEST(BigN, MulKaratsubaSingleDigitToSelf) { struct bign b1; bign_create_from_string(&b1, "42"); struct bign b2; bign_create_from_string(&b2, "69"); bign_mul_karatsuba(&b1, &b1, &b2); int cmp = bign_compare_to(&b1, "1b12"); EXPECT_EQ(cmp, 0); bign_destroy(&b2); bign_destroy(&b1); } TEST(BigN, MulKaratsubaManyDigits) { struct bign b1; bign_create_from_string(&b1, "69426942694269"); struct bign b2; bign_create_from_string(&b2, "12"); { struct bign b3; bign_create_empty(&b3); bign_mul_karatsuba(&b3, &b1, &b2); int cmp = bign_compare_to(&b3, "766ab66ab66ab62"); EXPECT_EQ(cmp, 0); bign_destroy(&b3); } { struct bign b3; bign_create_empty(&b3); bign_mul_karatsuba(&b3, &b2, &b1); int cmp = bign_compare_to(&b3, "766ab66ab66ab62"); EXPECT_EQ(cmp, 0); bign_destroy(&b3); } bign_destroy(&b2); bign_destroy(&b1); } TEST(BigN, MulKaratsubaManyDigitsToSelf) { struct bign b1; bign_create_from_string(&b1, "69426942694269"); struct bign b2; bign_create_from_string(&b2, "12"); bign_mul_karatsuba(&b1, &b1, &b2); int cmp = bign_compare_to(&b1, "766ab66ab66ab62"); EXPECT_EQ(cmp, 0); bign_destroy(&b2); bign_destroy(&b1); } TEST(BigN, MulKaratsubaManyDigitsWithCarry) { struct bign b1; bign_create_from_string(&b1, "4269426942694269"); struct bign b2; bign_create_from_string(&b2, "1200000012"); struct bign b3; bign_create_empty(&b3); bign_mul_karatsuba(&b3, &b1, &b2); int cmp = bign_compare_to(&b3, "4ab66ab6b56cd56c8ab66ab62"); EXPECT_EQ(cmp, 0); bign_destroy(&b3); bign_destroy(&b2); bign_destroy(&b1); } TEST(BigN, MulKaratsubaManyDigitsWithCarryToSelf) { struct bign b1; bign_create_from_string(&b1, "4269426942694269"); struct bign b2; bign_create_from_string(&b2, "1200000012"); bign_mul_karatsuba(&b1, &b1, &b2); int cmp = bign_compare_to(&b1, "4ab66ab6b56cd56c8ab66ab62"); EXPECT_EQ(cmp, 0); bign_destroy(&b2); bign_destroy(&b1); } TEST(BigN, MulKaratsubaMax) { struct bign b1; bign_create_from_string(&b1, "FFFFFFFFFFFFFFFF"); struct bign b2; bign_create_from_string(&b2, "FFFFFFFFFFFFFFFF"); struct bign b3; bign_create_empty(&b3); bign_mul_karatsuba(&b3, &b1, &b2); int cmp = bign_compare_to(&b3, "fffffffffffffffe0000000000000001"); EXPECT_EQ(cmp, 0); bign_destroy(&b3); bign_destroy(&b2); bign_destroy(&b1); } TEST(BigN, MulKaratsubaRsa768) { struct bign b1; bign_create_from_string(&b1, "d982ec7b440e2869d2535e51f91bacc3eb6eba042e106e6f875c3d17e53db65fffd6e4e9a36084ce60f83d754dd7f701"); struct bign b2; bign_create_from_string(&b2, "eebe6dd23ce7e99c0e2249fecc4418c34af74e418bfa714c3791828414ab18f32fd7e093062a49b030225cc845f99ab5"); struct bign b3; bign_create_empty(&b3); bign_mul_karatsuba(&b3, &b1, &b2); int cmp = bign_compare_to(&b3, "cad984557c97e039431a226ad727f0c6d43ef3d418469f1b375049b229843ee9f83b1f97738ac274f5f61f401f21f1913e4b64bb31b55a38d398c0dfed00b1392f0889711c44b359e7976c617fcc734f06e3e95c26476091b52f462e79413db5"); EXPECT_EQ(cmp, 0); bign_destroy(&b3); bign_destroy(&b2); bign_destroy(&b1); } /* * div */ TEST(BigN, DivSingleDigit) { struct bign b1; bign_create_from_string(&b1, "69"); struct bign b2; bign_create_from_string(&b2, "42"); struct bign q; bign_create_empty(&q); struct bign r; bign_create_empty(&r); bign_div(&q, &r, &b1, &b2); int cmpq = bign_compare_to(&q, "1"); EXPECT_EQ(cmpq, 0); int cmpr = bign_compare_to(&r, "27"); EXPECT_EQ(cmpr, 0); bign_destroy(&r); bign_destroy(&q); bign_destroy(&b2); bign_destroy(&b1); } TEST(BigN, DivSingleDigitReverse) { struct bign b1; bign_create_from_string(&b1, "69"); struct bign b2; bign_create_from_string(&b2, "42"); struct bign q; bign_create_empty(&q); struct bign r; bign_create_empty(&r); bign_div(&q, &r, &b2, &b1); int cmpq = bign_compare_to(&q, "0"); EXPECT_EQ(cmpq, 0); int cmpr = bign_compare_to(&r, "42"); EXPECT_EQ(cmpr, 0); bign_destroy(&r); bign_destroy(&q); bign_destroy(&b2); bign_destroy(&b1); } TEST(BigN, DivShort) { struct bign b1; bign_create_from_string(&b1, "E38C3BA948CDEA5673926BFFDBAECBF782B3F2C332F1C3F2"); struct bign b2; bign_create_from_string(&b2, "4269"); struct bign q; bign_create_empty(&q); struct bign r; bign_create_empty(&r); bign_div(&q, &r, &b1, &b2); int cmpq = bign_compare_to(&q, "36d289377777bc42aa33c0180efb449c6ca5908b4dc2c"); EXPECT_EQ(cmpq, 0); int cmpr = bign_compare_to(&r, "1de6"); EXPECT_EQ(cmpr, 0); bign_destroy(&r); bign_destroy(&q); bign_destroy(&b2); bign_destroy(&b1); } TEST(BigN, DivShortMax) { struct bign b1; bign_create_from_string(&b1, "FFFFFFFFFFFFFFFF"); struct bign b2; bign_create_from_string(&b2, "FFFFFFFF"); struct bign q; bign_create_empty(&q); struct bign r; bign_create_empty(&r); bign_div(&q, &r, &b1, &b2); int cmpq = bign_compare_to(&q, "100000001"); EXPECT_EQ(cmpq, 0); int cmpr = bign_compare_to(&r, "0"); EXPECT_EQ(cmpr, 0); bign_destroy(&r); bign_destroy(&q); bign_destroy(&b2); bign_destroy(&b1); } TEST(BigN, DivManyDigits) { struct bign b1; bign_create_from_string(&b1, "E38C3BA948CDEA5673926BFFDBAECBF782B3F2C332F1C3F2"); struct bign b2; bign_create_from_string(&b2, "426999FEAB350EB291B3F1098"); struct bign q; bign_create_empty(&q); struct bign r; bign_create_empty(&r); bign_div(&q, &r, &b1, &b2); int cmpq = bign_compare_to(&q, "36d20a18b7884e2890017831"); EXPECT_EQ(cmpq, 0); int cmpr = bign_compare_to(&r, "222ada30e45d62ecadb8056da"); EXPECT_EQ(cmpr, 0); bign_destroy(&r); bign_destroy(&q); bign_destroy(&b2); bign_destroy(&b1); } TEST(BigN, DivMax) { struct bign b1; bign_create_from_string(&b1, "FFFFFFFFFFFFFFFF"); struct bign b2; bign_create_from_string(&b2, "FFFFFFFFFFFFFFFF"); struct bign q; bign_create_empty(&q); struct bign r; bign_create_empty(&r); bign_div(&q, &r, &b1, &b2); int cmpq = bign_compare_to(&q, "1"); EXPECT_EQ(cmpq, 0); int cmpr = bign_compare_to(&r, "0"); EXPECT_EQ(cmpr, 0); bign_destroy(&r); bign_destroy(&q); bign_destroy(&b2); bign_destroy(&b1); } /* * tests from http://www.hackersdelight.org/hdcodetxt/divmnu64.c.txt * the first three tests are errors */ TEST(BigN, DivCase3) { // test #3 struct bign b1; bign_create_from_string(&b1, "00000003"); struct bign b2; bign_create_from_string(&b2, "00000002"); struct bign q; bign_create_empty(&q); struct bign r; bign_create_empty(&r); bign_div(&q, &r, &b1, &b2); int cmpq = bign_compare_to(&q, "00000001"); EXPECT_EQ(cmpq, 0); int cmpr = bign_compare_to(&r, "00000001"); EXPECT_EQ(cmpr, 0); bign_destroy(&r); bign_destroy(&q); bign_destroy(&b2); bign_destroy(&b1); } TEST(BigN, DivCase4) { // test #4 struct bign b1; bign_create_from_string(&b1, "00000003"); struct bign b2; bign_create_from_string(&b2, "00000003"); struct bign q; bign_create_empty(&q); struct bign r; bign_create_empty(&r); bign_div(&q, &r, &b1, &b2); int cmpq = bign_compare_to(&q, "00000001"); EXPECT_EQ(cmpq, 0); int cmpr = bign_compare_to(&r, "00000000"); EXPECT_EQ(cmpr, 0); bign_destroy(&r); bign_destroy(&q); bign_destroy(&b2); bign_destroy(&b1); } TEST(BigN, DivCase5) { // test #5 struct bign b1; bign_create_from_string(&b1, "00000003"); struct bign b2; bign_create_from_string(&b2, "00000004"); struct bign q; bign_create_empty(&q); struct bign r; bign_create_empty(&r); bign_div(&q, &r, &b1, &b2); int cmpq = bign_compare_to(&q, "00000000"); EXPECT_EQ(cmpq, 0); int cmpr = bign_compare_to(&r, "00000003"); EXPECT_EQ(cmpr, 0); bign_destroy(&r); bign_destroy(&q); bign_destroy(&b2); bign_destroy(&b1); } TEST(BigN, DivCase6) { // test #6 struct bign b1; bign_create_from_string(&b1, "00000000"); struct bign b2; bign_create_from_string(&b2, "ffffffff"); struct bign q; bign_create_empty(&q); struct bign r; bign_create_empty(&r); bign_div(&q, &r, &b1, &b2); int cmpq = bign_compare_to(&q, "00000000"); EXPECT_EQ(cmpq, 0); int cmpr = bign_compare_to(&r, "00000000"); EXPECT_EQ(cmpr, 0); bign_destroy(&r); bign_destroy(&q); bign_destroy(&b2); bign_destroy(&b1); } TEST(BigN, DivCase7) { // test #7 struct bign b1; bign_create_from_string(&b1, "ffffffff"); struct bign b2; bign_create_from_string(&b2, "00000001"); struct bign q; bign_create_empty(&q); struct bign r; bign_create_empty(&r); bign_div(&q, &r, &b1, &b2); int cmpq = bign_compare_to(&q, "ffffffff"); EXPECT_EQ(cmpq, 0); int cmpr = bign_compare_to(&r, "00000000"); EXPECT_EQ(cmpr, 0); bign_destroy(&r); bign_destroy(&q); bign_destroy(&b2); bign_destroy(&b1); } TEST(BigN, DivCase8) { // test #8 struct bign b1; bign_create_from_string(&b1, "ffffffff"); struct bign b2; bign_create_from_string(&b2, "ffffffff"); struct bign q; bign_create_empty(&q); struct bign r; bign_create_empty(&r); bign_div(&q, &r, &b1, &b2); int cmpq = bign_compare_to(&q, "00000001"); EXPECT_EQ(cmpq, 0); int cmpr = bign_compare_to(&r, "00000000"); EXPECT_EQ(cmpr, 0); bign_destroy(&r); bign_destroy(&q); bign_destroy(&b2); bign_destroy(&b1); } TEST(BigN, DivCase9) { // test #9 struct bign b1; bign_create_from_string(&b1, "ffffffff"); struct bign b2; bign_create_from_string(&b2, "00000003"); struct bign q; bign_create_empty(&q); struct bign r; bign_create_empty(&r); bign_div(&q, &r, &b1, &b2); int cmpq = bign_compare_to(&q, "55555555"); EXPECT_EQ(cmpq, 0); int cmpr = bign_compare_to(&r, "00000000"); EXPECT_EQ(cmpr, 0); bign_destroy(&r); bign_destroy(&q); bign_destroy(&b2); bign_destroy(&b1); } TEST(BigN, DivCase10) { // test #10 struct bign b1; bign_create_from_string(&b1, "ffffffffffffffff"); struct bign b2; bign_create_from_string(&b2, "00000001"); struct bign q; bign_create_empty(&q); struct bign r; bign_create_empty(&r); bign_div(&q, &r, &b1, &b2); int cmpq = bign_compare_to(&q, "ffffffffffffffff"); EXPECT_EQ(cmpq, 0); int cmpr = bign_compare_to(&r, "00000000"); EXPECT_EQ(cmpr, 0); bign_destroy(&r); bign_destroy(&q); bign_destroy(&b2); bign_destroy(&b1); } TEST(BigN, DivCase11) { // test #11 struct bign b1; bign_create_from_string(&b1, "ffffffffffffffff"); struct bign b2; bign_create_from_string(&b2, "ffffffff"); struct bign q; bign_create_empty(&q); struct bign r; bign_create_empty(&r); bign_div(&q, &r, &b1, &b2); int cmpq = bign_compare_to(&q, "0000000100000001"); EXPECT_EQ(cmpq, 0); int cmpr = bign_compare_to(&r, "00000000"); EXPECT_EQ(cmpr, 0); bign_destroy(&r); bign_destroy(&q); bign_destroy(&b2); bign_destroy(&b1); } TEST(BigN, DivCase12) { // test #12 struct bign b1; bign_create_from_string(&b1, "fffffffeffffffff"); struct bign b2; bign_create_from_string(&b2, "ffffffff"); struct bign q; bign_create_empty(&q); struct bign r; bign_create_empty(&r); bign_div(&q, &r, &b1, &b2); int cmpq = bign_compare_to(&q, "00000000ffffffff"); EXPECT_EQ(cmpq, 0); int cmpr = bign_compare_to(&r, "fffffffe"); EXPECT_EQ(cmpr, 0); bign_destroy(&r); bign_destroy(&q); bign_destroy(&b2); bign_destroy(&b1); } TEST(BigN, DivCase13) { // test #13 struct bign b1; bign_create_from_string(&b1, "0000123400005678"); struct bign b2; bign_create_from_string(&b2, "00009abc"); struct bign q; bign_create_empty(&q); struct bign r; bign_create_empty(&r); bign_div(&q, &r, &b1, &b2); int cmpq = bign_compare_to(&q, "000000001e1dba76"); EXPECT_EQ(cmpq, 0); int cmpr = bign_compare_to(&r, "00006bd0"); EXPECT_EQ(cmpr, 0); bign_destroy(&r); bign_destroy(&q); bign_destroy(&b2); bign_destroy(&b1); } TEST(BigN, DivCase14) { // test #14 struct bign b1; bign_create_from_string(&b1, "0000000000000000"); struct bign b2; bign_create_from_string(&b2, "0000000100000000"); struct bign q; bign_create_empty(&q); struct bign r; bign_create_empty(&r); bign_div(&q, &r, &b1, &b2); int cmpq = bign_compare_to(&q, "00000000"); EXPECT_EQ(cmpq, 0); int cmpr = bign_compare_to(&r, "0000000000000000"); EXPECT_EQ(cmpr, 0); bign_destroy(&r); bign_destroy(&q); bign_destroy(&b2); bign_destroy(&b1); } TEST(BigN, DivCase15) { // test #15 struct bign b1; bign_create_from_string(&b1, "0000000700000000"); struct bign b2; bign_create_from_string(&b2, "0000000300000000"); struct bign q; bign_create_empty(&q); struct bign r; bign_create_empty(&r); bign_div(&q, &r, &b1, &b2); int cmpq = bign_compare_to(&q, "00000002"); EXPECT_EQ(cmpq, 0); int cmpr = bign_compare_to(&r, "0000000100000000"); EXPECT_EQ(cmpr, 0); bign_destroy(&r); bign_destroy(&q); bign_destroy(&b2); bign_destroy(&b1); } TEST(BigN, DivCase16) { // test #16 struct bign b1; bign_create_from_string(&b1, "0000000700000005"); struct bign b2; bign_create_from_string(&b2, "0000000300000000"); struct bign q; bign_create_empty(&q); struct bign r; bign_create_empty(&r); bign_div(&q, &r, &b1, &b2); int cmpq = bign_compare_to(&q, "00000002"); EXPECT_EQ(cmpq, 0); int cmpr = bign_compare_to(&r, "0000000100000005"); EXPECT_EQ(cmpr, 0); bign_destroy(&r); bign_destroy(&q); bign_destroy(&b2); bign_destroy(&b1); } TEST(BigN, DivCase17) { // test #17 struct bign b1; bign_create_from_string(&b1, "0000000600000000"); struct bign b2; bign_create_from_string(&b2, "0000000200000000"); struct bign q; bign_create_empty(&q); struct bign r; bign_create_empty(&r); bign_div(&q, &r, &b1, &b2); int cmpq = bign_compare_to(&q, "00000003"); EXPECT_EQ(cmpq, 0); int cmpr = bign_compare_to(&r, "0000000000000000"); EXPECT_EQ(cmpr, 0); bign_destroy(&r); bign_destroy(&q); bign_destroy(&b2); bign_destroy(&b1); } TEST(BigN, DivCase18) { // test #18 struct bign b1; bign_create_from_string(&b1, "80000000"); struct bign b2; bign_create_from_string(&b2, "40000001"); struct bign q; bign_create_empty(&q); struct bign r; bign_create_empty(&r); bign_div(&q, &r, &b1, &b2); int cmpq = bign_compare_to(&q, "00000001"); EXPECT_EQ(cmpq, 0); int cmpr = bign_compare_to(&r, "3fffffff"); EXPECT_EQ(cmpr, 0); bign_destroy(&r); bign_destroy(&q); bign_destroy(&b2); bign_destroy(&b1); } TEST(BigN, DivCase19) { // test #19 struct bign b1; bign_create_from_string(&b1, "8000000000000000"); struct bign b2; bign_create_from_string(&b2, "40000001"); struct bign q; bign_create_empty(&q); struct bign r; bign_create_empty(&r); bign_div(&q, &r, &b1, &b2); int cmpq = bign_compare_to(&q, "00000001fffffff8"); EXPECT_EQ(cmpq, 0); int cmpr = bign_compare_to(&r, "00000008"); EXPECT_EQ(cmpr, 0); bign_destroy(&r); bign_destroy(&q); bign_destroy(&b2); bign_destroy(&b1); } TEST(BigN, DivCase20) { // test #20 struct bign b1; bign_create_from_string(&b1, "8000000000000000"); struct bign b2; bign_create_from_string(&b2, "4000000000000001"); struct bign q; bign_create_empty(&q); struct bign r; bign_create_empty(&r); bign_div(&q, &r, &b1, &b2); int cmpq = bign_compare_to(&q, "00000001"); EXPECT_EQ(cmpq, 0); int cmpr = bign_compare_to(&r, "3fffffffffffffff"); EXPECT_EQ(cmpr, 0); bign_destroy(&r); bign_destroy(&q); bign_destroy(&b2); bign_destroy(&b1); } TEST(BigN, DivCase21) { // test #21 struct bign b1; bign_create_from_string(&b1, "0000bcde0000789a"); struct bign b2; bign_create_from_string(&b2, "0000bcde0000789a"); struct bign q; bign_create_empty(&q); struct bign r; bign_create_empty(&r); bign_div(&q, &r, &b1, &b2); int cmpq = bign_compare_to(&q, "00000001"); EXPECT_EQ(cmpq, 0); int cmpr = bign_compare_to(&r, "0000000000000000"); EXPECT_EQ(cmpr, 0); bign_destroy(&r); bign_destroy(&q); bign_destroy(&b2); bign_destroy(&b1); } TEST(BigN, DivCase22) { // test #22 struct bign b1; bign_create_from_string(&b1, "0000bcde0000789b"); struct bign b2; bign_create_from_string(&b2, "0000bcde0000789a"); struct bign q; bign_create_empty(&q); struct bign r; bign_create_empty(&r); bign_div(&q, &r, &b1, &b2); int cmpq = bign_compare_to(&q, "00000001"); EXPECT_EQ(cmpq, 0); int cmpr = bign_compare_to(&r, "0000000000000001"); EXPECT_EQ(cmpr, 0); bign_destroy(&r); bign_destroy(&q); bign_destroy(&b2); bign_destroy(&b1); } TEST(BigN, DivCase23) { // test #23 struct bign b1; bign_create_from_string(&b1, "0000bcde00007899"); struct bign b2; bign_create_from_string(&b2, "0000bcde0000789a"); struct bign q; bign_create_empty(&q); struct bign r; bign_create_empty(&r); bign_div(&q, &r, &b1, &b2); int cmpq = bign_compare_to(&q, "00000000"); EXPECT_EQ(cmpq, 0); int cmpr = bign_compare_to(&r, "0000bcde00007899"); EXPECT_EQ(cmpr, 0); bign_destroy(&r); bign_destroy(&q); bign_destroy(&b2); bign_destroy(&b1); } TEST(BigN, DivCase24) { // test #24 struct bign b1; bign_create_from_string(&b1, "0000ffff0000ffff"); struct bign b2; bign_create_from_string(&b2, "0000ffff0000ffff"); struct bign q; bign_create_empty(&q); struct bign r; bign_create_empty(&r); bign_div(&q, &r, &b1, &b2); int cmpq = bign_compare_to(&q, "00000001"); EXPECT_EQ(cmpq, 0); int cmpr = bign_compare_to(&r, "0000000000000000"); EXPECT_EQ(cmpr, 0); bign_destroy(&r); bign_destroy(&q); bign_destroy(&b2); bign_destroy(&b1); } TEST(BigN, DivCase25) { // test #25 struct bign b1; bign_create_from_string(&b1, "0000ffff0000ffff"); struct bign b2; bign_create_from_string(&b2, "0000000100000000"); struct bign q; bign_create_empty(&q); struct bign r; bign_create_empty(&r); bign_div(&q, &r, &b1, &b2); int cmpq = bign_compare_to(&q, "0000ffff"); EXPECT_EQ(cmpq, 0); int cmpr = bign_compare_to(&r, "000000000000ffff"); EXPECT_EQ(cmpr, 0); bign_destroy(&r); bign_destroy(&q); bign_destroy(&b2); bign_destroy(&b1); } TEST(BigN, DivCase26) { // test #26 struct bign b1; bign_create_from_string(&b1, "0000012300004567000089ab"); struct bign b2; bign_create_from_string(&b2, "0000000100000000"); struct bign q; bign_create_empty(&q); struct bign r; bign_create_empty(&r); bign_div(&q, &r, &b1, &b2); int cmpq = bign_compare_to(&q, "0000012300004567"); EXPECT_EQ(cmpq, 0); int cmpr = bign_compare_to(&r, "00000000000089ab"); EXPECT_EQ(cmpr, 0); bign_destroy(&r); bign_destroy(&q); bign_destroy(&b2); bign_destroy(&b1); } TEST(BigN, DivCase27) { // test #27 // Shows that first qhat can = b + 1. struct bign b1; bign_create_from_string(&b1, "000080000000fffe00000000"); struct bign b2; bign_create_from_string(&b2, "000080000000ffff"); struct bign q; bign_create_empty(&q); struct bign r; bign_create_empty(&r); bign_div(&q, &r, &b1, &b2); int cmpq = bign_compare_to(&q, "00000000ffffffff"); EXPECT_EQ(cmpq, 0); int cmpr = bign_compare_to(&r, "00007fff0000ffff"); EXPECT_EQ(cmpr, 0); bign_destroy(&r); bign_destroy(&q); bign_destroy(&b2); bign_destroy(&b1); } TEST(BigN, DivCase28) { // test #28 // Adding back step req'd. struct bign b1; bign_create_from_string(&b1, "800000000000000000000003"); struct bign b2; bign_create_from_string(&b2, "200000000000000000000001"); struct bign q; bign_create_empty(&q); struct bign r; bign_create_empty(&r); bign_div(&q, &r, &b1, &b2); int cmpq = bign_compare_to(&q, "00000003"); EXPECT_EQ(cmpq, 0); int cmpr = bign_compare_to(&r, "200000000000000000000000"); EXPECT_EQ(cmpr, 0); bign_destroy(&r); bign_destroy(&q); bign_destroy(&b2); bign_destroy(&b1); } TEST(BigN, DivCase29) { // test #29 // Adding back step req'd. struct bign b1; bign_create_from_string(&b1, "000080000000000000000003"); struct bign b2; bign_create_from_string(&b2, "000020000000000000000001"); struct bign q; bign_create_empty(&q); struct bign r; bign_create_empty(&r); bign_div(&q, &r, &b1, &b2); int cmpq = bign_compare_to(&q, "00000003"); EXPECT_EQ(cmpq, 0); int cmpr = bign_compare_to(&r, "000020000000000000000000"); EXPECT_EQ(cmpr, 0); bign_destroy(&r); bign_destroy(&q); bign_destroy(&b2); bign_destroy(&b1); } TEST(BigN, DivCase30) { // test #30 // Add back req'd. struct bign b1; bign_create_from_string(&b1, "00007fff000080000000000000000000"); struct bign b2; bign_create_from_string(&b2, "000080000000000000000001"); struct bign q; bign_create_empty(&q); struct bign r; bign_create_empty(&r); bign_div(&q, &r, &b1, &b2); int cmpq = bign_compare_to(&q, "00000000fffe0000"); EXPECT_EQ(cmpq, 0); int cmpr = bign_compare_to(&r, "00007fffffffffff00020000"); EXPECT_EQ(cmpr, 0); bign_destroy(&r); bign_destroy(&q); bign_destroy(&b2); bign_destroy(&b1); } TEST(BigN, DivCase31) { // test #31 // Shows that mult-sub quantity cannot be treated as signed. struct bign b1; bign_create_from_string(&b1, "00008000000000000000fffe00000000"); struct bign b2; bign_create_from_string(&b2, "00008000000000000000ffff"); struct bign q; bign_create_empty(&q); struct bign r; bign_create_empty(&r); bign_div(&q, &r, &b1, &b2); int cmpq = bign_compare_to(&q, "00000000ffffffff"); EXPECT_EQ(cmpq, 0); int cmpr = bign_compare_to(&r, "00007fffffffffff0000ffff"); EXPECT_EQ(cmpr, 0); bign_destroy(&r); bign_destroy(&q); bign_destroy(&b2); bign_destroy(&b1); } TEST(BigN, DivCase32) { // test #32 // Shows that mult-sub quantity cannot be treated as signed. struct bign b1; bign_create_from_string(&b1, "8000000000000000fffffffe00000000"); struct bign b2; bign_create_from_string(&b2, "80000000000000000000ffff"); struct bign q; bign_create_empty(&q); struct bign r; bign_create_empty(&r); bign_div(&q, &r, &b1, &b2); int cmpq = bign_compare_to(&q, "0000000100000000"); EXPECT_EQ(cmpq, 0); int cmpr = bign_compare_to(&r, "00000000fffeffff00000000"); EXPECT_EQ(cmpr, 0); bign_destroy(&r); bign_destroy(&q); bign_destroy(&b2); bign_destroy(&b1); } TEST(BigN, DivCase33) { // test #33 // Shows that mult-sub quantity cannot be treated as signed. struct bign b1; bign_create_from_string(&b1, "8000000000000000fffffffe00000000"); struct bign b2; bign_create_from_string(&b2, "8000000000000000ffffffff"); struct bign q; bign_create_empty(&q); struct bign r; bign_create_empty(&r); bign_div(&q, &r, &b1, &b2); int cmpq = bign_compare_to(&q, "00000000ffffffff"); EXPECT_EQ(cmpq, 0); int cmpr = bign_compare_to(&r, "7fffffffffffffffffffffff"); EXPECT_EQ(cmpr, 0); bign_destroy(&r); bign_destroy(&q); bign_destroy(&b2); bign_destroy(&b1); } /* * exp */ // exp( , 0) TEST(BigN, ExpXPowerZero) { struct bign b1; bign_create_from_string(&b1, "1234567890ABCDEF"); struct bign b2; bign_create_from_string(&b2, "0"); struct bign b3; bign_create_empty(&b3); bign_exp(&b3, &b1, &b2); int cmp = bign_compare_to(&b3, "1"); EXPECT_EQ(cmp, 0); bign_destroy(&b3); bign_destroy(&b2); bign_destroy(&b1); } // exp( , 1) TEST(BigN, ExpXPowerOne) { struct bign b1; bign_create_from_string(&b1, "1234567890ABCDEF"); struct bign b2; bign_create_from_string(&b2, "1"); struct bign b3; bign_create_empty(&b3); bign_print(&b3); bign_exp(&b3, &b1, &b2); int cmp = bign_compare_to(&b3, "1234567890ABCDEF"); EXPECT_EQ(cmp, 0); bign_destroy(&b3); bign_destroy(&b2); bign_destroy(&b1); } // exp(0, ) TEST(BigN, ExpZeroPowerN) { struct bign b1; bign_create_from_string(&b1, "0"); struct bign b2; bign_create_from_string(&b2, "1234567890ABCDEF"); struct bign b3; bign_create_empty(&b3); bign_exp(&b3, &b1, &b2); int cmp = bign_compare_to(&b3, "0"); EXPECT_EQ(cmp, 0); bign_destroy(&b3); bign_destroy(&b2); bign_destroy(&b1); } // exp(1, ) TEST(BigN, ExpOnePowerN) { struct bign b1; bign_create_from_string(&b1, "1"); struct bign b2; bign_create_from_string(&b2, "1234567890ABCDEF"); struct bign b3; bign_create_empty(&b3); bign_exp(&b3, &b1, &b2); int cmp = bign_compare_to(&b3, "1"); EXPECT_EQ(cmp, 0); bign_destroy(&b3); bign_destroy(&b2); bign_destroy(&b1); } // exp(sm, sm) TEST(BigN, ExpSmallPowerSmall) { struct bign b1; bign_create_from_string(&b1, "31"); struct bign b2; bign_create_from_string(&b2, "56"); struct bign b3; bign_create_empty(&b3); bign_exp(&b3, &b1, &b2); bign_print(&b3); int cmp = bign_compare_to(&b3, "7491caf9dd4e6cc7aa542df60f1437aad480c03e54f97e58230a7952097d3710e2c0af4562b67af9f8e46b8c40beaa50fadf46423471861e4efce4f21"); EXPECT_EQ(cmp, 0); bign_destroy(&b3); bign_destroy(&b2); bign_destroy(&b1); } // exp(lg, sm) TEST(BigN, ExpLargePowerSmall) { struct bign b1; bign_create_from_string(&b1, "123456789"); struct bign b2; bign_create_from_string(&b2, "13"); struct bign b3; bign_create_empty(&b3); bign_exp(&b3, &b1, &b2); bign_print(&b3); int cmp = bign_compare_to(&b3, "b9def572bcd526c6bc46607dde0446ad6da1f4c4302fd57a1bec55d6157b328aeabe4525706f87494c647dca5fd70e1c33bbc93a4291fcf0eb957d7262a84b96148baee40ed8836bbeef433d9"); EXPECT_EQ(cmp, 0); bign_destroy(&b3); bign_destroy(&b2); bign_destroy(&b1); } // exp(sm, lg) TEST(BigN, ExpSmallPowerLarge) { struct bign b1; bign_create_from_string(&b1, "2"); struct bign b2; bign_create_from_string(&b2, "1000"); struct bign b3; bign_create_empty(&b3); bign_exp(&b3, &b1, &b2); EXPECT_EQ(b3.size, 129u); if (b3.size == 129u) { EXPECT_EQ(b3.data[128], UINT32_C(1)); for (int i = 0; i < 128; ++i) { EXPECT_EQ(b3.data[i], UINT32_C(0)); } } bign_destroy(&b3); bign_destroy(&b2); bign_destroy(&b1); } TEST(BigN, RandomAddSub) { static const int Iterations = 1000; for (int i = 0; i < Iterations; ++i) { struct bign b1; bign_create_random(&b1); struct bign b2; bign_create_random(&b2); struct bign b3; bign_create_empty(&b3); bign_add(&b3, &b1, &b2); struct bign b4; bign_create_empty(&b4); bign_sub(&b4, &b3, &b2); int cmp = bign_cmp(&b4, &b1); bign_destroy(&b4); bign_destroy(&b3); bign_destroy(&b2); bign_destroy(&b1); ASSERT_EQ(cmp, 0); } } TEST(BigN, RandomMulMul) { static const int Iterations = 100; for (int i = 0; i < Iterations; ++i) { struct bign b1; bign_create_random(&b1); struct bign b2; bign_create_random(&b2); struct bign b3; bign_create_empty(&b3); bign_mul(&b3, &b1, &b2); struct bign b4; bign_create_empty(&b4); bign_mul_karatsuba(&b4, &b1, &b2); int cmp = bign_cmp(&b3, &b4); bign_destroy(&b4); bign_destroy(&b3); bign_destroy(&b2); bign_destroy(&b1); ASSERT_EQ(cmp, 0); } } TEST(BigN, RandomMulDiv) { static const int Iterations = 1000; for (int i = 0; i < Iterations; ++i) { struct bign b1; bign_create_random(&b1); struct bign b2; bign_create_random(&b2); struct bign quo; bign_create_empty(&quo); struct bign rem; bign_create_empty(&rem); bign_div(&quo, &rem, &b1, &b2); struct bign b3; bign_create_random(&b3); bign_mul(&b3, &quo, &b2); bign_add(&b3, &b3, &rem); int cmp = bign_cmp(&b3, &b1); bign_destroy(&b3); bign_destroy(&rem); bign_destroy(&quo); bign_destroy(&b2); bign_destroy(&b1); ASSERT_EQ(cmp, 0); } } /* * BigZ */ TEST(BigZ, CreateEmpty) { struct bigz b1; bigz_create_empty(&b1); EXPECT_EQ(b1.n.size, 0u); EXPECT_EQ(b1.n.data, nullptr); bigz_destroy(&b1); } TEST(BigZ, CreateFromValuePositive) { struct bigz b1; bigz_create_from_value(&b1, INT32_C(42)); EXPECT_TRUE(b1.positive); EXPECT_EQ(b1.n.size, 1u); EXPECT_EQ(b1.n.data[0], UINT32_C(42)); bigz_destroy(&b1); } TEST(BigZ, CreateFromValueNegative) { struct bigz b1; bigz_create_from_value(&b1, INT32_C(-42)); EXPECT_FALSE(b1.positive); EXPECT_EQ(b1.n.size, 1u); EXPECT_EQ(b1.n.data[0], UINT32_C(42)); bigz_destroy(&b1); } TEST(BigZ, CreateFromValuePositiveMax) { struct bigz b1; bigz_create_from_value(&b1, INT32_MAX); uint32_t ref = INT32_MAX; EXPECT_TRUE(b1.positive); EXPECT_EQ(b1.n.size, 1u); EXPECT_EQ(b1.n.data[0], ref); bigz_destroy(&b1); } TEST(BigZ, CreateFromValueNegativeMin) { struct bigz b1; bigz_create_from_value(&b1, INT32_MIN); EXPECT_FALSE(b1.positive); EXPECT_EQ(b1.n.size, 1u); EXPECT_EQ(b1.n.data[0], UINT32_C(2147483648)); bigz_destroy(&b1); } TEST(BigZ, CreateFromStringPositiveZero) { struct bigz b1; bigz_create_from_string(&b1, "0", 10); EXPECT_TRUE(b1.positive); EXPECT_EQ(b1.n.size, 1u); EXPECT_EQ(b1.n.data[0], UINT32_C(0)); bigz_destroy(&b1); } TEST(BigZ, CreateFromStringNegativeZero) { struct bigz b1; bigz_create_from_string(&b1, "-0", 10); EXPECT_FALSE(b1.positive); EXPECT_EQ(b1.n.size, 1u); EXPECT_EQ(b1.n.data[0], UINT32_C(0)); bigz_destroy(&b1); } TEST(BigZ, CreateFromStringBinary) { struct bigz b1; bigz_create_from_string(&b1, "1001101101111010010010101101101011110110011100010001110111010001010001011110100010101010", 2); EXPECT_TRUE(b1.positive); EXPECT_EQ(b1.n.size, 3u); EXPECT_EQ(b1.n.data[0], UINT32_C(0xd145e8aa)); EXPECT_EQ(b1.n.data[1], UINT32_C(0xdaf6711d)); EXPECT_EQ(b1.n.data[2], UINT32_C(0x9b7a4a)); bigz_destroy(&b1); } TEST(BigZ, CreateFromStringDecimal) { struct bigz b1; bigz_create_from_string(&b1, "15497642151661527013020516797518124587412201", 10); EXPECT_TRUE(b1.positive); EXPECT_EQ(b1.n.size, 5u); EXPECT_EQ(b1.n.data[0], UINT32_C(0x1507eae9)); EXPECT_EQ(b1.n.data[1], UINT32_C(0x7698c6e5)); EXPECT_EQ(b1.n.data[2], UINT32_C(0x57589b7b)); EXPECT_EQ(b1.n.data[3], UINT32_C(0x7a1cba70)); EXPECT_EQ(b1.n.data[4], UINT32_C(0xb1e7)); bigz_destroy(&b1); } TEST(BigZ, CreateFromStringDecimalNegative) { struct bigz b1; bigz_create_from_string(&b1, "-15497642151661527013020516797518124587412201", 10); EXPECT_FALSE(b1.positive); EXPECT_EQ(b1.n.size, 5u); EXPECT_EQ(b1.n.data[0], UINT32_C(0x1507eae9)); EXPECT_EQ(b1.n.data[1], UINT32_C(0x7698c6e5)); EXPECT_EQ(b1.n.data[2], UINT32_C(0x57589b7b)); EXPECT_EQ(b1.n.data[3], UINT32_C(0x7a1cba70)); EXPECT_EQ(b1.n.data[4], UINT32_C(0xb1e7)); bigz_destroy(&b1); } TEST(BigZ, CmpSame) { struct bigz b1; bigz_create_from_string(&b1, "E38C3BA948CDEA5673926BFFDBAECBF782B3F2C332F1C3F2", 16); int cmp = bigz_cmp(&b1, &b1); EXPECT_EQ(cmp, 0); bigz_destroy(&b1); } TEST(BigZ, CmpEqualPositive) { struct bigz b1; bigz_create_from_string(&b1, "E38C3BA948CDEA5673926BFFDBAECBF782B3F2C332F1C3F2", 16); struct bigz b2; bigz_create_from_string(&b2, "E38C3BA948CDEA5673926BFFDBAECBF782B3F2C332F1C3F2", 16); int cmp = bigz_cmp(&b1, &b2); EXPECT_EQ(cmp, 0); bigz_destroy(&b2); bigz_destroy(&b1); } TEST(BigZ, CmpEqualNegative) { struct bigz b1; bigz_create_from_string(&b1, "-E38C3BA948CDEA5673926BFFDBAECBF782B3F2C332F1C3F2", 16); struct bigz b2; bigz_create_from_string(&b2, "-E38C3BA948CDEA5673926BFFDBAECBF782B3F2C332F1C3F2", 16); int cmp = bigz_cmp(&b1, &b2); EXPECT_EQ(cmp, 0); bigz_destroy(&b2); bigz_destroy(&b1); } TEST(BigZ, CmpDifferentSign) { struct bigz b1; bigz_create_from_string(&b1, "E38C3BA948CDEA5673926BFFDBAECBF782B3F2C332F1C3F2", 16); struct bigz b2; bigz_create_from_string(&b2, "-E38C3BA948CDEA5673926BFFDBAECBF782B3F2C332F1C3F2", 16); { int cmp = bigz_cmp(&b1, &b2); EXPECT_GT(cmp, 0); } { int cmp = bigz_cmp(&b2, &b1); EXPECT_LT(cmp, 0); } bigz_destroy(&b2); bigz_destroy(&b1); } // TODO: negative negative TEST(BigZ, CmpPositiveNegativeZero) { struct bigz b1; bigz_create_from_string(&b1, "0", 10); struct bigz b2; bigz_create_from_string(&b2, "-0", 10); { int cmp = bigz_cmp(&b1, &b2); EXPECT_EQ(cmp, 0); } { int cmp = bigz_cmp(&b2, &b1); EXPECT_EQ(cmp, 0); } bigz_destroy(&b2); bigz_destroy(&b1); } TEST(BigZ, CmpZeroEqualPositiveZero) { struct bigz b1; bigz_create_from_string(&b1, "0", 10); int cmp = bigz_cmp_zero(&b1); EXPECT_EQ(cmp, 0); bigz_destroy(&b1); } TEST(BigZ, CmpZeroEqualNegativeZero) { struct bigz b1; bigz_create_from_string(&b1, "-0", 10); int cmp = bigz_cmp_zero(&b1); EXPECT_EQ(cmp, 0); bigz_destroy(&b1); } TEST(BigZ, CmpZeroPositive) { struct bigz b1; bigz_create_from_string(&b1, "12345678987654321", 10); int cmp = bigz_cmp_zero(&b1); EXPECT_GT(cmp, 0); bigz_destroy(&b1); } TEST(BigZ, CmpZeroNegative) { struct bigz b1; bigz_create_from_string(&b1, "-12345678987654321", 10); int cmp = bigz_cmp_zero(&b1); EXPECT_LT(cmp, 0); bigz_destroy(&b1); } TEST(BigZ, Copy) { struct bigz b1; bigz_create_from_string(&b1, "-E38C3BA948CDEA5673926BFFDBAECBF782B3F2C332F1C3F2", 16); struct bigz b2; bigz_create_empty(&b2); bigz_copy_from_other(&b2, &b1); EXPECT_FALSE(b2.positive); EXPECT_EQ(b2.n.size, 6u); if (b2.n.size == 6u) { EXPECT_EQ(b2.n.data[5], UINT32_C(0xE38C3BA9)); EXPECT_EQ(b2.n.data[4], UINT32_C(0x48CDEA56)); EXPECT_EQ(b2.n.data[3], UINT32_C(0x73926BFF)); EXPECT_EQ(b2.n.data[2], UINT32_C(0xDBAECBF7)); EXPECT_EQ(b2.n.data[1], UINT32_C(0x82B3F2C3)); EXPECT_EQ(b2.n.data[0], UINT32_C(0x32F1C3F2)); EXPECT_EQ(bigz_cmp(&b1, &b2), 0); } bigz_destroy(&b2); bigz_destroy(&b1); } TEST(BigZ, CopyInNonEmpty) { struct bigz b1; bigz_create_from_string(&b1, "-E38C3BA948CDEA5673926BFFDBAECBF782B3F2C332F1C3F2", 16); struct bigz b2; bigz_create_from_string(&b2, "EF193C2DFAC33C2FF3D89274801", 16); bigz_copy_from_other(&b2, &b1); EXPECT_FALSE(b2.positive); EXPECT_EQ(b2.n.size, 6u); if (b2.n.size == 6u) { EXPECT_EQ(b2.n.data[5], UINT32_C(0xE38C3BA9)); EXPECT_EQ(b2.n.data[4], UINT32_C(0x48CDEA56)); EXPECT_EQ(b2.n.data[3], UINT32_C(0x73926BFF)); EXPECT_EQ(b2.n.data[2], UINT32_C(0xDBAECBF7)); EXPECT_EQ(b2.n.data[1], UINT32_C(0x82B3F2C3)); EXPECT_EQ(b2.n.data[0], UINT32_C(0x32F1C3F2)); EXPECT_EQ(bigz_cmp(&b1, &b2), 0); } bigz_destroy(&b2); bigz_destroy(&b1); } TEST(BigZ, Move) { struct bigz b1; bigz_create_from_string(&b1, "-E38C3BA948CDEA5673926BFFDBAECBF782B3F2C332F1C3F2", 16); uint32_t *ptr = b1.n.data; struct bigz b2; bigz_create_empty(&b2); bigz_move_from_other(&b2, &b1); EXPECT_FALSE(b2.positive); EXPECT_EQ(b2.n.size, 6u); if (b2.n.size == 6u) { EXPECT_EQ(b2.n.data[5], UINT32_C(0xE38C3BA9)); EXPECT_EQ(b2.n.data[4], UINT32_C(0x48CDEA56)); EXPECT_EQ(b2.n.data[3], UINT32_C(0x73926BFF)); EXPECT_EQ(b2.n.data[2], UINT32_C(0xDBAECBF7)); EXPECT_EQ(b2.n.data[1], UINT32_C(0x82B3F2C3)); EXPECT_EQ(b2.n.data[0], UINT32_C(0x32F1C3F2)); EXPECT_EQ(ptr, b2.n.data); EXPECT_EQ(b1.n.size, 0u); EXPECT_EQ(b1.n.capacity, 0u); EXPECT_EQ(b1.n.data, nullptr); } bigz_destroy(&b2); bigz_destroy(&b1); } TEST(BigZ, MoveInNonEmpty) { struct bigz b1; bigz_create_from_string(&b1, "-E38C3BA948CDEA5673926BFFDBAECBF782B3F2C332F1C3F2", 16); uint32_t *ptr = b1.n.data; struct bigz b2; bigz_create_from_string(&b2, "EF193C2DFAC33C2FF3D89274801", 16); bigz_move_from_other(&b2, &b1); EXPECT_FALSE(b2.positive); EXPECT_EQ(b2.n.size, 6u); if (b2.n.size == 6u) { EXPECT_EQ(b2.n.data[5], UINT32_C(0xE38C3BA9)); EXPECT_EQ(b2.n.data[4], UINT32_C(0x48CDEA56)); EXPECT_EQ(b2.n.data[3], UINT32_C(0x73926BFF)); EXPECT_EQ(b2.n.data[2], UINT32_C(0xDBAECBF7)); EXPECT_EQ(b2.n.data[1], UINT32_C(0x82B3F2C3)); EXPECT_EQ(b2.n.data[0], UINT32_C(0x32F1C3F2)); EXPECT_EQ(ptr, b2.n.data); EXPECT_EQ(b1.n.size, 0u); EXPECT_EQ(b1.n.capacity, 0u); EXPECT_EQ(b1.n.data, nullptr); } bigz_destroy(&b2); bigz_destroy(&b1); } // TEST(BigZ, Print) { // struct bigz b1; // bigz_create_from_string(&b1, "-E38C3BA948CDEA5673926BFFDBAECBF782B3F2C332F1C3F2", 16); // // bigz_print(&b1); puts(""); // // bigz_destroy(&b1); // } TEST(BigZ, AddPositivePositive) { struct bigz b1; bigz_create_from_string(&b1, "278230124321795170179057917641147901789701", 10); struct bigz b2; bigz_create_from_string(&b2, "46578458745802102102145458458245485441416", 10); { struct bigz b3; bigz_create_empty(&b3); bigz_add(&b3, &b1, &b2); int cmp = bigz_compare_to(&b3, "324808583067597272281203376099393387231117", 10); EXPECT_EQ(cmp, 0); bigz_destroy(&b3); } { struct bigz b3; bigz_create_empty(&b3); bigz_add(&b3, &b2, &b1); int cmp = bigz_compare_to(&b3, "324808583067597272281203376099393387231117", 10); EXPECT_EQ(cmp, 0); bigz_destroy(&b3); } bigz_destroy(&b2); bigz_destroy(&b1); } TEST(BigZ, AddPositiveNegative) { struct bigz b1; bigz_create_from_string(&b1, "278230124321795170179057917641147901789701", 10); struct bigz b2; bigz_create_from_string(&b2, "-46578458745802102102145458458245485441416", 10); { struct bigz b3; bigz_create_empty(&b3); bigz_add(&b3, &b1, &b2); int cmp = bigz_compare_to(&b3, "231651665575993068076912459182902416348285", 10); EXPECT_EQ(cmp, 0); bigz_destroy(&b3); } { struct bigz b3; bigz_create_empty(&b3); bigz_add(&b3, &b2, &b1); int cmp = bigz_compare_to(&b3, "231651665575993068076912459182902416348285", 10); EXPECT_EQ(cmp, 0); bigz_destroy(&b3); } bigz_destroy(&b2); bigz_destroy(&b1); } TEST(BigZ, AddNegativePositive) { struct bigz b1; bigz_create_from_string(&b1, "-278230124321795170179057917641147901789701", 10); struct bigz b2; bigz_create_from_string(&b2, "46578458745802102102145458458245485441416", 10); { struct bigz b3; bigz_create_empty(&b3); bigz_add(&b3, &b1, &b2); int cmp = bigz_compare_to(&b3, "-231651665575993068076912459182902416348285", 10); EXPECT_EQ(cmp, 0); bigz_destroy(&b3); } { struct bigz b3; bigz_create_empty(&b3); bigz_add(&b3, &b2, &b1); int cmp = bigz_compare_to(&b3, "-231651665575993068076912459182902416348285", 10); EXPECT_EQ(cmp, 0); bigz_destroy(&b3); } bigz_destroy(&b2); bigz_destroy(&b1); } TEST(BigZ, AddNegativeNegative) { struct bigz b1; bigz_create_from_string(&b1, "-278230124321795170179057917641147901789701", 10); struct bigz b2; bigz_create_from_string(&b2, "-46578458745802102102145458458245485441416", 10); { struct bigz b3; bigz_create_empty(&b3); bigz_add(&b3, &b1, &b2); int cmp = bigz_compare_to(&b3, "-324808583067597272281203376099393387231117", 10); EXPECT_EQ(cmp, 0); bigz_destroy(&b3); } { struct bigz b3; bigz_create_empty(&b3); bigz_add(&b3, &b2, &b1); int cmp = bigz_compare_to(&b3, "-324808583067597272281203376099393387231117", 10); EXPECT_EQ(cmp, 0); bigz_destroy(&b3); } bigz_destroy(&b2); bigz_destroy(&b1); } TEST(BigZ, SubPositivePositive) { struct bigz b1; bigz_create_from_string(&b1, "278230124321795170179057917641147901789701", 10); struct bigz b2; bigz_create_from_string(&b2, "46578458745802102102145458458245485441416", 10); { struct bigz b3; bigz_create_empty(&b3); bigz_sub(&b3, &b1, &b2); int cmp = bigz_compare_to(&b3, "231651665575993068076912459182902416348285", 10); EXPECT_EQ(cmp, 0); bigz_destroy(&b3); } { struct bigz b3; bigz_create_empty(&b3); bigz_sub(&b3, &b2, &b1); int cmp = bigz_compare_to(&b3, "-231651665575993068076912459182902416348285", 10); EXPECT_EQ(cmp, 0); bigz_destroy(&b3); } bigz_destroy(&b2); bigz_destroy(&b1); } TEST(BigZ, SubPositiveNegative) { struct bigz b1; bigz_create_from_string(&b1, "278230124321795170179057917641147901789701", 10); struct bigz b2; bigz_create_from_string(&b2, "-46578458745802102102145458458245485441416", 10); { struct bigz b3; bigz_create_empty(&b3); bigz_sub(&b3, &b1, &b2); int cmp = bigz_compare_to(&b3, "324808583067597272281203376099393387231117", 10); EXPECT_EQ(cmp, 0); bigz_destroy(&b3); } { struct bigz b3; bigz_create_empty(&b3); bigz_sub(&b3, &b2, &b1); int cmp = bigz_compare_to(&b3, "-324808583067597272281203376099393387231117", 10); EXPECT_EQ(cmp, 0); bigz_destroy(&b3); } bigz_destroy(&b2); bigz_destroy(&b1); } TEST(BigZ, SubNegativePositive) { struct bigz b1; bigz_create_from_string(&b1, "-278230124321795170179057917641147901789701", 10); struct bigz b2; bigz_create_from_string(&b2, "46578458745802102102145458458245485441416", 10); { struct bigz b3; bigz_create_empty(&b3); bigz_sub(&b3, &b1, &b2); int cmp = bigz_compare_to(&b3, "-324808583067597272281203376099393387231117", 10); EXPECT_EQ(cmp, 0); bigz_destroy(&b3); } { struct bigz b3; bigz_create_empty(&b3); bigz_sub(&b3, &b2, &b1); int cmp = bigz_compare_to(&b3, "324808583067597272281203376099393387231117", 10); EXPECT_EQ(cmp, 0); bigz_destroy(&b3); } bigz_destroy(&b2); bigz_destroy(&b1); } TEST(BigZ, SubNegativeNegative) { struct bigz b1; bigz_create_from_string(&b1, "-278230124321795170179057917641147901789701", 10); struct bigz b2; bigz_create_from_string(&b2, "-46578458745802102102145458458245485441416", 10); { struct bigz b3; bigz_create_empty(&b3); bigz_sub(&b3, &b1, &b2); int cmp = bigz_compare_to(&b3, "-231651665575993068076912459182902416348285", 10); EXPECT_EQ(cmp, 0); bigz_destroy(&b3); } { struct bigz b3; bigz_create_empty(&b3); bigz_sub(&b3, &b2, &b1); int cmp = bigz_compare_to(&b3, "231651665575993068076912459182902416348285", 10); EXPECT_EQ(cmp, 0); bigz_destroy(&b3); } bigz_destroy(&b2); bigz_destroy(&b1); } TEST(BigZ, MulPositivePositive) { struct bigz b1; bigz_create_from_string(&b1, "278230124321795170179057917641147901789701", 10); struct bigz b2; bigz_create_from_string(&b2, "4657845874580210210", 10); { struct bigz b3; bigz_create_empty(&b3); bigz_mul(&b3, &b1, &b2); int cmp = bigz_compare_to(&b3, "1295953036756212640552727646158429498971649147282135793047210", 10); EXPECT_EQ(cmp, 0); bigz_destroy(&b3); } { struct bigz b3; bigz_create_empty(&b3); bigz_mul(&b3, &b2, &b1); int cmp = bigz_compare_to(&b3, "1295953036756212640552727646158429498971649147282135793047210", 10); EXPECT_EQ(cmp, 0); bigz_destroy(&b3); } bigz_destroy(&b2); bigz_destroy(&b1); } TEST(BigZ, MulPositiveNegative) { struct bigz b1; bigz_create_from_string(&b1, "278230124321795170179057917641147901789701", 10); struct bigz b2; bigz_create_from_string(&b2, "-4657845874580210210", 10); { struct bigz b3; bigz_create_empty(&b3); bigz_mul(&b3, &b1, &b2); int cmp = bigz_compare_to(&b3, "-1295953036756212640552727646158429498971649147282135793047210", 10); EXPECT_EQ(cmp, 0); bigz_destroy(&b3); } { struct bigz b3; bigz_create_empty(&b3); bigz_mul(&b3, &b2, &b1); int cmp = bigz_compare_to(&b3, "-1295953036756212640552727646158429498971649147282135793047210", 10); EXPECT_EQ(cmp, 0); bigz_destroy(&b3); } bigz_destroy(&b2); bigz_destroy(&b1); } TEST(BigZ, MulNegativePositive) { struct bigz b1; bigz_create_from_string(&b1, "-278230124321795170179057917641147901789701", 10); struct bigz b2; bigz_create_from_string(&b2, "4657845874580210210", 10); { struct bigz b3; bigz_create_empty(&b3); bigz_mul(&b3, &b1, &b2); int cmp = bigz_compare_to(&b3, "-1295953036756212640552727646158429498971649147282135793047210", 10); EXPECT_EQ(cmp, 0); bigz_destroy(&b3); } { struct bigz b3; bigz_create_empty(&b3); bigz_mul(&b3, &b2, &b1); int cmp = bigz_compare_to(&b3, "-1295953036756212640552727646158429498971649147282135793047210", 10); EXPECT_EQ(cmp, 0); bigz_destroy(&b3); } bigz_destroy(&b2); bigz_destroy(&b1); } TEST(BigZ, MulNegativeNegative) { struct bigz b1; bigz_create_from_string(&b1, "-278230124321795170179057917641147901789701", 10); struct bigz b2; bigz_create_from_string(&b2, "-4657845874580210210", 10); { struct bigz b3; bigz_create_empty(&b3); bigz_mul(&b3, &b1, &b2); int cmp = bigz_compare_to(&b3, "1295953036756212640552727646158429498971649147282135793047210", 10); EXPECT_EQ(cmp, 0); bigz_destroy(&b3); } { struct bigz b3; bigz_create_empty(&b3); bigz_mul(&b3, &b2, &b1); int cmp = bigz_compare_to(&b3, "1295953036756212640552727646158429498971649147282135793047210", 10); EXPECT_EQ(cmp, 0); bigz_destroy(&b3); } bigz_destroy(&b2); bigz_destroy(&b1); } TEST(BigZ, DivPositivePositive) { struct bigz b1; bigz_create_from_string(&b1, "278230124321795170179057917641147901789701", 10); struct bigz b2; bigz_create_from_string(&b2, "4657845874580210210", 10); struct bigz q; bigz_create_empty(&q); struct bigz r; bigz_create_empty(&r); bigz_div(&q, &r, &b1, &b2); int cmpq = bigz_compare_to(&q, "59733647658934344963858", 10); EXPECT_EQ(cmpq, 0); int cmpr = bigz_compare_to(&r, "2948551563409199521", 10); EXPECT_EQ(cmpr, 0); bigz_destroy(&r); bigz_destroy(&q); bigz_destroy(&b2); bigz_destroy(&b1); } TEST(BigZ, DivPositiveNegative) { struct bigz b1; bigz_create_from_string(&b1, "278230124321795170179057917641147901789701", 10); struct bigz b2; bigz_create_from_string(&b2, "-4657845874580210210", 10); struct bigz q; bigz_create_empty(&q); struct bigz r; bigz_create_empty(&r); bigz_div(&q, &r, &b1, &b2); int cmpq = bigz_compare_to(&q, "-59733647658934344963858", 10); EXPECT_EQ(cmpq, 0); int cmpr = bigz_compare_to(&r, "2948551563409199521", 10); EXPECT_EQ(cmpr, 0); bigz_destroy(&r); bigz_destroy(&q); bigz_destroy(&b2); bigz_destroy(&b1); } TEST(BigZ, DivNegativePositive) { struct bigz b1; bigz_create_from_string(&b1, "-278230124321795170179057917641147901789701", 10); struct bigz b2; bigz_create_from_string(&b2, "4657845874580210210", 10); struct bigz q; bigz_create_empty(&q); struct bigz r; bigz_create_empty(&r); bigz_div(&q, &r, &b1, &b2); // int cmpq = bigz_compare_to(&q, "-59733647658934344963858", 10); int cmpq = bigz_compare_to(&q, "-59733647658934344963859", 10); EXPECT_EQ(cmpq, 0); // int cmpr = bigz_compare_to(&r, "-2948551563409199521", 10); int cmpr = bigz_compare_to(&r, "1709294311171010689", 10); EXPECT_EQ(cmpr, 0); bigz_destroy(&r); bigz_destroy(&q); bigz_destroy(&b2); bigz_destroy(&b1); } TEST(BigZ, DivNegativeNegative) { struct bigz b1; bigz_create_from_string(&b1, "-278230124321795170179057917641147901789701", 10); struct bigz b2; bigz_create_from_string(&b2, "-4657845874580210210", 10); struct bigz q; bigz_create_empty(&q); struct bigz r; bigz_create_empty(&r); bigz_div(&q, &r, &b1, &b2); // int cmpq = bigz_compare_to(&q, "59733647658934344963858", 10); int cmpq = bigz_compare_to(&q, "59733647658934344963859", 10); EXPECT_EQ(cmpq, 0); // int cmpr = bigz_compare_to(&r, "-2948551563409199521", 10); int cmpr = bigz_compare_to(&r, "1709294311171010689", 10); EXPECT_EQ(cmpr, 0); bigz_destroy(&r); bigz_destroy(&q); bigz_destroy(&b2); bigz_destroy(&b1); } TEST(BigZ, DivPositivePositiveZeroRemainder) { struct bigz b1; bigz_create_from_string(&b1, "278230124321795170179054969089584492590180", 10); struct bigz b2; bigz_create_from_string(&b2, "4657845874580210210", 10); struct bigz q; bigz_create_empty(&q); struct bigz r; bigz_create_empty(&r); bigz_div(&q, &r, &b1, &b2); int cmpq = bigz_compare_to(&q, "59733647658934344963858", 10); EXPECT_EQ(cmpq, 0); int cmpr = bigz_compare_to(&r, "0", 10); EXPECT_EQ(cmpr, 0); bigz_destroy(&r); bigz_destroy(&q); bigz_destroy(&b2); bigz_destroy(&b1); } TEST(BigZ, DivPositiveNegativeZeroRemainder) { struct bigz b1; bigz_create_from_string(&b1, "278230124321795170179054969089584492590180", 10); struct bigz b2; bigz_create_from_string(&b2, "-4657845874580210210", 10); struct bigz q; bigz_create_empty(&q); struct bigz r; bigz_create_empty(&r); bigz_div(&q, &r, &b1, &b2); int cmpq = bigz_compare_to(&q, "-59733647658934344963858", 10); EXPECT_EQ(cmpq, 0); int cmpr = bigz_compare_to(&r, "0", 10); EXPECT_EQ(cmpr, 0); bigz_destroy(&r); bigz_destroy(&q); bigz_destroy(&b2); bigz_destroy(&b1); } TEST(BigZ, DivNegativePositiveZeroRemainder) { struct bigz b1; bigz_create_from_string(&b1, "-278230124321795170179054969089584492590180", 10); struct bigz b2; bigz_create_from_string(&b2, "4657845874580210210", 10); struct bigz q; bigz_create_empty(&q); struct bigz r; bigz_create_empty(&r); bigz_div(&q, &r, &b1, &b2); int cmpq = bigz_compare_to(&q, "-59733647658934344963858", 10); EXPECT_EQ(cmpq, 0); int cmpr = bigz_compare_to(&r, "0", 10); EXPECT_EQ(cmpr, 0); bigz_destroy(&r); bigz_destroy(&q); bigz_destroy(&b2); bigz_destroy(&b1); } TEST(BigZ, DivNegativeNegativeZeroRemainder) { struct bigz b1; bigz_create_from_string(&b1, "-278230124321795170179054969089584492590180", 10); struct bigz b2; bigz_create_from_string(&b2, "-4657845874580210210", 10); struct bigz q; bigz_create_empty(&q); struct bigz r; bigz_create_empty(&r); bigz_div(&q, &r, &b1, &b2); int cmpq = bigz_compare_to(&q, "59733647658934344963858", 10); EXPECT_EQ(cmpq, 0); int cmpr = bigz_compare_to(&r, "0", 10); EXPECT_EQ(cmpr, 0); bigz_destroy(&r); bigz_destroy(&q); bigz_destroy(&b2); bigz_destroy(&b1); } TEST(BigZ, GcdCoprime) { struct bigz b1; bigz_create_from_string(&b1, "1533918542734615245164352154619195752815244561235899341531", 10); struct bigz b2; bigz_create_from_string(&b2, "1533918542734615245164352154619195752815244561235899341532", 10); struct bigz b3; bigz_create_empty(&b3); bigz_gcd(&b3, &b1, &b2); int cmp = bigz_compare_to(&b3, "1", 10); EXPECT_EQ(cmp, 0); bigz_destroy(&b3); bigz_destroy(&b2); bigz_destroy(&b1); } TEST(BigZ, GcdRsa768) { struct bigz b1; bigz_create_from_string(&b1, "d982ec7b440e2869d2535e51f91bacc3eb6eba042e106e6f875c3d17e53db65fffd6e4e9a36084ce60f83d754dd7f701", 16); struct bigz b2; bigz_create_from_string(&b2, "eebe6dd23ce7e99c0e2249fecc4418c34af74e418bfa714c3791828414ab18f32fd7e093062a49b030225cc845f99ab5", 16); struct bigz b3; bigz_create_empty(&b3); bigz_gcd(&b3, &b1, &b2); int cmp = bigz_compare_to(&b3, "1", 10); EXPECT_EQ(cmp, 0); bigz_destroy(&b3); bigz_destroy(&b2); bigz_destroy(&b1); } TEST(BigZ, GcdNotCoprime) { struct bigz b1; bigz_create_from_string(&b1, "829029200588685010168228367991253899050528829049", 10); struct bigz b2; bigz_create_from_string(&b2, "92196793900174799975899442851691027900097961", 10); struct bigz b3; bigz_create_empty(&b3); bigz_gcd(&b3, &b1, &b2); int cmp = bigz_compare_to(&b3, "97713221", 10); EXPECT_EQ(cmp, 0); bigz_destroy(&b3); bigz_destroy(&b2); bigz_destroy(&b1); } int main(int argc, char **argv) { ::testing::InitGoogleTest(&argc, argv); return RUN_ALL_TESTS(); }