Changeset 4
- Timestamp:
- 03/13/07 10:33:27 (2 years ago)
- Files:
-
- 14 modified
-
AUTHORS (modified) (1 diff)
-
ChangeLog (modified) (1 diff)
-
INSTALL (modified) (1 diff)
-
Makefile (modified) (1 diff)
-
README (modified) (3 diffs)
-
include/fflas-ffpack/ffpack_frobenius.inl (modified) (22 diffs)
-
include/fflas-ffpack/modular-balanced.h (modified) (1 diff)
-
include/fflas-ffpack/modular-positive.h (modified) (4 diffs)
-
tests/Makefile (modified) (1 diff)
-
tests/Matio.h (modified) (8 diffs)
-
tests/test-charpoly.C (modified) (3 diffs)
-
tests/test-fgemm.C (modified) (1 diff)
-
tests/test-frobenius.C (modified) (2 diffs)
-
tests/test-lqup.C (modified) (4 diffs)
Legend:
- Unmodified
- Added
- Removed
-
AUTHORS
r1 r4 1 1 Jean-Guillaume Dumas <Jean-Guillaume.Dumas@imag.fr> 2 2 Pascal Giorgi <pascal.giorgi@univ-perp.fr> 3 Cl ement Pernet <Clement.Pernet@imag.fr>3 Clément Pernet <Clement.Pernet@imag.fr> 4 4 -
ChangeLog
r1 r4 1 2007-03-11 v1.1.1 2 * complete preconditioning phase for the new Charpoly algorithm 3 * new Charpoly algorithm renamed CharpolyArithProg 4 * add exception for failure of the LasVegas algrithm 5 * default charpoly is now: 2 attempts to CharpolyArithProg, then LUKrylov 6 1 7 2007-02-27 v1.1.0 2 8 * change some naming conventions in the directories -
INSTALL
r1 r4 29 29 COMPILATION OF THE TESTS : 30 30 31 To compile the tests, complete the 3 variables given in test/Makefile : 32 ATLASROOT= {the root directory where ATLAS is installed} 33 ATLASARCH= {the architecture-system name given during ATLAS installation. 34 for example Linux_P4SSE2} 35 ARCH= {the architecture parameter for g++. For example pentium4, athlon, ...} 31 To compile the tests, complete the variables given in test/Makefile and/or uncomment the adequate option: 32 BLASROOT= {the directory where the BLAS library is located} 33 ARCH= {the architecture parameter for g++. For example pentium4, athlon, opteron,...} 36 34 37 35 Then simply run make in the test directory. -
Makefile
r1 r4 1 VERSION=1.1. 01 VERSION=1.1.1 2 2 3 3 FFLAS_FFPACK_DIR=/home/pernet/Logiciels/fflas-ffpack -
README
r1 r4 1 1 ****** FFLAS-FFPACK : Finite Field Linear Algebra Subroutines/Package ****** 2 2 3 Version 1. 0.13 Version 1.1.1 4 4 5 5 PURPOSE: … … 12 12 see INSTALL 13 13 14 AVAILABILITY: from www-l mc.imag.fr/lmc-mosaic/Jean-Guillaume.Dumas/FFLAS/14 AVAILABILITY: from www-ljk.imag.fr/membres/Jean-Guillaume.Dumas/FFLAS/ 15 15 16 REQUIREMENTS: A C-BLAS library: for ex. ATLAS (http://math-atlas.sourceforge.net/)16 REQUIREMENTS: A BLAS library: for ex. ATLAS (http://math-atlas.sourceforge.net/) 17 17 18 18 This library requires the GNU C++ compiler (gcc-3.0 or newer) or any … … 21 21 22 22 ========================================================== 23 The FFLAS-FFPACK website is www-l mc.imag.fr/lmc-mosaic/Jean-Guillaume.Dumas/FFLAS/23 The FFLAS-FFPACK website is www-ljk.imag.fr/membres/Jean-Guillaume.Dumas/FFLAS/ 24 24 25 Corrections, suggestions and comments to :25 Please adress your bug reports, suggestions and comments to : 26 26 Clement.Pernet@imag.fr 27 27 28 Last update : 2006 August28 Last update : March 2007 29 29 30 30 -
include/fflas-ffpack/ffpack_frobenius.inl
r3 r4 14 14 15 15 //--------------------------------------------------------------------- 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) 17 18 //--------------------------------------------------------------------- 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 172 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 146 19 template <class Field, class Polynomial> 147 20 std::list<Polynomial>& 148 21 FFPACK::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){ 150 24 151 25 static typename Field::Element one, zero, mone; … … 155 29 156 30 size_t * rp = new size_t[2*N]; 157 158 31 size_t noc = static_cast<size_t>(ceil(double(N)/double(c))); 159 32 … … 162 35 typename Field::Element *K2 = new typename Field::Element[N*(noc*c)]; 163 36 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 171 38 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 176 44 typename Field::RandIter g (F); 177 45 for (size_t i = 0; i < noc; ++i) … … 179 47 g.random( *(K + i*ldk +j) ); 180 48 49 // Computing the bloc Krylov matrix [U AU .. A^(c-1) U]^T 181 50 for (size_t i = 1; i<c; ++i) 182 51 fgemm( F, FflasNoTrans, FflasTrans, noc, N, N, one, 183 52 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];191 53 192 54 // K2 <- K (re-ordering) … … 196 58 fcopy(F, N, (K2+(w_idx)*ldk), 1, (K+(i+j*noc)*ldk), 1); 197 59 60 // Copying K <- K2 198 61 for (size_t i=0; i<noc*c; ++i) 199 62 fcopy (F, N, (K+i*ldk), 1, K2+i*ldk, 1); 200 63 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; 201 70 size_t R = LUdivine(F, FflasNonUnit, noc*c, N, K, ldk, Pk, Qk, FfpackLQUP); 202 71 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;208 72 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 213 73 size_t i=0; 214 row_idx=0;215 74 size_t dold = c; 216 75 size_t nb_full_blocks = 0; 217 76 size_t Mk = 0; 77 // Determining the degree sequence dK 218 78 for (size_t k = 0; k<noc; ++k){ 219 79 size_t d = 0; … … 226 86 throw CharpolyFailed(); 227 87 } 228 229 88 dK[k] = dold = d; 230 89 Mk++; 231 90 if (d == c) 232 91 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 236 96 // Selection of the last iterate of each block 237 97 size_t bk_idx = 0; 238 //write_field (F,cerr<<"Avant fgemm K2 = "<<endl, K2, noc*c, N, ldk);239 240 98 for (size_t i = 0; i < Mk; ++i){ 241 #if DEBUG242 std::cerr<<"dK ["<<i<<"] = "<<dK[i]<<std::endl;243 #endif244 99 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 } 249 102 typename Field::Element* K2b = K2+Mk*ldk; 103 250 104 // K <- K A^T 251 252 //write_field (F,cerr<<"Avant fgemm K2 = "<<endl, K2, noc*c, N, ldk);253 105 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);256 106 257 107 // K <- K P^T 258 108 applyP (F, FflasRight, FflasTrans, Mk, 0, R, K2b, ldk, Pk); 259 109 260 //write_field (F,cerr<<"Apres applyP K2b = "<<endl, K2b, Mk, N, ldk);261 110 // K <- K U^-1 262 111 ftrsm (F, FflasRight, FflasUpper, FflasNoTrans, FflasNonUnit, Mk, R, one, K, ldk, K2b, ldk); 263 112 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 284 116 // K <- K L^-1 285 //compressing L286 // 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 290 117 ftrsm (F, FflasRight, FflasLower, FflasNoTrans, FflasUnit, Mk, R, one, K, ldk, K2b, ldk); 291 //undoing permutation on K 118 119 //undoing permutation on L 292 120 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 298 122 // Recovery of the completed invariant factors 299 //cerr<<"// Recovery of the completed invariant factors"<<endl;300 123 size_t Ma = Mk; 301 124 size_t Ncurr = R; 302 125 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);306 126 for (size_t i=Mk-1; i>=nb_full_blocks+1; --i) 307 127 if (dK[i] >= 1){ 308 Polynomial P (dK [i]); 128 Polynomial P (dK [i]+1); 129 F.assign(P[dK[i]], one); 309 130 for (size_t j=0; j < dK [i]; ++j){ 310 131 F.neg (P [dK [i]-j-1], *(K2b + i*ldk + (offset-j))); 311 //cerr<<" "<<(*(K2b + i*ldk + (offset-j)));312 132 } 313 //cerr<<endl;314 // for (size_t j=0; j<dK[i]; ++j)315 // cerr<<" "<<(P)[j];316 133 frobeniusForm.push_front(P); 317 //cerr<<"Storing polynomial "<<i<<endl;318 134 offset -= dK [i]; 319 135 Ncurr -= dK [i]; 320 //block_idx--;321 136 Ma--; 322 137 } 323 138 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;328 139 329 140 // for (size_t i= offset+1; i<oldNcurr; ++i) … … 338 149 if (R<N){ 339 150 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; 346 155 typename Field::Element * K21 = K + R*ldk; 347 156 typename Field::Element * K22 = K21 + R; 348 157 typename Field::Element * Ki, *Ai; 158 349 159 // Compute the n-k last rows of A' = P A^T P^T in K2_ 350 160 // A = A . P^t 351 161 applyP( F, FflasRight, FflasTrans, N, 0, R, A, lda, Pk); 162 352 163 // Copy K2_ = (A'_2)^t 353 164 for (Ki = K21, Ai = A+R; Ki != K21 + Nrest*ldk; Ai++, Ki+=ldk-N) … … 355 166 *(Ki++) = *(Ai+j); 356 167 357 //write_field (F, cerr<<"A = "<<endl, A, N, N, lda);358 359 //write_field (F, cerr<<"K2_ = "<<endl, K21, Nrest, N, ldk);360 168 // A = A . P : Undo the permutation on A 361 169 applyP( F, FflasRight, FflasNoTrans, N, 0, R, A, lda, Pk); 170 362 171 // K2_ = K2_ . P^t (= ( P A^t P^t )2_ ) 363 172 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 365 174 // 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 370 178 typename Field::Element * Arec = new typename Field::Element[Nrest*Nrest]; 371 179 size_t ldarec = Nrest; … … 382 190 std::list<Polynomial> polyList; 383 191 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 386 194 CharpolyArithProg (F, polyList, Nrest, Arec, ldarec, 2); 387 //cerr<<"taille polyList = "<<polyList.size()<<endl;388 //cerr<<"Apres recursive call"<<endl;389 195 delete[] Arec; 390 196 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 399 199 delete[] Pk; 400 200 delete[] Qk; … … 402 202 for (size_t i=0; i<Mk; ++i) 403 203 dA[i] = dK[i]; 404 405 204 bk_idx = 0; 406 205 407 // write_field(F,cerr<<"Apres preconditionnement, K = "<<endl, K2+noc*ldk, noc,N,ldk);408 206 typename Field::Element *Arp = new typename Field::Element[Ncurr*Ma]; 409 207 typename Field::Element *Ac = new typename Field::Element[Ncurr*Ma]; … … 414 212 for (size_t j=0; j<Ma; ++j) 415 213 *(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 431 218 while ((nb_full_blocks >= 1) && (Mk > 1)) { 432 219 delete[] K; … … 436 223 ldk = Ma; 437 224 438 //cerr<<deg<<endl;439 //write_field(F, cerr<<"Ac = "<<endl, Ac, Ncurr, Ma, N);440 225 // Computation of the rank profile 441 226 for (size_t i=0; i < Ncurr; ++i) … … 448 233 std::cerr<<"FAIL R<Ncurr"<<std::endl; 449 234 throw CharpolyFailed(); 450 //exit(-1);451 } 235 } 236 452 237 // Computation of the degree vector dK 453 //cerr<<"// Computation of the degree vector dK"<<endl;454 238 it_idx = 0; 455 239 rp_val = 0; … … 458 242 block_idx = 0; 459 243 nb_full_blocks = 0; 460 #if DEBUG461 std::cerr<<"dK = ";462 #endif463 244 while (dtot<Ncurr){ 464 245 do {g++; rp_val++; it_idx++;} … … 471 252 dK[block_idx++] = it_idx; 472 253 dtot += it_idx; 473 #if DEBUG474 std::cerr<<dK[block_idx-1]<<" ";475 #endif476 254 if (it_idx == deg) 477 255 nb_full_blocks ++; … … 480 258 } 481 259 482 #if DEBUG483 std::cerr<<std::endl;484 #endif485 260 Mk = block_idx; 486
