RingHom EvalHom(const PolyRing& Rx, const BigRat& q) // Maps f in R[x] into f(q) in R { if (NumIndets(Rx) != 1) CoCoA_ERROR(ERR::BadArg, "EvalHom(Rx,N)"); const ring& R = CoeffRing(Rx); const vector<RingElem> IndetImage(1, RingElem(R,q)); return Rx->myHomCtor(R, IdentityHom(R), IndetImage); }
RingHom EvalHom(const PolyRing& Rx, ConstRefRingElem r) // Maps f in R[x] into f(r) in R { if (NumIndets(Rx) != 1) CoCoA_ERROR(ERR::BadArg, "EvalHom(Rx,r)"); const ring& R = CoeffRing(Rx); if (owner(r) != R) CoCoA_ERROR(ERR::MixedRings, "EvalHom(Rx,r"); const vector<RingElem> IndetImage(1, r); return Rx->myHomCtor(R, IdentityHom(R), IndetImage); }
RingHom EvalHom(const PolyRing& Rx, const std::vector<RingElem>& IndetImages) { const char* const FnName = "EvalHom(Rx,IndetImages)"; const ring& R = CoeffRing(Rx); if (NumIndets(Rx) != len(IndetImages)) CoCoA_ERROR(ERR::BadPolyRingHomImages, FnName); for (long i=0; i < NumIndets(Rx); ++i) if (owner(IndetImages[i]) != R) CoCoA_ERROR(ERR::BadPolyRingHomImages, FnName); return Rx->myHomCtor(R, IdentityHom(R), IndetImages); }
// Rx is the domain, S is the codomain RingHom PolyRingHom(const PolyRing& Rx, const ring& S, RingHom CoeffHom, const std::vector<RingElem>& IndetImages) { const char* const FnName = "PolyRingHom(Rx,S,CoeffHom,IndetImages)"; if (domain(CoeffHom) != CoeffRing(Rx)) CoCoA_ERROR(ERR::MixedCoeffRings, FnName); if (IsPolyRing(S) && codomain(CoeffHom) == CoeffRing(S)) CoeffHom = CoeffEmbeddingHom(S)(CoeffHom); if (codomain(CoeffHom) != S) CoCoA_ERROR(ERR::BadCodomain, FnName); if (NumIndets(Rx) != len(IndetImages)) CoCoA_ERROR(ERR::BadPolyRingHomImages, FnName); for (long i=0; i < NumIndets(Rx); ++i) if (owner(IndetImages[i]) != S) CoCoA_ERROR(ERR::BadPolyRingHomImages, FnName); return Rx->myHomCtor(S, CoeffHom, IndetImages); }
RingHom PolyAlgebraHom(const PolyRing& Rx, const ring& Ry, const std::vector<RingElem>& IndetImages) { const char* const FnName = "PolyAlgebraHom(Rx,Ry,IndetImages)"; // Check that IndetImages are sensible... if (NumIndets(Rx) != len(IndetImages)) CoCoA_ERROR(ERR::BadPolyRingHomImages, FnName); for (long i=0; i < NumIndets(Rx); ++i) if (owner(IndetImages[i]) != Ry) CoCoA_ERROR(ERR::BadPolyRingHomImages, FnName); // // Special case: codomain is coeff ring. // if (Ry == CoeffRing(Rx)) // return Rx->myHomCtor(Ry, IdentityHom(Ry), IndetImages); // // General case: codomain must be a poly ring with same coeffs // if (!IsPolyRing(Ry)) // CoCoA_ERROR(ERR::BadCodomain, FnName); // if (CoeffRing(Rx) != CoeffRing(Ry)) // CoCoA_ERROR(ERR::MixedCoeffRings, FnName); // return Rx->myHomCtor(Ry, CoeffEmbeddingHom(Ry), IndetImages); return Rx->myHomCtor(Ry, CanonicalHom(CoeffRing(Rx),Ry), IndetImages); }