bool RSAKey::applyToValue (BigInteger& value) const { if (part1.isZero() || part2.isZero() || value <= 0) { jassertfalse; // using an uninitialised key value.clear(); return false; } BigInteger result; while (! value.isZero()) { result *= part2; BigInteger remainder; value.divideBy (part2, remainder); remainder.exponentModulo (part1, part2); result += remainder; } value.swapWith (result); return true; }
void bigSieve (const BigInteger& base, const int numBits, BigInteger& result, const BigInteger& smallSieve, const int smallSieveSize) { jassert (! base[0]); // must be even! result.setBit (numBits); result.clearBit (numBits); // to enlarge the array int index = smallSieve.findNextClearBit (0); do { const int prime = (index << 1) + 1; BigInteger r (base), remainder; r.divideBy (prime, remainder); int i = prime - remainder.getBitRangeAsInt (0, 32); if (r.isZero()) i += prime; if ((i & 1) == 0) i += prime; i = (i - 1) >> 1; while (i < numBits) { result.setBit (i); i += prime; } index = smallSieve.findNextClearBit (index + 1); } while (index < smallSieveSize); }