#include "common/Utilities.h" #include #include // Factor a number into it's prime factors std::vector Utilities::factor(size_t number) { if ( number<=3 ) return std::vector(1,(int)number); size_t i, n, n_max; bool factor_found; // Compute the maximum number of factors int N_primes_max = 1; n = number; while (n >>= 1) ++N_primes_max; // Initialize n, factors n = number; std::vector factors; factors.reserve(N_primes_max); while ( 1 ) { // Check if n is a trivial prime number if ( n==2 || n==3 || n==5 ) { factors.push_back( (int) n ); break; } // Check if n is divisible by 2 if ( n%2 == 0 ) { factors.push_back( 2 ); n/=2; continue; } // Check each odd number until a factor is reached n_max = (size_t) floor(sqrt((double) n)); factor_found = false; for (i=3; i<=n_max; i+=2) { if ( n%i == 0 ) { factors.push_back( i ); n/=i; factor_found = true; break; } } if ( factor_found ) continue; // No factors were found, the number must be prime factors.push_back( (int) n ); break; } // Sort the factors std::sort( factors.begin(), factors.end() ); return factors; } // Dummy function to prevent compiler from optimizing away variable void Utilities::nullUse( void* data ) { NULL_USE(data); }