Changeset 1495df4 in git for kernel/ncSAMult.cc
- Timestamp:
- Jul 15, 2008, 6:27:58 PM (16 years ago)
- Branches:
- (u'spielwiese', 'fe61d9c35bf7c61f2b6cbf1b56e25e2f08d536cc')
- Children:
- e3164c057b351ebc7de36b8955221b4cb648bdbe
- Parents:
- 67dbdb5d3b02ace5998471f519c0e9ae91a1c63b
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/ncSAMult.cc
r67dbdb r1495df4 7 7 * Author: motsak 8 8 * Created: 9 * Version: $Id: ncSAMult.cc,v 1. 1 2008-07-04 16:18:42motsak Exp $9 * Version: $Id: ncSAMult.cc,v 1.2 2008-07-15 16:27:58 motsak Exp $ 10 10 *******************************************************************/ 11 11 12 12 13 #define MYTEST 014 #define OUTPUT 013 #define MYTEST 1 14 #define OUTPUT 1 15 15 16 16 #if MYTEST … … 22 22 23 23 #include <ncSAMult.h> // for CMultiplier etc classes 24 #include <ring.h> 25 #include <p_polys.h> 26 #include <sbuckets.h> 27 28 29 30 31 /* 24 #include <sca.h> // for SCA 25 26 27 28 32 29 // poly functions defined in p_Procs: ; 33 poly gnc_pp_Mult_mm(const poly p, const poly m, const ring r, poly 34 &last); 35 poly gnc_p_Mult_mm(poly p, const poly m, const ring r); 36 poly gnc_mm_Mult_p(const poly m, poly p, const ring r); 37 poly gnc_mm_Mult_pp(const poly m, const poly p, const ring r); 38 */ 30 static poly gnc_pp_Mult_mm(const poly p, const poly m, const ring r, poly& last) 31 { 32 #if OUTPUT 33 Print("gnc_pp_Mult_mm"); 34 PrintLn(); 35 #endif 36 assume( r->GetNC()->GetGlobalMultiplier() != NULL ); 37 38 return r->GetNC()->GetGlobalMultiplier()->MultiplyPE(p, m); 39 } 40 41 static poly gnc_p_Mult_mm(poly p, const poly m, const ring r) 42 { 43 #if OUTPUT 44 Print("gnc_p_Mult_mm"); 45 PrintLn(); 46 #endif 47 assume( r->GetNC()->GetGlobalMultiplier() != NULL ); 48 49 return r->GetNC()->GetGlobalMultiplier()->MultiplyPEDestroy(p, m); 50 } 51 52 static poly gnc_mm_Mult_p(const poly m, poly p, const ring r) 53 { 54 #if OUTPUT 55 Print("gnc_mm_Mult_p"); 56 PrintLn(); 57 #endif 58 assume( r->GetNC()->GetGlobalMultiplier() != NULL ); 59 60 return r->GetNC()->GetGlobalMultiplier()->MultiplyEPDestroy(m, p); 61 } 62 63 static poly gnc_mm_Mult_pp(const poly m, const poly p, const ring r) 64 { 65 #if OUTPUT 66 Print("gnc_mm_Mult_pp"); 67 PrintLn(); 68 #endif 69 70 assume( r->GetNC()->GetGlobalMultiplier() != NULL ); 71 72 return r->GetNC()->GetGlobalMultiplier()->MultiplyEP(m, p); 73 } 74 75 76 77 78 static void gnc_p_ProcsSet(ring rGR, p_Procs_s* p_Procs = NULL) 79 { 80 #if OUTPUT 81 Print("\ngnc_p_ProcsSet()!!!"); 82 PrintLn(); 83 #endif 84 85 if( p_Procs == NULL ) 86 p_Procs = rGR->p_Procs; 87 88 // "commutative" 89 p_Procs->p_Mult_mm = rGR->p_Procs->p_Mult_mm = gnc_p_Mult_mm; 90 p_Procs->pp_Mult_mm = rGR->p_Procs->pp_Mult_mm = gnc_pp_Mult_mm; 91 92 p_Procs->p_Minus_mm_Mult_qq = rGR->p_Procs->p_Minus_mm_Mult_qq = NULL; 93 94 // non-commutaitve multiplication by monomial from the left 95 rGR->GetNC()->p_Procs.mm_Mult_p = gnc_mm_Mult_p; 96 rGR->GetNC()->p_Procs.mm_Mult_pp = gnc_mm_Mult_pp; 97 98 } 99 100 101 102 103 104 105 106 bool ncInitSpecialPairMultiplication(ring r) 107 { 108 #if OUTPUT 109 Print("ncInitSpecialPairMultiplication(ring), ring: \n"); 110 rWrite(r); 111 PrintLn(); 112 #endif 113 assume(rIsPluralRing(r)); 114 assume(!rIsSCA(r)); 115 116 r->GetNC()->GetGlobalMultiplier() = new CGlobalMultiplier(r); 117 118 gnc_p_ProcsSet(r); 119 return true; 120 } 121 122 123 CGlobalMultiplier::CGlobalMultiplier(ring r): CMultiplier<poly>(r) 124 { 125 #if OUTPUT 126 Print("CGlobalMultiplier::CGlobalMultiplier(ring)!"); 127 PrintLn(); 128 #endif 129 130 m_cache = new CGlobalCacheHash(r); 131 m_powers = new CPowerMultiplier(r); 132 133 } 134 135 136 CGlobalMultiplier::~CGlobalMultiplier() 137 { 138 #if OUTPUT 139 Print("CGlobalMultiplier::~CGlobalMultiplier()!"); 140 PrintLn(); 141 #endif 142 143 delete m_cache; 144 delete m_powers; 145 } 146 147 148 149 // Exponent * Exponent 150 // TODO: handle components!!! 151 poly CGlobalMultiplier::MultiplyEE(const CExponent expLeft, const CExponent expRight) 152 { 153 #if OUTPUT 154 Print("CGlobalMultiplier::MultiplyEE(expLeft, expRight)!"); 155 PrintLn(); 156 #endif 157 158 CCacheHash<poly>::CCacheItem* pLookup; 159 int b = m_cache->LookupEE(expLeft, expRight, pLookup); 160 161 // up to now: 162 assume( b == -1 ); 163 164 // TODO: use PowerMultiplier!!!! 165 166 167 // up to now: 168 return NULL; 169 } 170 171 // Monom * Exponent 172 poly CGlobalMultiplier::MultiplyME(const poly pMonom, const CExponent expRight) 173 { 174 return MultiplyEE(pMonom, expRight); 175 } 176 177 // Exponent * Monom 178 poly CGlobalMultiplier::MultiplyEM(const CExponent expLeft, const poly pMonom) 179 { 180 return MultiplyEE(expLeft, pMonom); 181 } 182 183 184 185 186 187 // Exponent * Exponent 188 poly CCommutativeSpecialPairMultiplier::MultiplyEE(const int expLeft, const int expRight) 189 { 190 return NULL; 191 } 192 193 // Monom * Exponent 194 poly CCommutativeSpecialPairMultiplier::MultiplyME(const poly pMonom, const int expRight) 195 { 196 return NULL; 197 } 198 199 // Exponent * Monom 200 poly CCommutativeSpecialPairMultiplier::MultiplyEM(const int expLeft, const poly pMonom) 201 { 202 return NULL; 203 } 204 205 206 207 // factory method! 208 CSpecialPairMultiplier* AnalyzePair(const ring r, int i, int j) 209 { 210 #if OUTPUT 211 Print("AnalyzePair(ring, i: %d, j: %d)!", i, j); 212 PrintLn(); 213 #endif 214 215 const int N = r->N; 216 217 assume(i < j); 218 assume(i > 0); 219 assume(j <= N); 220 221 222 const poly c = GetC(r, i, j); 223 const poly d = GetD(r, i, j); 224 225 #if OUTPUT 226 Print("C_{%d, %d} = ", i, j); p_Write(c, r); 227 Print("D_{%d, %d} = ", i, j); p_Write(d, r); 228 #endif 229 230 if( (d == NULL) && n_IsOne(p_GetCoeff(c, r), r) ) 231 return new CCommutativeSpecialPairMultiplier(r, i, j); 232 233 return NULL; 234 } 235 236 237 238 239 240 241 CPowerMultiplier::CPowerMultiplier(ring r): CMultiplier<CPower>(r) 242 { 243 #if OUTPUT 244 Print("CPowerMultiplier::CPowerMultiplier(ring)!"); 245 PrintLn(); 246 #endif 247 248 m_specialpairs = (CSpecialPairMultiplier**)omAlloc0( ((NVars() * (NVars()-1)) / 2) * sizeof(CSpecialPairMultiplier*) ); 249 250 for( int i = 1; i < NVars(); i++ ) 251 for( int j = i + 1; j <= NVars(); j++ ) 252 GetPair(i, j) = AnalyzePair(GetBasering(), i, j); // factory method! 253 } 254 255 256 CPowerMultiplier::~CPowerMultiplier() 257 { 258 #if OUTPUT 259 Print("CPowerMultiplier::~CPowerMultiplier()!"); 260 PrintLn(); 261 #endif 262 263 omFreeSize((ADDRESS)m_specialpairs, ((NVars() * (NVars()-1)) / 2) * sizeof(CSpecialPairMultiplier*) ); 264 } 265 266 267 // Monom * Exponent 268 // pMonom may NOT be of the form: var(j)^{n}! 269 poly CPowerMultiplier::MultiplyME(const poly pMonom, const CExponent expRight) 270 { 271 const int j = expRight.Var; 272 const int n = expRight.Power; 273 274 #if OUTPUT 275 Print("CPowerMultiplier::MultiplyME(monom * var(%d)^{%d}!", j, n); 276 PrintLn(); 277 #endif 278 279 assume( (j > 0) && (j <= NVars())); 280 281 if( n == 0 ) 282 return p_Copy(pMonom, GetBasering()); // Copy?!? 283 284 285 int v = NVars(); 286 int e = p_GetExp(pMonom, v, GetBasering()); 287 288 while((v > j) && (e == 0)) 289 e = p_GetExp(pMonom, --v, GetBasering()); 290 291 // TODO: review this! 292 if( (e == 0) ) 293 return expRight.GetPoly(GetBasering()); 294 295 if( v == j ) 296 { 297 poly p = p_Copy(pMonom, GetBasering()); 298 p_SetExp(p, j, e + n, GetBasering()); 299 return p; 300 } 301 302 // And now the General Case: v > j! 303 304 poly p = MultiplyEE( CPower(v, e), expRight ); // Easy way! 305 306 --v; 307 308 while(v > 0) 309 { 310 e = p_GetExp(pMonom, v, GetBasering()); 311 312 if( e > 0 ) 313 p = MultiplyEPDestroy(CPower(v, e), p); 314 315 --v; 316 } 317 318 return p; 319 } 320 321 // Exponent * Monom 322 // pMonom may NOT be of the form: var(i)^{m}! 323 poly CPowerMultiplier::MultiplyEM(const CExponent expLeft, const poly pMonom) 324 { 325 // TODO: as above! (difference due to Left/Right semmantics!) 326 const int j = expLeft.Var; 327 const int n = expLeft.Power; 328 329 #if OUTPUT 330 Print("CPowerMultiplier::MultiplyEM(var(%d)^{%d} * monom)!", j, n); 331 PrintLn(); 332 #endif 333 334 assume( (j > 0) && (j <= NVars())); 335 336 if( n == 0 ) 337 return p_Copy(pMonom, GetBasering()); // Copy?!? 338 339 340 int v = 1; // NVars(); 341 int e = p_GetExp(pMonom, v, GetBasering()); 342 343 while((v < j) && (e == 0)) 344 e = p_GetExp(pMonom, ++v, GetBasering()); 345 346 // TODO: review this! 347 if( (e == 0) ) 348 return expLeft.GetPoly(GetBasering()); 349 350 if( v == j ) 351 { 352 poly p = p_Copy(pMonom, GetBasering()); 353 p_SetExp(p, j, e + n, GetBasering()); 354 return p; 355 } 356 357 // And now the General Case: v > j! 358 359 poly p = MultiplyEE( expLeft, CPower(v, e) ); // Easy way! 360 361 ++v; 362 while(v <= NVars()) 363 { 364 e = p_GetExp(pMonom, v, GetBasering()); 365 366 if( e > 0 ) 367 p = MultiplyPEDestroy(p, CPower(v, e)); 368 369 ++v; 370 } 371 372 } 373 374 375 // Exponent * Exponent 376 // Computes: var(j)^{expLeft} * var(i)^{expRight} 377 poly CPowerMultiplier::MultiplyEE(const CExponent expLeft, const CExponent expRight) 378 { 379 #if OUTPUT 380 Print("CPowerMultiplier::MultiplyEE)!"); 381 PrintLn(); 382 #endif 383 384 const int i = expRight.Var, j = expLeft.Var; 385 const int ei = expRight.Power, ej = expLeft.Power; 386 387 #if OUTPUT 388 Print("Input: var(%d)^{%d} * var(%d)^{%d}", j, ej, i, ei); 389 PrintLn(); 390 #endif 391 392 poly product; 393 394 if( i >= j ) 395 { 396 // easy! 397 product = NULL; 398 } else 399 { 400 assume(1 <= i); 401 assume(i < j); 402 assume(j <= NVars()); 403 assume(ei > 0); 404 assume(ej > 0); 405 406 // No Cache Lookup!? :( 407 408 CSpecialPairMultiplier* pSpecialMultiplier = GetPair(i, j); 409 410 poly product = NULL; 411 412 // Special case? 413 if( pSpecialMultiplier != NULL ) 414 { 415 assume( pSpecialMultiplier->GetI() == i ); 416 assume( pSpecialMultiplier->GetJ() == j ); 417 assume( pSpecialMultiplier->GetBasering() == GetBasering() ); 418 419 product = pSpecialMultiplier->MultiplyEE(ej, ei); 420 } else 421 { 422 // Perform general NC Multiplication: 423 // TODO 424 425 product = NULL; 426 } 427 } 428 429 return product; 430 } 431 432 433 434 435 436 437 CSpecialPairMultiplier::CSpecialPairMultiplier(ring r, int i, int j): 438 CMultiplier<int>(r), m_i(i), m_j(j) 439 { 440 assume(i < j); 441 assume(i > 0); 442 assume(j <= NVars()); 443 } 444 445 446 // Monom * Exponent 447 poly CSpecialPairMultiplier::MultiplyME(const poly pMonom, const CExponent expRight) 448 { 449 return MultiplyEE(p_GetExp(pMonom, GetJ(), GetBasering()), expRight); 450 } 451 452 // Exponent * Monom 453 poly CSpecialPairMultiplier::MultiplyEM(const CExponent expLeft, const poly pMonom) 454 { 455 return MultiplyEE(expLeft, p_GetExp(pMonom, GetI(), GetBasering())); 456 } 457 458 459 460
Note: See TracChangeset
for help on using the changeset viewer.