多項式の上の小さい根または上の小さい根を多項式時間で求めるアルゴリズム。つまり または となるようなを求めるということ。Sagemathではsmall_roots
というメソッドが生えている。
というパラメータがあり、はと多項式の剰余の関係。例えばを解くときはだけど、を解くときは(でp, qが同じくらいの大きさなら)ということになる
はとして が成立するように決める。この値が小さいほど大きい行列を内部で使うようになり、実行に時間がかかる。
原理
応用
- 特殊な設定下での 素因数分解 などで利用できる
pの上位bit/下位bitがわかっている時
原理的にはの半分くらいのbit数が判明しているとき、残りのbitを求められる。実践的には6割〜判明していないと安定しない
size = 128 p = random_prime(1 << (size + 1), lbound=1<<(size)) q = random_prime(1 << (size + 1), lbound=1<<(size)) N = p*q; # qbar is q + [hidden_size_random] hidden = 80 # diff = ZZ.random_element(0, 2^hidden-1) # qbar = q + diff qbar = (q >> hidden) << hidden # qbar = qbar | (q & ((1 << 64) - 1)) low_size = 24 q_low = q & ((1<<low_size)-1) PR.<x> = PolynomialRing(Zmod(N), implementation='NTL') f = qbar + x*2**low_size + q_low f = f.monic() set_verbose(2) r = f.small_roots(X=2**(hidden + 1 - low_size), beta=0.25, epsilon=0.01) print(r) print(q, qbar) print(N)