What is the fastest integer factorization algorithm?

后端 未结 8 1238
灰色年华
灰色年华 2020-11-28 01:49

I\'ve written a program that attempts to find Amicable Pairs. This requires finding the sums of the proper divisors of numbers.

Here is my current sumOfDiviso

8条回答
  •  刺人心
    刺人心 (楼主)
    2020-11-28 02:43

    A more 2015 C++ version 227 lookup table implementation for 1GB memory:

    #include  // cerr, cout, and NULL
    #include    // memcpy()
    #define uint unsigned __int32
    uint *factors;
    const uint MAX_F=134217728; // 2^27
    
    void buildFactors(){
       factors=new (nothrow) uint [(MAX_F+1)*2]; // 4 * 2 * 2^27 = 2^30 = 1GB
       if(factors==NULL)return; // not able to allocate enough free memory
       int i;
       for(i=0;i<(MAX_F+1)*2;i++)factors[i]=0;
    
       //Sieve of Eratosthenese
       factors[1*2]=1;
       factors[1*2+1]=1;
       for(i=2;i*i<=MAX_F;i++){
          for(;factors[i*2] && i*i<=MAX_F;i++);
          factors[i*2]=1;
          factors[i*2+1]=i;
          for(int j=2;i*j<=MAX_F;j++){
             factors[i*j*2]=i;
             factors[i*j*2+1]=j;
          }
       }
       for(;i<=MAX_F;i++){
          for(;i<=MAX_F && factors[i*2];i++);
          if(i>MAX_F)return;
          factors[i*2]=1;
          factors[i*2+1]=i;
       }
    }
    
    uint * factor(uint x, int &factorCount){
       if(x > MAX_F){factorCount=-1;return NULL;}
       uint tmp[70], at=x; int i=0;
       while(factors[at*2]>1){
          tmp[i++]=factors[at*2];
          cout<<"at:"<

    Update: or sacrificing some simplicity for a bit more range just past 228

    #include  // cerr, cout, and NULL
    #include    // memcpy(), memset()
    
    //#define dbg(A) A
    #ifndef dbg
    #define dbg(A)
    #endif
    
    #define uint   unsigned __int32
    #define uint8  unsigned __int8
    #define uint16 unsigned __int16
    
    uint * factors;
    uint8  *factors08;
    uint16 *factors16;
    uint   *factors32;
    
    const uint LIMIT_16   = 514; // First 16-bit factor, 514 = 2*257
    const uint LIMIT_32   = 131074;// First 32-bit factor, 131074 = 2*65537
    const uint MAX_FACTOR = 268501119;
    //const uint64 LIMIT_64 = 8,589,934,594; // First 64-bit factor, 2^33+1
    
    const uint TABLE_SIZE = 268435456; // 2^28 => 4 * 2^28 = 2^30 = 1GB 32-bit table
    const uint o08=1, o16=257 ,o32=65665; //o64=4294934465
    // TableSize = 2^37 => 8 * 2^37 = 2^40 1TB 64-bit table
    //   => MaxFactor = 141,733,953,600
    
    /* Layout of factors[] array
    *  Indicies(32-bit)              i                 Value Size  AFactorOf(i)
    *  ----------------           ------               ----------  ----------------
    *  factors[0..128]            [1..513]             8-bit       factors08[i-o08]
    *  factors[129..65408]        [514..131073]        16-bit      factors16[i-o16]
    *  factors[65409..268435455]  [131074..268501119]  32-bit      factors32[i-o32]
    *
    * Note: stopping at i*i causes AFactorOf(i) to not always be LargestFactor(i)
    */
    void buildFactors(){
    dbg(cout<<"Allocating RAM"<0);
             for(;i*j0);
             for(;i*j<=MAX_FACTOR;j++)factors32[i*j-o32]=i;
          }
       }i--;
    
    dbg(cout<<"Setting: 32-Bit Values"<MAX_FACTOR)return;
          factors32[i-o32]=1;
       }
    }
    
    uint * factor(uint x, int &factorCount){
       if(x > MAX_FACTOR){factorCount=-1;return NULL;}
       uint tmp[70], at=x; int i=0;
       while(at>=LIMIT_32 && factors32[at-o32]>1){
          tmp[i++]=factors32[at-o32];
    dbg(cout<<"at32:"<=LIMIT_16 && factors16[at-o16]>1){
             tmp[i++]=factors16[at-o16];
    dbg(cout<<"at16:"<1){
                tmp[i++]=factors08[at-o08];
    dbg(cout<<"at08:"< MAX_FACTOR)return -1;
       if(x < LIMIT_16) return factors08[x-o08];
       if(x < LIMIT_32) return factors16[x-o16];
                        return factors32[x-o32];
    }
    
    void main(){
       cout<<"Loading factors lookup table"<

提交回复
热议问题