输入 > 1 时伯努利数法错误
Bernoulli-number method wrong for input > 1
我正在尝试实现一种 returns n:th 伯努利数的方法,如下所示:
Object subclass: #Bernoulli.
Bernoulli class extend [
"******************************************************
* Psuedo code for bernoulli method I'm working from:
*
* function B(n)
* B[1] <-- 1
* for m <-- 2 to n+1 do
* B[m] <-- 0
* for k <-- 1 to m - 1 do
* B[m] <-- B[m] − BINOM (m, k-1) * B[k]
* B[m] <-- B[m]/m
* return B[n+1]
*
* function BINOM (n, k)
* r <-- 1
* for i <-- 1 to k do
* r <-- r · (n − i + 1)/i
* return r
******************************************************"
bernoulli: n [
"Initialize variables"
| B size innerLoop temp|
size := n + 1.
B := Array new: size.
B at: 1 put: 1. "B[1] <-- 1"
2 to: size do: [:m | "for m <-- 2 to (n+1) do"
B at: m put: 0. "B[m] <-- 0"
innerLoop := m - 1.
1 to: innerLoop do: [:k | "for k <-- 1 to (m-1) do"
B at: m put: (B at: m) - (Bernoulli binom: m k: (k-1)) * (B at: k). "B[m] <-- B[m] − BINOM(m, k-1) * B[k]"
].
B at: m put: (B at: m) / m. "B[m] <-- B[m] / m"
].
^(B at: size) "return B[n+1]"
]
binom: n k:k [
| r i |
r := 1. "r <-- 1"
1 to: k do: [:i | "for i <-- 1 to k do"
r := r * (n - i + 1) / i. "r <-- r * (n - i + 1)/i"
].
^r "return r"
]
]
z := Bernoulli bernoulli: 3.
z printNl.
(我已尽力对代码进行注释)。
但是,对于输入 n > 1,我得到了错误的伯努利数:
- n = 0 --> 1(正确)。
- n = 1 --> -1/2(正确)
- n = 2 --> 2/3
(应该是 1/6)
- n = 3 --> -7/12(应该是 0)
- n = 4 --> 77/45(应该是 -1/30)
- n = 5 --> 3157/9720(应为 0)
我的猜测是我以某种方式错误地实现了内部循环或内部循环,因为输入 n < 2 工作正常(并且 n < 2 完全跳过了内部循环)。我正在使用的伪代码也可能不正确,但我对此表示怀疑,因为我昨天才让它在 COBOL 中运行。 binom方法可以正常使用,我自己测试过。
即便如此,我还是不明白为什么它不能正常工作。感谢任何帮助。
这里是原算法的翻译。接收者是你的参数n
,答案是从0
到n
.
的所有伯努利数的数组
Integer >> bernoulliNumbers
| bernoulli |
bernoulli := Array new: self + 1.
bernoulli at: 1 put: 1.
2 to: self + 1 do: [:m |
bernoulli at: m put: 0.
1 to: m - 1 do: [:k |
bernoulli
at: m
put: (bernoulli at: m) - ((m binom: k - 1) * (bernoulli at: k))].
bernoulli at: m put: (bernoulli at: m) / m].
^bernoulli
示例:
5 bernoulliNumbers -> #(1 -1/2 1/6 0 -1/30 0)
编辑
这是我在 Integer
class
中创建的 binom:
方法
binom: k
| r |
r := 1.
1 to: k do: [:i | r := r * (self - i + 1) / i].
^r
你(我)在 (Bernoulli binom: m k: (k-1)) * (B at: k)
子句周围缺少括号。它应该是这样的:
B at: m put: (B at: m) - ((Bernoulli binom: m k: (k-1)) * (B at: k)).
我正在尝试实现一种 returns n:th 伯努利数的方法,如下所示:
Object subclass: #Bernoulli.
Bernoulli class extend [
"******************************************************
* Psuedo code for bernoulli method I'm working from:
*
* function B(n)
* B[1] <-- 1
* for m <-- 2 to n+1 do
* B[m] <-- 0
* for k <-- 1 to m - 1 do
* B[m] <-- B[m] − BINOM (m, k-1) * B[k]
* B[m] <-- B[m]/m
* return B[n+1]
*
* function BINOM (n, k)
* r <-- 1
* for i <-- 1 to k do
* r <-- r · (n − i + 1)/i
* return r
******************************************************"
bernoulli: n [
"Initialize variables"
| B size innerLoop temp|
size := n + 1.
B := Array new: size.
B at: 1 put: 1. "B[1] <-- 1"
2 to: size do: [:m | "for m <-- 2 to (n+1) do"
B at: m put: 0. "B[m] <-- 0"
innerLoop := m - 1.
1 to: innerLoop do: [:k | "for k <-- 1 to (m-1) do"
B at: m put: (B at: m) - (Bernoulli binom: m k: (k-1)) * (B at: k). "B[m] <-- B[m] − BINOM(m, k-1) * B[k]"
].
B at: m put: (B at: m) / m. "B[m] <-- B[m] / m"
].
^(B at: size) "return B[n+1]"
]
binom: n k:k [
| r i |
r := 1. "r <-- 1"
1 to: k do: [:i | "for i <-- 1 to k do"
r := r * (n - i + 1) / i. "r <-- r * (n - i + 1)/i"
].
^r "return r"
]
]
z := Bernoulli bernoulli: 3.
z printNl.
(我已尽力对代码进行注释)。
但是,对于输入 n > 1,我得到了错误的伯努利数:
- n = 0 --> 1(正确)。
- n = 1 --> -1/2(正确)
- n = 2 --> 2/3 (应该是 1/6)
- n = 3 --> -7/12(应该是 0)
- n = 4 --> 77/45(应该是 -1/30)
- n = 5 --> 3157/9720(应为 0)
我的猜测是我以某种方式错误地实现了内部循环或内部循环,因为输入 n < 2 工作正常(并且 n < 2 完全跳过了内部循环)。我正在使用的伪代码也可能不正确,但我对此表示怀疑,因为我昨天才让它在 COBOL 中运行。 binom方法可以正常使用,我自己测试过。
即便如此,我还是不明白为什么它不能正常工作。感谢任何帮助。
这里是原算法的翻译。接收者是你的参数n
,答案是从0
到n
.
Integer >> bernoulliNumbers
| bernoulli |
bernoulli := Array new: self + 1.
bernoulli at: 1 put: 1.
2 to: self + 1 do: [:m |
bernoulli at: m put: 0.
1 to: m - 1 do: [:k |
bernoulli
at: m
put: (bernoulli at: m) - ((m binom: k - 1) * (bernoulli at: k))].
bernoulli at: m put: (bernoulli at: m) / m].
^bernoulli
示例:
5 bernoulliNumbers -> #(1 -1/2 1/6 0 -1/30 0)
编辑
这是我在 Integer
class
binom:
方法
binom: k
| r |
r := 1.
1 to: k do: [:i | r := r * (self - i + 1) / i].
^r
你(我)在 (Bernoulli binom: m k: (k-1)) * (B at: k)
子句周围缺少括号。它应该是这样的:
B at: m put: (B at: m) - ((Bernoulli binom: m k: (k-1)) * (B at: k)).