apytypes_mp.h¶
Functions
-
template<class RANDOM_ACCESS_ITERATOR_INOUT, class RANDOM_ACCESS_ITERATOR_IN>
static inline apy_limb_t apy_inplace_addition(RANDOM_ACCESS_ITERATOR_INOUT dest_begin, RANDOM_ACCESS_ITERATOR_INOUT dest_end, RANDOM_ACCESS_ITERATOR_IN src_begin, RANDOM_ACCESS_ITERATOR_IN src_end)¶ Add two limb vectors in place: dest += src, where len(dest) >= len(src)
-
static inline apy_limb_t apy_addition_same_length(apy_limb_t *dest, const apy_limb_t *src0, const apy_limb_t *src1, const std::size_t limbs)¶
Add two limb vectors: dest = src0 + src1, where len(dest) == len(src0) == len(src1)
-
template<class RANDOM_ACCESS_ITERATOR_OUT, class RANDOM_ACCESS_ITERATOR_IN1, class RANDOM_ACCESS_ITERATOR_IN2>
static inline apy_limb_t apy_addition_iterator_same_length(RANDOM_ACCESS_ITERATOR_OUT dest_begin, RANDOM_ACCESS_ITERATOR_OUT dest_end, RANDOM_ACCESS_ITERATOR_IN1 src0, RANDOM_ACCESS_ITERATOR_IN2 src1)¶ Add two limb vectors: dest = src0 + src1, where len(dest) == len(src0) == len(src1)
-
static inline apy_limb_t apy_addition_length_two(apy_limb_t *dest, const apy_limb_t *src0, const apy_limb_t *src1)¶
Add two limb vectors of length two: dest = src0 + src1, where len(dest) == len(src0) == len(src1) == 2
-
template<class RANDOM_ACCESS_ITERATOR_INOUT>
static inline apy_limb_t apy_inplace_addition_single_limb(RANDOM_ACCESS_ITERATOR_INOUT begin_it, RANDOM_ACCESS_ITERATOR_INOUT end_it, const apy_limb_t src)¶ Add a single limb to a limb vector in place: dest += src.
-
template<class RANDOM_ACCESS_ITERATOR_INOUT>
static inline apy_limb_t apy_inplace_add_one_lsb(RANDOM_ACCESS_ITERATOR_INOUT begin_it, RANDOM_ACCESS_ITERATOR_INOUT end_it)¶ Add a single one to a limb vector in place: dest++.
-
template<class RANDOM_ACCESS_ITERATOR_INOUT, class RANDOM_ACCESS_ITERATOR_IN>
static inline apy_limb_t apy_inplace_iterator_addition_same_length(RANDOM_ACCESS_ITERATOR_INOUT dest_begin, RANDOM_ACCESS_ITERATOR_INOUT dest_end, RANDOM_ACCESS_ITERATOR_IN src_begin)¶ Add two limb vectors of the same length in place: dest += src, where len(dest) == len(src)
-
static inline apy_limb_t apy_inplace_addition_same_length(apy_limb_t *dest, const apy_limb_t *src, const std::size_t limbs)¶
Add two limb vectors of the same length in place: dest += src, where len(dest) == len(src)
-
static inline apy_limb_t apy_inplace_addition_length_two(apy_limb_t *dest, const apy_limb_t *src)¶
Add two limb vectors of length two in place: dest += src, where len(dest) == len(src) == 2
-
template<class RANDOM_ACCESS_ITERATOR_INOUT>
static inline apy_limb_t apy_inplace_negate(RANDOM_ACCESS_ITERATOR_INOUT begin_it, RANDOM_ACCESS_ITERATOR_INOUT end_it)¶ Negate a limb vector in place: dest = -dest.
-
template<class RANDOM_ACCESS_ITERATOR_IN, class RANDOM_ACCESS_ITERATOR_OUT>
static inline apy_limb_t apy_negate(RANDOM_ACCESS_ITERATOR_IN src_begin, RANDOM_ACCESS_ITERATOR_IN src_end, RANDOM_ACCESS_ITERATOR_OUT dest_begin)¶ Negate a limb vector: dest = -src.
-
template<class RANDOM_ACCESS_ITERATOR_INOUT>
static inline apy_limb_t apy_inplace_subtraction_single_limb(RANDOM_ACCESS_ITERATOR_INOUT begin_it, RANDOM_ACCESS_ITERATOR_INOUT end_it, const apy_limb_t src)¶ Subtract a single limb from a limb vectors in place: dest -= src.
-
template<class RANDOM_ACCESS_ITERATOR_INOUT, class RANDOM_ACCESS_ITERATOR_IN>
static inline apy_limb_t apy_inplace_subtraction_same_length(RANDOM_ACCESS_ITERATOR_INOUT dest_begin, RANDOM_ACCESS_ITERATOR_INOUT dest_end, RANDOM_ACCESS_ITERATOR_IN src_begin)¶ Subtract two limb vectors in place: dest -= src, where len(dest) == len(src)
-
template<class RANDOM_ACCESS_ITERATOR_INOUT, class RANDOM_ACCESS_ITERATOR_IN>
static inline apy_limb_t apy_inplace_reversed_subtraction_same_length(RANDOM_ACCESS_ITERATOR_INOUT dest_begin, RANDOM_ACCESS_ITERATOR_INOUT dest_end, RANDOM_ACCESS_ITERATOR_IN src_begin)¶ Subtract two limb vectors in place: dest = src - dest, where len(dest) == len(src)
-
static inline apy_limb_t apy_subtraction_same_length(apy_limb_t *dest, const apy_limb_t *src0, const apy_limb_t *src1, const std::size_t limbs)¶
Subtract two limb vectors: dest = src0 - src1, where len(dest) == len(src0) == len(src1)
-
static inline apy_limb_t apy_subtraction_length_two(apy_limb_t *dest, const apy_limb_t *src0, const apy_limb_t *src1)¶
Subtract two limb vectors of length two: dest = src0 - src1, where len(dest) == len(src0) == len(src1) == 2
-
apy_limb_t apy_inplace_left_shift(apy_limb_t*, const std::size_t, unsigned int)¶
Left-shift limb vector in place.
-
template<class RANDOM_ACCESS_ITERATOR_INOUT>
static inline apy_limb_t apy_inplace_left_shift(RANDOM_ACCESS_ITERATOR_INOUT begin_it, RANDOM_ACCESS_ITERATOR_INOUT end_it, const unsigned int shift_amount)¶ Left-shift limb vector in place.
-
apy_limb_t apy_left_shift(apy_limb_t *dest, const apy_limb_t *src, const std::size_t limbs, const unsigned shift_amount)¶
Left-shift limb vector: dest == src << shift_amount.
-
apy_limb_t apy_inplace_right_shift(apy_limb_t*, const std::size_t, unsigned int)¶
Right-shift limb vector in place.
-
template<class RANDOM_ACCESS_ITERATOR_INOUT>
apy_limb_t apy_inplace_right_shift(RANDOM_ACCESS_ITERATOR_INOUT begin_it, RANDOM_ACCESS_ITERATOR_INOUT end_it, unsigned int shift_amount)¶ Right-shift limb vector in place.
-
apy_limb_t apy_unsigned_multiplication(apy_limb_t*, const apy_limb_t*, const std::size_t, const apy_limb_t*, const std::size_t)¶
Multiply two unsigned limb vectors.
-
apy_limb_t apy_unsigned_square(apy_limb_t*, const apy_limb_t*, const std::size_t)¶
Square an unsigned limb vector.
-
template<class RANDOM_ACCESS_ITERATOR_OUT, class RANDOM_ACCESS_ITERATOR_IN>
void apy_unsigned_division(RANDOM_ACCESS_ITERATOR_OUT quotient, RANDOM_ACCESS_ITERATOR_IN numerator_begin, RANDOM_ACCESS_ITERATOR_IN numerator_end, RANDOM_ACCESS_ITERATOR_IN denominator_begin, RANDOM_ACCESS_ITERATOR_IN denominator_end)¶ Divide two unsigned limb vectors.
-
template<class RANDOM_ACCESS_ITERATOR_OUT, class RANDOM_ACCESS_ITERATOR_IN>
void apy_unsigned_division_preinverted(RANDOM_ACCESS_ITERATOR_OUT quotient, RANDOM_ACCESS_ITERATOR_IN numerator_begin, RANDOM_ACCESS_ITERATOR_IN numerator_end, RANDOM_ACCESS_ITERATOR_IN denominator_begin, RANDOM_ACCESS_ITERATOR_IN denominator_end, const APyDivInverse *inv)¶ Divide two unsigned limb vectors where the APyDivInverse is pre-computed.
-
void apy_division_multiple_limbs_preinverted(apy_limb_t *quotient, apy_limb_t *numerator, const std::size_t numerator_limbs, const apy_limb_t *denominator, const std::size_t denominator_limbs, const APyDivInverse *inv)¶
-
template<class RANDOM_ACCESS_ITERATOR_OUT, class RANDOM_ACCESS_ITERATOR_INOUT>
void apy_division_double_limbs_preinverted(RANDOM_ACCESS_ITERATOR_OUT quotient, RANDOM_ACCESS_ITERATOR_INOUT numerator_begin, RANDOM_ACCESS_ITERATOR_INOUT numerator_end, const APyDivInverse *inv)¶
-
apy_limb_t apy_division_single_limb_preinverted(apy_limb_t *quotient, const apy_limb_t *numerator, const std::size_t numerator_limbs, const APyDivInverse *inv)¶
-
apy_limb_t apy_division_3by2(apy_limb_t *remainder_1, apy_limb_t *remainder_0, const apy_limb_t numerator_tmp, const APyDivInverse *inv)¶
-
class APyDivInverse¶
- #include <apytypes_mp.h>
Class representing the inverse/reciprocal of the denominator.
Public Functions
-
explicit APyDivInverse(const apy_limb_t*, std::size_t)¶
Constructor from limb vector.
Public Members
-
unsigned norm_shift¶
Normalization shift count.
-
apy_limb_t norm_denominator_1¶
Normalized denominator, most significant limb.
-
apy_limb_t norm_denominator_0¶
Normalized denominator, least significant limb (unused for single limb denominators)
-
apy_limb_t inverse¶
Inverse, for 2/1 or 3/2.
Private Functions
-
void compute_3by2_inverse()¶
Compute the 3/2 (or 2/1) inverse.
-
explicit APyDivInverse(const apy_limb_t*, std::size_t)¶