关于数论
1 .质数筛 \(x\)是否为质数
质数-若一个正整数无法被除了1和它自身之外的任何自然数整除,则称该数为
质数(prime)
否则称该正整数为
合数(Composite number)
-
试除法(定义)
patr A bool Is_Prime(int x){ if(x<2) return 0; for(int i=2;i<=x-1;i++) if(x%i==0) return 0; return 1; } part B bool Is_Prime(int x){ if(x<2) return 0; for(int i=2;i*i<=x;i++) if(x%i==0) return 0; return 1; }一个数\(x\)如果有因数,一定是一个大于\(\sqrt{x}\)一个效应\(\sqrt{x}\)
或者就是\(\sqrt{x}\)所以只要枚举1~\(\sqrt{x}\)2.埃氏筛oioioioio
每个质数\(x\)的倍数\(2x,3x,4x......\)就是合数
bool Check[]; void Get_Prime(int n)//1~n{ for(int i=2;i<=n;i++) if(!Check[i]){ for(int j=2;i*j<=n;j++) Check[i*j]=1; } }3 .线性筛
埃氏筛会重复标记 12—既是3的倍数也是2的倍数
所以线性筛!首先,任意一个合数都可以被分解成一个质数和一个数的积。对于任意一个合数,我们用“这个合数 = 最小质因数 × 最大因数(非自己)”,来表示
bool Is_Prime[]; int Prime[],top=0; void Get_Prime(int n){ for(int i=2;i<=n;i++){ if(!Is_Prime[i]) Prime[++top]=i; for(int j=1;i<=Prime[j]*i<=n&&j<=Top;j++){ Is_Prime[i*Prime[j]]=1; if(i%Prime[j]==0) break; } } }
2.欧拉函数(Euler's totient function)
欧拉 \(\varphi\)
\(\forall a,b \in N\),若\(a b\)的最大公因数为1,即\(gcd(a,b)=1 那么ab\) 互质
\(\varphi(n)\)就是1~n中与n互质的数的个数
将n分解质因数可得 \(n=p^{c_1}_1*p^{c_2}_2*...*p^{c_m}_m\)
\(\varphi(n)=n * \dfrac{p_1-1}{p_1}*\dfrac{p_2-1}{p_2}*...*\dfrac{p_m-1}{p_m}=n*\prod\limits_{质数p<n}(1-\dfrac{1}{p})\)
-
[推导]
-
把\(n\)分解质因数后这些质因数在1~n中的倍数就是不能对\(\varphi(n)\)产生贡献的数,举个粒子:
\(300=2^2*3^1*5^2\) 那么在\(1-300\)中 2 ,3 ,5 的倍数就无法与300互质1-300中有\(\dfrac{1}{2}*300\)个2的倍数,有\(\dfrac{1}{3}*300\)个3的倍数,有\(\dfrac{1}{5}*300\)个5的倍数\((\dfrac{1}{2}*300)+(\dfrac{1}{3}*300)+(\dfrac{1}{5}*300)=(\dfrac{1}{2}+\dfrac{1}{3}+\dfrac{1}{5})*300\)
同理 6 既是2的倍数也是3的倍数
10 既是2的倍数也是5的倍数
15 既是5的倍数也是3的倍数
这些数每个被减了两遍所以要加回来
1-300中有\(300*\dfrac{1}{6}\)个6的倍数......
所以\((\dfrac{1}{2}+\dfrac{1}{3}+\dfrac{1}{5}-\dfrac{1}{6}-\dfrac{1}{10}-\dfrac{1}{15})*300\)这么多个数与300不互质
转化一下
\((1-(\dfrac{1}{2}+\dfrac{1}{3}+\dfrac{1}{5}-\dfrac{1}{6}-\dfrac{1}{10}-\dfrac{1}{15}))*300=\varphi(300)\)
然后因式分解
\(\varphi(300)=(1-\dfrac{1}{2})*(1-\dfrac{2}{3})*(1-\dfrac{4}{5})*300\)
!
再来一个??
\(\varphi(100)=1-(\dfrac{1}{2}+\dfrac{1}{5}-\dfrac{1}{10}))*100=(1-\dfrac{1}{2})*(1-\dfrac{4}{5})*100\)
!!!
int Got_Phi(int x){//找x的欧拉值 int ans=x;//初始认为全与x互质 for(int i=2;i*i<=x;i++){ if(x%i==0){//i是x的因数 ans=ans*((i-1)/i);//如公式 while(x%i==0) x/=i;//把次方剔除 } } if(x>1) ans=ans*((x-1)/x);//x自己是质数 return ans; } ## 晓
-
Dirichlet 卷积
已知两个数论函数 \(f(n),g(n)\)
那么这两个函数的 狄利克雷卷积 \((f*g)(n)\) 的定义式为:
\[(f * g)(n) = \sum_{k|n} f(k)g\left(\frac{n}{k}\right) = \sum_{k\ell=n} f(k)g(\ell) \]用自然语言描述可以理解为对所有 \(n\) 的正约数求和。
-
一些例子
\(\tau\) 是除数个数函数,\(1\) 是常数函数
\[\tau = 1 * 1 \iff \tau(n) = \sum_{d|n} 1 \]\(\tau(n)=1(n)*1(n)=\sum_{k|n}1\)
\(\sigma\) 是除数和函数,\(id\) 是恒等函数
\[\sigma = \text{id} * 1 \iff \sigma(n) = \sum_{d|n} d \]定义即可
-
狄利克雷的代数性质
-
\(f*g=g*f\)
-
\((f*g)*h=f*(g*h)\)
-
\((f+g)*h=f*h+g*h\)
-
单位元 \(\varepsilon(n)=[n=1]\)
\(f*\varepsilon =\varepsilon*f=f\)
-
逆元:当且仅当 \(f(1)\ne 0\),存在 \(g\) 使得 \(f*g=g*f=\varepsilon\)
称 \(g\) 是 \(f\) 的 Dirichlet 逆元,即 \(g=f^{-1}\)
\(g(1)=\frac{1}{f(1)},g(n)=-\frac{1}{f(1)}\sum_{d|n}f(d)g(\frac{n}{d})\)
-
-
不会证明的定理(悲
-
若 \(f,g\) 是积性函数,那么 \(f*g\) 也是积性函数,而且 \(f^{-1}\) 存在且为积性函数。
-
分配律,若 \(\alpha\) 是完全积性函数,那么有
\[(\alpha f) * (\alpha g) = \alpha \cdot (f * g) \]
-
-
莫比乌斯函数
- 如果 \(n=1\) ,那么 \(\mu(n)=1\)
- 如果 \(n\) 的因子中有幂次大于\(1\)的数,那么 \(\mu(n)=0\)
- 否则 \(\mu(n)=(-1)^k\) 其中 \(k\) 表示 \(n\) 的质因子个数
根据定义容易证明莫比乌斯函数是积性函数
-
性质
对于一个正整数 \(n\) 有:
\(\sum_{d|n}\mu(d)=[n=1]\)
也就是说:
当\(n=1\) 时,只有一个因子 \(d=1,\mu(1)=1\) 所以和为\(1\)
当\(n>1\) 时,所有因子的 \(\mu\) 值加起来和值为0
证明:
我们知道设 \(n\) 的质因数分解为:
\(n=p_1^{a1}p_2^{a2} \dots p_k^{ak}\)
根据定义,当 \(a_i\ge2\) 时,包含其的所有因子的 \(\mu\) 值都是 \(0\)
那么我们就只考虑它素因子的贡献,就转化为
\(n'=p_1p_2\dots p_k\)
所以有 \(\sum_{d|n}\mu(d)=\sum_{d|n'}\mu(d)\)
由于是唯一的,即所有的因子拼起来都会有贡献
那么选出来 \(i\) 个因子拼起来的次数就是 \(\binom{k}{i}\)
枚举选出来的个数,就会有:
\(\sum_{i=0}^{k}\binom{k}{i}(-1)^i=(1+(-1))^k=0^k\)
那么当 \(k=0,n=1\) 时值为 \(1\),否则为 \(0\)
那么根据狄利克雷卷积,我们就可以把这个表达式写成
\[\varepsilon=1*\mu \]也就是说,莫比乌斯函数是常值函数 \(1\) 的狄利克雷逆
那么我们把这个东西拿来判断两个数是否互质,就会有式子
\([\gcd(i,j)=1]=\sum_{d|\gcd(i,j)}\mu(d)=\sum_d[d|i][d|j]\mu(d)\)
-
求法
线性筛
inline ve<int> get_mu(int n){ ve<int>mu(n+1),prime;mu[1]=1; ve<bool>vis(n+1);prime.reserve(n); rep(x,2,n,1){ if(!vis[x]) prime.pb(x),mu[x]=-1; tep(p,prime){ if(x*p>n) bk; vis[x*p]=1; if(x%p==0){ mu[x*p]=0; bk; }else mu[x*p]=-mu[x]; } } re mu; } -
莫比乌斯反演
-
原式
设 \(f(n),g(n)\) 是两个数论函数,那么有
\(f(n)=\sum_{d|n}g(d)\Longleftrightarrow g(n)=\sum_{d|n}\mu\left(\frac{n}{d}\right)f(d)\)
-
证明
利用 Dirichlet 卷积,就会有式子
\(f=1*g\Longleftrightarrow g=\mu*f\)
由于 \(1*\mu=\varepsilon\),在两边同卷 \(\mu\)
\(\mu*f=1*g*\mu=g*\varepsilon=g\)
-
-
反演例子
-
\(n=\sum_{d|n}\phi(d)\) 即 \(id=1*\phi\)
那么根据式子就会有 \(\phi=\mu*id\)
\(\phi(n)=\sum_{d|n}d\mu(\frac{n}{d})\)
-
\(\sigma_k(n)=\sum_{d|n}d^k\) 即 \(\sigma_k=1*id_k\)
反演得到 \(id_k=\mu*\sigma_k\)
\(n^k=\sum_{d|n}\mu(\frac{n}{d})\sigma_k(d)\)
-

math的入门,蒟蒻的开端
浙公网安备 33010602011771号