高速乗算法の設計と実装(5)
梅谷 武
作成:2001-09-24 更新:2005-04-20
高速乗算法(5)は係数を2語と1語に分解する方法である。
IMS:20010924001; NDC:412.1; keywords:高速乗算法;
高速乗算法(1)(→[
F3])で導入した
T(n)を再度使用する。
とおくと
が成り立つ。
T(n),n=0,1,2,3,4,5,6を素数判定すると次のようになる。
| | |
| | |
| | |
| | 28(28-1)+1 | = | 65281 | = | 97*673:合成数 |
|
| | 216(216-1)+1 | = | 4294901761 | = | 193*22253377:合成数 |
|
| | 232(232-1)+1 | = | 18446744069414584321:素数 |
|
| | |
T(5)が素数になるのでこれを使用する。
T(5)を法とする整数の剰余環
ZT(5)は有限体となるが、この元は1語を32bitとするとき2語で表現できる。この積は
と128bit長で表現されるが、このとき、
より除算を使わずに剰余演算ができる。
T(5)は素数であり、
FT(5)上に長さ
Nの離散フーリエ変換が存在するための必要十分条件は、
であるが、
はこの条件を満たし、さらにこのとき
T(5)の最小原始根
7を使って
FT(5)上の
1の原始
N乗根を
と表現することができる。
T(5)によって係数の評価式
cr | ≦ | N(232-1)2 | = | N(264-233+1) |
の
を2語で表現できる素数によって上から押さえることができた。次に
を1語で表現できる素数によって上から押さえることを考える。
V(n) | = | 2n(232-n | - | 1) | + | 1, | 0<n<32 |
とおくとこれは1語で表現できる。この中で素数となるものは、
の2つである。離散フーリエ変換の長さをなるべく長くするために
V(30)を使う。
が成り立っているので、
である。
V(30)を法とする整数の剰余環
ZV(30)は有限体となるが、この元は1語で表現できる。この積は
と64bit長で表現されるが、このとき、
より除算を使わずに剰余演算ができる。
V(30)は素数であり、
FV(30)上に長さ
Nの離散フーリエ変換が存在するための必要十分条件は、
であるが、
はこの条件を満たし、さらにこのとき
V(30)の最小原始根
5を使って
FV(30)上の
1の原始
N乗根を
と表現することができる。
Step 1. 数のP進表現
基数を
P=232とし、長さを
とする。正の整数
a,bが次のように
P進表現されるものとする。
この積について
0≦ab<PNが成り立つと仮定する。
Step 2. 多項式としての積の計算
PK≡1(mod PN-1)より、
となる。この係数
cr=s+t≡r(mod N)asbtの大きさを評価すると、
0 | ≦ | cr | ≦ | N(232-1)2 | < | U(5) | = | 232(264-1)+1 |
となる。
Step 3. 離散フーリエ変換による係数の計算
crは、
(N, FU(5), ζ), ζ=11t, t=232-n(264-1)型の離散Fourier変換を利用して次のように計算する。
| | |
| | |
| | N-1 | N-1 Σ k=0 | F(a)kF(b)kζ-kr | | (mod U(5)) |
|
Step 4. 桁上げ処理
最後にcr, r=0,…,K-1に桁上げ処理を施すことで、c=abのP進表現が得られる。
高速乗算法