1. 程式人生 > >線性篩及其擴展-積性函數

線性篩及其擴展-積性函數

rac line 表示 var class 代碼 就是 最小 多次

  • 線性篩
    • 埃氏篩
      • 對於每個數x,枚舉其倍數,將kx篩去。
      • 在埃氏篩過程中,每個數都會被篩掉多次,且對於每個數x,枚舉其倍數的次數為\(\frac{n}{x}\)
      • 故埃氏篩的時間復雜度為\(\sum_{i=1}^{n}\)\(\frac{n}{i}\)=n\(\sum_{i=1}^{n}\)\(\frac{1}{i}\)=\(n ln(n)\)
    • 歐拉篩
      • 在埃氏篩中,每個數會被篩掉多次,想要進一步下降復雜度,我們要求每個數只會被篩一次。
      • 要想將多種篩去x的方法固定(唯一)。我們就要采用一種方法—“最小表示法”,套用在這裏就是每個數被自己的最小質因子篩去。
      • 首先,為了優化時間復雜度,我們不難發現,並不需要對每個x,把每個x的所有倍數都篩一遍,只需要將\(pri_k\)
        x,(\(pri_k \leq x\))篩去即可。
        • 證明:
        • 一個數x要被篩去,x必然是合數,x=ab,(a<b<c) ,令a為質數,當我們用b篩時,一定能夠篩去x=ab。
      • 然後我們要求每個數都被自己最小質因數篩去,則當我們用b篩時,設b的最小質因子為\(pri_b\),對於\(pri_i \leq pri_b\),我們篩掉\(pri_i b\)就是被自己的最小值因數\(pri_i\)篩去。
  • 常見積性函數
    • 歐拉函數(\(\varphi(x)\))
      • \(\varphi(x)\)為積性函數
      • \(\varphi(x)\)的兩種計算式:
        • \(\varphi(x)\) = \(\varphi(a)\)
          . \(\varphi(b)\) (a,b互質)
        • \(\varphi(x)\) = x \(\prod_{i=1}^{k}\) (1-\(\frac{1}{p_i}\))
    • 套用歐拉篩篩法,每個數都被自己最小質因子篩去,就有兩種情況:
      • 該數最小質因子pri的次數為1,即x=pri\(\sum_{i=2}^{k}pi^{ri}\)
        • 直接套用積性函數的定義式\(\varphi(x)\) = \(\varphi(pri).\varphi(\) \(\frac{x}{pri})\) (pri與\(\frac{x}{pri}\)互質)
      • 該數最小質因子pri的次數>1,即x= \(pri^{r_1} * \sum_{i=2}^{k} pi^{ri}\)
        • \(\varphi(x)\)的定義式知\(\varphi(x) = x \prod_{i=1}^{k} (1- \frac{1}{pi})\)
        • \(\frac{x}{pri}\)與x沒有增加額外的質因子
        • 所以 \(\varphi(x) = pri * \frac{x}{pri} \prod_{i=1}^{k}(1- \frac{1}{pi})\) = \(pri *\varphi (\frac{x}{pri})\)
    • 代碼
  • 莫比烏斯函數\(\mu(x)\)
    • \(\mu(x)\)定義式: \(\mu(x)\) = {}
    • \(\mu(x)\) =\(\mu(a)\)*\(\mu(b)\) (a,b互質)
    • 套用歐拉篩篩法
      • 當該數最小質因子pri,次數為1,同\(\varphi(x)\), \(\mu(x)\) =\(\mu(pri)\) . $\mu( $ \(\frac{x}{pri}\))
      • 當該數最小質因子pri,次數>1, \(\mu(x)\) = 0

線性篩及其擴展-積性函數