- For
*p*in the range [2, 2^{N}- 1] we can use single integers. Multiplication and addition can be made in (1) word operations.**N.B.**multiplication requires a two single integers buffer unless*p*in the range [2, 2^{N-1}- 1]. Exponentiation and computation of inverses require a bit more of works but are still in (1) word operations. For instance here's an ALDOR code for the division of two integers modulo a third onemod_/(i: %, j: %, n: %): % == { local c0, d0, c1, d1: %; (c0, d0) := (j, n); (c1, d1) := (1, 0); while not zero? d0 repeat { q := c0 quo d0; (c0, d0) := (d0, c0 - q*d0); (c1, d1) := (d1, c1 - q*d1) } if c0 ~= 1 then error "inverse does not exist"; if c1 < 0 then c1 := c1 + n; mod_*(i, c1, n);

- The set of the nonzero elements of
/
*p*is a cyclic group. In other words, there exists a generator*g*/*p*such that every nonzero*x*/*p*is a power of*g*called the discrete logarithm of*x*. Hence we can use discrete logarithms to represent nonzero elements of /*p*. Then exponentiation and computation of inverses become much more easy (for inverses we use Little Fermat Theorem) than with the previous encoding. However addition requires the use of tables of logarithms and exponentiations, for efficiency. Again all arithmetic operations are in (1) word operations.

2004-04-27