蓝桥杯必备算法一:欧拉函数

欧拉函数原理

一、欧拉函数的引入

请思考以下问题:
任意给定正整数n,请问在小于等于n的正整数之中,有多少个与n构成互质关系?
(比如,在1到8之中,有多少个数与8构成互质关系?)

计算这个值的方法就叫做欧拉函数,以φ(n)表示。在1到8之中,与8形成互质关系的是1、3、5、7,所以 φ(n) = 4。

二、欧拉函数的定义

  • 定义: 欧拉函数φ(n)是一个定义在正整数集上得函数,φ(n)的值等于序列0,1,2,…,n-1中与n互素的数的个数。

特别的,φ(1)=1(和1互质的数(小于等于1)就是1本身)。

三、欧拉函数的性质

  1. 当p是素数时,φ§=p-1。
  2. 欧拉函数是积性函数,但不是完全积性函数。
  3. 当且只当n可以分解成两个互质的整数之积,n = p1 × p2,则φ(n) = φ(p1p2) = φ(p1)φ(p2)。
    特别的,对于两个素数p,q, φ(pq)=(p-1)(q-1)。(RSA算法应用)
    当n>2时,φ(n)都是偶数,也即φ(n)≡0(mod2)。
    简单证明,因为若n是质数p的k次幂,φ(n)=pk-pk-1=(p-1)pk-1
    当p为2时,pk-1必为偶数;
    当p>2时,(p-1)必为偶数。

四、欧拉函数的计算方法

(一)解题思路

对于一个正整数N的素数幂分解N=P1q1P2q2…Pnqn,其中,Pi为素数(1≤i≤n)。
根据第二条性质得到:

φ(N)=φ(P1q1P2q2…Pnqn)=φ(P1q)φ(P2q2)…φ(Pnqn)

注意:每种质因数只有一个。
若n是质数p的k次幂,φ(n)=pk-pk-1=(p-1)pk-1,因为除了p的倍数外,其他数都跟n互质。
简单证明:φ(n)=pk-pk-1=(p-1)pk-1

证明:
由φ(n)的定义值,φ(pk)等于从pk减去在1,…,pk中与p不互素的数的个数。因为p是素数,故φ(pk)等于从pk减去在1,…,pk中被p整除的数的个数。而在
1,…,p,p+1,…,2p,…,pa-1 * p
中,易知p的倍数共有pa-1个,即得φ(n)=pk-pk-1=(p-1)pk-1

(二)编程计算

利用欧拉函数和它本身不同质因数的关系,用筛法计算出某个范围内所有数的欧拉函数值。
欧拉函数和它本身不同质因数的关系:

欧拉函数: φ(N)=N{∏p|N}(1-1/p)
亦即:
φ ( N ) = N ∗ ∏ ( 11 / p ) ( P 是 数 N 的 质 因 数 ) φ(N)=N*(1-1/p)(P是数N的质因数)

φ(N)=N∗∏(1−1/p)(P是数N的质因数),如:

φ(10=10×(11/2)×(11/5=410的质因数为25;
φ(30=30×(11/2)×(11/3)×(11/5=830的质因数为235;
φ(49=49×(11/7=4249的质因数为7

五、欧拉函数扩展

设n≥1,则有∑φ(n)=n,其中d|n,d>0.

在这里插入图片描述

六、欧拉函数应用

题目描述

在这里插入图片描述
题目输入输出样例

输入样例:
2
7 5
10 2
输出样例:
1
4

题目思路及代码

思路: f(n)函数就是欧拉函数的定义,并且g(n)函数就是欧拉函数扩展的定理应用,因此只需要进行计算即可
素数筛核心代码:

void pri(ll N){
    for(int i=2;i<=N;i++){
        if(!vis[i]){
            p[++tot]=i;
            vis[i]=1;
        }
        for(int j=1;j<=tot&&i*p[j]<=N;j++){
            vis[i*p[j]]=1;
            if(i%p[j]==0){
                break;
            }
        }
    }
}

代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long int ll;
const ll maxn=1e5+10;
const ll maxm=1e8+10;
const ll mod=1e9+7;
ll n,k;
ll p[maxn];
ll vis[maxn];
ll tot;
void pri(ll N){
    for(int i=2;i<=N;i++){
        if(!vis[i]){
            p[++tot]=i;
            vis[i]=1;
        }
        for(int j=1;j<=tot&&i*p[j]<=N;j++){
            vis[i*p[j]]=1;
            if(i%p[j]==0){
                break;
            }
        }
    }
}
ll ppi(ll x){
    ll ans=x;
    for(int i=1;i<=tot;i++){
        if(x%p[i]){
            continue;
        }
        ans=ans/p[i]*(p[i]-1);
        while(x%p[i]==0){
            x/=p[i];
        }
    }
    if(x>1){
        ans=ans/x*(x-1);
    }

    return ans;
}
int main(){
    pri(maxn-1);
    ll t;
    scanf("%lld",&t);
    while(t--){
            scanf("%lld%lld",&n,&k);
            k=(k+1)/2;
            for(int i=1;i<=k&&n>1;i++){
                n=ppi(n);
            }
            printf("%lldn",n%mod);

    }
	return 0;
}

推荐给大家的一段话


“遇事不决可问春风,春风不语即随本心”的意思是:对一件事犹豫不决,就问春风该如何做,春风给不出答案,就凭自己本心做出决断。“遇事不决可问春风,春风不语即随本心”一句出自网络作家“烽火戏诸侯”的《剑来》,其原文是:“遇事不决,可问春风。春风不语,遵循己心”。

在这里插入图片描述


本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>