积性函数
对于一个离散函数$f(x), x\in Z^+$ , 如果$\forall \gcd(a,b)=1$都有$f(a\cdot b)=f(a)\cdot f(b)$, 则称函数$f(x)$为积性函数。
完全积性函数
对于一个离散函数$f(x), x\in Z^+$ , 如果$\forall a,b\in Z^+$都有$f(a\cdot b)=f(a)\cdot f(b)$, 则称函数$f(x)$为完全积性函数。
积性函数分析
我们根据积性函数的定义,其实只要我们计算出了所有素数的幂的函数值,则任何其他$f(x)$都可以快速获取。
对此笔者准备了一个模版,我们只需要修改其中的56到63行即可
欧拉函数
$\phi(n)$就是小于等于n,且与n互质的数的个数。
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 
 | int euler(int n){
 int ret=n;
 for(int i=2; i*i<=n; i++)
 if(n%i==0){
 ret=ret-ret/i;
 do n/=i;
 while(n%i==0);
 }
 if(n>1)ret=ret-ret/n;
 return ret;
 }
 
 | 
莫比乌斯函数
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 
 | ll getmob(ll a){
 ll x=a,tmp=a;
 int cnt=0,now=0;
 for(ll j=2;j*j<=x;j++){
 now=0;
 if(x%j==0){
 while(x%j==0) now++,x/=j;
 if(now>1) return 0;
 cnt++;
 }
 }
 if(x!=1) cnt++;
 return (cnt&1)?-1:1;
 }
 int getmu(int n)
 {
 int v=1;
 for(int i=2;i*i<=n;i++)
 if(n%i==0)
 {
 v=-v;n/=i;
 if(n%i==0)return 0;
 }
 if(n!=1)v=-v;
 return v;
 }
 
 | 
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 
 | #include<bits/stdc++.h>using namespace std;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 typedef long long ll;
 const ll maxn=5e6;
 ll no_pri[maxn]={0,1,0},pri[maxn],low[maxn];
 ll PHI[maxn],DDD[maxn],XDX[maxn],MUU[maxn],SIG[maxn];
 void f_ini(){
 for(ll i=2;i<maxn;i++){
 if(!no_pri[i]) low[i]=pri[++pri[0]]=i;
 for(ll j=1;pri[j]*i<maxn;j++){
 no_pri[pri[j]*i]=1;
 if(i%pri[j]==0) {
 low[pri[j]*i]=low[i]*pri[j];
 break;
 }
 else low[pri[j]*i]=pri[j];
 }
 }
 
 DDD[1]=PHI[1]=MUU[1]=SIG[1]=1;
 for(ll i=1;i<=pri[0];i++){
 for(ll mul=pri[i],ct=1;mul<maxn;mul*=pri[i],ct++){
 DDD[mul]=ct+1;
 SIG[mul]=SIG[mul/pri[i]]+mul;
 MUU[mul]=ct==1?-1:0;
 PHI[mul]=mul/pri[i]*(pri[i]-1);
 }
 }
 
 for(ll i=2;i<maxn;i++){
 for(ll j=1;pri[j]*i<maxn;j++){
 ll x=low[i*pri[j]], y=i*pri[j]/x;
 DDD[x*y]=DDD[x]*DDD[y];
 MUU[x*y]=MUU[x]*MUU[y];
 PHI[x*y]=PHI[x]*PHI[y];
 SIG[x*y]=SIG[x]*SIG[y];
 if(i%pri[j]==0) break;
 }
 }
 
 for(ll i=1;i<maxn;i++) {
 DDD[i]+=DDD[i-1];
 MUU[i]+=MUU[i-1];
 PHI[i]+=PHI[i-1];
 SIG[i]+=SIG[i-1];
 XDX[i]=(DDD[i]-DDD[i-1])*i+XDX[i-1];
 }
 }
 
 int main(){
 f_ini();
 printf("数论函数表\n");
 printf(" i phi(i) PHI(i) muu(i) MUU(i) ddd(i) DDD(i) sig(i) SIG(i)\n");
 for(ll i=1;i<=30;i++) {
 printf("%2lld %3lld %6lld %6lld %6lld %6lld %6lld %6lld %6lld\n",i,PHI[i]-PHI[i-1],PHI[i],MUU[i]-MUU[i-1],MUU[i],DDD[i]-DDD[i-1],DDD[i],SIG[i]-SIG[i-1],SIG[i]);
 }
 return 0;
 }
 
 |