Hi, I have a question how would i use boost to generate a 160 bit random integer.
Heres the random number generator i wrote thanks to some of the boost community help.
#ifndef RANDOM_NUMBER_HPP
#define RANDOM_NUMBER_HPP
#include <boost/random/shuffle_output.hpp>
#include <boost/random/mersenne_twister.hpp>
#include <boost/random/uniform_int.hpp>
#include <boost/random/variate_generator.hpp>
#include <
Windows.h>
#ifdef _linux_
#include <boost/nondet_random.hpp>
#endif
#include <boost/cast.hpp>
// credit and thanks to Andrew Holden for help on this.
namespace Random
{
typedef boost::kreutzer1986 base_generator_type;
// typedef boost::mt19937 base_generator_type;
typedef boost::uniform_int<> distribution_type;
typedef boost::variate_generator<base_generator_type&, distribution_type> gen_type;
// boost::random_device nondet_generator;
//Declare the generator as a global variable for easy reuse
#ifdef __linux__
boost::random_device dev;
base_generator_type generator(dev());
#else
base_generator_type generator(GetTickCount());
#endif
/***************************************************
* initializes the random number generator *
**************************************************/
void initialize()
{
for (int i = 0; i < 900; ++i)
{
#ifdef __linux__
generator.seed(dev());
#else
generator.seed(GetTickCount());
#endif
}
}
/***************************************************
* generates a random number between a and b *
* @param a the starting range *
* @param b the integer ending range *
* @return N such that a <= N <= b *
**************************************************/
template <class T>
T randint (const T& a, const T& b)
{
//Check the parameters
BOOST_STATIC_ASSERT(boost::is_integral<T>::value);
assert (b >= a);
//Set up the desired distribution
gen_type ran_gen(generator, distribution_type(a, b));
//Get a random number
return ran_gen();
}
}
#endif /* RANDOM_NUMBER_HPP */
Heres a code to generate random prime number.
/***************************************************
* n <- random number with num_digits digits *
* if n is even then n = n + 1; *
* while is_prime(n, 150) *
* { *
* n = n + 2; *
* } *
* return n; *
***************************************************/
template <typename T>
T boost::random_prime(boost::function<bool(const T&, const T&)> f, const unsigned int& num_digits)
{
BOOST_STATIC_ASSERT(is_integral<T>::value);
T n(Random::randint<T>(numeric_cast<T>(pow(2.0, num_digits - 1)),
numeric_cast<T>(pow(2.0, num_digits)))
);
if (n%2 == 0)
{
++n;
}
while (f(n, 20))
{
n += 2;
}
return n;
}
now num_digits is number of bits. If i pass 160 bit as like for DSA algorithm the program crashes. I pass 8 and it works, how come? Is there a better way to do this? Oh f is any function that can deteremine if a number is most likely a prime or not....
Thanks.