将阶乘与 numpy 或 scipy 数组一起使用时出现混淆错误
Confusing error using factorial with numpy or scipy arrays
以下代码识别素数列表
import math
import numpy as np
import pandas as pd
import scipy
for x in range(20, 50):
print(x, math.factorial(x-1) % x)
输出是
20 0
21 0
22 0
23 22
24 0
25 0
26 0
27 0
28 0
29 28
30 0
31 30
32 0
33 0
34 0
35 0
36 0
37 36
38 0
39 0
40 0
41 40
42 0
43 42
44 0
45 0
46 0
47 46
48 0
49 0
每个素数的计算余数都不为零。
当我尝试用数组做同样的计算时,我的结果是不同的。
arr = np.arange(20,50)
modFactArr = factorial(arr-1) % arr
print(np.column_stack((arr,modFactArr)),'\n\n')
smodFactArr=scipy.special.factorial(arr-1) % arr
print(np.column_stack((arr,smodFactArr)),'\n\n')
给予
[[20. 0.]
[21. 0.]
[22. 0.]
[23. 22.]
[24. 0.]
[25. 22.]
[26. 16.]
[27. 11.]
[28. 12.]
[29. 16.]
[30. 24.]
[31. 8.]
[32. 0.]
[33. 18.]
[34. 16.]
[35. 33.]
[36. 20.]
[37. 12.]
[38. 20.]
[39. 10.]
[40. 0.]
[41. 25.]
[42. 26.]
[43. 6.]
[44. 4.]
[45. 3.]
[46. 36.]
[47. 40.]
[48. 0.]
[49. 12.]]
[[20. 0.]
[21. 0.]
[22. 0.]
[23. 22.]
[24. 0.]
[25. 22.]
[26. 16.]
[27. 11.]
[28. 12.]
[29. 16.]
[30. 24.]
[31. 8.]
[32. 0.]
[33. 18.]
[34. 16.]
[35. 33.]
[36. 20.]
[37. 12.]
[38. 20.]
[39. 10.]
[40. 0.]
[41. 25.]
[42. 26.]
[43. 6.]
[44. 4.]
[45. 3.]
[46. 36.]
[47. 40.]
[48. 0.]
[49. 12.]]
现在请注意,26、27、28 等数字现在给出残差。这是我的代码错误吗?或者 scipy 和 numpy 以不同的方式进行模运算是有原因的吗?
它的发生是因为 np.dtype
。你只有 np.int64
溢出,而原生 python int
不能溢出。
来自文档:
With exact=False
the factorial is approximated using the gamma function
exact=False
是默认值。
你可以看出这是近似值,因为结果是一个浮点数(因此 .0
),并且浮点数无法准确存储超过 2**53 的积分结果。
以下代码识别素数列表
import math
import numpy as np
import pandas as pd
import scipy
for x in range(20, 50):
print(x, math.factorial(x-1) % x)
输出是
20 0
21 0
22 0
23 22
24 0
25 0
26 0
27 0
28 0
29 28
30 0
31 30
32 0
33 0
34 0
35 0
36 0
37 36
38 0
39 0
40 0
41 40
42 0
43 42
44 0
45 0
46 0
47 46
48 0
49 0
每个素数的计算余数都不为零。 当我尝试用数组做同样的计算时,我的结果是不同的。
arr = np.arange(20,50)
modFactArr = factorial(arr-1) % arr
print(np.column_stack((arr,modFactArr)),'\n\n')
smodFactArr=scipy.special.factorial(arr-1) % arr
print(np.column_stack((arr,smodFactArr)),'\n\n')
给予
[[20. 0.]
[21. 0.]
[22. 0.]
[23. 22.]
[24. 0.]
[25. 22.]
[26. 16.]
[27. 11.]
[28. 12.]
[29. 16.]
[30. 24.]
[31. 8.]
[32. 0.]
[33. 18.]
[34. 16.]
[35. 33.]
[36. 20.]
[37. 12.]
[38. 20.]
[39. 10.]
[40. 0.]
[41. 25.]
[42. 26.]
[43. 6.]
[44. 4.]
[45. 3.]
[46. 36.]
[47. 40.]
[48. 0.]
[49. 12.]]
[[20. 0.]
[21. 0.]
[22. 0.]
[23. 22.]
[24. 0.]
[25. 22.]
[26. 16.]
[27. 11.]
[28. 12.]
[29. 16.]
[30. 24.]
[31. 8.]
[32. 0.]
[33. 18.]
[34. 16.]
[35. 33.]
[36. 20.]
[37. 12.]
[38. 20.]
[39. 10.]
[40. 0.]
[41. 25.]
[42. 26.]
[43. 6.]
[44. 4.]
[45. 3.]
[46. 36.]
[47. 40.]
[48. 0.]
[49. 12.]]
现在请注意,26、27、28 等数字现在给出残差。这是我的代码错误吗?或者 scipy 和 numpy 以不同的方式进行模运算是有原因的吗?
它的发生是因为 np.dtype
。你只有 np.int64
溢出,而原生 python int
不能溢出。
来自文档:
With
exact=False
the factorial is approximated using the gamma function
exact=False
是默认值。
你可以看出这是近似值,因为结果是一个浮点数(因此 .0
),并且浮点数无法准确存储超过 2**53 的积分结果。