简谈欧拉函数

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到n这n个数中只有n不与n互质,所以是n-1。

2.φ(n) < n-1 (n不是质数)。

3.当p为质数时,φ(pk)=pk-pk-1=pk-1×(p-1)=pk-1×φ(p)。

4.

5.

6.n>1时,1,2,3......n中与n互质的整数和为n*φ(n)/2。

扩展性质:

如何求解欧拉函数:

1.求解单个值的欧拉函数

void olas()
{
    num=0;
    memset(u,true,sizeof(u));
    for(int i=2; i<=50000; i++)
    {
        if(u[i])    su[++num]=i;
        for(int j=1; j<=num; j++)
        {
            if(su[j]*i>50000)    break;
            u[i*su[j]]=false;
            if(i%su[j]==0)    break;
        }
    }
}
ll phi(ll x)
{
    ll i,j,k;
    ll ans=1;
    for( i=1; i<=num; i++)
    {
        if(x%su[i]==0)
        {
            j=0;
            while(x%su[i]==0)
            {
                ++j;
                x/=su[i];
            }
            for( k=1; k<j; k++)
            {
                ans=ans*su[i]%1000000007ll;
                //cout<<"1"<<" "<<ans<<endl;
            }
            ans=ans*(su[i]-1)%1000000007ll;
            //cout<<"2"<<" "<<ans<<endl;
            if(x==1)    break;
        }
    }
    if(x>1)    ans=ans*(x-1)%1000000007ll;
    //cout<<"3"<<‘ ‘<<ans<<endl;
    return ans;
}

2.线性筛预处理欧拉函数

bool vis[1000005];
int tot=0, pri[1000005], phi[1000005];
void Get_phi(int N){
    phi[1] = 1;
    for(int i=2; i<=N; ++i){
        if(!vis[i]){
            pri[++tot] = i;
            phi[i] = i-1;
        }
        for(int j=1,x; j<=tot&&(x=i*pri[j])<=N; ++j){
            vis[x] = true;
            if(i%pri[j] == 0){
                phi[x] = phi[i]*pri[j];
                break;
            }
            else phi[x] = phi[i]*phi[pri[j]];
        }
    }
}

模板题:POJ 2407

#include<cstdio>
#include<cstring>
using namespace std ;
typedef long long ll;
bool u[50005];
ll su[50005],num;
void olas()
{
    num=0;
    memset(u,true,sizeof(u));
    for(int i=2; i<=50000; i++)
    {
        if(u[i])    su[++num]=i;
        for(int j=1; j<=num; j++)
        {
            if(su[j]*i>50000)    break;
            u[i*su[j]]=false;
            if(i%su[j]==0)    break;
        }
    }
}
ll phi(ll x)
{
    ll i,j,k;
    ll ans=1;
    for( i=1; i<=num; i++)
    {
        if(x%su[i]==0)
        {
            j=0;
            while(x%su[i]==0)
            {
                ++j;
                x/=su[i];
            }
            for( k=1; k<j; k++)
            {
                ans=ans*su[i]%1000000007ll;
                //cout<<"1"<<" "<<ans<<endl;
            }
            ans=ans*(su[i]-1)%1000000007ll;
            //cout<<"2"<<" "<<ans<<endl;
            if(x==1)    break;
        }
    }
    if(x>1)    ans=ans*(x-1)%1000000007ll;
    //cout<<"3"<<‘ ‘<<ans<<endl;
    return ans;
}
int main()
{
    //freopen("input.txt","r",stdin);
    ll n;
    olas();
    while(~scanf("%lld",&n)&&n)
    {
        printf("%d\n",(int)phi(n));
    }
}

END

