基础数论算法(7) 欧拉函数与BSGS算法
来源:互联网 发布:java游戏地下城与勇士 编辑:程序博客网 时间:2024/06/06 05:00
欧拉函数
我真的觉得欧拉无所不能…
在提到欧拉函数之前,我们先要说一个定义:积性函数。什么是积性函数?对于互质的数a,b,有f(ab)=f(a)*f(b)。
这个玩意真的特别神奇。最简单的积性函数是
另一个积性函数是
欧拉函数是什么呢?我们称1~n中与n互质的数的个数为欧拉函数,记作
那么如何求欧拉函数值?有这样一个公式:
例如,
以下内容大可无视
来考虑假设p是a的一个因数
那么ap 就是1~a中所有的p的倍数的个数
因此不妨来考虑一下这样一个概率问题:从1~a中选出一个数与a互质
这就是一个古典概型,假定a=pk11⋅pk22⋅...⋅pknn ,那么显然p1,p2,...,pn 的倍数都是与a不互质的。
因此,这就是一个分步的乘法原理:拿到非pi 的倍数的概率为1−1pi ,结果相乘。
所以,拿到与p互质的数的概率就是∏(1−1pi)
因此,ϕ(n)=n⋅∏(1−1pi),其中pi表示n的一个质因数
这样我们可以在O(n)的时间内求出某个数的欧拉函数值。如果用一些高科技手段分解质因数,又会略微快一点。
但是一般来说如果要涉及到欧拉函数都是多组的,那么这样求出一个欧拉函数表复杂度要
首先,我们需要了解几个东西。
(1)对素数来说,
(2)如果p为质数,
(3)如果p为质数,
前两条都是显然的,一个是素数本身的性质,一个是积性函数的定义。第三条比较有趣,我们来看一下之前得到的公式:
那么接下来就是欧拉函数与欧拉筛相结合。代码:
#include <iostream>#define MAXN 40003using namespace std;int n;int phi[MAXN],prime[MAXN],cnt,ans;bool notprime[MAXN];void getphi(){ int i,j; phi[1]=1; for(i=2;i<=40000;++i){ if(!notprime[i]){ prime[++cnt]=i; phi[i]=i-1; } for(j=1;j<=cnt;++j){ if(i*prime[j]>0) break; notprime[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); } } }}int main(){ getphi(); return 0;}
非常有趣吧。
北上广深 拔山盖世 BSGS算法
北上广深,啊不对,BSGS算法是Baby-step-Giant-step的简称,从名字上看就是挺蛋疼的一个算法。BSGS算法的用处在于,求解
因为一般而言NOIP考数论都会放在Day2的T1,所以出这玩意概率并不大……总之了解一下吧。
Ax≡B(mod C)
设m=⌈m−−√ ⌉,x=i⋅m+j
从而,(Ai)m⋅Aj≡B(mod C)
变一下形,Aj≡B(Ai)m(mod C)
是不是看到了什么熟悉的东西?没错,exgcd求逆元。
我们先将Aj 存在Hash表中,然后枚举i,快速的查出结果。
将Aj 存表我们称为Baby Step,而枚举i我们称为Giant Step.
代码我就不抄了……各位自己去搜吧,主要把思想了解一下就可以了qwq
那么数论专题基本上没剩什么了,接下来大概是处理一下矩阵快速幂优化求某一类数列的值以及高斯消元法求解线性方程组,还有Catalan数的相关知识。虽然不能算得上是数论,不过放到一块算了。
- 基础数论算法(7) 欧拉函数与BSGS算法
- 欧拉函数 算法摘记 数论
- 数论(基础欧拉函数)
- 求数论求约数和 与 互质和算法 (分解质因数与欧拉函数)
- 数论之素数,包括eratosthenes算法,欧拉函数
- bsgs算法
- bsgs算法
- 欧拉函数(数论)
- 【数论】【素数】素数相关基础——欧拉函数与欧拉定理
- 欧拉函数算法
- 欧拉函数算法
- 算法-欧拉函数
- 数论之 素因子分解,素数筛选法,欧拉函数和扩展欧几里得算法 (整理)
- bsgs(数论)
- 基础数论算法(1)整除与同余
- 基础数论算法(⑨) 高斯消元与LU分解
- 基础数论算法(⑩) Catalan数与Stirling数
- 数论欧拉函数
- 词向量与word2vec分析
- 对现代病理的应用
- 浅谈斐波那契数列——从递推到矩阵乘法
- 二叉树的深度优先遍历
- Triplet Loss及其梯度
- 基础数论算法(7) 欧拉函数与BSGS算法
- hdu-4990 Reading comprehension
- vscode使用Better Align插件以及快捷键配置实例
- 文本三剑客---gawk基础
- Django 基础教程 视图与网址
- 探究java多线程中正确的单例模式 volatile关键字
- 51单片机常用库函数
- JNI基础类型相互转换
- tensorflow系列(1)碎碎念