| 551 | |
| 552 | #ifdef HAVE_RINGS |
| 553 | number multring(bigintmat *nbase, nforder *o, number p) { |
| 554 | coeffs R = o->basecoeffs(); |
| 555 | number divi; |
| 556 | int n = o->getDim(); |
| 557 | |
| 558 | bigintmat *inv = new bigintmat(n, n, R); |
| 559 | divi = nbase->pseudoinv(inv); |
| 560 | |
| 561 | // Zusammenbau der "langen" Matrix |
| 562 | bigintmat *lon = new bigintmat(n, 0, R); |
| 563 | bigintmat *oldlon; |
| 564 | bigintmat *mm = new bigintmat(n, n, R); |
| 565 | bigintmat *temp = new bigintmat(n, 1, R); |
| 566 | bigintmat *nochnetemp = new bigintmat(n, n, R); |
| 567 | |
| 568 | for (int i=1; i<=n; i++) { |
| 569 | nbase->getcol(i, temp); |
| 570 | o->multmap(temp, mm); |
| 571 | bimMult(inv, mm, nochnetemp); |
| 572 | mm->copy(nochnetemp); |
| 573 | mm->inpTranspose(); |
| 574 | oldlon = lon; |
| 575 | lon = new bigintmat(n, (i)*n, o->basecoeffs()); |
| 576 | lon->concatcol(oldlon, mm); |
| 577 | delete oldlon; |
| 578 | } |
| 579 | |
| 580 | lon->skaldiv(divi); |
| 581 | |
| 582 | bigintmat * red; |
| 583 | if (1) { |
| 584 | bigintmat * cmp = lon->modhnf(p, o->basecoeffs()); |
| 585 | red = cmp; |
| 586 | } else { |
| 587 | lon->hnf(); |
| 588 | red = new bigintmat(n, n, o->basecoeffs()); |
| 589 | lon->getColRange((n-1)*n+1, n, red); |
| 590 | } |
| 591 | delete lon; |
| 592 | red->inpTranspose(); |
| 593 | |
| 594 | number divisor = red->pseudoinv(nbase); |
| 595 | nbase->hnf(); |
| 596 | |
| 597 | delete inv; |
| 598 | delete mm; |
| 599 | delete temp; |
| 600 | delete red; |
| 601 | delete nochnetemp; |
| 602 | n_Delete(&divi, o->basecoeffs()); |
| 603 | return divisor; |
| 604 | } |
| 605 | #endif |
| 606 | |
| 607 | #ifdef HAVE_RINGS |
no test coverage detected