v\:* {behavior:url(#default#VML);}
o\:* {behavior:url(#default#VML);}
w\:* {behavior:url(#default#VML);}
.shape {behavior:url(#default#VML);}

Normal
0

7.8 磅
0
2

false
false
false

EN-US
ZH-CN
X-NONE

/* Style Definitions */
table.MsoNormalTable
{mso-style-name:普通表格;
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-noshow:yes;
mso-style-priority:99;
mso-style-parent:"";
mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
mso-para-margin:0cm;
mso-para-margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:10.5pt;
mso-bidi-font-size:11.0pt;
font-family:等线;
mso-ascii-font-family:等线;
mso-ascii-theme-font:minor-latin;
mso-fareast-font-family:等线;
mso-fareast-theme-font:minor-fareast;
mso-hansi-font-family:等线;
mso-hansi-theme-font:minor-latin;
mso-font-kerning:1.0pt;}

v\:* {behavior:url(#default#VML);}
o\:* {behavior:url(#default#VML);}
w\:* {behavior:url(#default#VML);}
.shape {behavior:url(#default#VML);}

Normal
0

7.8 磅
0
2

false
false
false

EN-US
ZH-CN
X-NONE

/* Style Definitions */
table.MsoNormalTable
{mso-style-name:普通表格;
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-noshow:yes;
mso-style-priority:99;
mso-style-parent:"";
mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
mso-para-margin:0cm;
mso-para-margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:10.5pt;
mso-bidi-font-size:11.0pt;
font-family:等线;
mso-ascii-font-family:等线;
mso-ascii-theme-font:minor-latin;
mso-fareast-font-family:等线;
mso-fareast-theme-font:minor-fareast;
mso-hansi-font-family:等线;
mso-hansi-theme-font:minor-latin;
mso-font-kerning:1.0pt;}

原文地址:https://www.cnblogs.com/cautx/p/11387422.html

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

简谈欧拉函数的相关文章

浅谈欧拉函数【复习】

浅谈欧拉函数[复习] 定义: φ(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) {

浅谈欧拉函数

笔者太菜,现在才学欧拉函数还学得不咋滴-- 定义 定义:\(φ(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\)

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

一:知识点 欧拉函数参考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*(

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

HDU 5430 Reflect(欧拉函数)

题目: http://acm.hdu.edu.cn/showproblem.php?pid=5430 从镜面材质的圆上一点发出一道光线反射NNN次后首次回到起点. 问本质不同的发射的方案数. 输入描述 第一行一个整数T,表示数据组数.T≤10T \leq 10T≤10 对于每一个组,共一行,包含一个整数,表示正整数N(1≤N≤106)N(1 \leq N \leq 10^{6})N(1≤N≤10?6??). 输出描述 对于每一个组,输出共一行,包含一个整数,表示答案. 输入样例 1 4 输出样例

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

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

√n求单值欧拉函数

基本定理: 首先看一下核心代码: 核心代码 原理解析: 当初我看不懂这段代码,主要有这么几个问题: 1.定理里面不是一开始写了一个n*xxx么?为什么代码里没有*n? 2.ans不是*(prime[i]-1)么?为什么到了第二个while循环变成*prime[i]了? 3.定理里面不是要/pi么?为什么代码里没有/pi????????????? 公式化简 首先我们来分析一下整个程序的原理,如果把程序的原理搞明白了,这三个问题也就自然而然的解决了 这个程序的原理是基于唯一分解定理: 那么我们可以把

poj3696 快速幂的优化+欧拉函数+gcd的优化+互质

这题满满的黑科技orz 题意:给出L,要求求出最小的全部由8组成的数(eg: 8,88,888,8888,88888,.......),且这个数是L的倍数 sol:全部由8组成的数可以这样表示:((10^x)-1)*(8/9) 那么有m=((10^x)-1)*(8/9)=k*L,answer即满足条件的最小的x 性质1:若ax=by且a和b互质,那么说明a中没有任何b的质因子,b的质因子一定都在x里.所以x是b的倍数. 所以先想方设法在等式中构造两个互质的数以便化简.我们取p=8/gcd(8,L