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

◆ rawFactorBase()

void rawFactorBase ( const RingElement * g,
engine_RawRingElementArrayOrNull * result_factors,
M2_arrayintOrNull * result_powers,
const RingElement * mipo = nullptr )

Definition at line 661 of file factory.cpp.

669{
670 bool inExtension = mipo != nullptr;
671 try
672 {
674 *result_factors = nullptr;
675 *result_powers = nullptr;
676 if (P == nullptr)
677 {
678 ERROR("expected polynomial ring");
679 return;
680 }
681 struct enter_factory foo(P);
682 if (foo.mode == modeError) return;
683
684 CFFList q;
685 init_seeds();
686
687 if (foo.mode == modeGF)
688 {
689 inExtension = true;
690 Variable a = set_GF_minimal_poly(P);
691 CanonicalForm h = convertToFactory(*g, notInExtension);
692 q = factorize(h, a);
693 }
694 else if (mipo != nullptr)
695 {
696 CanonicalForm mipocf = convertToFactory(*mipo, notInExtension);
697 Variable a = rootOf(mipocf, 'a');
699 CanonicalForm h = convertToFactory(*g, inExtension);
700 // displayCF(P,h);
701 q = factorize(h, a);
703 P, P->var(P->n_vars() - 1)); // the algebraic generator is always
704 // the last variable in M2, the
705 // first one in factory
706 }
707 else
708 {
709 CanonicalForm h = convertToFactory(*g, inExtension);
710 // displayCF(P,h);
711 q = factorize(h);
712 algebraicElement_M2 = nullptr;
713 }
714
715 int nfactors = q.length();
716
717 *result_factors = getmemarraytype(engine_RawRingElementArray, nfactors);
718 (*result_factors)->len = nfactors;
719
720 *result_powers = M2_makearrayint(nfactors);
721
722 int next = 0;
723 for (CFFListIterator i = q; i.hasItem(); i++)
724 {
725 (*result_factors)->array[next] = convertToM2(P, i.getItem().factor());
726 (*result_powers)->array[next++] = i.getItem().exp();
727 }
728 algebraicElement_M2 = nullptr;
729 if (error()) *result_factors = nullptr, *result_powers = nullptr;
730 } catch (const exc::engine_error& e)
731 {
732 ERROR(e.what());
733 return;
734 }
735}
virtual ring_elem var(int v) const =0
int n_vars() const
Definition polyring.hpp:196
Abstract base for the engine's polynomial-ring hierarchy.
Definition polyring.hpp:96
virtual const PolynomialRing * cast_to_PolynomialRing() const
Definition ring.hpp:243
static RingElement * make_raw(const Ring *R, ring_elem f)
Definition relem.cpp:20
const Ring * get_ring() const
Definition relem.hpp:81
int error()
Definition error.c:48
@ modeGF
Definition factory.cpp:48
@ modeError
Definition factory.cpp:44
static const RingElement * convertToM2(const PolynomialRing *R, CanonicalForm h)
Definition factory.cpp:214
const bool notInExtension
Definition factory.cpp:37
static CanonicalForm convertToFactory(mpz_srcptr p)
Definition factory.cpp:312
CanonicalForm algebraicElement_Fac
Definition factory.cpp:80
const RingElement * algebraicElement_M2
Definition factory.cpp:81
static void init_seeds()
Definition factory.cpp:74
const int ERROR
Definition m2-mem.cpp:55
#define getmemarraytype(S, len)
Definition m2-mem.h:142
M2_arrayint M2_makearrayint(int n)
Definition m2-types.cpp:6

References algebraicElement_Fac, algebraicElement_M2, Ring::cast_to_PolynomialRing(), convertToFactory(), convertToM2(), ERROR, error(), RingElement::get_ring(), getmemarraytype, init_seeds(), M2_makearrayint(), RingElement::make_raw(), enter_factory::mode, modeError, modeGF, PolynomialRing::n_vars(), notInExtension, and PolynomialRing::var().

Referenced by rawFactor(), and rawFactor2().