Changeset ee0b48 in git
- Timestamp:
- Jan 6, 2011, 1:31:39 PM (12 years ago)
- Branches:
- (u'spielwiese', '0d6b7fcd9813a1ca1ed4220cfa2b104b97a0a003')
- Children:
- 22303d6e0646191c1eee37f0a1b95cd9bd9364d1
- Parents:
- b90cc8b474180d8d55d1ffc520a7e8ae0a273c30
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/linearAlgebra.cc
rb90cc8 ree0b48 439 439 MATELEM(N, nonZeroC, dim) = pCopy(MATELEM(uMat, r, w)); 440 440 } 441 number z;442 441 for (int d = 1; d <= dim; d++) 443 442 { … … 450 449 if (MATELEM(N, c, d) != NULL) 451 450 p = pAdd(p, ppMult_qq(MATELEM(uMat, r, c), MATELEM(N, c, d))); 452 MATELEM(N, nonZeroC, d) = pNeg(p); 453 if (MATELEM(N, nonZeroC, d) != NULL) 454 { 455 z = nDiv(pGetCoeff(MATELEM(N, nonZeroC, d)), 456 pGetCoeff(MATELEM(uMat, r, nonZeroC))); 457 nNormalize(z); pDelete(&MATELEM(N, nonZeroC, d)); 458 MATELEM(N, nonZeroC, d) = pNSet(z); 459 } 451 q = pNSet(nInvers(pGetCoeff(MATELEM(uMat, r, nonZeroC)))); 452 MATELEM(N, nonZeroC, d) = pMult(pNeg(p), q); 453 pNormalize(MATELEM(N, nonZeroC, d)); 460 454 } 461 455 p = pNeg(pCopy(MATELEM(yVec, r, 1))); … … 463 457 if (MATELEM(xVec, c, 1) != NULL) 464 458 p = pAdd(p, ppMult_qq(MATELEM(uMat, r, c), MATELEM(xVec, c, 1))); 465 MATELEM(xVec, nonZeroC, 1) = pNeg(p); 466 if (MATELEM(xVec, nonZeroC, 1) != NULL) 467 { 468 z = nDiv(pGetCoeff(MATELEM(xVec, nonZeroC, 1)), 469 pGetCoeff(MATELEM(uMat, r, nonZeroC))); 470 nNormalize(z); pDelete(&MATELEM(xVec, nonZeroC, 1)); 471 MATELEM(xVec, nonZeroC, 1) = pNSet(z); 472 } 459 q = pNSet(nInvers(pGetCoeff(MATELEM(uMat, r, nonZeroC)))); 460 MATELEM(xVec, nonZeroC, 1) = pMult(pNeg(p), q); 461 pNormalize(MATELEM(xVec, nonZeroC, 1)); 473 462 lastNonZeroC = nonZeroC; 474 463 } … … 1537 1526 /* solve lMat * yVec = cVec; this will always work as lMat is invertible; 1538 1527 moreover, all divisions are guaranteed to be without remainder */ 1539 number z;1528 poly p; poly q; 1540 1529 for (int r = 1; r <= m; r++) 1541 1530 { 1542 p oly p= pNeg(pCopy(MATELEM(cVec, r, 1)));1531 p = pNeg(pCopy(MATELEM(cVec, r, 1))); 1543 1532 for (int c = 1; c < r; c++) 1544 1533 p = pAdd(p, ppMult_qq(MATELEM(lMat, r, c), MATELEM(yVec, c, 1) )); 1545 MATELEM(yVec, r, 1) = pNeg(p); 1546 if (MATELEM(yVec, r, 1) != NULL) 1547 { 1548 z = nDiv(pGetCoeff(MATELEM(yVec, r, 1)), pGetCoeff(MATELEM(lMat, r, r))); 1549 nNormalize(z); /* division is without remainder */ 1550 pDelete(&MATELEM(yVec, r, 1)); 1551 MATELEM(yVec, r, 1) = pNSet(z); 1552 } 1534 /* The following division is without remainder. */ 1535 q = pNSet(nInvers(pGetCoeff(MATELEM(lMat, r, r)))); 1536 MATELEM(yVec, r, 1) = pMult(pNeg(p), q); 1537 pNormalize(MATELEM(yVec, r, 1)); 1553 1538 } 1554 1539 1555 1540 /* compute u * dMat * yVec and put result into yVec */ 1556 poly p;1557 1541 for (int r = 1; r <= m; r++) 1558 1542 { … … 1580 1564 xVec = mpNew(n, 1); 1581 1565 matrix N = mpNew(n, n); int dim = 0; 1582 poly p; poly q;1583 1566 /* solve uMat * xVec = yVec and determine a basis of the solution 1584 1567 space of the homogeneous system uMat * xVec = 0; … … 1610 1593 if (MATELEM(N, c, d) != NULL) 1611 1594 p = pAdd(p, ppMult_qq(MATELEM(uMat, r, c), MATELEM(N, c, d))); 1612 MATELEM(N, nonZeroC, d) = pNeg(p); 1613 if (MATELEM(N, nonZeroC, d) != NULL) 1614 { 1615 z = nDiv(pGetCoeff(MATELEM(N, nonZeroC, d)), 1616 pGetCoeff(MATELEM(uMat, r, nonZeroC))); 1617 nNormalize(z); /* division may be with remainder but only takes 1618 place for dim > 0 */ 1619 pDelete(&MATELEM(N, nonZeroC, d)); 1620 MATELEM(N, nonZeroC, d) = pNSet(z); 1621 } 1595 /* The following division may be with remainder but only takes place 1596 when dim > 0. */ 1597 q = pNSet(nInvers(pGetCoeff(MATELEM(uMat, r, nonZeroC)))); 1598 MATELEM(N, nonZeroC, d) = pMult(pNeg(p), q); 1599 pNormalize(MATELEM(N, nonZeroC, d)); 1622 1600 } 1623 1601 p = pNeg(pCopy(MATELEM(yVec, r, 1))); … … 1625 1603 if (MATELEM(xVec, c, 1) != NULL) 1626 1604 p = pAdd(p, ppMult_qq(MATELEM(uMat, r, c), MATELEM(xVec, c, 1))); 1627 MATELEM(xVec, nonZeroC, 1) = pNeg(p); 1628 if (MATELEM(xVec, nonZeroC, 1) != NULL) 1629 { 1630 z = nDiv(pGetCoeff(MATELEM(xVec, nonZeroC, 1)), 1631 pGetCoeff(MATELEM(uMat, r, nonZeroC))); 1632 nNormalize(z); /* division is without remainder */ 1633 pDelete(&MATELEM(xVec, nonZeroC, 1)); 1634 MATELEM(xVec, nonZeroC, 1) = pNSet(z); 1635 } 1605 /* The following division is without remainder. */ 1606 q = pNSet(nInvers(pGetCoeff(MATELEM(uMat, r, nonZeroC)))); 1607 MATELEM(xVec, nonZeroC, 1) = pMult(pNeg(p), q); 1608 pNormalize(MATELEM(xVec, nonZeroC, 1)); 1636 1609 lastNonZeroC = nonZeroC; 1637 1610 } 1638 1611 1639 1612 /* divide xVec by l*u = lTimesU and put result in xVec */ 1640 number z z = pGetCoeff(lTimesU);1613 number z = nInvers(pGetCoeff(lTimesU)); 1641 1614 for (int c = 1; c <= n; c++) 1642 1615 { 1643 if (MATELEM(xVec, c, 1) != NULL) 1644 { 1645 z = nDiv(pGetCoeff(MATELEM(xVec, c, 1)), zz); 1646 nNormalize(z); 1647 pDelete(&MATELEM(xVec, c, 1)); 1648 MATELEM(xVec, c, 1) = pNSet(z); 1649 } 1650 } 1616 pMult_nn(MATELEM(xVec, c, 1), z); 1617 pNormalize(MATELEM(xVec, c, 1)); 1618 } 1619 nDelete(&z); 1651 1620 1652 1621 if (dim == 0)
Note: See TracChangeset
for help on using the changeset viewer.