blogskol

思わず声に出して読みたくなるブログ

Dirichlet 積の解読

maspypy.com

これの解読をする

aが乗法的な時のDirichlet 積の計算

c=b;
  for(int p:primes)
    for(int i=N/p;i;i--){
      int n=p*i,q=p,m=i;
      while(true){
        c[n]+=a[q]*c[m];
        if(m%p)break;
        q*=p;m/=p;
      }
    }

pについてのループが終わると、
c[n] = \sum_{\substack{ij=n\\iに含まれる素因数全てp以下}}a[i]b[j]
が成立する様になることをpについての帰納法で示すと良い

pについてのループでは、n=piの時にwhileループ内でc[n]
\sum_{\substack{ij=n\\gcd(i,p^\infty)=p^k}} a[i]b[j]
kの昇順に1から足されてる

iを降順に取っているのは n=12,p=2,q=2,m=6の時に
c[12]+=a[2]c[6]
という式でa[2]a[2]b[3] と言う項が足されないため
iを昇順に取っているとc[6]には既にa[2]b[3]が足されているため上記の様な事が起きてしまう)