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

◆ power() [2/2]

ring_elem LocalRing::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.

Definition at line 570 of file localring.cpp.

571{
572 const local_elem *f = a.get_local_elem();
573 ring_elem top, bottom;
574 if (mpz_sgn(n) >= 0)
575 {
576 top = mRing->power(f->numer, n);
577 bottom = mRing->power(f->denom, n);
578
579 if (mRing->is_zero(bottom)) return set_non_unit_frac(f->denom);
580 }
581 else
582 {
583 mpz_t negative_n;
584 mpz_init(negative_n);
585 mpz_neg(negative_n, n);
586 if (not is_unit(a))
587 {
588 throw exc::engine_error("attempt to divide by a non-unit");
589 }
590 top = mRing->power(f->denom, negative_n);
591 bottom = mRing->power(f->numer, negative_n);
592 mpz_clear(negative_n);
593
594 if (mRing->is_zero(bottom)) return set_non_unit_frac(f->numer);
595 }
596 return ring_elem(make_elem(top, bottom));
597}
ring_elem set_non_unit_frac(ring_elem top) const
local_elem * make_elem(ring_elem a, ring_elem b) const
Definition localring.cpp:52
virtual bool is_unit(const ring_elem f) const
const PolyRing * mRing
Definition localring.hpp:69
ring_elem numer
Definition localring.hpp:48
ring_elem denom
Definition localring.hpp:49
const local_elem * get_local_elem() const
Definition ringelem.hpp:136

References local_elem::denom, ring_elem::get_local_elem(), is_unit(), make_elem(), mRing, local_elem::numer, and set_non_unit_frac().