Excel VBA 数学教室ではアフィリエイトプログラムを利用して商品を紹介しています。

離散対数(Ind)

離散対数Ind

p=7 を法とするとき、p1=6 の約数
{1,2,3,4,5,6}
のうち、p1=6 乗して初めて 1 と合同になる数は 35 でした。つまり 7 の原始根は g=3,5 です。そこで、たとえば原始根 3 のベキ乗をつくっていくと
301(mod7)313(mod7)322(mod7)336(mod7)344(mod7)355(mod7)
のようになり、原始根をベキ乗して得られる数は p1=6 以下の数について全部出揃っています。すなわち
3ea(mod7)
を満たす a7 の倍数を除いて必ず存在していることになります(たとえば a=12 は合同の意味で a=5 と同じです)。以前に学んだ 定理 E2 の前半部分によると

【定理E2】p を素数、a を正整数とする。
(a,p)=1 のとき、e=ordp(a) とおくと
a0a1a2ae1(modp)

ですから、素数 p の原始根の1つを g としたとき、
ge1(modp)
を満たす最小のベキ指数 ep1 となるので、
{g0,g1,g2,,gp2}
は互いに合同ではない p1 個の数であり、かついずれも p1 で割り切れない数です。したがって、この集合の要素は
{1,2,,p1}
のうちのいずれかの数と合同になり重複もありません。すなわち任意の正整数 a について
gea(modp)
を満たすような e
{0,1,2,,p2}
の中に必ず存在します。そこで離散対数というものを次のように定義します。

【定義E4】素数 p の原始根 g と正整数 a にたいして
gea(modp)を満たすような整数 eg を底とした a離散対数と定義し、e=Indg(a) と書く。

記号 Ind は Index の略です。a は離散真数とよばれます。7 の原始根 3 のべき乗を離散対数を使って書き直してみます。
301(mod7)Ind3(1)=0313(mod7)Ind3(3)=1322(mod7)Ind3(2)=2336(mod7)Ind3(6)=3344(mod7)Ind3(4)=4355(mod7)Ind3(5)=5
離散対数という名前の通り、Ind対数 の整数版なので、これから説明する計算法則の多くは実数の対数計算と一致します。

a=1 のとき、ge1 を満たす e0 です。
a=g のとき、geg を満たす e1 です。よって、
Indg(1)=0,Indg(g)=1
となります。

離散対数の基本定理を証明しておきます。

【定理E7】ab(modp) が成り立つとき、
Indg(a)Indg(b)(modp1)

[証明] Indg(a)=x,Indg(b)=y とおくと
agx,bgy(modp1)
ab(modp) ならば
gxgygxy1(modp)
一方、フェルマーの小定理より
gp11(modp)
が成り立ちますが、g は原始根なので p1|xy , すなわち
xy(modp1)
となります。よって、
Indg(a)Indg(b)(modp1)
が成り立ちます。(証明終)

次は離散対数表を作っておきます。
離散対数表とは数論版の対数表です。つまり
gea(modp)e=Indg(a)
における離散真数 a に対応する離散対数 e を並べたものです。

いつも mod7 ばかりでは飽きるので、今回は mod11 の原始根の中から g=2 を選びます。念のために g=2 が本当に原始根なのかを確認しおきます。べき乗していって p1=10 で初めて 1 と合同になれば原始根です。
212(mod11)224(mod11)238(mod11)245(mod11)2510(mod11)269(mod11)277(mod11)283(mod11)296(mod11)2101(mod11)
となるので、確かに 211 の原始根です。また、
2,4,8,5,10,9,7,3,6
は真数 a ですから、これに a=20=1 も含めて、a の小さい順に並べて離散対数表を作成すると次のようになります。

a=ge 1 2 3 4 5
e 0 1 8 2 4
a=ge 6 7 8 9 10
e 9 7 3 6 5
スクロールできます

表を参照して e=Ind2(a) を求めることができます。たとえば

Ind2(4)=2,Ind2(7)=7,Ind2(9)=6
のようになります。

離散対数計算の基本公式です。

【定理E8】p を奇素数、gp の原始根の1つ、n を正整数とすると、
Indg(ab)Indg(a)+Indg(b)(modp1)(1)Indg(an)nIndg(a)(modp1)(2)

