OI退役笔记-021:数论(五)欧拉定理

欧拉函数定义

在数论,对正整数 n,欧拉函数是小于或等于 n 的正整数中与 n 互质的数的数目(因此 φ(1) = 1)。此函数以其首名研究者欧拉命名(Euler’s totient function),它又称为 Euler’s totient function、φ 函数、欧拉商数等。 例如 φ(8)=4,因为1, 3, 5, 7 均和 8 互质。 从欧拉函数引伸出来在环论方面的事实和拉格朗日定理构成了欧拉定理的证明。

欧拉函数通式

通式
Π 表示 n 个数相乘。φ(n) = (1 - 1 / p1) * (1 - 1 / p2) * … * (1 - 1 / pn)。
(其中 p1, p2 … pn 为 x 的所有质因数,x 是不为 0 的整数)
注意:每种质因数只有一个。
eg: 12 = 2 * 2 * 3; φ(12) = 12 * (1 - 1 / 2) * (1 - 1 / 3) = 4(1、5、7、11,Δ:包括 1)。

欧拉函数性质

性质
又一个老性质

欧拉函数实现

直接求欧拉函数:

int Euler(int n)
{
	int rea = n;.
	for (int i = 2; i * i <= n; i++)
		if (n % i == 0)
        {
			rea = rea - rea / i;	// rea = rea * (1 - 1 / i)
			while (n % i == 0)
			{
                n = n / i;
			}
        }
    if (n > 1)						// 处理特殊情况
        rea = rea - rea / n;
    return rea;
}

快筛欧拉函数

手敲好累!
实际上就是套了个 [欧拉筛]

需加语句、头文件:

int prime[10010], phi[10010];
bool v[10010];

快速欧拉函数代码:

void quick_euler()
{
	int cnt = 0;
	for(int i = 2; i <= N; ++i)
	{
		if(!v[i])	
			// i 是质数,所以 φ(i) = i - 1
			prime[++cnt] = i, phi[i] = i - 1;
		for(int j = 1; i * prime[j] <= N && j <= cnt; ++j)
		{
			v[i * prime[j]] = 1;
			if(i % prime[j] == 0)
			{
				// 性质一
				phi[i * prime[j]] = phi[i] * prime[j];
			 	break;
			 }
			 else
			 	// 性质二
			 	phi[i * prime[j]] = phi[i] * (prime[j] - 1);
		}
	}
}
// 哪闶歉錾当?

作者:Rotch
日期:2020-10-03
修改:2020-10-03

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值