OSDN Git Service

Update bsgs.md
authorstevebraveman <42559612+stevebraveman@users.noreply.github.com>
Wed, 29 Aug 2018 00:04:18 +0000 (08:04 +0800)
committerGitHub <noreply@github.com>
Wed, 29 Aug 2018 00:04:18 +0000 (08:04 +0800)
docs/math/bsgs.md

index 31827b3..9a9decc 100644 (file)
@@ -87,3 +87,29 @@ $\therefore r = 0$.
 \r
 \r
 [BZOJ-1319](http://www.lydsy.com/JudgeOnline/problem.php?id=1319) 是一道模板题,代码可以在 [Steaunk的博客](https://blog.csdn.net/Steaunk/article/details/78988376) 中看到.\r
+\r
+\r
+### 3.0 扩展篇\r
+\r
+上文提到的情况是 $ c $ 为素数的情况,如果 $ c $ 不是素数呢?\r
+\r
+这就需要用到扩展BSGS算法,不要求 $ c $ 为素数!\r
+\r
+扩展BSGS用到了同余的一条性质:\r
+\r
+令 $ d=gcd(a,c) ,a=m \times d,b=n \times d,p=k \times d$;\r
+则 $ m \times d \equiv b \times d (mod c \times d) $ 等价于 $ m \equiv n(mod k) $\r
+所以我们要先消除因子:\r
+```cpp\r
+d=1,num=0;\r
+while(gcd(a,c)!=1){\r
+    if(b%gcd(a,c)!=0) \\无解\r
+    b\=gcd(a,c);\r
+    c\=gcd(a,c);\r
+    d*=a/gcd(a,c);\r
+    num++;\r
+}\r
+```\r
+消除完后,就变成了 $ d \times m^{x-num} \equiv n (mod k) $,令 $ x=i \times m+j+num $,后面的做法就和普通BSGS一样了。\r
+\r
+注意,因为 $ i,j \le 0 $,所以 $ x \le num $ ,但不排除解小于等于 $ num $ 的情况,所以在消因子之前做一下 $ \Theta(\log_2 p) $ 枚举,直接验证 $ a^i mod c = b $ ,这样就能避免这种情况。\r