Changeset 9f609e6 in git
- Timestamp:
- Apr 5, 2000, 12:03:09 PM (24 years ago)
- Branches:
- (u'spielwiese', 'fe61d9c35bf7c61f2b6cbf1b56e25e2f08d536cc')
- Children:
- 78f2216c4ff0ad23f68b4cdfcdbeabbd8107d8f3
- Parents:
- 69526d5b2781892b526a1ff184aafbda1f1c5b9b
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
factory/sm_sparsemod.cc
r69526d5 r9f609e6 1 1 /* emacs edit mode for this file is -*- C++ -*- */ 2 /* $Id: sm_sparsemod.cc,v 1. 7 1998-03-12 14:31:13 schmidtExp $ */2 /* $Id: sm_sparsemod.cc,v 1.8 2000-04-05 10:03:09 Singular Exp $ */ 3 3 4 4 //{{{ docu … … 58 58 return gcd( v, u ); 59 59 60 61 62 63 60 // u und v Polynome in levU - Variablen x1, ..., xlevU 64 61 // mit den gleichen Variablen, welches in sparsemod gesichert wurde 65 62 66 63 int levU = level( u ); 67 68 69 64 CFArray G( 1, levU ); 70 65 Variable x( 1 ); … … 78 73 79 74 if( alpha(lcggt) != 0 && degree(G[1]) != 0 ) 80 { 81 //G[1] =( alpha( lcggt ))*( ( 1/lc( G[1] ) ) * G[1] ); 82 G[1] =( alpha( lcggt ))*( ( 1/Leitkoeffizient( G[1] ) ) * G[1] ); 83 84 } 85 86 75 { 76 //G[1] =( alpha( lcggt ))*( ( 1/lc( G[1] ) ) * G[1] ); 77 G[1] =( alpha( lcggt ))*( ( 1/Leitkoeffizient( G[1] ) ) * G[1] ); 78 } 87 79 88 80 if ( degree( G[1]) < 0 ) 89 { 90 91 return 1 ; 92 } 81 { 82 return 1 ; 83 } 93 84 94 85 95 86 if ( degree( G[1] ) == 0 ) 96 { 97 // zwei Auswertungen um sicherzugehen, dass gcd Eins ist! 98 99 return 1; 100 } 101 87 { 88 // zwei Auswertungen um sicherzugehen, dass gcd Eins ist! 89 return 1; 90 } 102 91 103 92 CFIterator J = G[ 1 ]; … … 109 98 110 99 while ( J.hasTerms() ) 111 { 112 g[ i ] = J.coeff() ; 113 emma[ i ] = J.exp(); 114 J++; 115 i++; 116 } 117 100 { 101 g[ i ] = J.coeff() ; 102 emma[ i ] = J.exp(); 103 J++; 104 i++; 105 } 118 106 119 107 m = i-1; /// Anzahl der Terme bzgl x1 … … 129 117 130 118 for( s = 2 ;s <= levU ; s++ ) 131 { 132 U[ s ] = alpha( u, s+1, levU ); // s Variablen stehen lassen, fuer 133 V[ s ] = alpha( v, s+1, levU ); // den Rest alpha einsetzen 134 135 d = tmin( degree( U[ s ], s ), degree( V[ s ], s )); 136 137 DEBOUTLN( cerr, " U["<< s << "] = " << U[s] ); 138 DEBOUTLN( cerr, " V["<< s << "] = " << V[s] ); 139 DEBOUTLN( cerr, " d = " << d ); 140 141 119 { 120 U[ s ] = alpha( u, s+1, levU ); // s Variablen stehen lassen, fuer 121 V[ s ] = alpha( v, s+1, levU ); // den Rest alpha einsetzen 122 d = tmin( degree( U[ s ], s ), degree( V[ s ], s )); 123 124 DEBOUTLN( cerr, " U["<< s << "] = " << U[s] ); 125 DEBOUTLN( cerr, " V["<< s << "] = " << V[s] ); 126 DEBOUTLN( cerr, " d = " << d ); 127 128 for ( i = 1; i <= m ; i++ ) 129 { 130 // Anzahl der Monome berechnen pro gi liefert das Skeletonpolynom // 131 n[ i ] = countmonome( g[ i ] ); 132 //cout << "n["<<i<<"] = "<< n[i] << endl; 133 } 134 135 for ( i = 1; i <= m ; i++ ) 136 { 137 if ( i ==1 ) 138 N = n[i]; 139 else 140 { 141 if ( n[i]> N ) 142 N = n[i]; 143 } 144 } 145 146 // int tau[d+1][m+1][N+1]; /// keine Integers !!! 147 typedef CanonicalForm** CF_ptr_ptr; 148 typedef CanonicalForm* CF_ptr; 149 150 CanonicalForm ***tau = new CF_ptr_ptr[m+1]; 151 for ( i = 1; i <= m; i++ ) 152 { 153 tau[i] = new CF_ptr[d+1]; 154 for ( j = 1; j <= d; j++ ) 155 tau[i][j] = new CanonicalForm[N+1]; 156 } 157 158 CFArray beta( 1, d ); 159 160 for ( i = 1; i <= d ; i++ ) 161 { 162 beta[ i ] = gen.generate(); // verschiedene Elemente aus Zp 163 // cout << " beta["<<i << "] = " << beta[i]; 164 } 165 166 Array<REvaluation> xi( 1, N ); 167 REvaluation a( 2, s-1, gen ); 168 169 for ( i = 1 ; i <= N ; i++ ) 170 { 171 a.nextpoint(); 172 xi[ i ] = a;//REvaluation( 2, s-1, gen ); 173 // cout << " xi["<<i<<"] = "<< xi[i]; 174 } 175 176 //CFArray T(1, d*N ); 177 178 if ( d == 0 ) 179 { 180 ASSERT( 0, "alpha bad point! try some other gcd algorithm" ); 181 return gcd(u, v); 182 } 183 184 CFMatrix T( d, N ) ; // diese Moeglichkeit laeuft!!! 185 //help = Koeff( T( j, k ), emma[ i ] ); 186 //tau[i][j][k] = help; //.intval(); 187 188 for ( j = 1 ; j <= d ; j++ ) // jedesmal andere REvaluation?? 189 { 190 for ( k = 1 ; k <= N ; k++ ) 191 { 192 CanonicalForm zwischenu, zwischenv, help, nfa ; 193 194 zwischenu = U[ s ]( beta[ j ], s ); 195 zwischenv = V[ s ]( beta[ j ], s ); 196 197 T( j, k) = gcd ( xi[k]( zwischenu, 2, s-1 ), xi[k]( zwischenv, 2, s-1 )); 198 199 nfa = lcggt( beta[j], s ); 200 nfa = alpha( nfa, s+1, levU ); 201 202 //T(j, k ) = (xi[k]( nfa, 2, s-1 ))*((1/lc(T( j, k ))) * T( j, k )); 203 T(j, k ) = (xi[k]( nfa, 2, s-1 ))*((1/Leitkoeffizient(T( j, k ))) * T( j, k )); 204 205 //cout <<"T("<<j<<", "<< k <<") = " << T(j, k) << endl; 206 207 for ( i = 1 ; i <= m ; i++ ) 208 { 209 // diese Moeglichkeit laeuft!!! 210 //help = Koeff( T( j, k ), emma[ i ] ); 211 //tau[i][j][k] = help; //.intval(); 212 if ( T( j, k).inBaseDomain() ) 213 { 214 if ( emma[i] == 0 ) 215 tau[i][j][k] = T( j, k ); 216 else 217 tau[i][j][k] = 0 ; 218 } 219 else 220 { 221 tau[i][j][k] = T(j, k)[emma[i]]; 222 } 223 } 224 } 225 226 CFMatrix h( m, d ); 142 227 143 228 for ( i = 1; i <= m ; i++ ) 144 { 145 // Anzahl der Monome berechnen pro gi liefert das Skeletonpolynom // 146 147 n[ i ] = countmonome( g[ i ] ); 148 //cout << "n["<<i<<"] = "<< n[i] << endl; 149 } 150 151 152 153 for ( i = 1; i <= m ; i++ ) 154 { 155 if ( i ==1 ) 156 N = n[i]; 157 else 158 { 159 if ( n[i]> N ) 160 N = n[i]; 161 } 162 } 163 164 165 // int tau[d+1][m+1][N+1]; /// keine Integers !!! 166 typedef CanonicalForm** CF_ptr_ptr; 167 typedef CanonicalForm* CF_ptr; 168 169 CanonicalForm ***tau = new CF_ptr_ptr[m+1]; 170 for ( i = 1; i <= m; i++ ) { 171 tau[i] = new CF_ptr[d+1]; 172 for ( j = 1; j <= d; j++ ) 173 tau[i][j] = new CanonicalForm[N+1]; 174 } 175 176 CFArray beta( 1, d ); 177 178 for ( i = 1; i <= d ; i++ ) 179 { 180 beta[ i ] = gen.generate(); // verschiedene Elemente aus Zp 181 // cout << " beta["<<i << "] = " << beta[i]; 182 } 183 184 185 186 187 188 Array<REvaluation> xi( 1, N ); 189 REvaluation a( 2, s-1, gen ); 190 191 for ( i = 1 ; i <= N ; i++ ) 192 { 193 a.nextpoint(); 194 xi[ i ] = a;//REvaluation( 2, s-1, gen ); 195 // cout << " xi["<<i<<"] = "<< xi[i]; 196 } 197 198 199 //CFArray T(1, d*N ); 200 201 if ( d == 0 ) 202 { 203 ASSERT( 0, "alpha bad point! try some other gcd algorithm" ); 204 return gcd(u, v); 205 } 206 207 CFMatrix T( d, N ) ; // diese Moeglichkeit laeuft!!! 208 //help = Koeff( T( j, k ), emma[ i ] ); 209 //tau[i][j][k] = help; //.intval(); 210 211 212 213 for ( j = 1 ; j <= d ; j++ ) // jedesmal andere REvaluation?? 214 for ( k = 1 ; k <= N ; k++ ) 215 { 216 CanonicalForm zwischenu, zwischenv, help, nfa ; 217 218 zwischenu = U[ s ]( beta[ j ], s ); 219 zwischenv = V[ s ]( beta[ j ], s ); 220 221 T( j, k) = gcd ( xi[k]( zwischenu, 2, s-1 ), xi[k]( zwischenv, 2, s-1 )); 222 223 224 nfa = lcggt( beta[j], s ); 225 nfa = alpha( nfa, s+1, levU ); 226 227 //T(j, k ) = (xi[k]( nfa, 2, s-1 ))*((1/lc(T( j, k ))) * T( j, k )); 228 T(j, k ) = (xi[k]( nfa, 2, s-1 ))*((1/Leitkoeffizient(T( j, k ))) * T( j, k )); 229 230 //cout <<"T("<<j<<", "<< k <<") = " << T(j, k) << endl; 231 232 233 for ( i = 1 ; i <= m ; i++ ) 234 { 235 // diese Moeglichkeit laeuft!!! 236 //help = Koeff( T( j, k ), emma[ i ] ); 237 //tau[i][j][k] = help; //.intval(); 238 if ( T( j, k).inBaseDomain() ) 239 { 240 if ( emma[i] == 0 ) 241 tau[i][j][k] = T( j, k ); 242 else 243 tau[i][j][k] = 0 ; 244 } 245 else 246 { 247 tau[i][j][k] = T(j, k)[emma[i]]; 248 } 249 } 250 } 251 252 253 CFMatrix h( m, d ); 254 255 256 for ( i = 1; i <= m ; i++ ) 257 { 258 for ( j = 1 ; j <= d ; j++ ) 259 { 260 zip = n[i] +1; 261 CanonicalForm * zwischen = new CanonicalForm[ zip ];//n[i]+1 ]; 262 263 for ( k = 1 ; k <= n[i] ; k++ ) 264 { 265 zwischen[ k ] = tau[i][j][k]; 266 } 267 268 //cout <<" werte fuer sinterpol : " << endl; 269 //cout <<" g["<<i<<"] = " << g[i] << " xi = " << xi << endl; 270 //cout << " zwischen = " << zwischen << " ni = " << n[i]<<endl; 271 h[ i ][ j ] = sinterpol( g[i], xi, zwischen, n[i] ); 272 DEBOUTLN( cerr, " Ergebnis von sinterpol h["<<i<<"]["<<j<< "] = " << h[i][j] ); 273 delete [] zwischen; 274 } 275 } 229 { 230 for ( j = 1 ; j <= d ; j++ ) 231 { 232 zip = n[i] +1; 233 CanonicalForm * zwischen = new CanonicalForm[ zip ];//n[i]+1 ]; 234 235 for ( k = 1 ; k <= n[i] ; k++ ) 236 { 237 zwischen[ k ] = tau[i][j][k]; 238 } 239 240 //cout <<" werte fuer sinterpol : " << endl; 241 //cout <<" g["<<i<<"] = " << g[i] << " xi = " << xi << endl; 242 //cout << " zwischen = " << zwischen << " ni = " << n[i]<<endl; 243 h[ i ][ j ] = sinterpol( g[i], xi, zwischen, n[i] ); 244 DEBOUTLN( cerr, " Ergebnis von sinterpol h["<<i<<"]["<<j<< "] = " << h[i][j] ); 245 delete [] zwischen; 246 } 247 } 276 248 for ( i = 1 ; i <= m ; i++ ) 277 { 278 CFArray zwitscher( 1, d ); 279 for ( j = 1 ; j <= d ; j++ ) 280 { 281 zwitscher[ j ] = h[ i ][ j ]; 282 } 283 284 DEBOUTLN( cerr, "Werte fuer dinterpol : " ); 285 DEBOUTLN( cerr, " d = " << d << " g["<<i<<"] = "<< g[i] ); 286 DEBOUTLN( cerr, " zwitscher = " << zwitscher ); 287 DEBOUTLN( cerr, " alpha["<<s<< "] = "<< alpha[s] << " beta = "<<beta << " n["<<i<<"] = " << n[i] ); 288 289 g[ i ] = dinterpol( d, g[i], zwitscher, alpha, s, beta, n[ i ], CHAR ); 290 DEBOUTLN( cerr, " Ergebnis von dinterpol g["<<i<<"] = " << g[i] ); 291 292 } 293 249 { 250 CFArray zwitscher( 1, d ); 251 for ( j = 1 ; j <= d ; j++ ) 252 { 253 zwitscher[ j ] = h[ i ][ j ]; 254 } 255 256 DEBOUTLN( cerr, "Werte fuer dinterpol : " ); 257 DEBOUTLN( cerr, " d = " << d << " g["<<i<<"] = "<< g[i] ); 258 DEBOUTLN( cerr, " zwitscher = " << zwitscher ); 259 DEBOUTLN( cerr, " alpha["<<s<< "] = "<< alpha[s] << " beta = "<<beta << " n["<<i<<"] = " << n[i] ); 260 261 g[ i ] = dinterpol( d, g[i], zwitscher, alpha, s, beta, n[ i ], CHAR ); 262 DEBOUTLN( cerr, " Ergebnis von dinterpol g["<<i<<"] = " << g[i] ); 263 264 } 294 265 295 266 for ( i = 1 ; i <= m ; i++ ) 296 297 298 267 { 268 G[ s ] += g[ i ] * ( power( x, emma[i] ) ); 269 } 299 270 DEBOUTLN( cerr, "G["<<s<<"] = " << G[s] ); 300 for ( i = 1; i <= m; i++ ) { 301 for ( j = 1; j <= d; j++ ) 302 delete [] tau[i][j]; 303 delete [] tau[i]; 271 for ( i = 1; i <= m; i++ ) 272 { 273 for ( j = 1; j <= d; j++ ) 274 delete [] tau[i][j]; 275 delete [] tau[i]; 304 276 } 305 277 delete [] tau; 306 278 } 279 } 307 280 delete [] emma; 308 281 … … 318 291 //cout << " in sparse " << endl; 319 292 if( F.inCoeffDomain() && G.inCoeffDomain() ) 320 321 322 293 { 294 return gcd( F, G ); 295 } 323 296 324 297 CanonicalForm f, g, ff, gg, ggt, res, fmodp, gmodp ; … … 326 299 327 300 // COMPRESS /////////////////// 328 329 301 330 302 CFArray A(1, 2); … … 336 308 g = M(A[2]); 337 309 338 339 310 // POLYNOME PRIMITIV BZGL DER ERSTEN VARIABLE ///// 340 341 342 311 343 312 CanonicalForm primif, primig, lcf, lcg, lcggt, lcggtmodp, result ; … … 345 314 gg = content( g, Variable(1) );//contentsparse( g, 1 ); 346 315 347 348 349 316 primif = f/ff; 350 317 primig = g/gg; … … 352 319 353 320 if( primif.inCoeffDomain() && primig.inCoeffDomain() ) 354 { 355 return N( gcd( primif, primig ) ) * N( ggt ); 356 } 357 358 359 321 { 322 return N( gcd( primif, primig ) ) * N( ggt ); 323 } 360 324 361 325 // Variablen, die in beiden Polynomen auftreten ///// … … 380 344 381 345 while ( ABFRAGE == 1 ) 382 383 384 385 386 387 388 389 390 391 392 393 394 395 for( i = 1; i <= levis ; i++ )396 { 397 if ( degree( primif, i ) != 0 ) 398 varf[i] = 1; 399 else 400 varf[i] = 0; 401 if ( degree( primig, i ) != 0 ) 402 varg[i] = 1; 403 else 404 varg[i] = 0; 405 if ( varg[i] == 1 && varf[i] == 1 ) 406 schnitt[i] = 1; 407 else 408 schnitt[i] = 0; 409 } 410 411 levelprimif = level(primif);412 levelprimig = level(primig); 413 414 for ( m = 1; m <= levis ; m++)415 { 416 if ( schnitt[m] == 0 ) 417 418 419 420 421 422 423 424 425 426 427 if ( level( primif ) == level( primig ) ) 428 ABFRAGE = 0 ; 429 430 } 431 432 346 { 347 levelprimif = level(primif); 348 levelprimig = level(primig); 349 350 if ( levelprimif > levelprimig ) 351 levis = levelprimif; 352 else 353 levis = levelprimig; 354 355 if ( levis < 0 ) 356 return N( gcd(primif, primig )); 357 358 for( i = 1; i <= levis ; i++ ) 359 { 360 if ( degree( primif, i ) != 0 ) 361 varf[i] = 1; 362 else 363 varf[i] = 0; 364 if ( degree( primig, i ) != 0 ) 365 varg[i] = 1; 366 else 367 varg[i] = 0; 368 if ( varg[i] == 1 && varf[i] == 1 ) 369 schnitt[i] = 1; 370 else 371 schnitt[i] = 0; 372 } 373 374 levelprimif = level(primif); 375 levelprimig = level(primig); 376 377 for ( m = 1; m <= levis ; m++) 378 { 379 if ( schnitt[m] == 0 ) 380 { 381 if ( varf[m] == 1) 382 { 383 primif = content( primif, m ); //contentsparse( primif, m ); 384 } 385 else 386 { 387 primig = content( primig, m ); //contentsparse( primig, m ); 388 } 389 } 390 } 391 392 if ( level( primif ) == level( primig ) ) 393 ABFRAGE = 0 ; 394 395 } 396 433 397 delete [] varf; delete [] varg; delete [] schnitt; 434 398 435 436 399 // Nochmal compress fuer den Fall, dass eine Variable rausfliegt // 437 438 400 439 401 CFArray C(1, 2); … … 452 414 453 415 if( primif.inCoeffDomain() && primig.inCoeffDomain() ) 454 455 456 416 { 417 return N( NN( gcd( primif, primig ) ) ) * N( ggt ); 418 } 457 419 458 420 // erst hier Leitkoeffizienten updaten ///////// … … 463 425 lcg = LC(primig, 1 ); 464 426 lcggt = gcd ( lcf, lcg ); 465 466 467 427 468 428 // BOUND BESTIMMEN fuer Charakteristik Null ///////// … … 482 442 483 443 if( CHAR == 0 ) 484 485 486 487 488 489 490 491 492 493 494 //cout << " lcggt = " << lcggt << endl;495 //bool ja;496 //ja = divides( lcggt, lc( G[levU] ) );497 //cout << " ja = " << ja << endl;498 //cout << " vor Verlassen " << endl;499 500 444 { 445 p[ 1 ] = cf_getBigPrime( count ); 446 CanonicalForm q = p[ 1 ]; 447 448 while ( q < Bound ) 449 { 450 count++; 451 length++; 452 p[ length ] = cf_getBigPrime( count ); 453 q *= p[ length ]; //G[levU] = ( 1/lc(G[levU] ))* G[levU];// sinnig? 454 //cout << " lcggt = " << lcggt << endl; 455 //bool ja; 456 //ja = divides( lcggt, lc( G[levU] ) ); 457 //cout << " ja = " << ja << endl; 458 //cout << " vor Verlassen " << endl; 459 } 460 } 501 461 else 502 { 503 //int q = CHAR; 504 //setCharacteristic( 0 ); 505 //CanonicalForm Bound2 = mapinto( Bound ) ; 506 //cout << " Bound2 " << Bound2 << endl; 507 //cout << " CHAR = " << q << endl; 508 509 // erstmal ohne Erweiterung !!! 510 //deg = 3; // Default Erweiterung 511 //q *= ( q * q ) ;cout << "q = " << q << endl; 512 513 //Bestimme Grad der Koerpererweiterung voellig unnuetz!!! 514 //while ( q < abs( Bound2 ) ) 515 // { 516 // q *= CHAR;cout << " q = " << q << endl; 517 //deg++;cout << " degchar = " << deg << endl; 518 //cout << " in Graderhoehung? " << endl; 519 520 //} 521 //setCharacteristic( CHAR ); 522 //cerr << " JUHU " << endl; 523 } 524 525 526 462 { 463 //int q = CHAR; 464 //setCharacteristic( 0 ); 465 //CanonicalForm Bound2 = mapinto( Bound ) ; 466 //cout << " Bound2 " << Bound2 << endl; 467 //cout << " CHAR = " << q << endl; 468 469 // erstmal ohne Erweiterung !!! 470 //deg = 3; // Default Erweiterung 471 //q *= ( q * q ) ;cout << "q = " << q << endl; 472 473 //Bestimme Grad der Koerpererweiterung voellig unnuetz!!! 474 //while ( q < abs( Bound2 ) ) 475 // { 476 // q *= CHAR;cout << " q = " << q << endl; 477 //deg++;cout << " degchar = " << deg << endl; 478 //cout << " in Graderhoehung? " << endl; 479 480 //} 481 //setCharacteristic( CHAR ); 482 //cerr << " JUHU " << endl; 483 } 527 484 528 485 // ENDE BOUNDBESTIMMUNG ///////////////// 529 530 486 531 487 FFRandom gen ; … … 540 496 541 497 for ( i = 1 ; i <= 10; i++ ) // 10 Versuche mit sparsemod 542 { 543 if ( CHAR == 0 ) 544 { 545 for( k = 1; k <= length ; k++) 546 { 547 help = p[ k ].intval(); 548 setCharacteristic( help ); 549 FFRandom mache; 550 am = REvaluation( 2, levelprimif, mache ); 551 am.nextpoint(); 552 fmodp = mapinto( primif ); 553 gmodp = mapinto( primig ); 554 lcggtmodp = mapinto ( lcggt ); 555 556 zwischen = smodgcd( fmodp, gmodp, lcggtmodp, am, mache, CHAR, Variable( 1 )); 557 // Variable ( 1 ) Interface fuer endliche Koerper 558 559 // Char auf 0 wegen Chinese Remainder //////// 560 561 setCharacteristic( 0 ); 562 563 564 resultat[ k ] = mapinto( zwischen ); 565 566 } 567 568 569 //////////////////////////////////////////////////////////// 570 // result[k] mod p[k] via Chinese Remainder zu Resultat ////// 571 // ueber Z hochziehen ////// 572 //////////////////////////////////////////////////////////// 573 574 if( length != 1 ) 575 ChinesePoly( length, resultat, p, result ); 576 else 577 result = resultat[1]; 578 579 CanonicalForm contentresult = content( result, 1 ); 580 581 if ( contentresult != 0 ) 582 res = result/contentresult; 583 else 584 res = result; 585 586 if ( divides( res, primif ) && divides( res, primig ) ) 587 return N(NN(res))*N(ggt) ; /// compress rueckgaengig machen! 588 else 589 { 590 591 // Start all over again /// 592 593 count++; 594 for ( k = 1; k <= length ; k++) 595 { 596 p[k] = cf_getBigPrime( count ); 597 count++; 598 } 599 600 } 601 } 602 else 603 { 604 // Fall Char != 0 /// 605 // in algebraische Erweiterung vom Grad deg gehen // 606 //cout << " IN CHAR != 0 " << endl; 607 //cout << " degree = " << deg << endl; 608 CanonicalForm minimalpoly; 609 //cout << " vor mini " << endl; 610 minimalpoly = find_irreducible( deg, gen, alpha1 ); 611 //cout << " nach mini " << endl; 612 Variable alpha2 = rootOf( minimalpoly, 'a' ) ; 613 AlgExtRandomF hallo( alpha2 ); 614 //cout << " vor am " << endl; 615 REvaluation am ( 2, levelprimif, hallo ); 616 //cout << " nach ma " << endl; 617 am.nextpoint(); 618 //cout << "vor smodgcd " << endl; 619 result = smodgcd( primif, primig, lcggt, am, hallo, CHAR, alpha2 ); 620 if ( result == 1 && ABFRAGE == 0) 621 { 622 // zwei Auswertungen fuer gcd Eins 623 am.nextpoint(); 624 ABFRAGE = 1; 625 } 626 //CanonicalForm contentresult = contentsparse( result, 1 ); 627 //zuerst mal auf Nummer sicher gehen ... 628 else 629 { 630 CanonicalForm contentresult = content( result, 1 ); 631 //cout << "RESULT = " << result << endl; 632 if ( contentresult != 0 ) 633 res = result/contentresult; 634 else 635 { 636 res = result; 637 } 638 639 640 if ( ( divides( res, primif )) && ( divides ( res, primig ) )) 641 { 642 // make monic //// 643 res = (1/lc(res)) * res; 644 // eventuell auch hier Leitkoeffizient anstatt lc ? 645 646 return N( NN( res ) ) * N( ggt ) ; 647 } 648 else 649 { 650 // Grad der Erweiterung sukzessive um eins erhoehen 651 deg++; 652 //cout << " deg = " << deg << endl; 653 am.nextpoint(); 654 // nextpoint() unnoetig? 655 } 656 } 657 } 658 } 498 { 499 if ( CHAR == 0 ) 500 { 501 for( k = 1; k <= length ; k++) 502 { 503 help = p[ k ].intval(); 504 setCharacteristic( help ); 505 FFRandom mache; 506 am = REvaluation( 2, levelprimif, mache ); 507 am.nextpoint(); 508 fmodp = mapinto( primif ); 509 gmodp = mapinto( primig ); 510 lcggtmodp = mapinto ( lcggt ); 511 512 zwischen = smodgcd( fmodp, gmodp, lcggtmodp, am, mache, CHAR, Variable( 1 )); 513 // Variable ( 1 ) Interface fuer endliche Koerper 514 515 // Char auf 0 wegen Chinese Remainder //////// 516 517 setCharacteristic( 0 ); 518 519 resultat[ k ] = mapinto( zwischen ); 520 } 521 522 //////////////////////////////////////////////////////////// 523 // result[k] mod p[k] via Chinese Remainder zu Resultat ////// 524 // ueber Z hochziehen ////// 525 //////////////////////////////////////////////////////////// 526 527 if( length != 1 ) 528 ChinesePoly( length, resultat, p, result ); 529 else 530 result = resultat[1]; 531 532 CanonicalForm contentresult = content( result, 1 ); 533 534 if ( contentresult != 0 ) 535 res = result/contentresult; 536 else 537 res = result; 538 539 if ( divides( res, primif ) && divides( res, primig ) ) 540 return N(NN(res))*N(ggt) ; /// compress rueckgaengig machen! 541 else 542 { 543 544 // Start all over again /// 545 546 count++; 547 for ( k = 1; k <= length ; k++) 548 { 549 p[k] = cf_getBigPrime( count ); 550 count++; 551 } 552 } 553 } 554 else 555 { 556 // Fall Char != 0 /// 557 // in algebraische Erweiterung vom Grad deg gehen // 558 //cout << " IN CHAR != 0 " << endl; 559 //cout << " degree = " << deg << endl; 560 CanonicalForm minimalpoly; 561 //cout << " vor mini " << endl; 562 minimalpoly = find_irreducible( deg, gen, alpha1 ); 563 //cout << " nach mini " << endl; 564 Variable alpha2 = rootOf( minimalpoly, 'a' ) ; 565 AlgExtRandomF hallo( alpha2 ); 566 //cout << " vor am " << endl; 567 REvaluation am ( 2, levelprimif, hallo ); 568 //cout << " nach ma " << endl; 569 am.nextpoint(); 570 //cout << "vor smodgcd " << endl; 571 result = smodgcd( primif, primig, lcggt, am, hallo, CHAR, alpha2 ); 572 if ( result == 1 && ABFRAGE == 0) 573 { 574 // zwei Auswertungen fuer gcd Eins 575 am.nextpoint(); 576 ABFRAGE = 1; 577 } 578 //CanonicalForm contentresult = contentsparse( result, 1 ); 579 //zuerst mal auf Nummer sicher gehen ... 580 else 581 { 582 CanonicalForm contentresult = content( result, 1 ); 583 //cout << "RESULT = " << result << endl; 584 if ( contentresult != 0 ) 585 res = result/contentresult; 586 else 587 res = result; 588 589 if ( ( divides( res, primif )) && ( divides ( res, primig ) )) 590 { 591 // make monic //// 592 res = (1/lc(res)) * res; 593 // eventuell auch hier Leitkoeffizient anstatt lc ? 594 595 return N( NN( res ) ) * N( ggt ) ; 596 } 597 else 598 { 599 // Grad der Erweiterung sukzessive um eins erhoehen 600 deg++; 601 //cout << " deg = " << deg << endl; 602 am.nextpoint(); 603 // nextpoint() unnoetig? 604 } 605 } 606 } 607 } 659 608 660 609 … … 667 616 668 617 return 0; 669 670 618 } 671 619
Note: See TracChangeset
for help on using the changeset viewer.