Mono.Math.BigInteger.ModulusRing.OddPow C# (CSharp) Method

OddPow() private method

private OddPow ( BigInteger b, BigInteger exp ) : BigInteger
b BigInteger
exp BigInteger
return BigInteger
			private BigInteger OddPow (BigInteger b, BigInteger exp)
			{
				BigInteger resultNum = new BigInteger (Montgomery.ToMont (1, mod), mod.length << 1);
				BigInteger tempNum = new BigInteger (Montgomery.ToMont (b, mod), mod.length << 1);  // ensures (tempNum * tempNum) < b^ (2k)
				uint mPrime = Montgomery.Inverse (mod.data [0]);
				uint totalBits = (uint)exp.bitCount ();

				uint [] wkspace = new uint [mod.length << 1];

				// perform squaring and multiply exponentiation
				for (uint pos = 0; pos < totalBits; pos++) {
					if (exp.testBit (pos)) {

						Array.Clear (wkspace, 0, wkspace.Length);
						Kernel.Multiply (resultNum.data, 0, resultNum.length, tempNum.data, 0, tempNum.length, wkspace, 0);
						resultNum.length += tempNum.length;
						uint [] t = wkspace;
						wkspace = resultNum.data;
						resultNum.data = t;

						Montgomery.Reduce (resultNum, mod, mPrime);
					}

					Kernel.SquarePositive (tempNum, ref wkspace);
					Montgomery.Reduce (tempNum, mod, mPrime);
				}

				Montgomery.Reduce (resultNum, mod, mPrime);
				return resultNum;
			}

Same methods

BigInteger.ModulusRing::OddPow ( uint b, BigInteger exp ) : BigInteger