使用模数计算总和时枫的奇怪行为

时间:2011-03-07 22:38:13

标签: maple

我定义了一个简单的函数:

c(n) = 2 * floor((n mod 24) / 12)

我想用Maple计算和c(0)+ c(1)+ ... + c(n),但Maple计算的总和是错误的。以下是显示明显错误总和的示例的屏幕截图:http://i.stack.imgur.com/BpmB2.png

我不知道我在这里失踪了什么...

感谢您的时间

1 个答案:

答案 0 :(得分:2)

这种问题被称为过早评估。会发生什么是sum使用Maple通常的评估模型,其中包括在实际在过程体中进行计算之前评估过程调用的参数。

特别注意以下仅调用creneau(i)的结果。结果是sum在您的示例中看到的参数。换句话说,mod操作过早发生,因为对creneau(i)的调用已过早评估。

creneau := n -> (2*floor((n mod 24)/12)):

creneau(38);

                           2

oops := creneau(i);

                            /1   \
                     2 floor|-- i|
                            \12  /

eval(oops, i=38);

                           6


add(oops, i=38..38);

                           6

sum(oops, i=38..38);

                           6

sum(creneau(i), i=38..38);

                           6

sum('creneau(i)', i=38..38);

                           2

add(creneau(i), i=38..38);

                           2

解决此问题的常用方法是使用add代替sum(因为add具有所谓的“特殊评估规则”)或将第一个参数包装为{ {1}}带有所谓的无评估或延迟报价。

不幸的是,在2D数学输入模式下,sumsum的漂亮打印(Sigma)求和符号看起来相同。这使得这个错误更难以发现。

我甚至猜测你已经从Maple的标准GUI的“表达式”调色板中插入了2D数学求和,不幸的是add而不是sum导致了更多这种新的用户错误。

另请参阅special evaluation rules上的帮助页面。

宏基