12#ifndef RANLUXPP_MULMOD_H
13#define RANLUXPP_MULMOD_H
29#if defined(__clang__) || defined(__INTEL_COMPILER) || defined(__CUDACC__)
31#elif defined(__GNUC__) && __GNUC__ >= 8
35 for (
int i = 0; i < 18; i++) {
36 uint64_t current = next;
42#if defined(__clang__) || defined(__INTEL_COMPILER) || defined(__CUDACC__)
44#elif defined(__GNUC__) && __GNUC__ >= 8
48 for (
int j = 0;
j < 9;
j++) {
55#if defined(__SIZEOF_INT128__) && !defined(ROOT_NO_INT128)
59 uint64_t
upper = prod >> 64;
60 uint64_t
lower =
static_cast<uint64_t
>(prod);
138static void mod_m(
const uint64_t *mul, uint64_t *out)
142 for (
int i = 0; i < 9; i++) {
177 int64_t
t1 =
t2 >> 48;
186 for (
int i = 1; i < 3; i++) {
200 for (
int i = 4; i < 9; i++) {
217 uint64_t mul[2 * 9] = {0};
229static void powermod(
const uint64_t *base, uint64_t *res, uint64_t
n)
231 uint64_t
fac[9] = {0};
234 for (
int i = 1; i < 9; i++) {
239 uint64_t mul[18] = {0};
ROOT::Detail::TRangeCast< T, true > TRangeDynCast
TRangeDynCast is an adapter class that allows the typed iteration through a TCollection.
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t r
static uint64_t sub_overflow(uint64_t a, uint64_t b, unsigned &overflow)
Compute a - b and set overflow accordingly.
static uint64_t sub_carry(uint64_t a, uint64_t b, unsigned &carry)
Compute a - b and increment carry if there was an overflow.
static uint64_t add_carry(uint64_t a, uint64_t b, unsigned &carry)
Compute a + b and increment carry if there was an overflow.
static int64_t compute_r(const uint64_t *upper, uint64_t *r)
Update r = r - (t1 + t2) + (t3 + t2) * b ** 10.
static uint64_t add_overflow(uint64_t a, uint64_t b, unsigned &overflow)
Compute a + b and set overflow accordingly.
static void mulmod(const uint64_t *in1, uint64_t *inout)
Combine multiply9x9 and mod_m with internal temporary storage.
static void powermod(const uint64_t *base, uint64_t *res, uint64_t n)
Compute base to the n modulo m.
static void mod_m(const uint64_t *mul, uint64_t *out)
Compute a value congruent to mul modulo m less than 2 ** 576.
static void multiply9x9(const uint64_t *in1, const uint64_t *in2, uint64_t *out)
Multiply two 576 bit numbers, stored as 9 numbers of 64 bits each.