You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
47 lines
1.3 KiB
47 lines
1.3 KiB
// cached_power().
|
|
|
|
// General includes.
|
|
#include "cl_sysdep.h"
|
|
|
|
// Specification.
|
|
#include "cl_I.h"
|
|
|
|
|
|
// Implementation.
|
|
|
|
namespace cln {
|
|
|
|
// Table: For each base b (2 <= b <= 36), store k and b^k where k is the largest
|
|
// integer such that b^k < 2^intDsize, i.e. k == floor(log(2^intDsize-1,b)).
|
|
struct power_table_entry {
|
|
uintC k;
|
|
uintD b_to_the_k;
|
|
};
|
|
extern const power_table_entry power_table [36-2+1];
|
|
|
|
// Table: contains for each base b (2 <= b <= 36) either NULL or an array of
|
|
// lazily computed b^(k*2^i) and maybe 1/b^(k*2^i).
|
|
//#define MUL_REPLACES_DIV
|
|
struct cached_power_table_entry {
|
|
ALLOCATE_ANYWHERE(cached_power_table_entry)
|
|
cl_I base_pow; // 0 or b^(k*2^i)
|
|
#ifdef MUL_REPLACES_DIV
|
|
cl_I inv_base_pow; // if base_pow: floor(2^(2*integer_length(base_pow))/base_pow)
|
|
#endif
|
|
};
|
|
|
|
struct cached_power_table {
|
|
cached_power_table_entry element[30];
|
|
// Constructor and destructor - nothing special.
|
|
cached_power_table () {}
|
|
~cached_power_table () {}
|
|
// Allocation and deallocation.
|
|
void* operator new (size_t size) { return malloc_hook(size); }
|
|
void operator delete (void* ptr) { free_hook(ptr); }
|
|
};
|
|
|
|
extern cached_power_table* ctable [36-2+1];
|
|
|
|
const cached_power_table_entry * cached_power (uintD base, uintL i);
|
|
|
|
} // namespace cln
|