protected override BigInteger GenerateSearchBase (int bits, object Context) { if (Context == null) throw new ArgumentNullException ("Context"); BigInteger ret = new BigInteger ((BigInteger)Context); ret.setBit (0); return ret; }
protected virtual BigInteger GenerateSearchBase(int bits, object Context) { BigInteger ret = BigInteger.genRandom(bits); ret.setBit(0); return(ret); }
protected override BigInteger GenerateSearchBase(int bits, object Context) { if (Context == null) { throw new ArgumentNullException("Context"); } BigInteger ret = new BigInteger((BigInteger)Context); ret.setBit(0); return(ret); }
private BigInteger GenerateOddNumber(uint nBits) { var result = new BigInteger(); var random = new Random(); for (uint i = 0; i < nBits; i++) { if (random.Next(2) == 1) { result.setBit(i); } } // ensures the bigint is odd result.setBit(0); // ensures ns high bit is set result.setBit(nBits - 1); result.setBit(nBits - 2); return(result); }
protected override BigInteger GenerateSearchBase(int bits, object Context) { BigInteger ret = base.GenerateSearchBase(bits, Context); ContextData ctx = (ContextData)Context; Assert.AreEqual(ctx.bits, bits); uint d = ctx.testData; for (uint i = (uint)bits - 2; d > 0; i--, d >>= 1) { ret.setBit(i, (d & 1) == 1); } return(ret); }
private static BigInteger[] findRandomStrongPrime(uint primeBits, int orderBits, Rng random) { BigInteger one = new BigInteger(1); BigInteger u, aux, aux2; long[] table_q, table_u, prime_table; PrimeSieve sieve = new PrimeSieve(16000); uint table_count = sieve.AvailablePrimes() - 1; int i, j; bool flag; BigInteger prime = null, order = null; order = BigInteger.genPseudoPrime(orderBits, 20, random); prime_table = new long[table_count]; table_q = new long[table_count]; table_u = new long[table_count]; i = 0; for (int pN = 2; pN != 0; pN = sieve.getNextPrime(pN), i++) { prime_table[i] = (long)pN; } for (i = 0; i < table_count; i++) { table_q[i] = (((order % new BigInteger(prime_table[i])).LongValue()) * (long)2) % prime_table[i]; } while (true) { u = new BigInteger(); u.genRandomBits((int)primeBits, random); u.setBit(primeBits - 1); aux = order << 1; aux2 = u % aux; u = u - aux2; u = u + one; if (u.bitCount() <= (primeBits - 1)) { continue; } for (j = 0; j < table_count; j++) { table_u[j] = (u % new BigInteger(prime_table[j])).LongValue(); } aux2 = order << 1; for (i = 0; i < (1 << 24); i++) { long cur_p; long value; flag = true; for (j = 1; j < table_count; j++) { cur_p = prime_table[j]; value = table_u[j]; if (value >= cur_p) { value -= cur_p; } if (value == 0) { flag = false; } table_u[j] = value + table_q[j]; } if (!flag) { continue; } aux = aux2 * new BigInteger(i); prime = u + aux; if (prime.bitCount() > primeBits) { continue; } if (prime.isProbablePrime(20)) { break; } } if (i < (1 << 24)) { break; } } return(new BigInteger[] { prime, order }); }
private static BigInteger[] findRandomStrongPrime(uint primeBits, int orderBits, Random random) { BigInteger one = new BigInteger(1); BigInteger u, aux, aux2; long[] table_q, table_u, prime_table; PrimeSieve sieve = new PrimeSieve(16000); uint table_count = sieve.AvailablePrimes() - 1; int i, j; bool flag; BigInteger prime = null, order = null; order = BigInteger.genPseudoPrime(orderBits, 20, random); prime_table = new long[table_count]; table_q = new long[table_count]; table_u = new long[table_count]; i = 0; for(int pN = 2; pN != 0; pN = sieve.getNextPrime(pN), i++) { prime_table[i] = (long)pN; } for(i = 0; i < table_count; i++) { table_q[i] = (((order % new BigInteger(prime_table[i])).LongValue()) * (long)2) % prime_table[i]; } while(true) { u = new BigInteger(); u.genRandomBits((int)primeBits, random); u.setBit(primeBits - 1); aux = order << 1; aux2 = u % aux; u = u - aux2; u = u + one; if(u.bitCount() <= (primeBits - 1)) continue; for(j = 0; j < table_count; j++) { table_u[j] = (u % new BigInteger(prime_table[j])).LongValue(); } aux2 = order << 1; for(i = 0; i < (1 << 24); i++) { long cur_p; long value; flag = true; for(j = 1; j < table_count; j++) { cur_p = prime_table[j]; value = table_u[j]; if(value >= cur_p) value -= cur_p; if(value == 0) flag = false; table_u[j] = value + table_q[j]; } if(!flag) continue; aux = aux2 * new BigInteger(i); prime = u + aux; if(prime.bitCount() > primeBits) continue; if(prime.isProbablePrime(20)) break; } if(i < (1 << 24)) break; } return new BigInteger[] { prime, order }; }