[証明]
(1) Indg(a)=x,Indg(b)=y,Indg(ab)=z とおくと、
gxa,gyb,gzab(modp)
と表せるので
gzabgxgygx+y(modp)
すなわち
gzgx+y(modp)
定理 E7

  ab(modp)Indg(a)Indg(b)(modp1)

より、法を1つ下げて
zx+y(modp1)
すなわち
Indg(ab)Indg(a)+Indg(b)(modp1)
が成り立ちます。

(2) (1) の公式を繰り返し用いると
Indg(abc)=Indg(a)+Indg(b)+Indg(c)+(modp1)
となるので、
Indg(an)Indg(a)+Indg(a)+Indg(a)+=nIndg(a)(modp1)
が得られます。(証明終)

次の定理は離散対数の底の変換公式です。

【定理E9】p を奇素数、gp の原始根の1つとすると
Indb(a)Indg(b)=Indg(a)(modp1)(3)

[証明] Indg(a)=x,Indg(b)=y,Indg(ab)=z とおくと、
gxa,gyb,gzab(modp)
と表せるので
(gy)zbza(modp)
すなわち
gyzgx(modp)
定理 E7 より
yzx(modp)
したがって
Indb(a)Indg(b)=Indg(a)(modp1)
が成り立ちます。(証明終)

離散対数の公式が出揃ったところで具体例で練習してみましょう。
11 の原始根 2 の離散対数表を再掲します。

a=ge 1 2 3 4 5
e 0 1 8 2 4
a=ge 6 7 8 9 10
e 9 7 3 6 5
スクロールできます

まずは公式 (1) を確認してみます。
たとえば Ind2(3)=8,Ind2(5)=4 なので、
Ind2(15)Ind2(3)+Ind2(5)=122(mod10)
と計算できます(法が1つ下がることに注意!)。実際、左辺を離散対数表で確認してみると
Ind2(15)=Ind2(4)=2
となっています(真数は法 11 で合同計算します)。次は公式 (2) です。たとえば
Ind2(72)2Ind2(7)=2×7=144(mod10)
となります。左辺を離散対数表で確認してみると
Ind2(49)=Ind2(5)=4
となって、確かに公式は正しいことがわかります。次に公式 (3) を確認するために、原始根 g=6 の離散対数表を用意します。

a=ge 1 2 3 4 5
e 0 9 2 8 6
a=ge 6 7 8 9 10
e 1 3 7 4 5
スクロールできます

公式 (3) によると、たとえば
Ind2(6)Ind6(5)Ind2(5)=4(mod10)
というように計算できます。左辺を離散対数表で確認してみると
Ind2(6)Ind6(5)=9×6=544(mod10)
となっています。

ベキ乗合同計算への応用

次のようなベキ乗の合同計算を公式を使って計算してみます。
x37(mod11)
両辺の離散対数をとると公式 (2) より
Ind2(x)7Ind2(3)(mod10)
ここで原始根 g=2 の離散対数表を再掲します。

a=ge 1 2 3 4 5
e 0 1 8 2 4
a=ge 6 7 8 9 10
e 9 7 3 6 5
スクロールできます

表から Ind2(3)=8 なので
Ind2(x)7×8566(mod10)
表から離散対数が 6 となる真数を探すと e=9 なので
x6(mod11)
という答えが得られます。念のために検算すると
37=2187=198×11+9
となって、確かに 11 で割ると余りは 9 です。離散対数をとったり、また戻したりとする過程で法が下がったり上がったりすることに注意してください。

【おすすめ記事】≫ エクセルで対数計算

一次合同方程式への応用

次は離散対数を使って次のような合同方程式
5x7(mod11)
を解いてみます。両辺の離散対数をとると
Ind2(5)+Ind2(x)Ind2(7)(mod10)
11 の原始根 g=2 の離散対数表を調べます。

a=ge 1 2 3 4 5
e 0 1 8 2 4
a=ge 6 7 8 9 10
e 9 7 3 6 5
スクロールできます

Ind2(5)=4,Ind2(7)=7 なので
4+Ind2(x)7(mod10)
となります。両辺から 4 を引いて
Ind2(x)3(mod10)
また表から離散対数が 3 となる真数を探すと e=8 なので
x8(mod11)
となります。検算してみると
5×8407(mod11)
となって、確かに合同方程式を満たしています。

エクセルや数学に関するコメントをお寄せください