Macaulay2 Engine
Loading...
Searching...
No Matches

◆ promote() [4/4]

template<typename RingType>
bool M2::ConcreteRing< RingType >::promote ( const Ring * S,
const ring_elem f,
ring_elem & result ) const
virtual

If there is a "natural" map S --> R=this, where f is an element of S , then result is set to the image of f, and true is returned. Otherwise, false is returned.

The map must one-step, e.g. for k --> k[x] --> k[x][y], promotion must be done with two consecutive calls to promote(with different arguments). Examples of natural maps: ZZ --> R, for any R QQ --> RR --> CC ZZ --> ZZ/p ZZ/p --> GF(p^n) GF(p^m) --> GF(p^n), where m|n A --> A[vars]/I A[vars]/J --> A[vars]/I (assumption: I contains J).

Implements Ring.

Definition at line 663 of file aring-glue.hpp.

666{
667 const Ring *S = this;
668 // fprintf(stderr, "calling promote\n");
669 namespace RP = RingPromoter;
670 if (R == globalZZ)
671 {
672 resultS = S->from_int(fR.get_mpz());
673 return true;
674 }
675 if (R == S)
676 {
677 resultS = copy(fR);
678 return true;
679 }
680 switch (R->ringID())
681 {
682 case M2::ring_ZZp:
683 switch (S->ringID())
684 {
685 case M2::ring_ZZp:
686 return false;
689 default:
690 return false;
691 }
692 break;
694 switch (S->ringID())
695 {
696 case M2::ring_ZZp:
700 R, S, fR, resultS);
701 default:
702 return false;
703 }
704 case M2::ring_QQ:
705 switch (S->ringID())
706 {
707 case M2::ring_RR:
709 case M2::ring_RRR:
711 case M2::ring_RRi:
713 case M2::ring_CC:
715 case M2::ring_CCC:
717 case M2::ring_CCi:
719 default:
720 return false;
721 }
722 case M2::ring_RR:
723 switch (S->ringID())
724 {
725 case M2::ring_RR:
727 case M2::ring_RRR:
729 case M2::ring_RRi:
731 case M2::ring_CC:
733 case M2::ring_CCC:
735 case M2::ring_CCi:
737 default:
738 return false;
739 }
740 case M2::ring_RRR:
741 switch (S->ringID())
742 {
743 case M2::ring_RR:
745 case M2::ring_RRR:
747 case M2::ring_RRi:
749 case M2::ring_CC:
751 case M2::ring_CCC:
753 case M2::ring_CCi:
755 default:
756 return false;
757 }
758 case M2::ring_RRi:
759 switch (S->ringID())
760 {
761 case M2::ring_RR:
763 case M2::ring_RRR:
765 case M2::ring_RRi:
767 case M2::ring_CCi:
769 default:
770 return false;
771 }
772 case M2::ring_CC:
773 switch (S->ringID())
774 {
775 case M2::ring_CC:
777 case M2::ring_CCC:
779 case M2::ring_CCi:
781 default:
782 return false;
783 }
784 case M2::ring_CCC:
785 switch (S->ringID())
786 {
787 case M2::ring_CCC:
789 case M2::ring_CC:
791 case M2::ring_CCi:
793 default:
794 return false;
795 }
796 case M2::ring_CCi:
797 switch (S->ringID())
798 {
799 case M2::ring_CCi:
801 default:
802 return false;
803 }
804 default:
805 break;
806 };
807 return false;
808}
virtual ring_elem from_int(mpz_srcptr n) const
std::unique_ptr< RingType > R
virtual M2::RingID ringID() const
virtual ring_elem copy(const ring_elem f) const
Ring()
Definition ring.hpp:136

References copy(), Ring::from_int(), ring_elem::get_mpz(), globalZZ, R, Ring::Ring(), M2::ring_CC, M2::ring_CCC, M2::ring_CCi, M2::ring_QQ, M2::ring_RR, M2::ring_RRi, M2::ring_RRR, M2::ring_ZZp, M2::ring_ZZpFfpack, and Ring::ringID().