[探究] OI中各種初級數論算法相關


嗯,寫這個是因為我太弱了\(ORZ\).

#\(\mathcal{\color{silver}{1 \ \ Linear \ \ Sieve \ \ Method \ \ of \ \ Prime}}\)線性篩素數

嗯,其實對於這個而言,無非就是一個\(break\)不易理解而已。

if(! (i % prime[j])) break ;

那么我們先來分析線性篩的復雜度,嗯,很顯然因為是\(O(n)\)才稱其為線性篩法。所以也就是說,對於每個合數,我們只讓它被篩去一次。那么線性篩是如何保證的呢?答:每個合數都會被自己最小的質因子篩掉

下面讓我們來分析合理性,說是證明其實就是邏輯演繹

證明一:在線性篩法中,每個合數都會被自己最小的質因子篩掉。

我們令\(N\)為一個合數,且他的標准分解式為$$N = p_1^{k_1}p_2^{k_2}p_3^{k_3}...p_t^{k_t}$$不妨令$$p_1 < p_2 < p_3... <p_t$$ 我們考慮當用\(p_1\)篩除時,令$$N'=\frac{N}{p_1}$$那么會因為\(p_i\)會第一次被使用而使得\(N\)被成功篩掉(\(k_1\)的值無關緊要,即無論\(N'\)是否是\(i\)的倍數,只會在這之后跳出)。但是我們考慮,如果用\(p_s \ \ (s \neq 1)\)篩除的話,那么若令$$i = \frac{N}{p_s}$$,則一定有$$ p_1|i$$從而會使得在\(prime[j]\)剛枚舉到\(p_1\)還未枚舉到\(p_s\)時跳出,使其不能被篩掉。

所以得出結論,在線性篩法中,每個合數都會且僅會被自己最小的質因子篩掉。

證明二:線篩中,每個合數當前不被篩的原因是因為它要被放到之后去篩。

