1. 程式人生 > 實用技巧 >超級詳細的Maven使用教程

超級詳細的Maven使用教程

學習部落格:https://blog.csdn.net/stevensonson/article/details/85845334

之前就想學過,但是是在 \(oiwiki\) 上學的,那個其實寫的有些錯誤,而且挺難懂的,所以還是推薦自己找部落格學習。

什麼是二次剩餘?

如果存在一個整數 \(x\),滿足 \(x^2\equiv n \,(mod \,p)\) ,那麼稱 \(n\) 是模 \(p\) 的二次剩餘。

對於方程 \(x^2\equiv n \,(mod \,p)\) ,有 \(\frac{p-1}{2}\) 不同的 \(n\) ,使得方程有解

首先明確不考慮 \(n==0\) (二次剩餘的定義)

因為對於一個\(u\),如果大於 \(p\),即\(u=x*p+y\) ,模 \(p\) 之後等價於 \(y\),所以我們首先將 \(u\) 限制在 \([1,p-1]\) 這個範圍內。

首先證明有兩個解:

\(u^2\equiv n \,mod \,p\) ,那麼一定存在 \((p-u)^2 \equiv n \,mod\,p\) 一定成立。

所以對於一個數 \(n\) ,如果存在解,那麼至少存在兩個。

再而證明最多兩個解:

\(x_1^2\equiv n\,mod\,p\)\(x_2^2\equiv n\,mod\,p\)

那麼 \(x_2^2-x_1^2\equiv 0\,mod\,p\)

,所以 \((x_1+x_2)*(x_1-x_2)|p\) ,因為 \(0<x1,x2<p\) ,所以 \((x_1+x_2)=p\) ,這個解就是上式的 \(u\)\(p-u\) ,所以最多隻有兩個解。

綜上所述,所以有 $\frac{p-1}{2} $二次剩餘的解 \(n\)\([1,p-1]\) 中對應了兩個數,所以一定存在 \(\frac{p-1}{2}\) 個數沒有在 \([1,p-1]\) 中沒對應數,那麼這些數 \(y\) 永遠不會對應任何 \(x\) 使得 \(x^2\equiv y \,mod\,p\) , 因為大於 \(p-1\) 的數都可轉化到 \([0,p-1]\)

中來。

判斷一個數是否是模 \(p\) 的二次剩餘,勒讓德符號 \(\frac{n}{p}\)

如果 \(n\) 是模 \(p\) 的二次剩餘,那麼 \(\frac{n}{p}=1\)

如果 \(n\) 不是模 \(p\) 的二次剩餘,那麼 \(\frac{n}{p}=-1\)

如果 \(p|n\) ,那麼 \(\frac{n}{p}=0\)

結論:

如果p是一個奇質數,那麼 \(\frac{n}{p}=n^{\frac{p-1}{2}}\)

最後也是最重要的:求解二次剩餘

\([0,p-1]\) 隨機挑一個數 \(a\) ,令 \(w=a^2-n\) ,如果 \(w\) 是模 \(p\) 的一個非二次剩餘,那麼 \((a+\sqrt{w})^{\frac{p+1}{2}}\) 是一組二次剩餘。

證明:

\((a+\sqrt{w})^p \equiv a^p+(\sqrt{w})^p\,mod\,p\)

由費馬小定理可得:\(a^p\equiv a\,mod\,p\)

因為 \(w\) 是模 \(p\) 的一個非二次剩餘,而 \(p\) 又是一個奇質數,所以 \(w^{\frac{p-1}{2}}=-1\) 那麼 \(\sqrt{w}^p=-\sqrt{w}\)

所以 $(a+\sqrt{w})^p \equiv a^p+(\sqrt{w})^p \equiv (a-\sqrt{w}),mod,p $

所以\((a+\sqrt{w})^{p+1} \equiv (a-\sqrt{w})*(a+\sqrt{w}) \equiv a^2-w \equiv n \,mod\,p\)

證畢!

struct num {  //建立一個複數域
    ll x, y;
};
ll w;
num mul(num a, num b, ll p) {  //複數乘法
    num ans = {0, 0};
    ans.x = ((a.x * b.x % p + a.y * b.y % p * w % p) % p + p) % p;
    ans.y = ((a.x * b.y % p + a.y * b.x % p) % p + p) % p;
    return ans;
}

ll binpow_real(ll a, ll b, ll p) {  //實部快速冪
    ll ans = 1;
    while (b) {
        if (b & 1) ans = ans * a % p;
        a = a * a % p;
        b >>= 1;
    }
    return ans % p;
}

ll binpow_imag(num a, ll b, ll p) {  //虛部快速冪
    num ans = {1, 0};
    while (b) {
        if (b & 1) ans = mul(ans, a, p);
        a = mul(a, a, p);
        b >>= 1;
    }
    return ans.x % p;
}

ll cipolla(ll n, ll p) {
    n %= p;
    if (p == 2) return n;
    if (binpow_real(n, (p - 1) / 2, p) == p - 1) return -1;
    ll a;
    srand(time(NULL));
    while (1) {  //生成隨機數再檢驗找到滿足非二次剩餘的a
        a = rand() % p;
        w = ((a * a % p - n) % p + p) % p;
        if (binpow_real(w, (p - 1) / 2, p) == p - 1) break;
    }
    num x = {a, 1};
    return binpow_imag(x, (p + 1) / 2, p);
}