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

◆ power_direct()

ring_elem PolyRing::power_direct ( const ring_elem f,
int n ) const
protected

Definition at line 868 of file poly.cpp.

869{
870 ring_elem result, g, rest, h, tmp;
871 ring_elem coef1, coef2, coef3;
872
873 Nterm *lead = ff;
874 if (lead == nullptr) return ZERO_RINGELEM;
875
876 rest = lead->next;
877 g = from_long(1);
878
879 // Start the result with the n th power of the lead term
880 Nterm *t = new_term();
881 t->coeff = K_->power(lead->coeff, n);
882 M_->power(lead->monom, n, t->monom);
883 t->next = nullptr;
884 // if (_base_ring != NULL) normal_form(t); NOT NEEDED
885 result = t;
886
887 if (POLY(rest) == nullptr) return result;
888 monomial m = M_->make_one();
889
890 mpz_t bin_c;
891
892 mpz_init_set_ui(bin_c, 1);
893
894 for (int i = 1; i <= n; i++)
895 {
896 tmp = mult(g, rest);
897 g = tmp;
898
899 mpz_mul_ui(bin_c, bin_c, n - i + 1);
900 mpz_fdiv_q_ui(bin_c, bin_c, i);
901
902 coef1 = K_->from_int(bin_c);
903
904 if (!K_->is_zero(coef1))
905 {
906 coef2 = K_->power(lead->coeff, n - i);
907 coef3 = K_->mult(coef1, coef2);
908 M_->power(lead->monom, n - i, m);
909
910 h = mult_by_term(g, coef3, m);
911 add_to(result, h);
912 }
913 }
914 mpz_clear(bin_c);
915 return result;
916}
virtual ring_elem from_long(long n) const
Definition poly.cpp:169
virtual ring_elem mult(const ring_elem f, const ring_elem g) const
Definition poly.cpp:821
virtual ring_elem mult_by_term(const ring_elem f, const ring_elem c, const_monomial m) const
Definition poly.cpp:781
Nterm * new_term() const
Definition poly.cpp:146
const Ring * K_
Definition polyring.hpp:123
const Monoid * M_
Definition polyring.hpp:124
void add_to(ring_elem &f, const ring_elem &g) const
Definition ring.cpp:205
#define monomial
Definition gb-toric.cpp:11
VALGRIND_MAKE_MEM_DEFINED & result(result)
#define POLY(q)
Definition poly.cpp:23
#define ZERO_RINGELEM
Definition ring.hpp:677
Nterm * next
Definition ringelem.hpp:157
ring_elem coeff
Definition ringelem.hpp:158
int monom[1]
Definition ringelem.hpp:160

References Ring::add_to(), Nterm::coeff, from_long(), PolynomialRing::K_, PolynomialRing::M_, Nterm::monom, monomial, mult(), mult_by_term(), new_term(), Nterm::next, POLY, result(), and ZERO_RINGELEM.

Referenced by power().