improved simple factorization
This commit is contained in:
parent
c6a9a8e456
commit
40b23f19d6
@ -22,12 +22,12 @@
|
|||||||
namespace LA {
|
namespace LA {
|
||||||
|
|
||||||
template<typename N>
|
template<typename N>
|
||||||
N primefactor(const N &x)
|
N primefactor(const N &x, const N &last)
|
||||||
{
|
{
|
||||||
N i,t;
|
N i,t;
|
||||||
if ( x <= 2 ) return x;
|
if ( x <= 2 ) return x;
|
||||||
if ( !(x & 1) ) return 2;
|
if ( !(x & 1) ) return 2;
|
||||||
i = 3;
|
i = last >3 ? last : 3;
|
||||||
for (;;) {
|
for (;;) {
|
||||||
t = x / i;
|
t = x / i;
|
||||||
if ( t < i ) break;
|
if ( t < i ) break;
|
||||||
@ -47,7 +47,7 @@ N y=x;
|
|||||||
N last=0;
|
N last=0;
|
||||||
while(y>1)
|
while(y>1)
|
||||||
{
|
{
|
||||||
N z=primefactor(y);
|
N z=primefactor(y,last);
|
||||||
if(z!=last)
|
if(z!=last)
|
||||||
{
|
{
|
||||||
std::pair<N,N> p;
|
std::pair<N,N> p;
|
||||||
@ -121,7 +121,7 @@ return y;
|
|||||||
//force instantization
|
//force instantization
|
||||||
|
|
||||||
#define INSTANTIZE(N) \
|
#define INSTANTIZE(N) \
|
||||||
template N primefactor(const N &x); \
|
template N primefactor(const N &x, const N &last); \
|
||||||
template FACTORIZATION<N> factorization(const N &x); \
|
template FACTORIZATION<N> factorization(const N &x); \
|
||||||
template N nextprime(N x); \
|
template N nextprime(N x); \
|
||||||
template std::ostream & operator<<(std::ostream &s, const FACTORIZATION<N> &x); \
|
template std::ostream & operator<<(std::ostream &s, const FACTORIZATION<N> &x); \
|
||||||
|
@ -31,7 +31,7 @@
|
|||||||
namespace LA {
|
namespace LA {
|
||||||
|
|
||||||
template<typename N>
|
template<typename N>
|
||||||
N primefactor(const N &x);
|
N primefactor(const N &x, const N &last=0);
|
||||||
|
|
||||||
template<typename N>
|
template<typename N>
|
||||||
bool isprime(const N &x) {return x>1 && x==primefactor(x);}
|
bool isprime(const N &x) {return x>1 && x==primefactor(x);}
|
||||||
|
Loading…
Reference in New Issue
Block a user