BSGSと拡張BSGS
5074 ワード
BSGS
(BSGS)アルゴリズムは大股小歩とも呼ばれる((Baby-step-Giant-step))アルゴリズム(BSGS)アルゴリズムは主に以下の同余方程式[A^xequiv B(modp)]のうち((A,P)=1)、すなわち(A)と(P)の相互作用を解くために用いられる.
先行知識
オーラの定理(A^{varphi(p)}equiv 1(modp))による、(A^x(modp))のループ節は(varphi(p))である.すなわち,上記の方程式に解(x)があれば,必ず(xin[0,varphi(p)])があるので,(x)を列挙して解くことができる.
ガイド人
上は暴力的なやり方であり、(BSGS)はブロック化の考え方を利用して上のアルゴリズムの複雑度を(sqrt{varphi(p)})または(sqrt{varphi(p)}log;p)(map)メソッド(m=lceilsqrt{varphi(p)}rceil)では、いずれの(xin[0,varphi(p)])も(im-j(iin[1,m],jin[0,m])と表すことができる形式であれば、元の式は[A^{im-j}equiv B(modp)]と表すことができる
インプリメンテーション
そこで、右の(A^jB(jin[0,m]))を前処理して(hash)テーブルに保存します.次に左側の(iin[1,m])を列挙して(A^{im})を計算し、(hash)テーブルでクエリーします.列挙(i,j)の複雑さはすべて(sqrt{varphi(p)})であり、定数は(hash)テーブルの細部に依存し、一般的には(x)が最小であるため、(j)がより大きく、(i)がより小さくなることを望んでいる.したがって、(hash)テーブルに保存するときは、より大きな(j)を保持します.小さい頃から大きな列挙(i)まで、実行可能な答えに出会って直接出力すればいい.
例題
luogu3846
コード#コード#
拡張BSGS
(BSGS)アルゴリズムには一定の限界がある((A,p)相互質()).拡張(BSGS)は、(A,p)が互いに質を持たない場合を処理することができる.
ガイド人
私たちはすでに(A,p)の互質の場合、(A,p)の非互質の場合、(A,p)の互質に変換すればよい.命令(d=gcd(A,p)).(dmid B)の場合、または(B=1)の場合、答えは(0)です.さもないとペ蜀の定理に基づいてきっと解けない.だから私たちは最初に(B=1)の状況を特判すればいいのです.後に(dmid B)を発見すれば無解を説明できる.だから今私たちは(dmid B)を仮定します.私たちは(A,B,P)を同時に1つの(d)で割った.すなわち[A^{x-1}frac{A}{d}equivfrac{B}{d}(mod\frac{p}{d})]を繰り返し、(d=1)まで同余方程式が得られる[A^{x−k}frac{ A^k}{prodlimits_{i=1}^kd_i}equivfrac{ B}{prodlimits_{i=1}^kd_i}(mod\frac{ p}{prodfrac{ p}{prodlimits_{i=1}^kd_i}]設定(p'=frac{ p}{{prodlimits_{i=1}^kd_i},B'=frac{ B'=frac{ Bd_i=1}^kd_i},B'=frac{ Bc{Bd_i},}{prodlimits_{i=1}^kd_i},C=frac{A^k}{prodlimits_{i=1}^kd_i},x'=x-k)原式は[A^{x'}Cequiv B'(modp')]となるそして(A,p')互質に変換する場合、普通の(BSGS)でできます.
例題
luogu4195
コード#コード#
転載先:https://www.cnblogs.com/wxyww/p/BSGS.html
(BSGS)アルゴリズムは大股小歩とも呼ばれる((Baby-step-Giant-step))アルゴリズム(BSGS)アルゴリズムは主に以下の同余方程式[A^xequiv B(modp)]のうち((A,P)=1)、すなわち(A)と(P)の相互作用を解くために用いられる.
先行知識
オーラの定理(A^{varphi(p)}equiv 1(modp))による、(A^x(modp))のループ節は(varphi(p))である.すなわち,上記の方程式に解(x)があれば,必ず(xin[0,varphi(p)])があるので,(x)を列挙して解くことができる.
ガイド人
上は暴力的なやり方であり、(BSGS)はブロック化の考え方を利用して上のアルゴリズムの複雑度を(sqrt{varphi(p)})または(sqrt{varphi(p)}log;p)(map)メソッド(m=lceilsqrt{varphi(p)}rceil)では、いずれの(xin[0,varphi(p)])も(im-j(iin[1,m],jin[0,m])と表すことができる形式であれば、元の式は[A^{im-j}equiv B(modp)]と表すことができる
インプリメンテーション
そこで、右の(A^jB(jin[0,m]))を前処理して(hash)テーブルに保存します.次に左側の(iin[1,m])を列挙して(A^{im})を計算し、(hash)テーブルでクエリーします.列挙(i,j)の複雑さはすべて(sqrt{varphi(p)})であり、定数は(hash)テーブルの細部に依存し、一般的には(x)が最小であるため、(j)がより大きく、(i)がより小さくなることを望んでいる.したがって、(hash)テーブルに保存するときは、より大きな(j)を保持します.小さい頃から大きな列挙(i)まで、実行可能な答えに出会って直接出力すればいい.
例題
luogu3846
コード#コード#
#include
#include
#include
#include
#include
#include
#include
拡張BSGS
(BSGS)アルゴリズムには一定の限界がある((A,p)相互質()).拡張(BSGS)は、(A,p)が互いに質を持たない場合を処理することができる.
ガイド人
私たちはすでに(A,p)の互質の場合、(A,p)の非互質の場合、(A,p)の互質に変換すればよい.命令(d=gcd(A,p)).(dmid B)の場合、または(B=1)の場合、答えは(0)です.さもないとペ蜀の定理に基づいてきっと解けない.だから私たちは最初に(B=1)の状況を特判すればいいのです.後に(dmid B)を発見すれば無解を説明できる.だから今私たちは(dmid B)を仮定します.私たちは(A,B,P)を同時に1つの(d)で割った.すなわち[A^{x-1}frac{A}{d}equivfrac{B}{d}(mod\frac{p}{d})]を繰り返し、(d=1)まで同余方程式が得られる[A^{x−k}frac{ A^k}{prodlimits_{i=1}^kd_i}equivfrac{ B}{prodlimits_{i=1}^kd_i}(mod\frac{ p}{prodfrac{ p}{prodlimits_{i=1}^kd_i}]設定(p'=frac{ p}{{prodlimits_{i=1}^kd_i},B'=frac{ B'=frac{ Bd_i=1}^kd_i},B'=frac{ Bc{Bd_i},}{prodlimits_{i=1}^kd_i},C=frac{A^k}{prodlimits_{i=1}^kd_i},x'=x-k)原式は[A^{x'}Cequiv B'(modp')]となるそして(A,p')互質に変換する場合、普通の(BSGS)でできます.
例題
luogu4195
コード#コード#
#include
#include
#include
#include
#include
#include
#include
転載先:https://www.cnblogs.com/wxyww/p/BSGS.html