0x32.3 互质与欧拉函数

互质定义

\(\forall a, b \in \mathbb N\),若 \(\gcd(a, b)=1\),则称\(a, b\)互质。

注:\(\gcd(a, b, c)=1\)称为\(a, b, c\)互质。注意与三个数两两互质区分。

欧拉函数的定义

\(1~n\)中与\(n\)互质的数的个数称为欧拉函数,记为$ \varphi (N)$。

  • 公式1:如果\(p\)是素数且\(k \ge 1\),则

\[\varphi (p^k) = p^k - p^{k - 1} \]

  • 公式2: 如果\(\gcd(m, n)=1\),那么

\[\varphi (mn) = \varphi (m)\varphi (n) \]

  • 公式3: 若\(N={p_1}^{c_1}{p_2}^{c_2}{p_3}^{c_3}...{p_n}^{c_n}\),其中\(p_1, p_2, p_3..., p_n\)是质数。
    那么\(\varphi (N) = N * (1 - \frac 1{p_1})* (1 - \frac 1{p_2})* (1 - \frac 1{p_3})* ... * (1 - \frac 1{p_n})\)

练习:

(1)若\(\varphi (n) = n / 2\)

(2)若 \(\varphi (n) = n / 3\)

(3)若\(\varphi (n ) = n / 6\)

求满足条件的n的可能的值。

求欧拉函数(对单个数n,时间复杂度\(O(\sqrt n)\)

int phi(int n)
{
    int ans = n;
    for (int i = 2; i <= sqrt(n); i++)
    {
        if (n % i == 0)
        {
            ans = ans / i * (i - 1);
            while (n % i == 0) n /= i;
        }
    }
    if (n > 1) ans = ans / n * (n - 1);
}

求2 ~ n中每个数的欧拉函数(时间复杂度\(O(nloglogn)\)

void euler(int n)
{
    for (int i = 2; i <= n; i++) phi[i] = I;
    for (int i = 2; i <= n; i++)
    {
        if (phi[i] == i) // 如果i 是质数
        {
            for (int j = 1; j <= n / i; j++)
                phi[j * i] = phi[j * i] / i * (i - 1);
        }
    }
}

线性时间求2 ~ n中每个数的欧拉函数(时间复杂度\(O(n)\)
\(p \mid n\)\(p^2 \mid n\),则 $ \varphi (n) = \varphi (n/p) * p\( 若\)p \mid n$且 \(p^2 \nmid n\),则$ \varphi (n) = \varphi (n/p) * (p - 1)$

int prime[N], m;  // 用来保存质数,m表示当前质数的个数
bool v[N]; // v[i] = 1表示i不是质数
int phi[N]; // 记录i的欧拉函数值

void euler(int n)
{
    for (int i = 2; i <= n; i++)
    {
        if (!v[i]) { prime[++m] = i; phi[i] = i - 1; }
        for (int j = 1; j <= m && prime[j] <= n / i; j++)
        {
            v[prime[j] * i] = 1;
            if (i % prime[j] == 0)
            {
                phi[i * prime[j]] = phi[i] * prime[j];
                break;
            }
            phi[i * prime[j]] = phi[i] * (prime[j] - 1);
        }  
    }
}

例 可见的点

在一个平面直角坐标系的第一象限内,如果一个点(x,y)与原点(0,0)的连线中没有通过其他任何点,则称该点在原点处是可见的。

例如,点(4,2)就是不可见的,因为它与原点的连线会通过点(2,1)。

部分可见点与原点的连线如下图所示:

编写一个程序,计算给定整数N的情况下,满足0≤x,y≤N
的可见点(x,y)的数量(可见点不包括原点)。

posted @ 2020-03-09 00:06  keik  阅读(166)  评论(0)    收藏  举报