feat(big): add SBigNot

This commit is contained in:
Adam Heinermann 2024-11-15 09:01:26 -08:00 committed by superp00t
parent 1cad63b7f2
commit 5688b7ec3e
5 changed files with 58 additions and 0 deletions

View file

@ -103,6 +103,10 @@ void SBigNew(BigData** num) {
*num = new (m) BigData();
}
void SBigNot(BigData* a, BigData* b) {
Not(a->Primary(), b->Primary());
}
void SBigPowMod(BigData* a, BigData* b, BigData* c, BigData* d) {
PowMod(a->Primary(), b->Primary(), c->Primary(), d->Primary(), a->Stack());
}

View file

@ -42,6 +42,8 @@ void SBigMul(BigData* a, BigData* b, BigData* c);
void SBigNew(BigData** num);
void SBigNot(BigData* a, BigData* b);
void SBigPowMod(BigData* a, BigData* b, BigData* c, BigData* d);
void SBigShl(BigData* a, BigData* b, uint32_t shift);

View file

@ -277,6 +277,15 @@ void MulMod(BigBuffer& a, const BigBuffer& b, const BigBuffer& c, const BigBuffe
stack.Free(allocCount);
}
void Not(BigBuffer& a, const BigBuffer& b) {
uint32_t i = 0;
for (; b.IsUsed(i); i++) {
a[i] = ~b[i];
}
a.SetCount(i);
}
void PowMod(BigBuffer& a, const BigBuffer& b, const BigBuffer& c, const BigBuffer& d, BigStack& stack) {
c.Trim();

View file

@ -49,6 +49,8 @@ void Mul(BigBuffer& a, const BigBuffer& b, const BigBuffer& c, BigStack& stack);
void MulMod(BigBuffer& a, const BigBuffer& b, const BigBuffer& c, const BigBuffer& d, BigStack& stack);
void Not(BigBuffer& a, const BigBuffer& b);
void PowMod(BigBuffer& a, const BigBuffer& b, const BigBuffer& c, const BigBuffer& d, BigStack& stack);
void SetOne(BigBuffer& buffer);

View file

@ -728,6 +728,47 @@ TEST_CASE("SBigPowMod", "[big]") {
}
}
TEST_CASE("SBigNot", "[big]") {
BigDataTest a, b;
SECTION("bitwise negates small values") {
auto v = GENERATE(uint32_t(1), 2, 10, 0xFFFFFFFF);
SBigFromUnsigned(b, v);
SBigNot(a, b);
CHECK(a->Primary().Count() == 1);
CHECK(a->Primary()[0] == ~v);
}
SECTION("bitwise negates large values") {
auto v = GENERATE(10000000000000ULL, 0xFF00000000000000ULL);
SBigFromStr(b, std::to_string(v).c_str());
SBigNot(a, b);
CHECK(a->Primary().Count() == 2);
CHECK(a->Primary()[0] == ~uint32_t(v));
CHECK(a->Primary()[1] == ~uint32_t(v >> 32));
}
SECTION("bitwise negates huge value") {
uint32_t data[] = { 0xF00DFEED, 0xBA1D, 0xBEEBBEEB, 0x12345678, 0x9ABCDEF, 0xDEADCAD, 0xD011A };
SBigFromBinary(b, data, sizeof(data));
SBigNot(a, b);
CHECK(a->Primary().Count() == 7);
CHECK(a->Primary()[0] == ~data[0]);
CHECK(a->Primary()[1] == ~data[1]);
CHECK(a->Primary()[2] == ~data[2]);
CHECK(a->Primary()[3] == ~data[3]);
CHECK(a->Primary()[4] == ~data[4]);
CHECK(a->Primary()[5] == ~data[5]);
CHECK(a->Primary()[6] == ~data[6]);
}
}
TEST_CASE("SBigShl", "[big]") {
SECTION("shifts 256 left 7 bits") {
BigData* a;