對於\(N\)的兩個因子\(p_r < p_s\),他們會分別在\(i = \frac{N}{p_r}\)\(i' = \frac{N}{p_s}\)時篩掉,因為\(p_r< p_s\),所以會有\(i > i`\)。結合證明一,由於\(N\)一定會被最小的\(p_i\)篩除,所以可以得出此時的\(i\)一定為最大,所以必須等到所枚舉的\(i\)更大時,\(N\)才會被篩除。

#\(\mathcal{\color{gold}{2 \ \ Sieve \ \ Method \ \ of \ \ Euler}}\)歐拉篩

首先我們需要有一個前置技能:\(\varphi(x) \times \phi(y) = \varphi(x \times y) <=>(x, y) = 1\)

那么類比線性篩而言,我們可以發現,對於一個素數\(p\)而言,\(\varphi(p)=p-1\),那么因為凡是素數必然在合數之前被篩到,所以我們可以考慮以此為基進行歐拉篩。那么,由於若\(W=a\times{b}\)\(gcd(a,b)=1\),就會有\(\varphi(W)=\varphi(a)\times \varphi(b)\),所以有

else 
phi[i*prime[j]]=phi[i]*phi[prime[j]];

那么對於另一種情況\(w = i \times j\),\(i \ \ mod \ \ j = 0\)而言,我們考慮有$$i=j^{n-1} \times {x}$$且其中\(gcd(j^n,x)=1\)

那么此時就會有$$\varphi(w)=\varphi(j^n) \times \varphi(x)$$

而因為事實上$$\varphi(j^{n})=j^n-j^{n-1}$$

故$$\varphi(x) \times (j^{n-1}-j^{n-2})=\varphi(x) \times \varphi(j^{n-1})= \varphi(i)$$

所以會有$$\varphi(w)=\varphi(x) \times j\times(j^{n-1}-j^{n-2})$$

\[\varphi(w) = \varphi(i) \times j \]

所以:

if(i%prime[j]==0)
{
	phi[i*prime[j]]=prime[j]*phi[i];
	break;
}

#\(\mathcal{\color{cyan}{3 \ \ Linear \ \ Recursion \ \ of \ \ Inverse \ \ Element}}\)線性推逆元

首先來思考逆元是個什么東西:

\(a \times x \equiv 1 (\mod \ \ b)\) ,且 \(a\)\(b\) 互質,那么我們就能定義: \(x\)\(a\)\(mod \ \ b\)的逆元,記為 \(a^{-1}\)

再來思考逆元有個什么用處:

對於 \(\frac{a}{b} (mod \ \ {p})\) ,我們就可以求出 \(b\) 在 $ mod \ \ p $下的逆元,然后乘上 \(a\),再\(mod \ \ p\),即可得出結果。

好的那么我們來看一下這玩意兒怎么線性推\(QAQ\):

首先我們令\(p = k \times i + r,0 < r < i\)

然后顯然的是

\[k \times i + r \equiv 0 (mod \ \ p) \]

兩邊同時乘上\(i^{-1}\)\(r^{-1}\)

\[k \times r^{-1} + i^{-1} \equiv 0 (mod \ \ p) \]

移個小項

\[i^{-1} \equiv -k \times r^{-1} (mod \ \ p) \]

換個元

\[i^{-1} \equiv \lfloor {\frac{p}{i}} \rfloor \times (p \ \ mod \ \ i)^{-1} (mod \ \ p) \]

於是就華麗麗地結束了\(qwq\)

inv[1]=1;
for(i = 2; i <= n; i ++)
{
	inv[i] = - (p / i) * inv[p % i] ;
	inv[i] = (inv[i] % p + p ) % p ;
}

#\(\mathcal{\color{midnightblue}{4 \ \ Euler‘s \ \ Formula \ \ }}\)歐拉公式

歐拉公式是世界上最美妙的公式 ——蘇格拉底【霧

首先讓我們來看看這個公式的樣子:$$e^{ix} = cosx + isinx$$其中\(i\)復數單位:$$i = \sqrt{-1}$$
那么它美妙在哪里呢?我們會發現它聯系了最重要的無理數之一——\(e\)、復數域\(i\)和基本初等函數\(sin\)\(cos\)這些東西,所以被冠以“最優美、最偉大橋梁”“數學上的天橋”等美稱。

但是這遠遠不是最美妙的,最美妙的是,當你取\(x = \pi\)時,會有$$e^{\pi i} + 1 = 0$$還有什么比這更美妙嗎?我們通過這個公式,成功地將兩個最重要的超越數\(\pi\)\(e\)、復數中的“地基”\(i\)、自然數中最美妙的\(0\)\(1\),在這一個公式中被我們盡收眼底\(qwq\)

那么,現在有沒有引起你的興趣?如果有,我們來看證明吧:

首先我們需要前置技能——泰勒展開

泰勒公式是將一個在\(x=x_0\)處具有\(n\)階導數的函數\(f(x)\)利用關於\((x-x_0)\)\(n\)次多項式來逼近函數的方法。

若函數\(f(x)\)在包含\(x_0\)的某個閉區間\([a,b]\)上具有\(n\)階導數,且在開區間\((a,b)\)上具有\((n+1)\)階導數,則對閉區間\([a,b]\)上任意一點\(x\),成立下式:

——\(baidu\)百科

這就是泰勒展開式,正確性證明暫時不會,右邊的那個冪級數又叫做泰勒級數,我們可以理解為我們把某些特定的函數展開成了冪級數的形式。

\(ps\):如果無法理解的話……看高數去吧!【下冊即可

好啦,扯這么多其實就是說,我們右邊的\(sin\)\(cos\)都是可以被展開……換種方式表示的\(qwq\).

那么他們展開之后大約是這樣子:$$\forall x, sinx = \sum\limits_{n = 0}^{\infty}{\frac{(-1)^n}{2n + 1}!x^{2n + 1}}$$ $$\forall x, cosx = \sum\limits_{n=0}^{\infty}{\frac{(-1)^n}{2n}!x^{2n}}$$

等式左邊$$e^x = \sum\limits_{n=0}^{\infty}{\frac{1}{n!}}$$而我們來看\(i\)的次冪們$$i^1 = i,i^2 = -1, i^3 = -i, i^4 = 1.....$$那我們的左邊可以得到

而因為對於\(sin\)\(cos\)的泰勒級數我們可以寫成這樣:


所以有$$e^{ix} = cosx + isinx$$

證畢。

\(ps:\)如果你細心+聰明的話,會看到無理數\(e\)的遞推公式哦!

# \(\color{PINK}{\mathcal{5 \ \ Number-theory \ \ Partitioning}}\)數論分塊

好的,數論分塊也叫做整除分塊,是數學問題中一個優化時間復雜度的技巧,通常解決的是一個子問題——沒錯,是用來解決一個很常見的子問題,或者與其相似的子問題。

\(233\)也就是說大部分情況他就只有一個用處:

求$$\sum \limits_{i=1}^{n}\lfloor \frac{n}{i} \rfloor$$並要求復雜度\(\Theta(\sqrt n)\)

這個問題優化的方向是縮小規模——之所以可以縮小規模,是因為我們發現原來當\(n=7\) 的時候,\(i=5\)\(i=6\)以及\(i=7\)的值都一樣,於是我們思考可以分塊亂搞一下。那么分塊怎么分塊呢?我們可以有以下這個程序:

for(l = 1 ; l <= N ; l = r + 1){
        r = N / (N / l) ;
        Ans += (r - l + 1) * (N / l) ;
    }

看起來……比較明朗的是這確實是一個分塊,並且跟我們上文提及的指導思想十分的相似……

\(However\)你還是不知道他到底是怎么分的塊\(\rm{TAT}\)

那么精彩的證明就要開始了惹~

\(\color{red}{Task1}\)先證一下“指導思想”

這個\(emmm\)應該是復雜度的證明\(233\)

命題:$$\forall n \in N+, i \leq n =>cnt(\lfloor \frac {n}{i}\rfloor) < 2\sqrt{n}$$其中\(cnt(f(x))\)表示整值多項式\(f(x)\)的值域大小。

(人話版本:我們接下來要證明\(\lfloor \frac{n}{i}\rfloor\) 最多有\(2 \sqrt n - 1\)種取值,也就是證我們最多要進行的運算次數是\(\sqrt n\)級別的)

以下是證明:

我們分成兩種情況來考慮:\(i \leq \sqrt n\)\(i > \sqrt n\)

我們先思考簡單點的,當\(i > \sqrt n\)時,此時對於全部的\(\lfloor \frac {n}{i}\rfloor\)最大不會超過\(\sqrt n\) \(- 1\),所以其取值不會超過\(\sqrt n\)的級別。

那么對於\(i \leq n\)的情況,我們思考去證明另一件事——證明\(\lfloor \frac {n}{i}\rfloor \neq \lfloor \frac {n}{i + 1}\rfloor\)

那么我們此處不妨用反證法,假設\(\exists \lfloor \frac {n}{i}\rfloor = \lfloor \frac {n}{i + 1}\rfloor\).我們不妨令\(n = i \cdot k + q ~ (0 \leq q < i)\) ,則我們可以得到$$i \leq \sqrt n \leq k$$ 繼而得到$$k > q$$

那么根據假設,我們很顯然會有$$n = (i + 1) \cdot k + q', (0 \leq q' < i+1)$$

