BSGS CQOI2018 破解D H協議

2021-09-16 12:20:33 字數 1381 閱讀 5589

bsgs演算法,又稱大小步演算法(某大神稱拔山蓋世演算法)。

主要用來解決 a^x=b(mod c)(c是質數),都是整數,已知a、b、c求x。

具體步驟如下: 先把x=i*m-j,其中m=ceil(sqrt(c)),(ceil是向上取整)。

這樣原式就變為a^(i*m-j)=b(mod c), 再變為a^j×b=a^(m*i) (mod c)。

列舉j(範圍0-m),將a^j×b存入hash表 列舉i(範圍1-m),從hash表中尋找第乙個滿足a^j×b=a^(m*i) (mod c)。

此時x=i*m-j即為所求。

在網上看到的其他題解大多用的是x=i*m+j,也可以做,只是會牽扯的求逆元,所以比較麻煩。使x=i*m-j就可以輕鬆避免這個問題了。

那麼肯定有人會有疑問為何只計算到m=ceil(sqrt(c))就可以確定答案呢?

x=i*m-j 也就是x 的最大值不會超過p,那超過p的怎麼辦 ?

有乙個公式 a^(k mod p-1)=a^k (mod p)

這個公式的推導需要用到費馬小定理

k mod p-1可以看做 k-m(p-1) ,原式可化成 a^k/(a^(p-1))^m=a^k (mod p)

根據費馬小定理 a^(p-1)=1 (mod p) 其中p為質數 ,a,p 互質,可得a^k/1^m=a^k (mod p) a^k=a^k (mod p) 得證。

給定質數p及其原根g

每組詢問給出 a=g^a(mod p), b=g^b(mod p), 求g^(ab)(mod p)。

對於給出的數 a, b, 我們只要求出 g^a(mod p)=a 的 a 值,然後再求 b^a = (g^b)^a = g^(ab) 就可以了。

// a = g ^ a (mod p)				(1)

// g ^ ( i * m - j ) = a (mod p) (2)

// g ^ (i * m) = g ^ j * a (mod p) (3)

#include using namespace std;

typedef long long ll;

const int inf = 0x7fffffff;

ll g, p, m, a, b, n;

map mp;

int ksm(ll x,ll k)

return ans;

}void init() // 把 g ^ (i * m) --> i * m 存入雜湊表(map)

}ll bsgs(ll a) // a = g ^ a(mod p) 求 a

}int main()

return 0;

}

CQOI 2018 破解D H協議

傳送門 題目描述 diffie hellman 金鑰交換協議是一種簡單有效的金鑰交換方法。它可以讓通訊雙方在沒有事先約定金鑰 密碼 的情況下,通過不安全的通道 可能被竊聽 建立乙個安全的金鑰 k kk,用於加密之後的通訊內容。假定通訊雙方名為 alice 和 bob,協議的工作過程描述如下 其中 m...

CQOI2018 破解D H協議

題目鏈結 已知 g a a 和 g b b 求 g bmod p 可以先求 a 再得 b a 也即,在 g a equiv a pmod p 中求 a 顯然 bsgs g 是原根,這就意味著 g t bmod p 0 leq t 如何加速?考慮一種拆分方法使得可以預處理一部分,即設 t i time...

PyCharm2018 安裝及破解方法

目錄 1 安裝 2 破解 pycharm就是python語言開發中乙個很受歡迎的ide,介面類似於visual studio,android studio,整合的功能也很多。然後會出現乙個選擇安裝目標路徑的提示,你可以自定義安裝路徑也可以選擇預設安裝路徑 預設安裝路徑是在c盤,以後執行軟體時會更加快...