浅谈欧拉函数

笔者太菜,现在才学欧拉函数还学得不咋滴……

定义

定义:\(φ(n)\)是小于等于\(n\),且与\(n\)互质的数的个数。

写成另一个式子就是:\(∑_{i=1}^{n} 1[gcd(i,n)==1]\)

有一个结论,是\(φ(n)\)为积性函数,即有\(φ(ab)=φ(a)*φ(b)\).

还有一些其它性质:当\(p\)为质数时,显然有\(φ(p)=p-1\).

若\(p|n\) 且\(p^2 | n\),则\(φ(n)=φ(n/p)*p\)

若\(p|n\) 且不满足\(p^2 | n\),则\(φ(n)=φ(n/p)*(p-1)\)

还有:\(∑_{d|n} φ(d)=n\)

由于它是积性函数,于是我们可以用欧拉筛把它筛出来。

当\(p=prime\)时,用第一个性质。

当\(p\)与\(x\)互质时,则\(φ(x*p)=φ(x)*φ(p)\)

当\(x\)与\(p\)不互质时,就有:

设\(x=t*p^k\)

则有:\(φ(x*p)=φ(t*p^{k+1})=φ(t*p^k)*p=φ(x)*p\)

由此可以写出欧拉筛程序:

void Init(){
    phi[1]=1;
    for(int i=2;i<=MAXN;++i){
        if(is_prime[i])phi[i]=i-1,p[++tot]=i;
        for(int j=1;j<=tot&&i*p[j]<=n;++j){
            is_prime[i*p[j]]=0;
            if(i%p[j]==0){
                phi[i*p[j]]=phi[i]*p[j];
                break;
            }
            else phi[i*p[j]]=phi[i]*phi[p[j]];
        }
    }
}

继续普及定理:

欧拉定理:当\(x\)与\(p\)互质时,有:

\(x^{φ(m)}≡1(mod p)\)

这个东西的局限性有点大,来看一下拓展欧拉定理:

无需\(x\)与\(p\)互质,当\(y>φ(p)\)时,有:

$ x^y$ \(≡\) \(x^{b%φ(p)+φ(p)}\) \((mod\) \(p)\)

当$y<φ(p)时,指数上没有那个+φ(p)

根据这个东西,我们可以解决一些问题,诸如:

\(2^{2^{2^...}}\) \(mod\) \(p\)的东西(上帝与集合的正确用法)

来一个题目:求\(x,y<=n\)且\(gcd(x,y)∈prime\)的数对个数。

看向文章第一个式子,\(∑_{i=1}^{n} 1[gcd(i,n)==1]\)

自然联想到欧拉函数。

把\(gcd\)变一下,\(gcd(x,y)=1\) \(->\) \(gcd(x*p,y*p)=p(p∈prime)\)

那么,我们就想求\(p∈prime\) 且\(p<=n\)

自然一遍筛法。而且可以顺便把欧拉函数筛出来。

对于一个数对\((a,b)\),设\(a<=b\),

那么\(a\)有 \(φ(p)\)个值可以使\(gcd(a,b)=1\).

那么我们可以做一下前缀和。

答案就变为:枚举所有\(p<=n\)且p为质数,由于没有大小限制所以最后答案\(*2\);注意枚举时的重复,注意欧拉函数统计1时所计算的重复,所以有\(-1\).

\(Code:\)

#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
const int MAXN=1e7+10;
int phi[MAXN],n,tot,p[MAXN],flg[MAXN];
long long Ans,sum[MAXN];
void Init(int MAXN1){
    phi[1]=1;
    /*for(int i=2;i<=MAXN1;++i){
        if(!phi[i])
            prime[++tot]=i;
            for(int j=i;j<=MAXN1;j+=i){
                if(!phi[j])phi[j]=j;
                phi[j]=phi[j]/i*(i-1);
            }
    }*/
    phi[1]=1;
    for(int i=2;i<=n;++i) {
        if(!flg[i]) p[++tot]=i,phi[i]=i-1;
        for(int j=1;j<=tot&&i*p[j]<=n;++j) {
            flg[i*p[j]]=1;
            if(i%p[j]==0) {
                phi[i*p[j]]=phi[i]*p[j];
                break;
            } else {
                phi[i*p[j]]=phi[i]*phi[p[j]];
            }
        }
    }
    for(int i=1;i<=MAXN;++i)sum[i]=sum[i-1]+phi[i];
}
int main(){
    scanf("%d",&n);
    Init(n+10);
    for(int i=1;i<=tot&&p[i]<=n;++i)Ans+=sum[n/p[i]]+sum[n/p[i]]-1;
    printf("%lld\n",Ans);
    return 0;
}

?

原文地址:https://www.cnblogs.com/h-lka/p/11600309.html

时间: 2024-10-09 21:21:53

浅谈欧拉函数的相关文章

浅谈欧拉函数【复习】

