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

◆ gbvector_weyl_diff()

gbvector * WeylAlgebra::gbvector_weyl_diff ( GBRing * GR,
const ring_elem c,
int comp,
const_exponents expf,
const int * derivatives,
const FreeModule * Fg,
const gbvector * g ) const
protected

Definition at line 456 of file weylalg.cpp.

465{
466 // This isn't really differentiation, but it is close.
467 // It is the inner loop of the multiplication routine for the Weyl algebra.
468 // Returns: sum of d*[n,derivative]*c*n*m/(derivative,derivatives) e_i, for
469 // each
470 // term d*n*e_i of v which satisfies: x part of n is >= derivatives,
471 // and where the multiplication and division of monomials is in the
472 // commutative
473 // monoid.
474
475 gbvector head;
476 head.next = nullptr;
477 gbvector *result = &head;
478
479 int i;
481 exponents_t deriv_exp = newarray_atomic_clear(int, nvars_);
482 exponents_t result_exp = newarray_atomic(int, nvars_);
484 {
485 int sum = 0;
486 for (i = 0; i < _nderivatives; i++)
487 {
488 sum += 2 * derivatives[i];
489 deriv_exp[_derivative[i]] = derivatives[i];
490 deriv_exp[_commutative[i]] = derivatives[i];
491 }
492 deriv_exp[_homog_var] = -sum;
493 }
494 else
495 for (i = 0; i < _nderivatives; i++)
496 {
497 deriv_exp[_derivative[i]] = derivatives[i];
498 deriv_exp[_commutative[i]] = derivatives[i];
499 }
500
501 for (const gbvector *t = g; t != nullptr; t = t->next)
502 {
503 // This first part checks whether the x-part of t->monom is divisible by
504 // 'derivatives'. If so, true is returned, and the resulting monomial is
505 // set.
506 GR->gbvector_get_lead_exponents(F, t, result_exp);
507 extractCommutativePart(result_exp, exp);
508 if (divides(derivatives, exp))
509 {
510 ring_elem a = diff_coefficients(c, derivatives, exp);
511 if (K_->is_zero(a))
512 {
513 K_->remove(a);
514 continue;
515 }
516 ring_elem b = K_->mult(a, t->coeff);
517 K_->remove(a);
518 if (K_->is_zero(b))
519 {
520 K_->remove(b);
521 continue;
522 }
523 // Now compute the new monomial:
524 for (int i2 = 0; i2 < nvars_; i2++)
525 result_exp[i2] += expf[i2] - deriv_exp[i2];
526
527 gbvector *tm =
528 GR->gbvector_term_exponents(F, b, result_exp, comp + t->comp);
529
530 // Append to the result
531 result->next = tm;
532 result = tm;
533 }
534 }
535 freemem(exp);
536 freemem(result_exp);
537 result->next = nullptr;
538 return head.next;
539}
exponents::Exponents exponents_t
void gbvector_get_lead_exponents(const FreeModule *F, const gbvector *f, int *result)
Definition gbring.cpp:541
gbvector * gbvector_term_exponents(const FreeModule *F, ring_elem coeff, const int *exp, int comp)
Definition gbring.cpp:345
const Ring * K_
Definition polyring.hpp:123
ring_elem diff_coefficients(const ring_elem c, const int *derivatives, const_exponents exp) const
Definition weylalg.cpp:307
void extractCommutativePart(const_exponents exp, int *result) const
Definition weylalg.cpp:298
int * _derivative
Definition weylalg.hpp:65
int _homog_var
Definition weylalg.hpp:64
int _nderivatives
Definition weylalg.hpp:62
bool _homogeneous_weyl_algebra
Definition weylalg.hpp:63
int * _commutative
Definition weylalg.hpp:67
bool divides(const_exponents expbottom, const_exponents exptop) const
Definition weylalg.cpp:266
void freemem(void *s)
Definition m2-mem.cpp:103
VALGRIND_MAKE_MEM_DEFINED & result(result)
const mpreal exp(const mpreal &x, mp_rnd_t r=mpreal::get_default_rnd())
Definition mpreal.h:2298
const mpreal sum(const mpreal tab[], const unsigned long int n, int &status, mp_rnd_t mode=mpreal::get_default_rnd())
Definition mpreal.h:2600
#define newarray_atomic_clear(T, len)
Definition newdelete.hpp:93
#define newarray_atomic(T, len)
Definition newdelete.hpp:91
gbvector * next
Definition gbring.hpp:80

References _commutative, _derivative, _homog_var, _homogeneous_weyl_algebra, _nderivatives, diff_coefficients(), divides(), extractCommutativePart(), freemem(), PolyRing::FreeModule, PolynomialRing::K_, newarray_atomic, newarray_atomic_clear, gbvector::next, PolynomialRing::nvars_, and result().

Referenced by gbvector_mult_by_term().