1. 程式人生 > >數論函數學習筆記之線性篩

數論函數學習筆記之線性篩

inline pri lse lin ini arp 學習筆記 學習 mod

其實主要是想發一下線性篩的板子,包括線性篩質數,歐拉函數和莫比烏斯函數。
當然也會有一點簡單的證明。


線性篩質數就不說啦。


然後加一個篩歐拉函數。
\(i\)為質數的時候,自然\(\varphi(i) = i - 1\)
\(n = mp\)
\(m \ \ mod \ \ p == 0\)的時候,有\(\varphi(n) = \varphi(m) * p\)
否則有\(\varphi(n) = \varphi(m) * (p - 1)\)


證明一下吧:
1.若\(m \ \ mod \ \ p == 0\),令\(m = k * p ^ x\),這樣保證了\(k, p\)互質。
所以
\(\varphi(n) = \varphi(k) * \varphi(p ^ {x + 1})\)


???\(= \varphi(k) * p ^ x * (p - 1)\)


然後看等式右邊:
\(\varphi(m) * p = \varphi(k) * \varphi(p ^ x) * p\)
??????$ = \varphi(k) * p ^ {x - 1} * (p - 1) * p$
??????$ = \varphi(k) * p ^ x * (p - 1)$
(也不知道這算不算證明)


至於\(m \ \ mod \ \ p \neq 0\)時,根據積性,\(\varphi(n) = \varphi(m) * (p - 1)\)


至於篩莫比烏斯函數,就更簡單了。
如果\(n\)
為質數,則\(\mu(n) = -1\)
\(m \ \ mod \ \ p == 0\),則\(\mu(n) = 0\),
否則\(\mu(n) = - \mu(m)\)

void init()
{
  phi[1] = mu[1] = 1;
  for(int i = 2; i <= n; ++i)
    {
      if(!v[i]) v[i] = i, prime[++prime[0]] = i, phi[i] = i - 1, mu[i] = -1;
      for(int j = 1; i * prime[j] <= n && j <= prime[0]; ++j)
    {
      int k = i * prime[j];
      v[k] = prime[j];
      if(i % prime[j] == 0)
        {
          phi[k] = prime[j] * phi[i];
          mu[k] = 0;
          break;
        }
      else phi[k] = (prime[j] - 1) * phi[i], mu[k] = -mu[i];
    }
    }
}

數論函數學習筆記之線性篩