1. 程式人生 > >擴充套件BSGS 學習筆記

擴充套件BSGS 學習筆記

首先你在學擴充套件BSGS前需要先了解BSGS。如果你還不瞭解BSGS或者對BSGS有什麼疑問,可以看看我的BSGS講解,我覺得基本是全網最詳細的了。
我們知道,BSGS可以解決求ax=b(modp)的最小非負整數x,它的應用條件是要求底數a與模數p互質的,那麼如果不互質應該怎麼辦呢?這時候就要用到擴充套件BSGS了。
擴充套件BSGS是在BSGS的基礎上進行一些改進。既然互質的我們會做了,我們就考慮把不互質的轉化為互質的。
我們設d=gcd(a,p),如果d不能整除b,那麼只有b=1時有解,即x=0,否則就無解。
首先先說明一個定理:

c|ac|bc|p

a=b(modp)那麼ac=bc(modpc)
好,接下來開始我們的推導。
如果d|bd1,那麼ax=b(modp) ax1a=b(modp) ax1ad=bd(modpd) 如果此時的apd仍然不互質,那麼我們就繼續分解,直到api=1kdi互質。
此時axkaki=1kdi=bi=
1kdi(modpi=1kdi)

對於已經求到的任何一個k,如果ikdi不能整除b,那麼唯一可能的解就是x=0,所以如果我們在開頭先特判了x=0的情況,在這裡只要遇到不能整除的情況就是無解。
對於(i=1kdi)|b,我們首先列舉