Changeset 1466


Ignore:
Timestamp:
May 24, 2010, 3:51:18 PM (12 years ago)
Author:
Sven Rech
Message:

some msieve changes (compressed serialization)

Location:
trunk
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/CrypPlugins/QuadraticSieve/msieve/build.vc9/msieve.dll/wrapper.cpp

    r1463 r1466  
    284284                {
    285285                        relationYield* y = (relationYield*)yield.ToPointer();
    286                         array<unsigned char>^ out = gcnew array<unsigned char>((y->yield_count)*949 + 4);
     286
     287                        //calculate needed size:
     288                        int size = 0;
     289                        for (int c = 0; c < y->yield_count; c++)
     290                        {
     291                                size++; //type information
     292                                if (y->yield_array[c].type == 1)        //poly  (256 bytes)
     293                                        size += 256;
     294                                else                                                            //relation      ((5+num_factors)*4 bytes)
     295                                        size += (5 + y->yield_array[c].rel.num_factors)*4;
     296                        }
     297
     298                        //serialize:                   
     299                        array<unsigned char>^ out = gcnew array<unsigned char>(size + 4);
    287300                        copyIntToArray(out, 0, y->yield_count);
     301                        int pos = 4;
    288302
    289303                        for (int c = 0; c < y->yield_count; c++)
    290304                        {
    291                                 out[4 + c*949] = (char)(y->yield_array[c].type);
    292                                 if (y->yield_array[c].type == 1)        //poly
     305                                out[pos++] = (char)(y->yield_array[c].type);
     306                                if (y->yield_array[c].type == 1)        //poly  (256 bytes)
    293307                                {
    294308                                        for (int i = 0; i < 256; i++)
    295                                                 out[4 + c*949 + 1 + i] = y->yield_array[c].polybuf[i];
    296                                 }
    297                                 else                                                            //relation
    298                                 {
    299                                         copyIntToArray(out, 4+c*949 + 1, y->yield_array[c].rel.sieve_offset);
    300                                         copyIntToArray(out, 4+c*949 + 1 + 4, y->yield_array[c].rel.num_factors);
    301                                         copyIntToArray(out, 4+c*949 + 1 + 8, y->yield_array[c].rel.poly_index);
    302                                         copyIntToArray(out, 4+c*949 + 1 + 12, y->yield_array[c].rel.large_prime1);
    303                                         copyIntToArray(out, 4+c*949 + 1 + 16, y->yield_array[c].rel.large_prime2);
    304                                         for (int i = 0; i < 232; i++)
    305                                                 copyIntToArray(out, 4+c*949 + 1 + 20 + i*4, y->yield_array[c].rel.fb_offsets[i]);
     309                                                out[pos++] = y->yield_array[c].polybuf[i];
     310                                }
     311                                else                                                            //relation      ((5+num_factors)*4 bytes)
     312                                {
     313                                        copyIntToArray(out, pos, y->yield_array[c].rel.sieve_offset);
     314                                        copyIntToArray(out, pos + 4, y->yield_array[c].rel.num_factors);
     315                                        copyIntToArray(out, pos + 8, y->yield_array[c].rel.poly_index);
     316                                        copyIntToArray(out, pos + 12, y->yield_array[c].rel.large_prime1);
     317                                        copyIntToArray(out, pos + 16, y->yield_array[c].rel.large_prime2);
     318                                        pos += 20;
     319                                        for (int i = 0; i < y->yield_array[c].rel.num_factors; i++)
     320                                        {
     321                                                copyIntToArray(out, pos, y->yield_array[c].rel.fb_offsets[i]);
     322                                                pos += 4;
     323                                        }
    306324                                }
    307325                        }
     
    315333                        y->yield_count = getIntFromArray(yield, 0);
    316334                        y->yield_array = (yield_element*)malloc(sizeof(yield_element)*y->yield_count);
     335                        int pos = 4;
    317336                       
    318337                        for (int c = 0; c < y->yield_count; c++)
    319338                        {
    320                                 y->yield_array[c].type = yield[4+c*949];
    321                                 if (y->yield_array[c].type == 1)        //poly
     339                                y->yield_array[c].type = yield[pos++];
     340                                if (y->yield_array[c].type == 1)        //poly  (256 bytes)
    322341                                {
    323342                                        for (int i = 0; i < 256; i++)
    324                                                 y->yield_array[c].polybuf[i] = yield[4 + c*949 + 1 + i];
    325                                 }
    326                                 else                                                            //relation
    327                                 {
    328                                         y->yield_array[c].rel.sieve_offset = getIntFromArray(yield, 4+c*949 + 1);
    329                                         y->yield_array[c].rel.num_factors = getIntFromArray(yield, 4+c*949 + 1 + 4);
    330                                         y->yield_array[c].rel.poly_index = getIntFromArray(yield, 4+c*949 + 1 + 8);
    331                                         y->yield_array[c].rel.large_prime1 = getIntFromArray(yield, 4+c*949 + 1 + 12);
    332                                         y->yield_array[c].rel.large_prime2 = getIntFromArray(yield, 4+c*949 + 1 + 16);
    333                                         y->yield_array[c].rel.fb_offsets = (uint32*)malloc(sizeof(uint32) * 232);
    334                                         for (int i = 0; i < 232; i++)
    335                                                 y->yield_array[c].rel.fb_offsets[i] = getIntFromArray(yield, 4+c*949 + 1 + 20 + i*4);
     343                                                y->yield_array[c].polybuf[i] = yield[pos++];
     344                                }
     345                                else                                                            //relation      ((5+num_factors)*4 bytes)
     346                                {
     347                                        y->yield_array[c].rel.sieve_offset = getIntFromArray(yield, pos);
     348                                        y->yield_array[c].rel.num_factors = getIntFromArray(yield, pos + 4);
     349                                        y->yield_array[c].rel.poly_index = getIntFromArray(yield, pos + 8);
     350                                        y->yield_array[c].rel.large_prime1 = getIntFromArray(yield, pos + 12);
     351                                        y->yield_array[c].rel.large_prime2 = getIntFromArray(yield, pos + 16);
     352                                        pos += 20;
     353                                        y->yield_array[c].rel.fb_offsets = (uint32*)malloc(sizeof(uint32) * y->yield_array[c].rel.num_factors);
     354                                        for (int i = 0; i < y->yield_array[c].rel.num_factors; i++)
     355                                        {
     356                                                y->yield_array[c].rel.fb_offsets[i] = getIntFromArray(yield, pos);
     357                                                pos += 4;
     358                                        }
    336359                                }
    337360                        }
Note: See TracChangeset for help on using the changeset viewer.