简述 index calculus 算法
Posted Zetaa
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了简述 index calculus 算法相关的知识,希望对你有一定的参考价值。
前言:仅个人小记。index calculus 本质上还是蛮力计算,不过这个蛮力相对于普通的蛮力更加优雅有效,但仍然是指数级别,可以称之为亚指数时间复杂。本文仅限于素数域进行讨论,还不涉及到多项式形式的素数的幂的扩域的情形,关于多项式形式,可以参看A Course in Number Theory and Cryptography,其内容简洁明了到位。
前提交代
域
F
p
F_p
Fp,生成元为 b。
b为底数,
i
n
d
(
a
)
ind(a)
ind(a)表示以 b 为的 a 的离散对数。
挑一个值S,找出小于S的所有素数,构成一个基组A
A
=
p
1
,
p
2
,
.
.
.
,
p
k
A=\\p_1,p_2,...,p_k\\
A=p1,p2,...,pk
小注:为什么称为基?素数本就是数的基。任意一个数都可以通过素数来进行表达。整个数空间都可以用素数表达出来,而且每个素数之间相互独立,所以完全可以把每个素数视为一个维度,多个素数可以构成一个数的子空间。从基的角度,能够很好地理解,任意一个数能够在基上做分解。当然,如果这个数来自更高维度的空间,显然分解不了。
计算B中素数的离散对数【构建线性方程组来解出小素数的离散对数】
计算
i
n
d
b
(
p
i
)
ind_b(p_i)
indb(pi)。具体计算是通过构建线性方程组来完成。
记
x
i
=
i
n
d
b
(
p
i
)
x_i=ind_b(p_i)
xi=indb(pi),则现在的目标是求解
x
1
,
x
2
,
.
.
.
,
x
k
x_1,x_2,...,x_k
x1,x2,...,xk。
下面试图构建出一组关于未知数
x
1
,
x
2
,
.
.
.
,
x
k
x_1,x_2,...,x_k
x1,x2,...,xk的线性方程组。
随机选取 t, 计算
b
t
b^t
bt,然后将
b
t
b^t
bt这个数在素数基A上做整数分解。即希望把
b
t
b^t
bt写作
b t = p 1 e 1 p 2 e 2 . . . p k e k b^t=p_1^e_1p_2^e_2...p_k^e_k bt=p1e1p2e2...pkek
但是, b t b^t bt可能并不会在基A上完全分解,故而,这里就是一个蛮力的过程,对于 1 ≤ t ≤ p − 1 1\\leq t\\leq p-1 1≤t≤p−1,挨个计算 b t b^t bt,在A上对 b t b^t bt做分解。对于某个 t,如果 b t b^t bt不能被A完全分解,则丢弃分解结果;否则,保留分解结果,即 e 0 , e 1 , . . . , e k e_0,e_1,...,e_k e0,e1,...,ek。
直到收集了有效的 k 个分解结果,以上分解行为才会停止。
理论推导
下面给出理论推导,
b
t
=
p
1
e
1
p
2
e
2
.
.
.
p
k
e
k
=
b
e
1
x
1
b
e
2
x
2
.
.
.
b
e
k
x
k
=
b
e
1
x
1
+
e
2
x
2
+
.
.
.
+
e
k
x
k
b^t=p_1^e_1p_2^e_2...p_k^e_k=b^e_1x_1b^e_2x_2...b^e_kx_k=b^e_1x_1+e_2x_2+...+e_kx_k
bt=p1e1p2e2...pkek=be1x1be2x2...bekxk=be1x1+e2x2+...+ekxk进而得出一个线性方程
t
=
e
1
x
1
+
e
2
x
2
+
.
.
.
+
e
k
x
k
t=e_1x_1+e_2x_2+...+e_kx_k
t=e1x1+e2x2+...+ekxk
其中,t 是已知的,
e
1
,
e
2
,
.
.
.
,
e
k
e_1,e_2,...,e_k
e1,e2,...,ek是可以在给定了 t 然后对
b
t
b^t
bt做分解得到[这个过程是蛮力的]。故而,
t
=
e
1
x
1
+
e
2
x
2
+
.
.
.
+
e
k
x
k
t=e_1x_1+e_2x_2+...+e_kx_k
t=e1x1+e2x2+...+以上是关于简述 index calculus 算法的主要内容,如果未能解决你的问题,请参考以下文章
UVa 1374 Power Calculus (IDA*或都打表)
sizeof(char**),sizeof(char*), sizeof(char)小注