先看這篇題解
下面是一些註釋
首先,這篇題解的做法相當於是跟藍書上插入查詢的物件剛好反過來,也沒有問題
然後,是對這篇題解存前兩個的解釋
首先是為什麼會存在這個問題?我們考慮\(a^{p_1t}\)和\(a^{p_2t}\),其中\(p_1<p_2\)而且\(a^{p_1t}\equiv a^{p_2t} (mod\: p)\)
那麼我們在列舉\(q\)的時候,我們是兩種情況都要考慮的,因為此時最開始的那個等式的變換不是充要條件,我們不能漏掉任何一種可能的解
然而這樣就會提升複雜度。這篇題解的解決方法是,我們設所有滿足這樣條件的\(p\)的集合是{\(p_1,p_2,...,p_k\)}(假設嚴格遞增),那麼我們只用檢驗\(p_1\)和\(p_2\)即可。原因如下:由於\(a^{p_it}\)同餘的值都相等,所以他們現在一定進入了一個指數迴圈節上的某一點;由於\(q<t\),\(p_1t-q\)可能跳出指數迴圈節,但是\(p_it-q\)(\(i>1\))不可能跳出指數迴圈節,而且每一個\(p_it-q\)所在節點都一樣,所以我們只用檢驗前兩個。下面給出一張圖來幫助理解(這是底數是\(124\),模數是\(495616\)的情況)
比如\(p_it\)在\(245760\)這個點上,那麼\(p_1t-q\)可能會跳出這個環,走到前面的那條鏈上的某一節點,但是\(p_it-q\)(\(i>1\))一定都是在\(245760\)這個點上
我們如果按照藍書的做法,也是可以這麼做的,但是保留的就是\(a^q\)的最大和次大的\(q\)了。設此時這個集合是{\(q_1,q_2,...,q_k\)}(假設嚴格遞減),那麼這些點仍然在迴圈節上,而注意\(pt>q_1\),所以\(pt\)也在迴圈節上;那麼\(pt-q_1\)可能跳出迴圈節,但是\(pt-q_i\)(\(i>1\))就不可能跳出迴圈節了