前置知識:生日悖論
不考慮出生年份(假設每年都是 365 天),問:一個房間中至少多少人,才能使其中兩個人生日相同的機率達到\(50\%\)?
答案是23
考慮一個問題,設定一個資料n,在\([1,1000]\)裡隨機選取\(i\)個數(\(i=1\)時就是它自己),使它們之間有兩個數的差值為\(k。當\)i=1$時成功的機率是 \(\dfrac{1}{1000}\),當\(i=2\)時成功的機率是 \(\dfrac{1}{500}\)(考慮絕對值,\(k_2\)可以取$k_1-k \(或\)k_1+k\(),隨著\)i$的增大,這個機率也會增大最後趨向於1
1.利用最大公約數求出一個約數
n和某個數的公約數一定是n的約數,即\(\forall k \in\mathbf{N}_{+},\gcd(k,n) \mid n\),只要選取適當的k使得\(1<\gcd(k,n)< n\),,就能夠求得n的一個約數
滿足這個條件的k很多,n的因數的大部分倍數都可行
我們透過\(f(x)=(x^2+c)\bmod n\)來生成一個序列\(\{x_i\}\):隨機取一個\(x_1\),令\(x_2=f(x_1),x_3=f(x_2),\dots,x_i=f(x_{i-1})\),其中c是一個隨機選取的常數
舉個例子:
n=50,c=6,x_1=1,f(x) 生成的資料為:\(1, 7, 5, 31, 17, 45, 31, 17, 45, 31,\dots\)
可以發現在x以後,生成的數就在\(31,17,45\)之間迴圈了
如果將這些數如下圖一樣排列起來,會發現這個影像酷似一個\(\rho\),演算法也因此得名 rho
該式子滿足\(\forall x \equiv y(\bmod p), f(x)\equiv f(y)(\bmod p)\),其中\(p|n\)
證明:
若\(x\equiv y \pmod p\),則可以將它們表示為\(x=k_1p+a\),\(y=k_2p+a\),滿足\(k_1,k_2,a\in \mathbb{Z},a\in \left[0,p\right)\)。
\(f(x)=(x^2+c) \bmod n\),因此\(f(x)=x^2+c-kn\),其中\(k \in \mathbb{Z}\)。\[\begin{aligned} f(x) & = x^2+c-kn\\ & = (k_1p+a)^2+c-kn\\ & = k_1^2 p^2+2k_1pa+a^2+c-kn\\ & \equiv a^2+c \pmod p \end{aligned} \]同理,\(f(y) \equiv a^2+c \pmod p\),因此\(f(x) \equiv f(y) \pmod p\)。
根據生日悖論,序列中的不同值約為\(\sqrt{n}\)個,設\(m\)為\(n\)的最小非平凡因子,顯然有\(m\leq \sqrt{n}\)
將\(\{x_i\}\)的每一項對m取模,得到序列\(\{y_i\}\),根據生日悖論,不同值的個數約為\(O(n^{\frac{1}{4}})\)
實現上可以使用floyd判環或倍增最佳化