// square root of a positive integer, also an positive integer
inline unsigned long sqrti(unsigned long n)
{
? unsigned long m = 0, r = 0;
? for(unsigned long i = 0; i < 16; ++i)
? {
??? r <<= 1;
??? m = (m << 2) + (n >> 30);
??? n <<= 2;
??? if(++r <= m)
??? {
????? m -= r;
?? ?? ++r;
??? }
??? else
????? --r;
? }
?? ?return r >> 1;
}
// what is the next adjacent prime number?
unsigned long next_prime(unsigned long n)
{
?? ?if(n < 3)
?? ?? return 2;
?? ?if(0 == (n & 1))
?? ?? ++n;
?? ?while(true)
?? ?{
?? ?? unsigned long m = sqrti(n) + 1;
?? ?? unsigned long i = 2;
?? ?? while(i < m)
?? ?? {
?? ???? if(0 == n % i)
?? ?????? break;
?? ??? ??? ?++i;
?? ?? }
?? ?? if(i >= m)
?? ???? break;
?? ??? ?n += 2;
?? ?}
?? ?return n;
}
// a very simple test!
#include <iostream>
#include <cstdlib>
#include <ctime>
int main()
{
? const unsigned long SZ = 100;
? std::srand(std::time(0));
? for(unsigned i = 0; i < 100; ++i)
? {
??? unsigned tmp = std::rand();
??? std::cout << tmp << ", " << next_prime(tmp) << '\n';
? }
}