Show
Ignore:
Timestamp:
03/13/07 10:33:27 (2 years ago)
Author:
pernet
Message:

Clean up the code for charpoly, + misc updates

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • include/fflas-ffpack/ffpack_frobenius.inl

    r3 r4  
    1414 
    1515//--------------------------------------------------------------------- 
    16 // CharpolyArithProg: Las Vegas algorithm to compute the Charpoly normal form over a large field 
     16// CharpolyArithProg: Las Vegas algorithm to compute the Charpoly normal 
     17// form over a large field (Z/pZ, s.t.  p > 2n^2) 
    1718//--------------------------------------------------------------------- 
    18  
    19  
    20 //  
    21 template <class Field> 
    22 void FFPACK::CompressRowsQK (Field& F, const size_t M, 
    23                            typename Field::Element * A, const size_t lda, 
    24                            typename Field::Element * tmp, const size_t ldtmp, 
    25                            const size_t * d, const size_t deg,const size_t nb_blocs){ 
    26  
    27         size_t currtmp = 0; 
    28         size_t currw = d[0]-1; 
    29         size_t currr = d[0]-1; 
    30         for (int i = 0; i< int(nb_blocs)-1; ++i){ 
    31                 for (int j = d[i]-1; j<deg-1; ++j, currr++, currtmp++) 
    32                         fcopy(F, M, tmp + currtmp*ldtmp, 1,  A + currr*lda, 1); 
    33                 //cerr<<"d["<<i<<"] = "<<d[i]<<endl; 
    34                 for (int j=0; j < d[i+1] -1; ++j, currr++, currw++){ 
    35                         fcopy(F, M, A + (currw)*lda, 1, A+(currr)*lda, 1); 
    36                 } 
    37                 //cerr<<"Ok"<<endl; 
    38         } 
    39  
    40         //write_field(F,cerr<<"avant tmp"<<endl,A, currtmp, M, lda); 
    41         for (int i=0; i < currtmp; ++i, currw++){ 
    42                 fcopy (F, M, A + (currw)*lda, 1, tmp + i*ldtmp, 1); 
    43         } 
    44 } 
    45  
    46 template <class Field> 
    47 void FFPACK::CompressRows (Field& F, const size_t M, 
    48                              typename Field::Element * A, const size_t lda, 
    49                              typename Field::Element * tmp, const size_t ldtmp, 
    50                              const size_t * d, const size_t nb_blocs){ 
    51  
    52         size_t currd = d[0]-1; 
    53         size_t curri = d[0]-1; 
    54         for (int i = 0; i< int(nb_blocs)-1; ++i){ 
    55                 fcopy(F, M, tmp + i*ldtmp, 1,  A + currd*lda, 1); 
    56                 for (int j=0; j < d[i+1] -1; ++j){ 
    57                         fcopy(F, M, A + (curri++)*lda, 1, A+(currd+j+1)*lda, 1); 
    58                 } 
    59                 currd += d[i+1]; 
    60         } 
    61         for (int i=0; i < int(nb_blocs)-1; ++i){ 
    62                 fcopy (F, M, A + (curri++)*lda, 1, tmp + i*ldtmp, 1); 
    63         } 
    64 } 
    65 template <class Field> 
    66 void FFPACK::DeCompressRowsQK (Field& F, const size_t M, const size_t N, 
    67                                typename Field::Element * A, const size_t lda, 
    68                                typename Field::Element * tmp, const size_t ldtmp, 
    69                                const size_t * d, const size_t deg,const size_t nb_blocs){ 
    70          
    71         size_t zeroblockdim = 1; // the last block contributes with 1 
    72         size_t currtmp = 0; 
    73         for (int i=0; i<int(nb_blocs)-1; ++i) 
    74                 zeroblockdim += deg - d[i]; 
    75         //cerr<<"zeroblockdim = "<<zeroblockdim<<endl; 
    76         for (int i=0; i < zeroblockdim - 1; ++i, ++currtmp) 
    77                 fcopy(F, M, tmp + currtmp*ldtmp, 1,  A + (N - zeroblockdim +i)*lda, 1); 
    78         //write_field(F,cerr<<"tmp= "<<endl,tmp,zeroblockdim - 1, M,ldtmp); 
    79         currtmp--; 
    80         size_t w_idx = N - 2; 
    81         size_t r_idx = N - zeroblockdim - 1; 
    82  
    83         for (int i = int(nb_blocs)-2; i>=0; --i){ 
    84                 for (size_t j = 0; j < d [i+1] - 1; ++j) 
    85                         fcopy (F, M, A + (w_idx--)*lda, 1, A + (r_idx--)*lda, 1); 
    86                 for (size_t j = 0; j < deg - d[i]; ++j) 
    87                         fcopy (F, M, A + (w_idx--)*lda, 1, tmp + (currtmp--)*ldtmp, 1); 
    88         } 
    89 } 
    90  
    91 template <class Field> 
    92 void FFPACK::DeCompressRows (Field& F, const size_t M, const size_t N, 
    93                              typename Field::Element * A, const size_t lda, 
    94                              typename Field::Element * tmp, const size_t ldtmp, 
    95                              const size_t * d, const size_t nb_blocs){ 
    96          
    97         for (int i=0; i<int(nb_blocs)-1; ++i) 
    98                 fcopy(F, M, tmp + i*ldtmp, 1, A + (N-nb_blocs+i)*lda, 1); 
    99          
    100         size_t w_idx = N - 2; 
    101         size_t r_idx = N - nb_blocs - 1; 
    102         for (int i = int(nb_blocs)-2; i>=0; --i){ 
    103                 for (size_t j = 0; j<d[i+1]-1; ++j) 
    104                         fcopy (F, M, A + (w_idx--)*lda, 1, A + (r_idx--)*lda, 1); 
    105                 fcopy (F, M, A + (w_idx--)*lda, 1, tmp + i*ldtmp, 1); 
    106         } 
    107 } 
    108  
    109 template <class Field> 
    110 void FFPACK::CompressRowsQA (Field& F, const size_t M, 
    111                              typename Field::Element * A, const size_t lda, 
    112                              typename Field::Element * tmp, const size_t ldtmp, 
    113                              const size_t * d, const size_t nb_blocs){ 
    114  
    115         size_t currd = 0; 
    116         size_t curri = 0; 
    117         for (size_t i = 0; i< nb_blocs; ++i){ 
    118                 fcopy(F, M, tmp + i*ldtmp, 1,  A + currd*lda, 1); 
    119                 for (size_t j=0; j < d[i] -1; ++j) 
    120                         fcopy(F, M, A + (curri++)*lda, 1, A+(currd+j+1)*lda, 1); 
    121                 currd += d[i]; 
    122         } 
    123         for (size_t i=0; i < nb_blocs; ++i) 
    124                 fcopy (F, M, A + (curri++)*lda, 1, tmp + i*ldtmp, 1); 
    125 } 
    126  
    127 template <class Field> 
    128 void FFPACK::DeCompressRowsQA (Field& F, const size_t M, const size_t N, 
    129                                typename Field::Element * A, const size_t lda, 
    130                                typename Field::Element * tmp, const size_t ldtmp, 
    131                                const size_t * d, const size_t nb_blocs){ 
    132          
    133         for (size_t i=0; i<nb_blocs; ++i) 
    134                 fcopy(F, M, tmp + i*ldtmp, 1, A + (N-nb_blocs+i)*lda, 1); 
    135  
    136         size_t w_idx = N - 1; 
    137         size_t r_idx = N - nb_blocs - 1; 
    138         for (int i = int(nb_blocs)-1; i>=0; --i){ 
    139                 for (size_t j = 0; j<d[i]-1; ++j) 
    140                         fcopy (F, M, A + (w_idx--)*lda, 1, A + (r_idx--)*lda, 1); 
    141                 fcopy (F, M, A + (w_idx--)*lda, 1, tmp + i*ldtmp, 1); 
    142         } 
    143 } 
    144  
    145  
    14619template <class Field, class Polynomial> 
    14720std::list<Polynomial>& 
    14821FFPACK::CharpolyArithProg (const Field& F, std::list<Polynomial>& frobeniusForm,  
    149                            const size_t N, typename Field::Element * A, const size_t lda, const size_t c){ 
     22                           const size_t N, typename Field::Element * A, const size_t lda, 
     23                           const size_t c){ 
    15024         
    15125        static typename Field::Element one, zero, mone; 
     
    15529 
    15630        size_t * rp = new size_t[2*N]; 
    157  
    15831        size_t noc = static_cast<size_t>(ceil(double(N)/double(c))); 
    15932 
     
    16235        typename Field::Element *K2 = new typename Field::Element[N*(noc*c)]; 
    16336        size_t ldk = N; 
    164         // Permutations such that 
    165         // A = QA [ I Ac ] PA 
    166         //        [ 0 Ac ] 
    167         // 
    168         // K = [ I Kc ] PK 
    169         //     [ 0 Kc ] 
    170          
     37 
    17138        size_t *dA = new size_t[N]; //PA 
    172         //      size_t *dK = new size_t[N]; 
    173  
    174  
    175         size_t Nrest = N-(c-1)*noc; 
     39        size_t *dK = new size_t[noc*c]; 
     40        for (size_t i=0; i<noc; ++i) 
     41                dK[i]=0; 
     42 
     43        // Picking a random noc x N block vector U^T 
    17644        typename Field::RandIter g (F); 
    17745        for (size_t i = 0; i < noc; ++i) 
     
    17947                        g.random( *(K + i*ldk +j) ); 
    18048 
     49        // Computing the bloc Krylov matrix [U AU .. A^(c-1) U]^T 
    18150        for (size_t i = 1; i<c; ++i) 
    18251                fgemm( F, FflasNoTrans, FflasTrans,  noc, N, N, one, 
    18352                       K+(i-1)*noc*ldk, ldk, A, lda, zero, K+i*noc*ldk, ldk); 
    184 //      fgemm( F, FflasNoTrans, FflasTrans, Nrest, N, N, one, 
    185 //             K+(c-2)*noc*ldk, ldk, A, lda, zero, K+(c-1)*noc*ldk, ldk); 
    186  
    187         //write_field(F,cerr<<"K = "<<endl,K, c*noc,N,ldk); 
    188         //write_field(F,cerr<<"A = "<<endl,A, N,N,ldk); 
    189         size_t * Pk = new size_t[N]; 
    190         size_t * Qk = new size_t[c*noc]; 
    19153 
    19254        // K2 <- K (re-ordering) 
     
    19658                        fcopy(F, N, (K2+(w_idx)*ldk), 1, (K+(i+j*noc)*ldk), 1); 
    19759 
     60        // Copying K <- K2 
    19861        for (size_t i=0; i<noc*c; ++i) 
    19962                fcopy (F, N, (K+i*ldk), 1, K2+i*ldk, 1); 
    20063         
     64        size_t * Pk = new size_t[N]; 
     65        size_t * Qk = new size_t[c*noc]; 
     66        for (size_t i=0; i<c*noc; ++i) 
     67                Qk[i] = 0; 
     68        for (size_t i=0; i<N; ++i) 
     69                Pk[i] = 0; 
    20170        size_t R = LUdivine(F, FflasNonUnit, noc*c, N, K, ldk, Pk, Qk, FfpackLQUP); 
    20271 
    203         //write_field(F,cerr<<"Apres LUDivine K = "<<endl,K, c*noc,N,ldk); 
    204         // cerr<<"Q = "; 
    205 //      for (size_t i=0; i<noc*c; ++i) 
    206 //              cerr<<Qk[i]<<" "; 
    207 //      cerr<<endl; 
    20872        size_t row_idx = 0; 
    209         size_t * dK = new size_t[noc]; 
    210         for (size_t i=0; i<noc; ++i) 
    211                 dK[i]=0; 
    212          
    21373        size_t i=0; 
    214         row_idx=0; 
    21574        size_t dold = c; 
    21675        size_t nb_full_blocks = 0; 
    21776        size_t Mk = 0; 
     77        // Determining the degree sequence dK 
    21878        for (size_t k = 0; k<noc; ++k){ 
    21979                size_t d = 0; 
     
    22686                        throw CharpolyFailed(); 
    22787                } 
    228                          
    22988                dK[k] = dold = d; 
    23089                Mk++; 
    23190                if (d == c) 
    23291                        nb_full_blocks++; 
    233                 i = Qk[row_idx]; 
    234         } 
    235         //cerr<<"Mk = "<<Mk<<endl; 
     92                if (row_idx < noc*c) 
     93                        i = Qk[row_idx]; 
     94        } 
     95 
    23696        // Selection of the last iterate of each block 
    23797        size_t bk_idx = 0; 
    238         //write_field (F,cerr<<"Avant fgemm K2 = "<<endl, K2, noc*c, N, ldk); 
    239  
    24098        for (size_t i = 0; i < Mk; ++i){ 
    241 #if DEBUG 
    242                 std::cerr<<"dK ["<<i<<"] = "<<dK[i]<<std::endl; 
    243 #endif 
    24499                fcopy (F, N, (K2+i*ldk), 1, (K2 + (bk_idx + dK[i]-1)*ldk), 1); 
    245                 //cerr<<"(bk_idx+dK[i]-1) = "<<(bk_idx+dK[i]-1)<<endl; 
    246                 bk_idx+= c; 
    247         } 
    248  
     100                bk_idx += c; 
     101        } 
    249102        typename Field::Element* K2b = K2+Mk*ldk; 
     103 
    250104        // K <- K A^T  
    251  
    252         //write_field (F,cerr<<"Avant fgemm K2 = "<<endl, K2, noc*c, N, ldk); 
    253105        fgemm( F, FflasNoTrans, FflasTrans, Mk, N, N, one,  K2, ldk, A, lda, zero, K2b, ldk); 
    254  
    255         //write_field (F,cerr<<"Apres fgemm K2b = "<<endl, K2b, Mk, N, ldk); 
    256106 
    257107        // K <- K P^T 
    258108        applyP (F, FflasRight, FflasTrans, Mk, 0, R, K2b, ldk, Pk); 
    259109 
    260         //write_field (F,cerr<<"Apres applyP K2b = "<<endl, K2b, Mk, N, ldk); 
    261110        // K <- K U^-1 
    262111        ftrsm (F, FflasRight, FflasUpper, FflasNoTrans, FflasNonUnit, Mk, R, one, K, ldk, K2b, ldk); 
    263112 
    264         //write_field (F,cerr<<"Apres ftrsm K2b = "<<endl, K2b, Mk, N, ldk); 
    265         // K <- K Q^T 
    266         //applyP (F, FflasRight, FflasNoTrans, Mk, 0, R, K2b, ldk, Qk); 
    267  
    268  
    269 //      row_idx = 0; 
    270 //      for (size_t i=0; i<R; ++i){ 
    271 //              for (size_t k=row_idx; k<Qk[i]; ++k) // iterate on the linearly dependent rows 
    272 //                      for (size_t j=0; j<i; ++j) 
    273 //                              F.assign( *(K+j+k*ldk),zero); 
    274 //              row_idx = Qk[i]+1; 
    275 //      } 
    276         //cerr<<"c, noc, row_idx, N = "<<c<<" "<<noc<<" "<<row_idx<<" "<<N<<endl; 
    277         //row_idx = noc*c -1; 
    278 //      while (row_idx < noc*c){ 
    279 //              for (size_t j=0; j<MIN(row_idx,N); ++j) 
    280 //                      F.assign( *(K + j + (row_idx)*ldk),zero); 
    281 //              row_idx++; 
    282 //      } 
    283         //write_field (F,cerr<<"Avant solvelb K2b = "<<endl, K2b, Mk, N, ldk); 
     113        // L <-  Q^T L 
     114        applyP(F, FflasLeft, FflasNoTrans, N, 0, R, K, ldk, Qk); 
     115 
    284116        // K <- K L^-1 
    285         //compressing L 
    286         //      write_field (F,cerr<<"Avant compression L = "<<endl, K, noc*c, N, ldk); 
    287         applyP(F, FflasLeft, FflasNoTrans, N, 0, R, K, ldk, Qk); 
    288         //write_field (F,cerr<<"Apres compression L = "<<endl, K, noc*c, N, ldk); 
    289  
    290117        ftrsm (F, FflasRight, FflasLower, FflasNoTrans, FflasUnit, Mk, R, one, K, ldk, K2b, ldk); 
    291         //undoing permutation on K 
     118 
     119        //undoing permutation on L 
    292120        applyP(F, FflasLeft, FflasTrans, N, 0, R, K, ldk, Qk); 
    293         //      solveLB2 (F, FflasRight, Mk, noc*c, R, K, ldk, Qk, K2b, ldk); 
    294         //§!!!!! 
    295         //applyP (F, FflasRight, FflasTrans, Mk, 0, R, K2b, ldk, Qk); 
    296         //write_field (F,cerr<<"Apres solvelb K2b = "<<endl, K2b, Mk, N, ldk); 
    297          
     121 
    298122        // Recovery of the completed invariant factors 
    299         //cerr<<"// Recovery of the completed invariant factors"<<endl; 
    300123        size_t Ma = Mk; 
    301124        size_t Ncurr = R; 
    302125        size_t offset = Ncurr-1; 
    303         size_t oldNcurr = Ncurr; 
    304         Polynomial *P; 
    305         //write_field (F,cerr<<"Recovery of the completed blocks"<<endl, K2b, Mk, N, ldk); 
    306126        for (size_t i=Mk-1; i>=nb_full_blocks+1;  --i) 
    307127                if (dK[i] >= 1){  
    308                         Polynomial P (dK [i]); 
     128                        Polynomial P (dK [i]+1); 
     129                        F.assign(P[dK[i]], one); 
    309130                        for (size_t j=0; j < dK [i]; ++j){ 
    310131                                F.neg (P [dK [i]-j-1], *(K2b + i*ldk + (offset-j))); 
    311                                 //cerr<<" "<<(*(K2b + i*ldk + (offset-j))); 
    312132                        } 
    313                         //cerr<<endl; 
    314                         // for (size_t j=0; j<dK[i]; ++j) 
    315 //                              cerr<<" "<<(P)[j]; 
    316133                        frobeniusForm.push_front(P); 
    317                         //cerr<<"Storing polynomial "<<i<<endl; 
    318134                        offset -= dK [i]; 
    319135                        Ncurr -= dK [i]; 
    320                         //block_idx--; 
    321136                        Ma--; 
    322137                } 
    323138        Mk = Ma; 
    324         //cerr<<"taille frob = "<<frobeniusForm.size()<<endl; 
    325         //write_field(F,cerr,K,oldNcurr, Mk, ldk); 
    326         // cerr<<"nb_full_blocks, Mk, Ncurr, oldNcurr, offset  = " 
    327 //                  <<nb_full_blocks<<" "<<Mk<<" "<<Ncurr<<" "<<oldNcurr<<" "<<offset<<endl; 
    328139 
    329140//      for (size_t i= offset+1; i<oldNcurr; ++i) 
     
    338149        if (R<N){ 
    339150                 
    340                 std::cerr<<"Preconditionning failed; missing rank = "<<N-R<<" completing the Krylov matrix" 
    341                          <<std::endl; 
    342                 // exit(-1); 
    343                  
    344                 Nrest = N-R; 
    345                 //cerr<<"Nrest = "<<Nrest<<endl; 
     151//              std::cerr<<"Preconditionning failed; missing rank = "<<N-R 
     152//                       <<" completing the Krylov matrix" 
     153//                       <<std::endl; 
     154                size_t Nrest = N-R; 
    346155                typename Field::Element * K21 = K + R*ldk; 
    347156                typename Field::Element * K22 = K21 + R; 
    348157                typename Field::Element * Ki, *Ai; 
     158 
    349159                //  Compute the n-k last rows of A' = P A^T P^T in K2_ 
    350160                // A = A . P^t 
    351161                applyP( F, FflasRight, FflasTrans, N, 0, R, A, lda, Pk); 
     162 
    352163                // Copy K2_ = (A'_2)^t 
    353164                for (Ki = K21, Ai = A+R; Ki != K21 + Nrest*ldk; Ai++, Ki+=ldk-N) 
     
    355166                                *(Ki++) = *(Ai+j); 
    356167 
    357                 //write_field (F, cerr<<"A = "<<endl, A, N, N, lda); 
    358                  
    359                 //write_field (F, cerr<<"K2_ = "<<endl, K21, Nrest, N, ldk); 
    360168                // A = A . P : Undo the permutation on A 
    361169                applyP( F, FflasRight, FflasNoTrans, N, 0, R, A, lda, Pk); 
     170 
    362171                // K2_ = K2_ . P^t (=  ( P A^t P^t )2_ )  
    363172                applyP( F, FflasRight, FflasTrans, Nrest, 0, R, K21, ldk, Pk); 
    364                 //write_field (F, cerr<<"K2_ ( = P A^T P^T) = "<<endl, K21, Nrest, N, ldk); 
     173                 
    365174                // K21 = K21 . S1^-1 
    366                 //write_field (F, cerr<<"S1  = "<<endl, K,R,R, ldk); 
    367                 ftrsm(F, FflasRight, FflasUpper, FflasNoTrans, FflasNonUnit, Nrest, R, 
    368                       one, K, ldk, K21, ldk);   
    369                 //write_field (F, cerr<<"% S1^-1 = "<<endl, K21, Nrest, N, ldk); 
     175                ftrsm (F, FflasRight, FflasUpper, FflasNoTrans, FflasNonUnit, Nrest, R, 
     176                       one, K, ldk, K21, ldk);   
     177 
    370178                typename Field::Element * Arec = new typename Field::Element[Nrest*Nrest]; 
    371179                size_t ldarec = Nrest; 
     
    382190                std::list<Polynomial> polyList; 
    383191                polyList.clear(); 
    384                 //write_field (F, cerr<<"Recursive call with A = "<<endl, Arec, Nrest, Nrest, Nrest); 
    385  
     192 
     193                // Recursive call on the complementary subspace 
    386194                CharpolyArithProg (F, polyList, Nrest, Arec, ldarec, 2); 
    387                 //cerr<<"taille polyList = "<<polyList.size()<<endl; 
    388                 //cerr<<"Apres recursive call"<<endl; 
    389195                delete[] Arec; 
    390196                frobeniusForm.merge(polyList); 
    391                 //cerr<<"taille frob = "<<frobeniusForm.size()<<endl; 
    392                 //              typename list <Polynomial>::iterator pl_it = polyList.begin(); 
    393 //              while (pl_it != polyList.end()) 
    394 //                      frobeniusForm.push_front(*(pl_it++)); 
    395                  
    396         } 
    397          
    398          
     197        } 
     198 
    399199        delete[] Pk; 
    400200        delete[] Qk; 
     
    402202        for (size_t i=0; i<Mk; ++i) 
    403203                dA[i] = dK[i]; 
    404          
    405204        bk_idx = 0; 
    406205         
    407         //      write_field(F,cerr<<"Apres preconditionnement, K = "<<endl, K2+noc*ldk, noc,N,ldk); 
    408206        typename Field::Element *Arp = new typename Field::Element[Ncurr*Ma]; 
    409207        typename Field::Element *Ac = new typename Field::Element[Ncurr*Ma]; 
     
    414212                for (size_t j=0; j<Ma; ++j) 
    415213                        *(K+i*ldk+j) = *(Ac + i*Ma +j) = *(K2b + i + (j)*ldk); 
    416         //      for (size_t i=0; i < noc; ++i){ 
    417 //              for (size_t k=0; k < degini[i]; ++k){ 
    418 //                      for (size_t j=0; j < noc; ++j) 
    419 //                              *(Ac + (w_idx)*N + j) = *(K2 + (noc+j)*ldk + i + bk_idx); 
    420 //                      bk_idx += degK[k]; 
    421 //                      w_idx++; 
    422 //                      } 
    423 //              bk_idx = 0; 
    424 //      } 
    425  
    426         //write_field(F,cerr<<"Apres preconditionnement, Ac = "<<endl, Ac, Ncurr, Ma, Ma); 
    427          
    428         size_t block_idx, it_idx, rp_val; 
    429  
    430         //cerr<<"Avant a boucle : Ma, Ncurr = "<<Ma<<" "<<Ncurr<<endl; 
     214 
     215        size_t block_idx, it_idx, rp_val; 
     216 
     217        // Main loop of the arithmetic progession 
    431218        while ((nb_full_blocks >= 1) && (Mk > 1)) { 
    432219                delete[] K; 
     
    436223                ldk = Ma; 
    437224  
    438                 //cerr<<deg<<endl; 
    439                 //write_field(F, cerr<<"Ac = "<<endl, Ac, Ncurr, Ma, N); 
    440225                // Computation of the rank profile 
    441226                for (size_t i=0; i < Ncurr; ++i) 
     
    448233                        std::cerr<<"FAIL R<Ncurr"<<std::endl; 
    449234                        throw CharpolyFailed(); 
    450                         //exit(-1); 
    451                 } 
     235                } 
     236 
    452237                // Computation of the degree vector dK 
    453                 //cerr<<"// Computation of the degree vector dK"<<endl; 
    454238                it_idx = 0; 
    455239                rp_val = 0; 
     
    458242                block_idx = 0; 
    459243                nb_full_blocks = 0; 
    460 #if DEBUG 
    461                 std::cerr<<"dK = "; 
    462 #endif 
    463244                while (dtot<Ncurr){ 
    464245                        do {g++; rp_val++; it_idx++;} 
     
    471252                        dK[block_idx++] = it_idx; 
    472253                        dtot += it_idx; 
    473 #if DEBUG 
    474                         std::cerr<<dK[block_idx-1]<<" "; 
    475 #endif 
    476254                        if (it_idx == deg) 
    477255                                nb_full_blocks ++; 
     
    480258                } 
    481259 
    482 #if DEBUG 
    483                 std::cerr<<std::endl; 
    484 #endif 
    485260                Mk = block_idx; 
    486                 //cerr<<"Mk, nb_full_blocks = "<<Mk<<" "<<nb_full_blocks<<endl; 
    487  
    488  
    489261                                 
    490262                // Selection of dense colums of K  
    491                 //cerr<<"// Selection of dense colums of K "<<endl; 
    492263                for (size_t i=0; i < nb_full_blocks; ++i){ 
    493264                        fcopy (F, Ncurr, K+i, ldk, Ac+i, ldac); 
    494265                } 
    495                 //write_field(F, cerr<<"K = "<<endl, K, Ncurr, Mk, ldk); 
    496266                 
    497267                // K <- QK K 
    498                 // cerr<<"// K <- QK K "<<endl; 
    499 //              DeCompressRows (F, Mk - nb_full_blocks, Ncurr-nb_full_blocks*deg, K + nb_full_blocks*(deg-1)*ldk, ldk, Arp, N, dK+nb_full_blocks, Mk-nb_full_blocks); 
    500 //              write_field(F, cerr<<"K = "<<endl, K, Ncurr, Mk, ldk); 
    501  
    502268                size_t pos = nb_full_blocks*(deg-1); 
    503269                for (size_t i = nb_full_blocks; i < Mk; ++i){ 
    504                         //      cerr<<"*(K + "<<i<<") = "<<(*(K+i))<<"ldk = "<<ldk<<endl; 
    505270                        for (size_t j=0; j<Ncurr; ++j) 
    506271                                F.assign (*(K + i + j*ldk), zero); 
    507272                        F.assign (*(K + i + (pos + dK[i]-1)*ldk), one); 
    508                         //cerr<<"dA["<<i<<"] = "<<dA[i]<<endl; 
    509273                        pos += dA[i]; 
    510274                } 
    511                 //write_field(F, cerr<<"K = "<<endl, K, Ncurr, Mk, ldk); 
    512275 
    513276                // Copying K2 <- K 
    514                 //cerr<<"// Copying K2 <- K"<<endl; 
    515277                for (size_t i=0; i<Mk; ++i) 
    516278                        fcopy (F, Ncurr, K2+i, ldk, K+i, ldk); 
    517                 CompressRowsQK (F, Mk, K2 + nb_full_blocks*(deg-1)*ldk, ldk, Arp, ldarp, dK+nb_full_blocks, deg, Mk-nb_full_blocks); 
    518  
    519                  
     279                CompressRowsQK (F, Mk, K2 + nb_full_blocks*(deg-1)*ldk, ldk, 
     280                                Arp, ldarp, dK+nb_full_blocks, deg, Mk-nb_full_blocks); 
     281 
    520282                // K <- PA K 
    521                 //cerr<<"// K <- PA K"<<endl; 
    522283                CompressRows (F, nb_full_blocks, K, ldk, Arp, ldarp, dA, Ma); 
    523                 //write_field(F, cerr<<"K = "<<endl, K, Ncurr, Mk, ldk); 
    524284                 
    525285                // A <- newQA^T K (compress) 
    526                 //cerr<<"// K <- newQA^T K (compress)"<<endl; 
    527286                CompressRowsQA (F, Ma, Ac, ldac, Arp, ldarp, dA, Ma); 
    528                 //write_field(F, cerr<<"K = "<<endl, K, Ncurr, Mk, ldk); 
    529  
     287                 
    530288                // K <- A K 
    531                 // cerr<<"// K <- A K"<<endl; 
    532 //              cerr<<"C <- AB + C"<<endl; 
    533                 // write_field(F,cerr<<"A = "<<endl, Ac, Ncurr-Ma, Ma, N); 
    534 //              write_field(F,cerr<<"B = "<<endl, K+(Ncurr-Ma)*ldk, Ma,nb_full_blocks, ldk); 
    535 //              write_field(F,cerr<<"C = "<<endl, K, Ncurr-Ma, nb_full_blocks, ldk); 
    536                  
    537                 fgemm (F, FflasNoTrans, FflasNoTrans, Ncurr-Ma, nb_full_blocks, Ma, one, Ac, ldac, K+(Ncurr-Ma)*ldk, ldk, one, K, ldk); 
    538                 fgemm (F, FflasNoTrans, FflasNoTrans, Ma, nb_full_blocks, Ma, one, Ac+(Ncurr-Ma)*ldac, ldac, K+(Ncurr-Ma)*ldk, ldk, zero, Arp, ldarp); 
     289                fgemm (F, FflasNoTrans, FflasNoTrans, Ncurr-Ma, nb_full_blocks, Ma, one, 
     290                       Ac, ldac, K+(Ncurr-Ma)*ldk, ldk, one, K, ldk); 
     291                fgemm (F, FflasNoTrans, FflasNoTrans, Ma, nb_full_blocks, Ma, one, 
     292                       Ac+(Ncurr-Ma)*ldac, ldac, K+(Ncurr-Ma)*ldk, ldk, zero, Arp, ldarp); 
    539293                for (size_t i=0; i< Ma; ++i) 
    540294                        fcopy(F, nb_full_blocks, K+(Ncurr-Ma+i)*ldk, 1, Arp+i*ldarp, 1); 
    541                 //write_field(F, cerr<<"K = "<<endl, K, Ncurr, Mk, ldk); 
    542295                 
    543296                // Copying the last rows of A times K 
    544                 //cerr<<"// Copying the last rows of k "<<nb_full_blocks<<" "<<Mk<<endl; 
    545                  offset = (deg-2)*nb_full_blocks; 
     297                offset = (deg-2)*nb_full_blocks; 
    546298                for (size_t i = nb_full_blocks; i < Mk; ++i) { 
    547                         //cerr<<"dK["<<i<<"] = "<<dK[i]<<" deg = "<<deg<<endl; 
    548299                        for (size_t j=0; j<Ncurr; ++j) 
    549300                                F.assign(*(K+i+j*ldk), zero); 
     
    552303                        else{ 
    553304                                F.assign (*(K + i + (offset+dK[i]-1)*ldk), one); 
    554                                 //cerr<<"*(K + "<<i<<" + ("<<offset <<"+dK["<<i<<"]-1)*ldk) := 1 "<<endl; 
    555305                        } 
    556306                        offset += dA[i]-1; 
    557307                } 
    558                 //write_field(F, cerr<<"K = "<<endl, K, Ncurr, Mk, ldk);