也就會有下面這個等式$$n = i \cdot k + k + q' = i \cdot k + q + (k + q' - q) = n + (k + q' - q)$$ 但是因為我們已經證完了的\(k > q\) 所以等式左邊一定不會等於等式右邊……所以出現矛盾。

那么我們就通過反證法證明了結論\(\lfloor \frac {n}{i}\rfloor \neq \lfloor \frac {n}{i + 1}\rfloor\),從而有幾個不同的\(i \leq n\)就會有幾個不同的取值。

所以得出結論,\(cnt(\lfloor \frac {n}{i}\rfloor) < 2\sqrt n\)

\[\mathcal{Q.E.D.} \]

好的,剛才的證明和正確性沒啥關系……好吧跟時間復雜度的正確性有關系……那就跟正確性有關系好了……我在說些什么奇怪的東西……2333333333333333333

接下來證明那一句玄學的

r = N / (N / l) ;

\(\color{red}{Task2}\)再證一下正確性

首先我們意會一下……我們所做的工作,就是要找出極小的\(l\)和極大的\(r\),對於給定的\(\omega\)有$ c \in [l,r]\(,\)\lfloor \frac{n}{c} \rfloor = \omega$ 。那么根據我們上一個證明中的下半部分我們可以知道,這就是一個極大塊,並且下一個極大塊是從\(r + 1\)開始的,因為極大塊必然滿足\(\lfloor \frac {n}{r}\rfloor \neq \lfloor \frac {n}{r + 1}\rfloor\).

那么我們要找的就是每個極大塊的右斷點\(r\)

命題:如果已知\(n,p \in N+,p \leq n\),那么滿足\(\lfloor \frac {n}{p}\rfloor = \lfloor \frac {n}{i}\rfloor\)的最大的\(i\)滿足$$i = \lfloor \frac {n}{\lfloor \frac{n}{p} \rfloor}\rfloor $$

(其實這個玩意兒是可以意會出來的\(233\))

以下是證明:

我們不妨繼續分類討論:

\(p \leq \sqrt n\)時:

不妨繼續設\(n = k \cdot p + q, (0 \leq q < p)\)

那么我們可以得到比較顯然的結論是$$\lfloor \frac {n}{\lfloor \frac{n}{p} \rfloor}\rfloor = \lfloor \frac {n}{k} \rfloor$$且因為當\(p \leq \sqrt n\)時,\(\lfloor \frac {n}{p}\rfloor\)互不相同,所以\(i_{maxp} = p\),我們只需要證明 $$p= \lfloor \frac {n}{k} \rfloor$$ 而這個結論是顯然的。因為\(q < p \leq k\) ,所以得證\(p = \lfloor \frac {n}{k}\rfloor\)

\(p > \sqrt n\) 時:

直接證似乎不是很容易,那么我們思考一個轉化。因為對於一個\(p\)我們要證明的\(i_{maxp}\)有兩個性質:$$\lfloor \frac {n}{i_{maxp}}\rfloor = \lfloor \frac {n}{p}\rfloor = k$$並且$$\lfloor \frac {n}{i_{maxp} + 1}\rfloor \neq \lfloor \frac {n}{p}\rfloor$$

那么由於$\lfloor \frac {n}{\lfloor \frac{n}{p} \rfloor}\rfloor = \lfloor \frac {n}{k} \rfloor $ 所以我們不妨把要求的\(i_{maxp}\)換成$\lfloor \frac {n}{k} \rfloor $ 並說明$$\lfloor \frac {n}{\lfloor \frac {n}{k}\rfloor}\rfloor = \lfloor \frac {n}{p}\rfloor = k$$並且 $$\lfloor \frac {n}{ \lfloor \frac {n}{k}\rfloor+ 1}\rfloor \neq \lfloor \frac {n}{p}\rfloor$$

而此時由於\(k < \sqrt n\), 所以我們發現原來就是當\(p \leq \sqrt n\)時的結論。於是我們就無比迅速地得到了\(\lfloor \frac {n}{\lfloor \frac {n}{k}\rfloor}\rfloor = k\)並且由\(Task1\)中的結論推出了\(\lfloor \frac {n}{ \lfloor \frac {n}{k}\rfloor+ 1}\rfloor \neq k\)

於是乎:

\[\mathcal{Q.E.D.} \]

那么我們就證完了!想不到這個這么顯然的結論這么好背的結論居然是迄今為止這篇博客中我花費心血最多的\(233\)……

嗯,我被自己帥到了嘿嘿~

#\(\mathcal{\color{lavender}{6 ~Something~About~Ackerman~Function}}\) 阿克曼函數相關

不知道為什么就開始頹這個函數……

感覺很牛13的樣子……

以下大部分內容來自\(Wiki\)(主要是智障樓主找不到更好的材料了)

首先我們先解釋一下箭頭表示法這個東西(一時編不出什么更好的名字)

我們用\(\uparrow\)表示“迭代相乘”,譬如說\(2\uparrow4\)表示\(2^4\),而\(3\uparrow4\)則表示\(3^4\)

同時,我們用\(\uparrow \uparrow\)表示“迭代取冪”,它的意思是\(a \uparrow \uparrow b = a^{a^{\cdot^{ \cdot^{ \cdot ^a}}}}\) ,等式右邊一共有\(b\)\(a\)

同時,我們用\(\uparrow \uparrow \uparrow\)表示“迭代迭代取冪”……

好吧,其實這玩意兒是遞歸定義的,借鑒的\(wiki\)的我承認\(233\)……

\[a \uparrow ^n b = \begin{cases} a^b, & \mbox{if }n\mbox{ = 1} \\1, & \mbox{if }b\mbox{ = 0} \\a\uparrow ^ {n-1}(a \uparrow ^n (b - 1)), & \mbox{otherwise}\end{cases}\]

那么這東西用處是啥呢?其實我們如果用它來表示大數的話,是比科學計數法更容易的,比如\(a^{19260817}\)就看起來很繁瑣是吧\(233\)

那么接下來,我們來介紹真正地\(Ackerman\)函數。很巧的是,這東西也是遞歸定義的:

\[A(m,n)= \begin{cases}n+1, & \mbox{if }m\mbox{ = 0} \\A(m-1,1), & \mbox{if }m\mbox{ > 0 & n = 0} \\A(m-1,A(m, n-1)), & \mbox{otherwise}\end{cases}\]

並且,這東西十分的,當\(m \geq 4 ~ \& ~n > 2\)的時候就已經十分不可算了,因為事實上\(A(4,3) = 2^{65536} - 3\),不知道會不會爆\(python~23333\)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM