モジュラー算術において、バレット減算は1986年にPDバレットによって導入された減算アルゴリズムである。 [1]
素朴な計算方法

高速除算アルゴリズム を使用するのが最善です。バレット減算は、が定数であり、 であると仮定して、除算を乗算に置き換えて
この演算を最適化するように設計されたアルゴリズムです。

歴史的には、値 については、完全な積 にバレット還元を適用することで計算されていました。最近、オペランドの1つで事前計算を実行できる場合は完全な積は不要であることが示されました。[2] [3]

一般的な考え方
関数が整数近似であるとは、 のときである。 を法とし、整数近似 を次のように
定義する。![{\displaystyle \left[\,\right]:\mathbb {R} \to \mathbb {Z} }](https://wikimedia.org/api/rest_v1/media/math/render/svg/26cf7cce8fee09a0e27e1ef99370e2825214e74a)
![{\displaystyle |\left[z\right]-z|\leq 1}](https://wikimedia.org/api/rest_v1/media/math/render/svg/1c58ced9be029cda841359de6a4367212c24f944)

![{\displaystyle \left[\,\right]}](https://wikimedia.org/api/rest_v1/media/math/render/svg/5654b4b054083661bf0cc75c3d8ff3011a772ae6)
![{\displaystyle {\text{mod}}^{\left[\,\right]}\,n:\mathbb {Z} \to (\mathbb {Z} /n\mathbb {Z} )}](https://wikimedia.org/api/rest_v1/media/math/render/svg/f43fea42f0571f9a1df5dc2c302ecd27772ad805)
。
一般的な選択肢としては、floor、ceiling、rounding関数があります。
![{\displaystyle \left[\,\right]}](https://wikimedia.org/api/rest_v1/media/math/render/svg/5654b4b054083661bf0cc75c3d8ff3011a772ae6)
一般的に、バレット乗算は2つの整数近似値を指定することから始まり、次のよう
にかなり近い近似値を計算する。![{\displaystyle \left[\,\right]_{0},\left[\,\right]_{1}}](https://wikimedia.org/api/rest_v1/media/math/render/svg/e804e99686f7fec68620740d3c48e34d7852818f)

、
ここで、は固定定数であり、通常は 2 の累乗であり、乗算と除算を効率的に実行できるように選択されます。


このケースは、床関数の場合にPD Barrett [1]によって導入されました。 の一般的なケースはNTLで見つけることができます。[2]
整数近似の見解とモンゴメリ乗算とバレット乗算の対応は、Hanno Becker、Vincent Hwang、Matthias J. Kannwischer、Bo-Yin Yang、およびShang-Yi Yangによって発見されました。[3]
![{\displaystyle \left[\,\right]_{0}=\left[\,\right]_{1}=\lfloor \,\rfloor }](https://wikimedia.org/api/rest_v1/media/math/render/svg/ecf31e3f480001f0bb752aa804d3e8d43bbdb71e)
単一単語のバレット縮小
バレットは当初、値がマシンワードに収まる場合、上記のアルゴリズムの整数バージョンを検討しました。床関数の場合の考え方を、 と を使用して示します。


符号なし整数を計算する場合、明らかな類似法は による除算を使用することです。


func Reduce ( a uint ) uint { q := a / n // 除算は暗黙的に結果の切り捨てを返します。return a - q * n }
ただし、除算はコストが高く、暗号化設定では一部の CPU で定数時間命令ではない可能性があり、その場合、操作がタイミング攻撃の対象になります。したがって、バレット減算は値で近似します。これは、による除算が右シフトだけであるため、コストがかからないためです。



与えられたものに対する最適な値を計算するには、次の点を考慮してください。



を整数にするには、何らかの方法で丸める必要があります。最も近い整数に丸めると、最良の近似値が得られますが、よりも大きくなる可能性があり、アンダーフローが発生する可能性があります。したがって、符号なし演算には が使用されます。





したがって、上記の関数は次のように近似できます。
func Reduce ( a uint ) uint { q := ( a * m ) >> k // ">> k" は k のビットシフトを表します。return a - q * n }
しかし、 であるため、その関数の の値は1 つ小さくなりすぎる可能性があり、したがって が一般に要求されるではなく の範囲内にあることが保証されます。条件付き減算により、これを修正できます。

qa

func Reduce ( a uint ) uint { q := ( a * m ) >> k a -= q * n a >= n の場合{ a -= n } a を返す}
単一単語のバレット乗算
が既知であると仮定します。これにより、を受け取る前に事前計算することができます。バレット乗算は を計算し、 の上位部分を
で
近似し、近似値を減算します。
は の倍数であるため、結果の値
は を表します。










バレット乗算とモンゴメリ乗算の対応
符号なしモンゴメリ乗算は、
次のように
代表値を計算することを思い出してください。
。
実際、この値は に等しくなります。

この主張は次のように証明されます。

一般に、整数近似の場合、
![{\displaystyle \left[\,\right]_{0},\left[\,\right]_{1}}](https://wikimedia.org/api/rest_v1/media/math/render/svg/e804e99686f7fec68620740d3c48e34d7852818f)
[3 ]
バレット乗算の範囲
出力を で制限します
。

同様の境界は他の種類の整数近似関数にも当てはまります。例えば、切り上げ関数
を選択した場合、![{\displaystyle \left[\,\right]_{0}=\left[\,\right]_{1}=\left\lfloor \,\right\rceil }](https://wikimedia.org/api/rest_v1/media/math/render/svg/cc3cee2b15a9c1721bafc76f5d8688638de0dcde)

複数単語のバレット削減
バレットが縮小を検討した主な動機は、 RSAの実装であり、問題となる値はほぼ確実にマシンワードのサイズを超えるでしょう。この状況で、バレットは上記の単一ワードバージョンを複数ワード値で近似するアルゴリズムを提供しました。詳細については、応用暗号ハンドブックのセクション14.3.3を参照してください。[4]
多項式に対するバレットアルゴリズム
多項式を逆にしてX進演算を使用することで、多項式除算にバレットアルゴリズムを使用することも可能です。[5]
参照
参考文献
- ^ ab Barrett, P. (1986). 「標準デジタル信号プロセッサへの Rivest Shamir および Adleman 公開鍵暗号化アルゴリズムの実装」。暗号学の進歩 - CRYPTO' 86。コンピュータサイエンスの講義ノート。 第 263 巻。 pp. 311–323。doi :10.1007/3-540-47721-7_24。ISBN
978-3-540-18047-0。
- ^ ab Shoup, Victor. 「数論ライブラリ」。
- ^ abc Becker, Hanno; Hwang, Vincent; Kannwischer, Matthias J.; Yang, Bo-Yin; Yang, Shang-Yi (2021)、「Neon NTT: Cortex-A72 および Apple M1 でのより高速な Dilithium、Kyber、および Saber」、Transactions on Cryptographic Hardware and Embedded Systems、2022 (1): 221–244、doi : 10.46586/tches.v2022.i1.221-244
- ^ Menezes, Alfred; Oorschot, Paul; Vanstone, Scott (1997). Handbook of Applied Cryptography (第 5 版). CRC Press. doi :10.1201/9780429466335. ISBN 0-8493-8523-7。
- ^ 「多項式のバレット縮約」www.corsix.org . 2022年9月7日閲覧。
出典
- Bosselaers, A.; Govaerts, R.; Vandewalle, J. (1993)。「3 つのモジュラー リダクション関数の比較」。Stinson, Douglas R. (編)。暗号学の進歩 - Crypto'93。コンピュータ サイエンスの講義ノート。第 773 巻。Springer。pp. 175–186。CiteSeerX 10.1.1.40.3779。ISBN 3540483292。
- Hasenplaugh, W.; Gaubatz, G.; Gopal, V. (2007). 「高速モジュラー縮約」(PDF) .第 18 回 IEEE コンピュータ算術シンポジウム (ARITH'07) . pp. 225–229. doi :10.1109/ARITH.2007.18. ISBN 978-0-7695-2854-0.S2CID 14801112 。