这个算术导数的实现有什么问题?

What is wrong with this implementation of the arithmetic derivative?

以下是 Python 找到的用于计算算术导数的 Python 代码的重构。

from sympy import factorint

def f(n):
    result = factorint(n)
    result = result.items()
    result = [int(n*e/p) for p, e in result]
    result = sum(result)
    result = result if n > 1 else 0
    return result 

It can be shown一个引物数对其自身次方的算术导数就是一个不动点。如果您认为这是问题所在,请随时仔细检查证明。

A051674 是素数按通常的素数顺序自次幂排列的序列。其中有827240261886336764177,但是当我在上面调用上面的函数时,我没有得到正确的结果:

>>> f(827240261886336764177)
827240261886336827392

事实上,将 f 评估的所有列出的序列成员制表显示该条目之前有效,而该条目之后中断。

p_n f(p_n)
4 4
27 27
3125 3125
823543 823543
285311670611 285311670611
302875106592253 302875106592253
827240261886336764177 827240261886336827392
1978419655660313589123979 1978419655660313627328512
20880467999847912034355032910567 20880467999847910614749358850048
2567686153161211134561828214731016126483469 2567686153161211279596267358657515496669184

所以看起来数字变得太大可能是个问题。为什么这个函数在这些较大的情况下会失败?

如果您要处理整数,请尽量只使用整数运算。由于行

result = [int(n*e/p) for p, e in result]

nep是整数(int类型),只需写n*e//p而不是int(n*e/p)