ホームに戻る
 オイラー関数

// オイラー関数ではn以下のnと互いに素な自然数の個数を求めます。
// O(N^(1/2))
long long euler_phi(ll n){
  long long res = n;
  for(long long i = 2; i*i <= n; i++){
    if(n % i == 0){
      res = res / i * (i-1);
      for(;n % i == 0; n /= i);
    }
  }
  if(n != 1)res = res / n * (n-1);
  return res;
}

// テーブルの作成 O(MAX_N)程度
long long euler[MAX_N];

void euler_phi(){
  for(long long i = 0; i < MAX_N; i++)euler[i] = i;
  for(long long i = 2; i < MAX_N; i++){
    if(euler[i] == i){
      for(long long j = i; j < MAX_N; j += i)euler[j] = euler[j] / i *(i-1);
    }
  }
}

inserted by FC2 system