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

◆ power() [2/2]

ring_elem PolyRing::power ( const ring_elem f,
mpz_srcptr n ) const
virtual

Exponentiation. This is the default function, if a class doesn't define this.

Reimplemented from Ring.

Reimplemented in SchurRing, SkewPolynomialRing, SolvableAlgebra, and WeylAlgebra.

Definition at line 829 of file poly.cpp.

830{
831 ring_elem ff, result;
832
833 if (mpz_sgn(n) == 0) return from_long(1);
834 if (is_zero(f0)) return ZERO_RINGELEM;
835
836 mpz_t abs_n;
837 mpz_init(abs_n);
838 mpz_abs(abs_n, n);
839 if (mpz_sgn(n) > 0)
840 ff = f0;
841 else
842 ff = invert(f0);
843
844 Nterm *f = ff;
845
846 // In this case, the computation may only be formed in two
847 // cases: (1) f is a constant, or (2) n is small enough
848 std::pair<bool, int> n1 = RingZZ::get_si(abs_n);
849 if (n1.first)
850 {
851 result = power(f, n1.second);
852 }
853 else if (is_unit(f)) // really want a routine 'is_scalar'...
854 {
855 ring_elem a = K_->power(f->coeff, abs_n);
856 result = make_flat_term(a, f->monom);
857 }
858 else
859 {
860 ERROR("exponent too large");
862 }
863
864 mpz_clear(abs_n);
865 return result;
866}
virtual ring_elem power(const ring_elem f, mpz_srcptr n) const
Exponentiation. This is the default function, if a class doesn't define this.
Definition poly.cpp:829
virtual ring_elem from_long(long n) const
Definition poly.cpp:169
virtual ring_elem invert(const ring_elem f) const
Definition poly.cpp:961
virtual bool is_unit(const ring_elem f) const
Definition poly.cpp:478
virtual ring_elem make_flat_term(const ring_elem a, const_monomial m) const
Definition poly.cpp:1965
virtual bool is_zero(const ring_elem f) const
Definition poly.cpp:487
const Ring * K_
Definition polyring.hpp:123
static std::pair< bool, int > get_si(mpz_srcptr n)
Definition ZZ.cpp:46
const int ERROR
Definition m2-mem.cpp:55
VALGRIND_MAKE_MEM_DEFINED & result(result)
#define ZERO_RINGELEM
Definition ring.hpp:677
ring_elem coeff
Definition ringelem.hpp:158
int monom[1]
Definition ringelem.hpp:160

References Nterm::coeff, ERROR, from_long(), RingZZ::get_si(), invert(), is_unit(), is_zero(), PolynomialRing::K_, make_flat_term(), Nterm::monom, power(), result(), and ZERO_RINGELEM.

Referenced by power().