17template <
int32 NumBits,
bool bSigned = true>
32 NumWords =
NumBits / BitsPerWord
35 static_assert(
NumBits >= 64,
"TBigInt must have at least 64 bits.");
106 Bits[0] = (
Value & 0xffffffff);
107 Bits[1] = (
Value >> BitsPerWord) & 0xffffffff;
167 if (BitCount & (BitsPerWord - 1))
174 for (
int32 WordIndex = (NumWords - 1) -
HiWordOffset; WordIndex >= 0; --WordIndex)
184 for (
int32 WordIndex = NumWords - 1; WordIndex >=
ShiftWords; --WordIndex)
186 Result.Bits[WordIndex] = Bits[WordIndex -
ShiftWords];
198 Bits[NumWords - 1] = Bits[NumWords - 1] << 1;
199 for (
int32 WordIndex = NumWords - 2; WordIndex >= 0; --WordIndex)
202 Bits[WordIndex + 0] =
Value << 1;
217 if (BitCount & (BitsPerWord - 1))
234 for (
int32 WordIndex = NumWords - 1; WordIndex >=
ShiftWords; --WordIndex)
236 Result.Bits[WordIndex -
ShiftWords] = Bits[WordIndex];
248 Bits[0] = Bits[0] >> 1;
249 for (
int32 WordIndex = 1; WordIndex < NumWords; ++WordIndex)
252 Bits[WordIndex - 0] =
Value >> 1;
263 for (
int32 WordIndex = 0; WordIndex < NumWords; ++WordIndex)
289 return !!(Bits[NumWords - 1] & (1U << (BitsPerWord - 1)));
310 for (
int32 WordIndex = 0; WordIndex < NumWords; ++WordIndex)
312 Bits[WordIndex] =
~Bits[WordIndex];
323 for (WordIndex = NumWords - 1; WordIndex >= 0 && Bits[WordIndex] == 0; --WordIndex);
348 Carry = Product >> BitsPerWord;
354 for (
int32 WordIndex = 0; WordIndex < NumWords; ++WordIndex)
372 Result.MultiplyFast(
Other);
384 BigInt Denominator(Divisor);
431 const int32 NumLoops =
Current.GetHighestNonZeroBit() + 1;
433 for (
int32 i = 0; i < NumLoops; ++i)
505 Result.ShiftRightInternal(1);
510 Result.ShiftRightInternal(1);
531 for (
int32 WordIndex = NumWords - 1; WordIndex >= 0; --WordIndex)
533 if (!!Bits[WordIndex])
536 for (BitIndex = BitsPerWord - 1; BitIndex >= 0 && !(Bits[WordIndex] & (1 << BitIndex)); --BitIndex);
537 return BitIndex + WordIndex * BitsPerWord;
548 const int32 WordIndex = BitIndex / BitsPerWord;
549 BitIndex -= WordIndex * BitsPerWord;
550 return (Bits[WordIndex] & (1 << BitIndex)) ? 1 : 0;
558 const int32 WordIndex = BitIndex / BitsPerWord;
559 BitIndex -= WordIndex * BitsPerWord;
562 Bits[WordIndex] |= (1 << BitIndex);
566 Bits[WordIndex] &= ~(1 << BitIndex);
582 else if (BitCount < 0)
607 else if (BitCount < 0)
625 for (
int32 WordIndex = 0; WordIndex < NumWords; ++WordIndex)
627 Bits[WordIndex] |=
Other.Bits[WordIndex];
636 for (
int32 WordIndex = 0; WordIndex < NumWords; ++WordIndex)
638 Bits[WordIndex] &=
Other.Bits[WordIndex];
647 for (
int32 WordIndex = 0; WordIndex < NumWords; ++WordIndex)
649 Bits[WordIndex] =
~Bits[WordIndex];
658 for (
int32 WordIndex = 0; WordIndex < NumWords; ++WordIndex)
660 if (Bits[WordIndex] !=
Other.Bits[WordIndex])
676 if (!
Other.IsNegative())
686 for (WordIndex = NumWords - 1; WordIndex >= 0 &&
Other.Bits[WordIndex] == Bits[WordIndex]; --WordIndex);
687 return WordIndex >= 0 && Bits[WordIndex] <
Other.Bits[WordIndex];
697 if (!
Other.IsNegative())
707 for (WordIndex = NumWords - 1; WordIndex >= 0 &&
Other.Bits[WordIndex] == Bits[WordIndex]; --WordIndex);
708 return WordIndex < 0 || Bits[WordIndex] <
Other.Bits[WordIndex];
718 if (!
Other.IsNegative())
728 for (WordIndex = NumWords - 1; WordIndex >= 0 &&
Other.Bits[WordIndex] == Bits[WordIndex]; --WordIndex);
729 return WordIndex >= 0 && Bits[WordIndex] >
Other.Bits[WordIndex];
739 if (
Other.IsNegative())
749 for (WordIndex = NumWords - 1; WordIndex >= 0 &&
Other.Bits[WordIndex] == Bits[WordIndex]; --WordIndex);
759 for (WordIndex = NumWords - 1; WordIndex >= 0 && !Bits[WordIndex]; --WordIndex);
760 return WordIndex < 0;
781 return !!(Bits[0] & 1);
795 Result.ShiftRight(
Count);
808 Result.ShiftLeft(
Count);
840 Result.Subtract(
Other);
859 Result.Multiply(
Other);
885 Result.Modulo(Modulus);
928 Result.BitwiseAnd(
Other);
941 Result.BitwiseOr(
Other);
964 return (
int64)Bits[0] + ((
int64)Bits[1] << BitsPerWord);
974 for (WordIndex = NumWords - 1; WordIndex > 0; --WordIndex)
981 for (; WordIndex >= 0; --WordIndex)
983 Text += FString::Printf(
TEXT(
"%08x"), Bits[WordIndex]);
1025template<
int32 NumBits,
bool bSigned>
1036template <
typename IntType>
1052 template <
typename IntType>
1073 while ((
ValueA & 1) == 0)
1081 while ((
ValueB & 1) == 0)
1105 template <
typename IntType>
1112 IntType
a0 = Exponent;
1145 template <
typename IntType>
1148 const IntType Modulus = P * Q;
1149 const IntType
Fi = (P - 1) * (Q - 1);
1170 template <
typename IntType>
1171 IntType
ModularPow(IntType Base, IntType Exponent, IntType Modulus)
1173 const IntType
One(1);
1175 while (Exponent > 0)
1177 if (Exponent.IsFirstBitSet())
1179 Result = (Result *
Base) % Modulus;
1190 template <
typename IntType>
1202 template <
typename IntType>
1226 Result.MultiplyFast(Base);
1230 Base.MultiplyFast(Base);
1231 Base.Modulo(Modulus);
1238template <
class InDataType>
#define checkSlow(expr)
Definition AssertionMacros.h:332
#define check(expr)
Definition AssertionMacros.h:314
TBigInt< 512 > TEncryptionInt
Definition BigInt.h:1031
TBigInt< 512 > int512
Definition BigInt.h:1030
TBigInt< 256 > int256
Definition BigInt.h:1029
TEncryptionKey< TEncryptionInt > FEncryptionKey
Definition BigInt.h:1042
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
@ One
Definition PropertyPathHelpersTest.h:16
#define UE_ARRAY_COUNT(array)
Definition UnrealTemplate.h:212
Definition Archive.h:1208
virtual void Serialize(void *V, int64 Length)
Definition Archive.h:1689
bool operator!=(const BigInt &Other) const
Definition BigInt.h:920
void ShiftRightByOneInternal()
Definition BigInt.h:245
bool IsEqual(const BigInt &Other) const
Definition BigInt.h:656
bool IsZero() const
Definition BigInt.h:756
BigInt operator<<(int32 Count) const
Definition BigInt.h:805
bool IsFirstBitSet() const
Definition BigInt.h:779
bool operator[](int32 BitIndex) const
Definition BigInt.h:786
bool IsNegative() const
Definition BigInt.h:285
void ShiftLeftByOneInternal()
Definition BigInt.h:195
bool IsGreater(const BigInt &Other) const
Definition BigInt.h:714
BigInt operator*(const BigInt &Other) const
Definition BigInt.h:856
FString ToString() const
Definition BigInt.h:970
BigInt operator>>(int32 Count) const
Definition BigInt.h:792
BigInt & operator&=(const BigInt &Other)
Definition BigInt.h:932
bool IsGreaterOrEqual(const BigInt &Other) const
Definition BigInt.h:735
UE_FORCEINLINE_HINT void Zero()
Definition BigInt.h:93
bool operator==(const BigInt &Other) const
Definition BigInt.h:915
BigInt operator+(const BigInt &Other) const
Definition BigInt.h:818
int32 GetHighestNonZeroWord() const
Definition BigInt.h:320
BigInt & operator/=(const BigInt &Divider)
Definition BigInt.h:876
void SetBit(int32 BitIndex, int32 Value)
Definition BigInt.h:556
bool operator<=(const BigInt &Other) const
Definition BigInt.h:900
BigInt & operator-=(const BigInt &Other)
Definition BigInt.h:850
static BigInt One
Definition BigInt.h:24
TBigInt(const uint8 *InData, uint32 InNumBytes)
Definition BigInt.h:137
TBigInt()
Definition BigInt.h:111
void Multiply(const BigInt &Factor)
Definition BigInt.h:363
int64 ToInt() const
Definition BigInt.h:962
BigInt operator|(const BigInt &Other) const
Definition BigInt.h:938
void Subtract(const BigInt &Other)
Definition BigInt.h:275
TBigInt & operator=(int64 Other)
Definition BigInt.h:520
void Set(int64 Value)
Definition BigInt.h:103
BigInt & operator|=(const BigInt &Other)
Definition BigInt.h:945
bool IsLessOrEqual(const BigInt &Other) const
Definition BigInt.h:693
bool operator>(const BigInt &Other) const
Definition BigInt.h:905
UE_FORCEINLINE_HINT uint32 * GetBits()
Definition BigInt.h:82
BigInt & operator--()
Definition BigInt.h:844
BigInt operator-(const BigInt &Other) const
Definition BigInt.h:837
BigInt & operator*=(const BigInt &Other)
Definition BigInt.h:863
void ShiftRight(const int32 BitCount)
Definition BigInt.h:600
void ShiftRightInternal(const int32 BitCount)
Definition BigInt.h:212
void MultiplyFast(const BigInt &Factor)
Definition BigInt.h:330
BigInt & operator<<=(int32 Count)
Definition BigInt.h:812
void ShiftLeftInternal(const int32 BitCount)
Definition BigInt.h:162
int32 Sign() const
Definition BigInt.h:300
UE_FORCEINLINE_HINT const uint32 * GetBits() const
Definition BigInt.h:87
void BitwiseNot()
Definition BigInt.h:645
TBigInt(const FString &Value)
Definition BigInt.h:152
BigInt operator~() const
Definition BigInt.h:951
bool operator<(const BigInt &Other) const
Definition BigInt.h:895
TBigInt(const uint32 *InBits)
Definition BigInt.h:129
void ShiftLeft(const int32 BitCount)
Definition BigInt.h:575
void BitwiseAnd(const BigInt &Other)
Definition BigInt.h:634
bool IsGreaterThanZero() const
Definition BigInt.h:766
int32 GetBit(int32 BitIndex) const
Definition BigInt.h:546
BigInt operator%(const BigInt &Modulus) const
Definition BigInt.h:882
BigInt operator/(const BigInt &Divider) const
Definition BigInt.h:869
void Modulo(const BigInt &Modulus)
Definition BigInt.h:466
void DivideWithRemainder(const BigInt &Divisor, BigInt &Remainder)
Definition BigInt.h:382
TBigInt(int64 Other)
Definition BigInt.h:121
void BitwiseOr(const BigInt &Other)
Definition BigInt.h:623
void Add(const BigInt &Other)
Definition BigInt.h:260
BigInt & operator>>=(int32 Count)
Definition BigInt.h:799
TBigInt< NumBits, bSigned > BigInt
Definition BigInt.h:22
void Parse(const FString &Value)
Definition BigInt.h:991
BigInt operator&(const BigInt &Other) const
Definition BigInt.h:925
int32 GetHighestNonZeroBit() const
Definition BigInt.h:529
bool IsLessThanZero() const
Definition BigInt.h:774
BigInt & operator+=(const BigInt &Other)
Definition BigInt.h:831
void Divide(const BigInt &Divisor)
Definition BigInt.h:457
friend FArchive & operator<<(FArchive &Ar, BigInt &Value)
Definition BigInt.h:1015
BigInt & operator++()
Definition BigInt.h:825
BigInt & operator%=(const BigInt &Modulus)
Definition BigInt.h:889
void Sqrt()
Definition BigInt.h:485
bool operator>=(const BigInt &Other) const
Definition BigInt.h:910
void Negate()
Definition BigInt.h:308
bool IsLess(const BigInt &Other) const
Definition BigInt.h:672
IntType CalculateMultiplicativeInverseOfExponent(IntType Exponent, IntType Totient)
Definition BigInt.h:1106
IntType ModularPow(IntType Base, IntType Exponent, IntType Modulus)
Definition BigInt.h:1171
void GenerateKeyPair(const IntType &P, const IntType &Q, FEncryptionKey &PublicKey, FEncryptionKey &PrivateKey)
Definition BigInt.h:1146
IntType CalculateGCD(IntType ValueA, IntType ValueB)
Definition BigInt.h:1053
void EncryptSignature(const FDecryptedSignature &InUnencryptedSignature, FEncryptedSignature &OutEncryptedSignature, const FEncryptionKey &EncryptionKey)
Definition BigInt.h:1297
void DecryptSignature(const FEncryptedSignature &InEncryptedSignature, FDecryptedSignature &OutUnencryptedSignature, const FEncryptionKey &EncryptionKey)
Definition BigInt.h:1302
void EncryptBytes(IntType *EncryptedData, const uint8 *Data, const int64 DataLength, const FEncryptionKey &EncryptionKey)
Definition BigInt.h:1191
void DecryptBytes(uint8 *DecryptedData, const IntType *Data, const int64 DataLength, const FEncryptionKey &DecryptionKey)
Definition BigInt.h:1203
UE_STRING_CLASS Result(Forward< LhsType >(Lhs), RhsLen)
Definition String.cpp.inl:732
U16 Index
Definition radfft.cpp:71
static UE_FORCEINLINE_HINT void * Memcpy(void *Dest, const void *Src, SIZE_T Count)
Definition UnrealMemory.h:160
static UE_FORCEINLINE_HINT void * Memset(void *Dest, uint8 Char, SIZE_T Count)
Definition UnrealMemory.h:119
FSignatureBase()
Definition BigInt.h:1245
bool operator==(const FSignatureBase &InOther)
Definition BigInt.h:1270
bool operator!=(const FSignatureBase &InOther)
Definition BigInt.h:1265
friend FArchive & operator<<(FArchive &Ar, FSignatureBase &Value)
Definition BigInt.h:1278
DataType Data
Definition BigInt.h:1243
void Serialize(FArchive &Ar)
Definition BigInt.h:1250
bool IsValid() const
Definition BigInt.h:1260
static int64 Size()
Definition BigInt.h:1255
InDataType DataType
Definition BigInt.h:1241
static CharType ToUpper(CharType Char)
Definition Char.h:80
IntType Modulus
Definition BigInt.h:1040
IntType Exponent
Definition BigInt.h:1039