0484 算术导数
* * * *
拉格朗日计划
* * * *
算术导数

算术导数是$\mathbb N\to\mathbb N\cup\{0\}$上满足莱布尼兹法则$(ab)'=ab'+a'b$的函数,任意素数$p$的算术导数$p'$为$1$($1$的算术导数为$0$)。不难验证$20'=24$。

求$\sum_{k=1}^{5\times 10^{15}}\gcd(k,k')$。

本题难度:



解答

记$g(n)=\gcd(n,n')$,$g(n)$的值可参考OEIS A085731。特别地,若$n=p_1^{a_1}\ldots p_k^{a_k}$,则 $$n'=a_1\ldots a_k\cdot p_1^{a_1-1}\ldots p_k^{a_k}$$ 若令 $$f(p^a)=g(p^a)-g(p^{a-1}),$$ 则$f$是积性函数,从而若令$P$为所有PN数(即powerful number,与无平方因子数相反,若$n$是PN数则对其每个素因子$p$而言$p^2$都能整除$n$),则 $$\sum_{k=2}^Ng(k)=-1+\sum_{n\in P}\left\lfloor\frac{N}{n}\right\rfloor f(n),$$ 此处的求和是PN筛的标准公式(见此处)。

直接计算即得最终结果$8907904768686152599$。

注:因使用sympy库以及math.gcd等函数,以下代码为Python 3。代码中未打印进度,但运行需要数分钟。

import sympy,math

N=5*(10**15)
preLists=[]

def f(a,m,x):
  res=m*x
  for p in range(a, len(preLists)):
    if preLists[p][0][0] > m:
      break
    for q,r in preLists[p]:
      if q>m:
        break
      res+=f(p+1,m//q,x*r)
  return res

for p in sympy.primerange(math.isqrt(N)):
  q,r,e= p*p,1,2
  pre=[]
  while q<=N:
    d=math.gcd(e*(q//p), q)
    if d-r:
      pre.append((q,d-r))
    q*=p
    e+=1
    r=d
  preLists.append(pre)

print(f(0,N,1)-1)