# Efficient Implementation

Contents in Brief

- 14.1
**Introduction.............................591** - 14.2
**Multiple-precision integer arithmetic................592** - 14.3
**Multiple-precision modular arithmetic...............599** - 14.4
**Greatest common divisor algorithms................606** - 14.5
**Chinese remainder theorem for integers..............610** - 14.6
**Exponentiation...........................613** - 14.7
**Exponent recoding.........................627** - 14.8
**Notes and further references....................630**

## Introduction

Many public-key encryption and digital signature schemes, and some hash functions (see §9.4.3), require computations in Z_{m}, the integers modulo *m* (m is a large positive integer which may or may not be a prune). For example, the RSA, Rabin, and ElGamal schemes require efficient methods for performing multiplication and exponentiation in Z_{OT}. Although Z_{m} is prominent in many aspects of modem applied cryptography, other algebraic structures are also important. These include, but are not limited to, polynomial rings, finite fields, and finite cyclic groups. For example, the group formed by the points on an elliptic curve over a finite field has considerable appeal for various cryptographic applications. The efficiency of a particular cryptographic scheme based on any one of these algebraic structures will depend on a number of factors, such as parameter size, time-memory tradeoffs, processing power available, software and/or hardware optimization, and mathematical algorithms.

This chapter is concerned primarily with mathematical algorithms for efficiently carrying out computations in the underlying algebraic structure. Since many of the most widely implemented techniques rely on Z_{m}, emphasis is placed on efficient algorithms for performing the basic arithmetic operations in this structure (addition, subtraction, multiplication, division, and exponentiation).

In some cases, several algorithms will be presented which perform the same operation. For example, a number of techniques for doing modular multiplication and exponentiation are discussed in §14.3 and §14.6, respectively. Efficiency can be measured in numerous ways; thus, it is difficult to definitively state which algorithm is the best. An algorithm may be efficient in the tune it takes to perform a certain algebraic operation, but quite inefficient in the amount of storage it requires. One algorithm may require more code space than another. Depending on the environment in which computations are to be performed, one algorithm may be preferable over another. For example, current chipcard technology provides very limited storage for both precomputed values and program code. For such applications, an algorithm which is less efficient in time but very efficient in memory requirements may be preferred.

The algorithms described in this chapter are those which, for the most part, have received considerable attention in the literature. Although some attempt is made to point out their relative merits, no detailed comparisons are given.

**Chapter outline**

§14.2 deals with the basic arithmetic operations of addition, subtraction, multiplication, squaring, and division for multiple-precision integers. §14.3 describes the basic arithmetic operations of addition, subtraction, and multiplication in Z_{m}. Techniques described for performing modular reduction for an arbitrary modulus m are the classical method (§14.3.1), Montgomery’s method (§14.3.2), and Barrett’s method (§14.3.3). §14.3.4 describes a reduction procedure ideally suited to moduli of a special form. Greatest common divisor (gcd) algorithms are the topic of §14.4, including the binary gcd algorithm (§14.4.1) and Lehmer’s gcd algorithm (§14.4.2). Efficient algorithms for performing extended gcd computations are given in §14.4.3. Modular inverses are also considered in §14.4.3. Gamer’s algorithm for implementing the Chinese remainder theorem can be found in §14.5. §14.6 is a treatment of several of the most practical exponentiation algorithms. §14.6.1 deals with exponentiation in general, without consideration of any special conditions. §14.6.2 looks at exponentiation when the base is variable and the exponent is fixed. §14.6.3 considers algorithms which take advantage of a fixed-base element and variable exponent. Techniques involving representing the exponent in non-binary form are given in § 14.7; recoding the exponent may allow significant performance enhancements. §14.8 contains further notes and references.