New "i62" code for big integers with 64x64->128 opcodes; also improved "i31" modular exponentiation.
This commit is contained in:
parent
90bc9406c3
commit
8b2fe3add6
22 changed files with 1504 additions and 73 deletions
22
src/inner.h
22
src/inner.h
|
|
@ -1271,6 +1271,25 @@ void br_i31_from_monty(uint32_t *x, const uint32_t *m, uint32_t m0i);
|
|||
void br_i31_modpow(uint32_t *x, const unsigned char *e, size_t elen,
|
||||
const uint32_t *m, uint32_t m0i, uint32_t *t1, uint32_t *t2);
|
||||
|
||||
/*
|
||||
* Compute a modular exponentiation. x[] MUST be an integer modulo m[]
|
||||
* (same announced bit length, lower value). m[] MUST be odd. The
|
||||
* exponent is in big-endian unsigned notation, over 'elen' bytes. The
|
||||
* "m0i" parameter is equal to -(1/m0) mod 2^31, where m0 is the least
|
||||
* significant value word of m[] (this works only if m[] is an odd
|
||||
* integer). The tmp[] array is used for temporaries, and has size
|
||||
* 'twlen' words; it must be large enough to accommodate at least two
|
||||
* temporary values with the same size as m[] (including the leading
|
||||
* "bit length" word). If there is room for more temporaries, then this
|
||||
* function may use the extra room for window-based optimisation,
|
||||
* resulting in faster computations.
|
||||
*
|
||||
* Returned value is 1 on success, 0 on error. An error is reported if
|
||||
* the provided tmp[] array is too short.
|
||||
*/
|
||||
uint32_t br_i31_modpow_opt(uint32_t *x, const unsigned char *e, size_t elen,
|
||||
const uint32_t *m, uint32_t m0i, uint32_t *tmp, size_t twlen);
|
||||
|
||||
/*
|
||||
* Compute d+a*b, result in d. The initial announced bit length of d[]
|
||||
* MUST match that of a[]. The d[] array MUST be large enough to
|
||||
|
|
@ -1338,6 +1357,9 @@ void br_i15_reduce(uint16_t *x, const uint16_t *a, const uint16_t *m);
|
|||
|
||||
void br_i15_mulacc(uint16_t *d, const uint16_t *a, const uint16_t *b);
|
||||
|
||||
uint32_t br_i62_modpow_opt(uint32_t *x31, const unsigned char *e, size_t elen,
|
||||
const uint32_t *m31, uint32_t m0i31, uint64_t *tmp, size_t twlen);
|
||||
|
||||
/* ==================================================================== */
|
||||
|
||||
static inline size_t
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue