本週總結 雜湊表+逆元儲存原根的離散對數

weixin_45608039 多巴胺發表於2020-11-30

如果要打表儲存某個素數的原根的所有的相關的離散對數,而這個素數又比較大,那麼可以通過雜湊表和逆元結合來儲存,g^z =g^km+r,g為原根,r=z%m; g^m * x =1%p; 那麼如果y=g^z,
yx=g^e,
yx=g^(z-m) (g^m) x%p = ( g^e)%p; 由於(g^m) x=1%p;
那麼 z=m+e;
那麼根據這個性質,就可以建立這樣一個雜湊表,假設素數大小約為10000,那麼,可以建一個100長度的雜湊表,所掛連結串列的長度也為100,那麼上面的m的值就是100,建立起1到100這一百個離散對數與g的次方的雜湊表後,在查詢y對應值的過程中,如果找不到,就乘以g^m的逆元后繼續找,若找到後,相應的離散對數值加上m,這樣的話就可以吧10000長度的表長縮短為幾百,並且查詢過程最壞也就是查詢100次,由於是對模素數的值進行雜湊,所得到的的雜湊表的衝突較小,這樣用時間換空間,就可以取得不錯的效果,當素數的大小達到1e7或1e8時,就能大大降低空間複雜度。
參考的網上的程式碼。

struct HASH_TABLE {
    ll top, gm, inv, m, pri;
    ll hash_table[hash_size], mp[hash_size];
    ll head[hash_size], nxt[hash_size];
    void init() {
        top = 1;
        memset(hash_table, 0, sizeof hash_table);
        memset(nxt, 0, sizeof nxt);
        memset(head, -1, sizeof head);
    }
    void init_table(ll g, ll p) { 
        m = maxn; ll e = 1;
        for(ll i = 0; i < m; i++) {
            ll id = e % hash_size;
            if(~head[id]) nxt[top] = head[id];
            head[id] = top;
            hash_table[top] = e; mp[top] = i;
            e = e * g % p; top++;
        }
        gm = e; pri = p;
        inv = exgcd(gm, p, 1);
    }
    ll query(ll x) {
        for(ll i = 0; i <= pri / m; i++) {
            ll id = x % hash_size;
            ll hd = head[id];
            if(~hd) for( ; hd; hd = nxt[hd]) {
                if(hash_table[hd] == x) return i * m + mp[hd];
            }
            x = x * inv % pri;
        }
        return -1;
    }
 
} hs;
 

盧卡斯定理由於複雜度是o(p),卡點經常是素數太大,詢問次數太多,或者是一個數可以分解成多個大素數相乘,從而使直接盧卡斯的時間複雜度較高,這時候就要預處理以及運用擴充套件盧卡斯定理的一些知識,但不是對擴充套件盧卡斯定理的模板的直接套用。

由於原根有一條較強的性質g的1到fi(p)次方對應1到p-1,所以在涉及到有關模p情況下的(x)^y的這種形式,x就可以用g的相應次方來替換掉,從而得到進一步的結果,也方便運用尤拉函式,gcd進行一些推導。

對於數學漸漸的有一些感覺了,雖然在做一些題目的過程中經常被一些小的細節卡很長時間,細節多的話一兩天都不能完全搞定。很難從一種形式過度到另一種形式,但理解起來沒有那麼費勁了,細節上的過度點很重要,比如說 x|m*p,那麼p就是x/gcd(m,x)的倍數,這樣就從整除引入了gcd,其實就是把x和m的共同因子去掉,又由於m/gcd(m,x)與x/gcd(m,x)互素,那麼x中剩下的因子就只能由p來包含。本質上還是因數與因數之間的關係的另一種表現形式, 其實,整個整數集合的各種關係都是以素數,因數為本質的各種表現形式。

接觸了一些有關莫比烏斯的一些東西,其實也就是把之前的知識點全部融入到了一個新的體系中,銜接更緊密了,如果把莫比烏斯涉及的推導以及之前的各種知識點慢慢的都關聯到一起,那麼一些細節過度點的尋找銜接就會有所突破。

在這裡插入圖片描述

在這裡插入圖片描述
在這裡插入圖片描述

相關文章