Changeset 3
- Timestamp:
- 03/11/07 15:11:02 (2 years ago)
- Location:
- include/fflas-ffpack
- Files:
-
- 4 modified
-
ffpack.h (modified) (7 diffs)
-
ffpack_charpoly.inl (modified) (16 diffs)
-
ffpack_frobenius.inl (modified) (16 diffs)
-
ffpack_krylovelim.inl (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
include/fflas-ffpack/ffpack.h
r1 r3 48 48 FfpackKGFast=4, 49 49 FfpackDanilevski=5, 50 FfpackKGFastG=6 50 FfpackArithProg=6, 51 FfpackKGFastG=7 51 52 }; 53 54 class CharpolyFailed{}; 52 55 53 56 enum FFPACK_MINPOLY_TAG { FfpackDense=1, … … 451 454 CharPoly( const Field& F, std::list<Polynomial>& charp, const size_t N, 452 455 typename Field::Element * A, const size_t lda, 453 const enum FFPACK_CHARPOLY_TAG CharpTag= Ffpack LUK);456 const enum FFPACK_CHARPOLY_TAG CharpTag= FfpackArithProg); 454 457 455 458 //--------------------------------------------------------------------- … … 469 472 470 473 // Solve L X = B or X L = B in place 471 // L is M*M if Side == FflasLeft and N*N if Side == FflasRig t, B is M*N.474 // L is M*M if Side == FflasLeft and N*N if Side == FflasRight, B is M*N. 472 475 // Only the R non trivial column of L are stored in the M*R matrix L 473 476 // Requirement : so that L could be expanded in-place … … 483 486 F.init(one, 1.0); 484 487 F.init(zero, 0.0); 488 size_t LM = (Side == FflasRight)?N:M; 485 489 for (int i=R-1; i>=0; --i){ 486 490 if ( Q[i] > (size_t) i){ 487 491 //for (size_t j=0; j<=Q[i]; ++j) 488 492 //F.init( *(L+Q[i]+j*ldl), 0 ); 489 fcopy( F, M-Q[i]-1, L+Q[i]*(ldl+1)+ldl,ldl, L+(Q[i]+1)*ldl+i, ldl ); 490 for ( size_t j=Q[i]*ldl; j<M*ldl; j+=ldl) 493 //cerr<<"1 deplacement "<<i<<"<-->"<<Q[i]<<endl; 494 fcopy( F, LM-Q[i]-1, L+Q[i]*(ldl+1)+ldl,ldl, L+(Q[i]+1)*ldl+i, ldl ); 495 for ( size_t j=Q[i]*ldl; j<LM*ldl; j+=ldl) 491 496 F.assign( *(L+i+j), zero ); 492 497 } 493 498 } 494 499 ftrsm( F, Side, FflasLower, FflasNoTrans, FflasUnit, M, N, one, L, ldl , B, ldb); 495 500 //write_field(F,cerr<<"dans solveLB "<<endl,L,N,N,ldl); 496 501 // Undo the permutation of L 497 502 for (size_t i=0; i<R; ++i){ … … 499 504 //for (size_t j=0; j<=Q[i]; ++j) 500 505 //F.init( *(L+Q[i]+j*ldl), 0 ); 501 fcopy( F, M-Q[i]-1, L+(Q[i]+1)*ldl+i, ldl, L+Q[i]*(ldl+1)+ldl,ldl );502 for ( size_t j=Q[i]*ldl; j< M*ldl; j+=ldl)506 fcopy( F, LM-Q[i]-1, L+(Q[i]+1)*ldl+i, ldl, L+Q[i]*(ldl+1)+ldl,ldl ); 507 for ( size_t j=Q[i]*ldl; j<LM*ldl; j+=ldl) 503 508 F.assign( *(L+Q[i]+j), zero ); 504 509 } … … 547 552 int j=R-1; 548 553 while ( j >=0 ) { 554 //cerr<<"j="<<j<<endl; 549 555 k = ib = Q[j]; 550 556 while ( (j>=0) && (Q[j] == k) ) {--k;--j;} 551 557 Ldim = ib-k; 558 //cerr<<"Ldim, ib, k, N = "<<Ldim<<" "<<ib<<" "<<k<<" "<<N<<endl; 552 559 Lcurr = L + j+1 + (k+1)*ldl; 553 560 Bcurr = B + ib; 554 561 Rcurr = Lcurr + Ldim*ldl; 555 fgemm ( F, FflasNoTrans, FflasNoTrans, M, N-ib-1, Ldim, Mone, Bcurr, ldb, Rcurr, ldl, one, Bcurr-Ldim, ldb);562 fgemm (F, FflasNoTrans, FflasNoTrans, M, Ldim, N-ib-1, Mone, Bcurr, ldb, Rcurr, ldl, one, Bcurr-Ldim, ldb); 556 563 //cerr<<"j avant="<<j<<endl; 557 564 //cerr<<"k, ib, j, R "<<k<<" "<<ib<<" "<<j<<" "<<R<<endl; 558 565 //cerr<<"M,k="<<M<<" "<<k<<endl; 559 566 //cerr<<" ftrsm with M, N="<<Ldim<<" "<<N<<endl; 560 ftrsm (F, Side, FflasLower, FflasNoTrans, FflasUnit, M, Ldim, one, Lcurr, ldl , Bcurr-Ldim, ldb );567 ftrsm (F, Side, FflasLower, FflasNoTrans, FflasUnit, M, Ldim, one, Lcurr, ldl , Bcurr-Ldim, ldb ); 561 568 //cerr<<"M,k="<<M<<" "<<k<<endl; 562 569 //cerr<<" fgemm with M, N, K="<<M-k<<" "<<N<<" "<<Ldim<<endl; … … 581 588 template <class Field, class Polynomial> 582 589 static std::list<Polynomial>& 583 Frobenius(const Field& F, std::list<Polynomial>& frobeniusForm,584 const size_t N, typename Field::Element * A, const size_t lda, const size_t c);590 CharpolyArithProg (const Field& F, std::list<Polynomial>& frobeniusForm, 591 const size_t N, typename Field::Element * A, const size_t lda, const size_t c); 585 592 template <class Field> 586 593 static void CompressRows (Field& F, const size_t M, -
include/fflas-ffpack/ffpack_charpoly.inl
r1 r3 11 11 template <class Field, class Polynomial> 12 12 std::list<Polynomial>& 13 FFPACK::CharPoly (const Field& F, std::list<Polynomial>& charp, const size_t N,14 typename Field::Element * A, const size_t lda,15 const enum FFPACK_CHARPOLY_TAG CharpTag){16 switch ( CharpTag) {13 FFPACK::CharPoly (const Field& F, std::list<Polynomial>& charp, const size_t N, 14 typename Field::Element * A, const size_t lda, 15 const enum FFPACK_CHARPOLY_TAG CharpTag){ 16 switch (CharpTag) { 17 17 case FfpackLUK:{ 18 18 typename Field::Element * X = new typename Field::Element[N*(N+1)]; 19 LUKrylov (F, charp, N, A, lda, X, N);19 LUKrylov (F, charp, N, A, lda, X, N); 20 20 delete[] X; 21 21 return charp; 22 22 } 23 23 case FfpackKG:{ 24 return KellerGehrig ( F, charp, N, A, lda);24 return KellerGehrig (F, charp, N, A, lda); 25 25 break; 26 26 } … … 31 31 case FfpackKGFast:{ 32 32 size_t mc, mb, j; 33 if (KGFast ( F, charp, N, A, lda, &mc, &mb, &j)){33 if (KGFast (F, charp, N, A, lda, &mc, &mb, &j)){ 34 34 std::cerr<<"NON GENERIC MATRIX PROVIDED TO KELLER-GEHRIG-FAST"<<std::endl; 35 35 } … … 43 43 case FfpackHybrid:{ 44 44 typename Field::Element * X = new typename Field::Element[N*(N+1)]; 45 LUKrylov_KGFast (F, charp, N, A, lda, X, N);45 LUKrylov_KGFast (F, charp, N, A, lda, X, N); 46 46 delete[] X; 47 return charp; 48 break; 49 } 50 51 case FfpackArithProg:{ 52 size_t attempts=0; 53 bool cont = false; 54 do{ 55 try { 56 CharpolyArithProg (F, charp, N, A, lda, 30); 57 } 58 catch (CharpolyFailed){ 59 if (attempts<2) 60 cont = true; 61 else 62 CharPoly(F, charp, N, A, lda, FfpackLUK); 63 64 } 65 } while (cont); 47 66 return charp; 48 67 break; … … 50 69 default:{ 51 70 typename Field::Element * X = new typename Field::Element[N*(N+1)]; 52 LUKrylov (F, charp, N, A, lda, X, N);71 LUKrylov (F, charp, N, A, lda, X, N); 53 72 delete[] X; 54 73 return charp; … … 60 79 template <class Field, class Polynomial> 61 80 std::list<Polynomial>& 62 FFPACK::LUKrylov (const Field& F, std::list<Polynomial>& charp, const size_t N,63 typename Field::Element * A, const size_t lda,64 typename Field::Element * X, const size_t ldx){81 FFPACK::LUKrylov (const Field& F, std::list<Polynomial>& charp, const size_t N, 82 typename Field::Element * A, const size_t lda, 83 typename Field::Element * X, const size_t ldx){ 65 84 66 85 typedef typename Field::Element elt; … … 73 92 charp.clear(); 74 93 int nbfac = 0; 75 while ( Ncurr > 0){94 while (Ncurr > 0){ 76 95 size_t P[Ncurr]; 77 Polynomial minP;//=new Polynomial();78 MinPoly ( F, minP, Ncurr, A, lda, X2, ldx, P);96 Polynomial minP;//=new Polynomial(); 97 MinPoly (F, minP, Ncurr, A, lda, X2, ldx, P); 79 98 int k = minP.size()-1; // degre of minpoly 80 if ( (k==1) && F.isZero( (minP)[0] )){ // minpoly is X99 if ((k==1) && F.isZero ((minP)[0])){ // minpoly is X 81 100 Ai = A; 82 101 int j = Ncurr*Ncurr; 83 while ( j-- && F.isZero(*(Ai++)));84 if ( !j){ // A is 0, CharPoly=X^n102 while (j-- && F.isZero(*(Ai++))); 103 if (!j){ // A is 0, CharPoly=X^n 85 104 minP.resize(Ncurr+1); 86 105 (minP)[1] = zero; … … 90 109 } 91 110 nbfac++; 92 charp.push_front ( minP);93 if ( k==Ncurr){111 charp.push_front (minP); 112 if (k==Ncurr){ 94 113 return charp; 95 114 } … … 97 116 elt * X21 = X2 + k*ldx; 98 117 elt * X22 = X21 + k; 99 // Compute the n-k last rows of A' = PA^tP^t in X2_118 // Compute the n-k last rows of A' = PA^tP^t in X2_ 100 119 // A = A . P^t 101 applyP (F, FflasRight, FflasTrans, Ncurr, 0, k, A, lda, P);120 applyP (F, FflasRight, FflasTrans, Ncurr, 0, k, A, lda, P); 102 121 // Copy X2_ = (A'_2)^t 103 for ( Xi = X21, Ai = A+k; Xi != X21 + Nrest*ldx; Ai++, Xi+=ldx-Ncurr)104 for ( size_t jj=0; jj<Ncurr*lda; jj+=lda)122 for (Xi = X21, Ai = A+k; Xi != X21 + Nrest*ldx; Ai++, Xi+=ldx-Ncurr) 123 for (size_t jj=0; jj<Ncurr*lda; jj+=lda) 105 124 *(Xi++) = *(Ai+jj); 106 125 // A = A . P : Undo the permutation on A 107 applyP (F, FflasRight, FflasNoTrans, Ncurr, 0, k, A, lda, P);108 // X2_ = X2_ . P^t (= ( P A^t P^t )2_)109 applyP (F, FflasRight, FflasTrans, Nrest, 0, k, X21, ldx, P);126 applyP (F, FflasRight, FflasNoTrans, Ncurr, 0, k, A, lda, P); 127 // X2_ = X2_ . P^t (= (P A^t P^t)2_) 128 applyP (F, FflasRight, FflasTrans, Nrest, 0, k, X21, ldx, P); 110 129 // X21 = X21 . S1^-1 111 130 ftrsm(F, FflasRight, FflasUpper, FflasNoTrans, FflasUnit, Nrest, k, 112 one, X2, ldx, X21, ldx); 131 one, X2, ldx, X21, ldx); 113 132 // Creation of the matrix A2 for recurise call 114 for ( Xi = X22,Ai = A;115 Xi != X22 + Nrest*ldx;116 Xi += (ldx-Nrest), Ai += (lda-Nrest))117 for ( size_t jj=0; jj<Nrest; ++jj)133 for (Xi = X22, Ai = A; 134 Xi != X22 + Nrest*ldx; 135 Xi += (ldx-Nrest), Ai += (lda-Nrest)) 136 for (size_t jj=0; jj<Nrest; ++jj) 118 137 *(Ai++) = *(Xi++); 119 fgemm (F, FflasNoTrans, FflasNoTrans, Nrest, Nrest, k, Mone,120 X21, ldx, X2+k, ldx, one, A, lda );138 fgemm (F, FflasNoTrans, FflasNoTrans, Nrest, Nrest, k, Mone, 139 X21, ldx, X2+k, ldx, one, A, lda); 121 140 X2 = X22; 122 141 Ncurr = Nrest; … … 127 146 template <class Field, class Polynomial> 128 147 std::list<Polynomial>& 129 FFPACK::LUKrylov_KGFast (const Field& F, std::list<Polynomial>& charp, const size_t N,130 typename Field::Element * A, const size_t lda,131 typename Field::Element * X, const size_t ldx){148 FFPACK::LUKrylov_KGFast (const Field& F, std::list<Polynomial>& charp, const size_t N, 149 typename Field::Element * A, const size_t lda, 150 typename Field::Element * X, const size_t ldx){ 132 151 133 152 typedef typename Field::Element elt; … … 139 158 size_t kg_mc, kg_mb, kg_j; 140 159 141 if (!KGFast ( F, charp, N, A, lda, &kg_mc, &kg_mb, &kg_j))160 if (!KGFast (F, charp, N, A, lda, &kg_mc, &kg_mb, &kg_j)) 142 161 return charp; 143 162 else{// Matrix A is not generic … … 147 166 size_t *P = new size_t[N]; 148 167 149 MinPoly ( F, *minP, N, A, lda, X, ldx, P, FfpackKGF, kg_mc, kg_mb, kg_j);168 MinPoly (F, *minP, N, A, lda, X, ldx, P, FfpackKGF, kg_mc, kg_mb, kg_j); 150 169 size_t k = minP->size()-1; // degre of minpoly 151 if ( (k==1) && F.isZero( (*minP)[0] )){ // minpoly is X170 if ((k==1) && F.isZero ((*minP)[0])){ // minpoly is X 152 171 Ai = A; 153 172 int j = N*N; 154 while ( j-- && F.isZero(*(Ai++)));155 if ( !j){ // A is 0, CharPoly=X^n173 while (j-- && F.isZero(*(Ai++))); 174 if (!j){ // A is 0, CharPoly=X^n 156 175 minP->resize(N+1); 157 176 (*minP)[1] = zero; … … 161 180 } 162 181 163 if ( k==N){182 if (k==N){ 164 183 charp.clear(); 165 184 charp.push_front(*minP); // CharPoly = MinPoly … … 176 195 size_t imax = kg_mc+kg_mb; 177 196 // First Id 178 for ( size_t j = 0; j < lambda; ++j){197 for (size_t j = 0; j < lambda; ++j){ 179 198 for (size_t i=0; i<imax; ++i) 180 F.assign (*(A+j+i*lda), zero);181 F.assign (*(A+j+imax*lda), one);199 F.assign (*(A+j+i*lda), zero); 200 F.assign (*(A+j+imax*lda), one); 182 201 for (size_t i=imax+1; i<N; ++i) 183 F.assign (*(A+j+i*lda), zero);202 F.assign (*(A+j+i*lda), zero); 184 203 ++imax; 185 204 } 186 205 // Column block B 187 206 for (typename Field::Element* Ai=A; Ai<A+N*lda; Ai+=lda) 188 fcopy ( F, kg_mb, Ai+lambda, 1, Ai+N-kg_mc-kg_mb, 1);207 fcopy (F, kg_mb, Ai+lambda, 1, Ai+N-kg_mc-kg_mb, 1); 189 208 190 209 // Second Id block … … 192 211 for (size_t j = 0; j< kg_j*kg_mc; ++j){ 193 212 for (size_t i = 0; i<imax; ++i) 194 F.assign ( *(A+lambda+kg_mb+j+i*lda), zero);195 F.assign ( *(A+lambda+kg_mb+j+imax*lda), one);213 F.assign (*(A+lambda+kg_mb+j+i*lda), zero); 214 F.assign (*(A+lambda+kg_mb+j+imax*lda), one); 196 215 for (size_t i = imax+1; i<N; ++i) 197 F.assign ( *(A+lambda+kg_mb+j+i*lda), zero);216 F.assign (*(A+lambda+kg_mb+j+i*lda), zero); 198 217 ++imax; 199 218 } 200 219 201 // Compute the n-k last rows of A' = PA^tP^t in X2_220 // Compute the n-k last rows of A' = PA^tP^t in X2_ 202 221 203 222 // A = P . A 204 applyP (F, FflasLeft, FflasNoTrans, N, 0, k,223 applyP (F, FflasLeft, FflasNoTrans, N, 0, k, 205 224 const_cast<typename Field::Element* &>(A), lda, P); 206 225 207 226 // Copy X2_ = (A'2_) 208 for ( Xi = X21, Ai = A+k*lda; Xi != X21 + Nrest*ldx; Ai+=lda-N, Xi+=ldx-N){209 for ( size_t jj=0; jj<N; ++jj){227 for (Xi = X21, Ai = A+k*lda; Xi != X21 + Nrest*ldx; Ai+=lda-N, Xi+=ldx-N){ 228 for (size_t jj=0; jj<N; ++jj){ 210 229 *(Xi++) = *(Ai++); 211 230 } … … 213 232 214 233 // A = P^t . A : Undo the permutation on A 215 applyP (F, FflasLeft, FflasTrans, N, 0, k,234 applyP (F, FflasLeft, FflasTrans, N, 0, k, 216 235 const_cast<typename Field::Element* &>(A), lda, P); 217 236 218 // X2_ = X2_ . P^t (= ( P A P^t )2_)219 applyP (F, FflasRight, FflasTrans, Nrest, 0, k, X21, ldx, P);237 // X2_ = X2_ . P^t (= (P A P^t)2_) 238 applyP (F, FflasRight, FflasTrans, Nrest, 0, k, X21, ldx, P); 220 239 221 240 // X21 = X21 . S1^-1 … … 226 245 elt * A2 = new elt[Nrest*Nrest]; 227 246 228 for ( Xi = X22,A2i = A2;229 Xi != X22 + Nrest*ldx;230 Xi += (ldx-Nrest)){231 for ( size_t jj=0; jj<Nrest; ++jj){247 for (Xi = X22, A2i = A2; 248 Xi != X22 + Nrest*ldx; 249 Xi += (ldx-Nrest)){ 250 for (size_t jj=0; jj<Nrest; ++jj){ 232 251 *(A2i++) = *(Xi++); 233 252 } 234 253 } 235 fgemm (F, FflasNoTrans, FflasNoTrans, Nrest, Nrest, k, Mone,236 X21, ldx, X+k, ldx, one, A2, Nrest );254 fgemm (F, FflasNoTrans, FflasNoTrans, Nrest, Nrest, k, Mone, 255 X21, ldx, X+k, ldx, one, A2, Nrest); 237 256 238 257 // Recursive call on X22 239 LUKrylov_KGFast ( F, charp, Nrest, A2, Nrest, X22, ldx);240 charp.push_front ( *minP);258 LUKrylov_KGFast (F, charp, Nrest, A2, Nrest, X22, ldx); 259 charp.push_front (*minP); 241 260 delete[] P; 242 261 delete[] A2; -
include/fflas-ffpack/ffpack_frobenius.inl
r1 r3 14 14 15 15 //--------------------------------------------------------------------- 16 // Frobenius: Las Vegas algorithm to compute the Frobeniusnormal form over a large field16 // CharpolyArithProg: Las Vegas algorithm to compute the Charpoly normal form over a large field 17 17 //--------------------------------------------------------------------- 18 18 … … 146 146 template <class Field, class Polynomial> 147 147 std::list<Polynomial>& 148 FFPACK:: Frobenius(const Field& F, std::list<Polynomial>& frobeniusForm,149 const size_t N, typename Field::Element * A, const size_t lda, const size_t c){148 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){ 150 150 151 151 static typename Field::Element one, zero, mone; … … 156 156 size_t * rp = new size_t[2*N]; 157 157 158 size_t noc = static_cast<size_t>(ceil( N/double(c)));159 160 // Building the workplace matrix Aw158 size_t noc = static_cast<size_t>(ceil(double(N)/double(c))); 159 160 // Building the workplace matrix 161 161 typename Field::Element *K = new typename Field::Element[N*(noc*c)]; 162 162 typename Field::Element *K2 = new typename Field::Element[N*(noc*c)]; … … 170 170 171 171 size_t *dA = new size_t[N]; //PA 172 size_t *dK = new size_t[N];172 // size_t *dK = new size_t[N]; 173 173 174 174 … … 185 185 // K+(c-2)*noc*ldk, ldk, A, lda, zero, K+(c-1)*noc*ldk, ldk); 186 186 187 //write_field(F,cerr<<"K = "<<endl,K, c*noc,N,ldk);188 //write_field(F,cerr<<"A = "<<endl,A, N,N,ldk);187 //write_field(F,cerr<<"K = "<<endl,K, c*noc,N,ldk); 188 //write_field(F,cerr<<"A = "<<endl,A, N,N,ldk); 189 189 size_t * Pk = new size_t[N]; 190 190 size_t * Qk = new size_t[c*noc]; … … 193 193 size_t w_idx = 0; 194 194 for (size_t i=0; i<noc; ++i) 195 for (size_t j=0; j<c; ++j )196 fcopy(F, N, (K2+(w_idx ++)*ldk), 1, (K+(i+j*noc)*ldk), 1);195 for (size_t j=0; j<c; ++j, w_idx++) 196 fcopy(F, N, (K2+(w_idx)*ldk), 1, (K+(i+j*noc)*ldk), 1); 197 197 198 198 for (size_t i=0; i<noc*c; ++i) … … 200 200 201 201 size_t R = LUdivine(F, FflasNonUnit, noc*c, N, K, ldk, Pk, Qk, FfpackLQUP); 202 if (R<N){ 203 std::cerr<<"Preconditionning failed; not yet implemented"<<std::endl; 204 exit(-1); 205 } 206 202 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; 207 208 size_t row_idx = 0; 208 size_t * d egini= new size_t[noc];209 size_t * dK = new size_t[noc]; 209 210 for (size_t i=0; i<noc; ++i) 210 degini[i]=0; 211 // size_t * degK = new size_t[c]; 212 // for (size_t i=0; i<c; ++i) 213 // degK[i]=0; 211 dK[i]=0; 214 212 215 213 size_t i=0; 216 214 row_idx=0; 215 size_t dold = c; 216 size_t nb_full_blocks = 0; 217 size_t Mk = 0; 217 218 for (size_t k = 0; k<noc; ++k){ 218 219 size_t d = 0; 219 220 while ( (d<c) && (row_idx<R) && (Qk[row_idx] == i)) {i++; row_idx++; d++;} 220 degini[k] = d; 221 if (d > dold){ 222 std::cerr << "FAIL in preconditionning phase:" 223 << " degree sequence is not monotonically not increasing" 224 << std::endl; 225 //exit (-1); 226 throw CharpolyFailed(); 227 } 228 229 dK[k] = dold = d; 230 Mk++; 231 if (d == c) 232 nb_full_blocks++; 221 233 i = Qk[row_idx]; 222 234 } 223 224 // for (size_t i = 0; i<N; ++i) 225 // if (Qk[row_idx] == i){ 226 // degini[i % noc] ++; 227 // // degK[i/noc] ++; 228 // row_idx ++; 235 //cerr<<"Mk = "<<Mk<<endl; 236 // Selection of the last iterate of each block 237 size_t bk_idx = 0; 238 //write_field (F,cerr<<"Avant fgemm K2 = "<<endl, K2, noc*c, N, ldk); 239 240 for (size_t i = 0; i < Mk; ++i){ 241 #if DEBUG 242 std::cerr<<"dK ["<<i<<"] = "<<dK[i]<<std::endl; 243 #endif 244 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 249 typename Field::Element* K2b = K2+Mk*ldk; 250 // K <- K A^T 251
