欧拉函数及欧拉定理

目录

欧拉函数

求解单个欧拉函数:

线性求连续欧拉函数

欧拉定理(同余相关)

扩展欧拉定理


欧拉函数

欧拉函数φ(n)表示小于等于n的数中与n互质的正整数的个数

换句话说,\varphi (n) = \sum_{i=1}^{n}[gcd(i,n) = 1]

欧拉函数为积性函数,即有φ(p*q) = φ(p) * φ(q) 当且仅当p,q互质(gcd(p,q) = 1)

性质(p代表素数):

  • \varphi(1) = 1
  • \varphi(p) = p-1
  • gcd(p,q) = 1\Rightarrow \varphi(p*q) = \varphi(p)*\varphi(q)
  • n = \sum_{d|n}^{}\varphi(d)
  • n = p^k \ \rightarrow \ \varphi(n) = p^k - p^{k-1} = p^{k-1}*(p-1)
  • n = \prod_{i=1}^{k}p_{i}^{a_{i}}  \Rightarrow \varphi(n) = \prod_{i=1}^{k}p_{i}^{r_{i}} = \prod_{i=1}^{k}{p_{i}}^{r_{i-1}}(p_{i}-1)= n*\prod_{i=1}^{k}(1-\frac{1}{p_{i}})

求解单个欧拉函数:

n = \prod_{i=1}^{k}p_{i}^{a_{i}} \Rightarrow \varphi(n) = n*\prod_{i=1}^{k}(1-\frac{1}{p_{i}})

根据上述性质可以在分解n的质因数的时候计算

复杂度为sqrt(n)

//原式展开为n*(1-1/p1)*(1-1/p2)...(1-1/pk)
//等价于n = n/pi * (pi-1) 也等价于 n = n-(n/pi) (1<=i<=k)
long long phi(long long x)
{
	long long ans = x;
	for(long long i = 2;i <= sqrt(x);i++)
	{
		if(x % i == 0)
		{
			ans = ans/i * (i-1);
            //分解质因数 p^ai
			while(a % i == 0)
			{
				x /= i;
			}
		}
	}
    //最后剩下的可能是一个大于sqrt(x)的质数
	if(x > 1) ans = ans/a * (x-1);
	return ans;
}

线性求连续欧拉函数

引入一条新的性质:

                \varphi(n*p) = \varphi(n) * p \ \ \ \ (p|n)

若p不能整除n则p,n互质,根据积性函数的性质直接求解即可

令n = m*p,p为质数,则

                \varphi(n) =n* \prod_{i=1}^{k}(1-\frac{1}{p_{i}}) = p*m*\prod_{i=1}^{k}(1-\frac{1}{p_{i}})

又因为n%p == 0,m = n/p,所以n的质因子和m相同,也就是后面的累乘式相同

                p*m*\prod_{i=1}^{k}(1-\frac{1}{p_{i}}) = p * \varphi(m)

                \varphi(n*p) = \varphi(n) * p\ \ \ (p|n)  得证

有了这些性质支撑,就可以通过筛素数的方式来递推求解欧拉函数

void euler()
{
	b[1] = 1;
	p[1] = 1;
	for(int i = 2;i <= n;i++)
	{
		if(!b[i])
		{
            //素数的phi(i) = i-1
			prime[++cnt] = i;
			p[i] = i-1;
		}
		for(int j = 1;j <= cnt && i*prime[j] <= n;j++)
		{
			b[i*prime[j]] = 1;
			if(i % prime[j] == 0)
			{
                //i%p == 0 phi(i*p) = phi(i) * p
				p[i*prime[j]] = p[i] * prime[j];
				break;
			}
            //i%p != 0 利用积性函数性质 phi(i*p) = phi(i) * phi(p)
			p[i*prime[j]] = p[i] * p[prime[j]];
		}
	}
}

欧拉定理(同余相关)

gcd(a,p) = 1, \ a^{\varphi(p)}\equiv 1\ (mod\ p)

证明会在后面的介绍中讲到

扩展欧拉定理

gcd(a,p) = 1,\ a^b\equiv a^{b\ mod\ \varphi(p)}\ (mod\ p)

gcd(a,p) \neq 1,b\geqslant \varphi(p),a^b\equiv a^{(b\ mod\ \varphi(p)) + \varphi(p)}\ (mod \ p)  

证明很长,想了解可自行百度~

  • 16
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值