算法学习系列(二十七):欧拉函数、欧拉定理、费马小定理

目录

  • 引言
  • 一、欧拉函数
    • 1.概念
    • 2.求每个数的欧拉函数
  • 二、线性筛法求欧拉函数
  • 三、欧拉定理,费马小定理

引言

本文主要介绍欧拉函数、线性筛法求欧拉函数,以及公式是怎样推导出来的,并且介绍了欧拉定理,以及费马小定理是怎样被推导出来的。

一、欧拉函数

1.概念

欧拉函数 ϕ ( N ) : 欧拉函数\phi(N): 欧拉函数ϕ(N) 1 ~ N中与N互质的数的个数,(互质:公约数只有1的两个自然数)
N = p 1 α 1 ⋅ p 2 α 2 ⋅ p 3 α 3 ⋅ ⋯ p k α k , ( p i 为质数 ) N = p_{1}^{\alpha_{1}} \cdot p_{2}^{\alpha_{2}} \cdot p_{3}^{\alpha_{3}} \cdot \cdots p_{k}^{\alpha_{k}},(p_{i}为质数) N=p1α1p2α2p3α3pkαk,(pi为质数) ϕ ( N ) = N ⋅ ( 1 − 1 1 − p 1 ) ⋅ ( 1 − 1 1 − p 2 ) ⋯ ( 1 − 1 1 − p k ) \phi(N)=N\cdot(1-\frac{1}{1-p_{1}})\cdot(1-\frac{1}{1-p_{2}})\cdots(1-\frac{1}{1-p_{k}}) ϕ(N)=N(11p11)(11p21)(11pk1)

2.求每个数的欧拉函数

题目描述:

给定 n 个正整数 ai,请你求出每个数的欧拉函数。

欧拉函数的定义
1∼N 中与 N 互质的数的个数被称为欧拉函数,记为 ϕ(N)。
若在算数基本定理中,N=pa11pa22…pamm,则:ϕ(N) = N×p1−1p1×p2−1p2×…×pm−1pm

输入格式
第一行包含整数 n。
接下来 n 行,每行包含一个正整数 ai。

输出格式
输出共 n 行,每行输出一个正整数 ai 的欧拉函数。

数据范围
1≤n≤100,1≤ai≤2×109

输入样例:
3
3
6
8
输出样例:
2
2
4

示例代码:

#include 
#include 

using namespace std;

int get_euler(int n)
{
    int res = n;
    for(int i = 2; i <= n / i; ++i)
    {
        if(n % i == 0)
        {
            res = res / i * (i - 1);  //为避免小数
            while(n % i == 0) n /= i;
        }
    }
    
    if(n > 1) res = res / n * (n - 1);
    
    return res;
}

int main()
{
    int n;
    scanf("%d", &n);
    
    while(n--)
    {
        int a;
        scanf("%d", &a);
        
        int res = get_euler(a);
        printf("%d\n", res);
    }
    
    return 0;
}

二、线性筛法求欧拉函数

当 i 为质数: ϕ ( i ) = i − 1 当i为质数:\phi(i)=i-1 i为质数:ϕ(i)=i1
当 i   m o d   p r i m e s [ j ] = 0 , 当i \ mod \ primes[j] = 0, i mod primes[j]=0, ϕ ( i ∗ p r i m e s [ j ] ) = i   ∗   p r i m e s [ j ]   ∗   ( 1 − 1 1 − p 1 )   ∗   ( 1 − 1 1 − p 2 ) ⋯   ( 1 − 1 1 − p k ) = p r i m e s [ j ] ∗ ϕ ( i ) \phi(i*primes[j])= i\ *\ primes[j]\ *\ (1-\frac{1}{1-p_{1}})\ *\ (1-\frac{1}{1-p_{2}})\cdots\ (1-\frac{1}{1-p_{k}}) = primes[j] * \phi(i) ϕ(iprimes[j])=i  primes[j]  (11p11)  (11p21) (11pk1)=primes[j]ϕ(i)
当 i   m o d   p r i m e s [ j ]   ! =   0 , 当i \ mod \ primes[j]\ !=\ 0, i mod primes[j] != 0, ϕ ( i ∗ p r i m e s [ j ] ) = i   ∗   p r i m e s [ j ]   ∗   ( 1 − 1 1 − p 1 )   ∗   ( 1 − 1 1 − p 2 ) ⋯   ( 1 − 1 1 − p k )   ∗   ( 1 − 1 1 − p r i m e s [ j ] ) = ( p r i m e s [ j ] − 1 )   ∗   ϕ ( i ) \phi(i*primes[j])= i\ *\ primes[j]\ *\ (1-\frac{1}{1-p_{1}})\ *\ (1-\frac{1}{1-p_{2}})\cdots\ (1-\frac{1}{1-p_{k}})\ *\ (1-\frac{1}{1-primes[j]}) = (primes[j]-1)\ *\ \phi(i) ϕ(iprimes[j])=i  primes[j]  (11p11)  (11p21) (11pk1)  (11primes[j]1)=(primes[j]1)  ϕ(i)

题目描述:

给定一个正整数 n,求 1∼n 中每个数的欧拉函数之和。

输入格式
共一行,包含一个整数 n。

输出格式
共一行,包含一个整数,表示 1∼n 中每个数的欧拉函数之和。

数据范围
1≤n≤106

输入样例:
6
输出样例:
12

示例代码:

#include 
#include 

using namespace std;

typedef long long LL;

const int N = 1e6+10;

int primes[N], cnt;
int phi[N];
bool st[N];

LL get_eulers(int n)
{
    phi[1] = 1;
    for(int i = 2; i <= n; ++i)
    {
        if(!st[i])
        {
            phi[i] = i - 1;
            primes[cnt++] = i;
        }
        for(int j = 0; primes[j] * i <= n; ++j)
        {
            st[primes[j] * i] = true;
            if(i % primes[j] == 0)
            {
                phi[i * primes[j]] = phi[i] * primes[j];
                break;
            }
            phi[i * primes[j]] = phi[i] * (primes[j] - 1);
        }
    }
    
    LL res = 0;
    for(int i = 1; i <= n; ++i) res += phi[i];
    
    return res;
}

int main()
{
    int n;
    scanf("%d", &n);
    
    LL res = get_eulers(n);
    printf("%lld\n", res);
    
    return 0;
}

三、欧拉定理,费马小定理

欧拉定理:若 a 与 n 互质,则 a ϕ ( n ) ≡ 1 ( m o d n ) 欧拉定理:若a与n互质,则a^{\phi(n)} \equiv 1 \pmod n 欧拉定理:若an互质,则aϕ(n)1(modn) 费马小定理: a p − 1 ≡ 1 ( m o d p ) (当 p 为质数,则 ϕ ( p ) = p − 1 ) 费马小定理:a^{p-1} \equiv 1 \pmod p(当p为质数,则\phi(p)=p-1) 费马小定理:ap11(modp)(当p为质数,则ϕ(p)=p1

你可能感兴趣的:(算法,算法,学习)