Changeset 3e31b2 in git
- Timestamp:
- Apr 17, 2014, 11:42:03 AM (10 years ago)
- Branches:
- (u'spielwiese', '6e5adcba05493683b94648c659a729c189812c77')
- Children:
- 2f864fd4d49e100b0c0e759c51665fb14c67c55c
- Parents:
- 4341170a137c82a30b8d5c6007a7c6797c5d3f19
- git-author:
- Adi Popescu <adi_popescum@yahoo.de>2014-04-17 11:42:03+02:00
- git-committer:
- Adi Popescu <adi_popescum@yahoo.de>2014-05-05 11:08:44+02:00
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
Singular/ipassign.cc
r4341170 r3e31b2 748 748 ideal id=(ideal)a->CopyD(IDEAL_CMD); 749 749 if((rField_is_Ring(currRing)) && (idPosConstant(id) != -1)) 750 { 751 // computing over Rings: handle constant generators of id properly 752 if(nCoeff_is_Ring_ModN(currRing->cf) || 753 nCoeff_is_Ring_PtoM(currRing->cf) || 754 nCoeff_is_Ring_2toM(currRing->cf)) 755 { 756 // already computing mod modNumber: use gcd(modNumber,constant entry of id) 757 mpz_t gcd; 758 mpz_t newConst; 759 mpz_init(newConst); 760 mpz_set_ui(newConst, currRing->cf->cfInt(p_GetCoeff(id->m[idPosConstant(id)], currRing),currRing->cf)); 761 mpz_init(gcd); 762 mpz_gcd(gcd, currRing->cf->modNumber, newConst); 763 if(mpz_cmp_ui(gcd, 1) == 0) 764 { 765 WerrorS("constant in q-ideal is coprime to modulus in ground ring"); 766 WerrorS("Unable to create qring!"); 750 { 751 qr = updateQring(currRing, id, idPosConstant(id)); 752 if(qr == NULL) 767 753 return TRUE; 768 } 769 if(nCoeff_is_Ring_PtoM(currRing->cf) || 770 nCoeff_is_Ring_2toM(currRing->cf)) 771 { 772 // modNumber is prime power: set modExponent appropriately 773 int kNew = 1; 774 mpz_t baseTokNew; 775 mpz_init(baseTokNew); 776 mpz_set(baseTokNew, currRing->cf->modBase); 777 while(mpz_cmp(gcd, baseTokNew) > 0) 778 { 779 kNew++; 780 mpz_mul(baseTokNew, baseTokNew, currRing->cf->modBase); 781 } 782 //To Do: currently we stay in case Z/p^n even for n=1 783 // for performance reasons passing to groundfield Z/p 784 // would be more suitable 785 qr = rCopyNewCoeff(currRing, currRing->cf->modBase, kNew, currRing->cf->type); 786 mpz_clear(baseTokNew); 787 } 788 else 789 { 790 // previously over modNumber, now over new modNumber 791 qr = rCopyNewCoeff(currRing, gcd, 1, currRing->cf->type); 792 //printf("\nAfter rCopyNewCoeff: \n"); 793 //rWrite(qr); 794 } 795 mpz_clear(gcd); 796 //printf("\nAfter mpz_clear: \n"); 797 //rWrite(qr); 798 mpz_clear(newConst); 799 } 800 else 801 { 802 // previously over Z, now over Z/m 803 mpz_t newConst; 804 mpz_init(newConst); 805 mpz_set_ui(newConst, currRing->cf->cfInt(p_GetCoeff(id->m[idPosConstant(id)], currRing),currRing->cf)); 806 qr= rCopyNewCoeff( currRing, newConst, 1, n_Zn); 807 mpz_clear(newConst); 808 } 809 } 754 } 810 755 else 811 756 #endif -
libpolys/polys/monomials/ring.cc
r4341170 r3e31b2 1644 1644 //omFreeSize(dummy, sizeof(mpz_t)); 1645 1645 return res; 1646 } 1647 1648 ring updateQring(ring r, ideal id, int pos) 1649 { 1650 ring qr; 1651 // computing over Rings: handle constant generators of id properly 1652 if(nCoeff_is_Ring_ModN(r->cf) || 1653 nCoeff_is_Ring_PtoM(r->cf) || 1654 nCoeff_is_Ring_2toM(r->cf)) 1655 { 1656 // already computing mod modNumber: use gcd(modNumber,constant entry of id) 1657 mpz_t gcd; 1658 mpz_t newConst; 1659 mpz_init(newConst); 1660 mpz_set_ui(newConst, r->cf->cfInt(p_GetCoeff(id->m[pos], r),r->cf)); 1661 mpz_init(gcd); 1662 mpz_gcd(gcd, r->cf->modNumber, newConst); 1663 if(mpz_cmp_ui(gcd, 1) == 0) 1664 { 1665 WerrorS("constant in q-ideal is coprime to modulus in ground ring"); 1666 WerrorS("Unable to create qring!"); 1667 return NULL; 1668 } 1669 if(nCoeff_is_Ring_PtoM(r->cf) || 1670 nCoeff_is_Ring_2toM(r->cf)) 1671 { 1672 // modNumber is prime power: set modExponent appropriately 1673 int kNew = 1; 1674 mpz_t baseTokNew; 1675 mpz_init(baseTokNew); 1676 mpz_set(baseTokNew, r->cf->modBase); 1677 while(mpz_cmp(gcd, baseTokNew) > 0) 1678 { 1679 kNew++; 1680 mpz_mul(baseTokNew, baseTokNew, r->cf->modBase); 1681 } 1682 //To Do: currently we stay in case Z/p^n even for n=1 1683 // for performance reasons passing to groundfield Z/p 1684 // would be more suitable 1685 qr = rCopyNewCoeff(r, r->cf->modBase, kNew, r->cf->type); 1686 mpz_clear(baseTokNew); 1687 } 1688 else 1689 { 1690 // previously over modNumber, now over new modNumber 1691 qr = rCopyNewCoeff(r, gcd, 1, r->cf->type); 1692 //printf("\nAfter rCopyNewCoeff: \n"); 1693 //rWrite(qr); 1694 } 1695 mpz_clear(gcd); 1696 //printf("\nAfter mpz_clear: \n"); 1697 //rWrite(qr); 1698 mpz_clear(newConst); 1699 } 1700 else 1701 { 1702 // previously over Z, now over Z/m 1703 mpz_t newConst; 1704 mpz_init(newConst); 1705 mpz_set_ui(newConst, r->cf->cfInt(p_GetCoeff(id->m[pos], r),r->cf)); 1706 qr= rCopyNewCoeff( r, newConst, 1, n_Zn); 1707 mpz_clear(newConst); 1708 } 1709 return(qr); 1646 1710 } 1647 1711 -
libpolys/polys/monomials/ring.h
r4341170 r3e31b2 347 347 ring rCopy(ring r); 348 348 ring rCopyNewCoeff(ring r, mpz_t Base, int Exp, n_coeffType typ); 349 ring updateQring(ring r, ideal id, int pos); 349 350 ring rCopy0(const ring r, BOOLEAN copy_qideal = TRUE, BOOLEAN copy_ordering = TRUE); 350 351 ring rCopy0AndAddA(ring r, int64vec *wv64, BOOLEAN copy_qideal = TRUE,
Note: See TracChangeset
for help on using the changeset viewer.