【发布时间】:2018-02-05 00:02:49
【问题描述】:
我通过平方函数编写了一个递归模幂运算,它可以正常工作但会触发警告:
msquare <- function(x,n) (x*x) %% n
mod.exp <- function(a,k,n){
ifelse(k <= 2,
a^k %% n,
ifelse(k %% 2 == 0,
msquare(mod.exp(a,k %/% 2,n),n),
(a * msquare(mod.exp(a,k %/% 2,n),n)) %% n))
}
我使用ifelse 编写了它,所以我可以使用它在指数上进行矢量化:
powers <- mod.exp(2,1:348,349)
当我运行上面的代码时,它会触发许多警告,例如:
在 ifelse(k
但是当我查看输出时(并将其与 Python 的模幂函数 pow() 进行比较),它是 100% 正确的。计算本身不应该采用大于 2*348^2 = 242208 的数字的模数,这远低于这甚至应该成为问题的水平。
是什么导致了这些警告,我该如何避免它们?我知道我可以以非递归方式重写它,这可能会有所帮助,尽管这仍然会使警告的来源变得神秘。
编辑时有点奇怪,下面的代码在没有警告的情况下运行:
powers <- sapply(1:348, function(x) mod.exp(2,x,349))
不知何故,递归调用似乎对警告负责。
【问题讨论】:
-
我认为 R 总是评估
ifelse的两个分支中的表达式,这可能意味着对不起作用的数字进行计算,即使这些数字永远不会被返回。 -
@Marius 的观点可能会帮助您使用逻辑来弄清楚发生了什么。或者,作为更暴力的替代方法,您可以通过使用
options(warn=2,error=recover)在触发警告时转到调试器来跟踪错误的来源
标签: r