浅谈欧拉函数[复习] 定义: φ(n)表示小于n的正整数中和n互质的个数; 性质: 1.积性函数:φ(n×m)=φ(n)×φ(m)(感性理解) 2.a^φ(n)^≡1(mod n),当且仅当gcd(a,n)==1(感性理解) 3.[1,n]中与n互质的数的和为n×φ(n)/2 4.Σφ(d)=n,其中(d|n)(感性理解) 5.φ(p^a^)=p^a^-p^a-1^,其中(p为素数,a为正整数) 证明: 这里插入个游戏: 问题:求正整数3^83^的最后两位数 回到正题 一:√n求单个数的欧拉函数

浅谈欧拉函数 By cellur925

1.某神犇Blog 学了三遍的 欧拉函数φ--DEADFISH7 2.我要做一些补充o(* ̄▽ ̄*)o $φ(1)=1$: 公式有两种形式,一种有太多除法,实际可能会慢些.通用 对于任意$n$>1,1~$n$中与$n$互质的数之和等于$n*φ(n)/2$. 是积性函数. $sigma(d|n) φ(d)=n$. 代码实现 1°:朴素的质因数分解顺便求出 void init_phi() { int ans=n; for(int i=2;i<=sqrt(n);i++) { if(n%i==0) {

简谈欧拉函数

START 参考博客:https://blog.csdn.net/qq_39922639/article/details/77511761 欧拉函数是积性函数的一种,所谓积性函数是指满足,gcd(a,b)&&ƒ(a*b)=ƒ(a)*ƒ(b)的函数,特别的,若gcd(a,b)!=1但是ƒ(a*b)=ƒ(a)*ƒ(b)仍然满足,我们称之为完全积性函数. 定义: 记欧拉函数φ(n)表示从{1,2,3......n}中和n互质的数的个数,即:φ(n) = 性质: 1.φ(n) = n-1 (n为质

欧拉函数 / 蒙哥马利快速幂 / 容斥

一:知识点 欧拉函数参考1 浅谈欧拉函数参考2 欧拉函数的定义: 在数论中,对于正整数N,少于或等于N ([1,N]),且与N互质(即gcd为1)的正整数(包括1)的个数,记作φ(n).     欧拉函数的延伸: 小于或等于n的数中,与n互质的数的总和为:φ(x) * x / 2  (n>1). 欧拉函数φ(x)模板: ll Euler(int n)//即求φ(x) { ll ret=n; for(int i=2;i<=sqrt(n);i++) if(n%i==0) { ret=ret/i*(

O(N)的素数筛选法和欧拉函数

首先,在谈到素数筛选法时,先涉及几个小知识点. 1.一个数是否为质数的判定. 质数,只有1和其本身才是其约数,所以我们判定一个数是否为质数,只需要判定2~(N - 1)中是否存在其约数即可,此种方法的时间复杂度为O(N),随着N的增加,效率依然很慢.这里有个O()的方法:对于一个合数,其必用一个约数(除1外)小于等于其平方根(可用反证法证明),所以我们只需要判断2-之间的数即可. bool is_prime(int num) { const int border = sqrt(num); for

欧拉函数

void Euler_Sieve_Method(int * euler, int n) { euler[1] = 1; for (int i = 2; i < n; i++) { euler[i] = i; } for (int i = 2; i < n; i++) { if (euler[i] == i) { for (int j = i; j < n; j += i) { euler[j] = euler[j] / i * (i - 1); } } } } void Euler_Si

hdu1695(莫比乌斯)或欧拉函数+容斥

题意:求1-b和1-d之内各选一个数组成数对,问最大公约数为k的数对有多少个,数对是有序的.(b,d,k<=100000) 解法1: 这个可以简化成1-b/k 和1-d/k 的互质有序数对的个数.假设b=b/k,d=d/k,b<=d.欧拉函数可以算出1-b与1-b之内的互质对数,然后在b+1到d的数i,求每个i在1-b之间有多少互质的数.解法是容斥,getans函数参数的意义:1-tool中含有rem位置之后的i的质因子的数的个数. 在 for(int j=rem;j<=factor[i

欧拉函数常用性质

欧拉函数定义:设n 为正整数,则1,2......,n中与n互质的整数个数记作f(n). 1.1 若n为素数,f(n)=n-1; 1.2 整数n=p*q,p,q为不同素数,则f(n)=f(p)*f(q)=(p-1)*(q-1) 1.3 n=p^a*q^b,f(n)=f(p^a)*f(q^b)=n*(1-1/p)*(1-1/q) 1.4 分解质因子相乘,f(n)=n*(1-1/p1)*(1-1/p2)*.......*(1-1/pk). f(100)=f(2^2*5^2)=100*1/2*4/5=

POJ2478(SummerTrainingDay04-E 欧拉函数)

Farey Sequence Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 16927   Accepted: 6764 Description The Farey Sequence Fn for any integer n with n >= 2 is the set of irreducible rational numbers a/b with 0 < a < b <= n and gcd(a,b)