这个算术导数的实现有什么问题?
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]
n
、e
和p
是整数(int
类型),只需写n*e//p
而不是int(n*e/p)
。
以下是 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]
n
、e
和p
是整数(int
类型),只需写n*e//p
而不是int(n*e/p)
。