【发布时间】:2017-08-06 07:01:09
【问题描述】:
我有一个包含大约 1000 个元素的向量,从大约 1 到 10,我希望所有元素的乘积以 10^6 为模。即,我想要类似的东西
x <- as.integer(runif(1000, 1, 10))
prod(x) %% 1000000
但是,由于 prod(x) 的计算结果为 Inf,因此上面的代码只返回 NaN。
在我的实际应用程序中(这不是最小的,所以我不会把它放在这里),我用for 循环完成了这个,比如
x <- as.integer(runif(1000, 1, 10))
for (i in 1:length(x)) {
if (i == 1) {
y <- x[i]
} else {
y <- y * x[i]
y <- y %% 1000000
}
}
y
最初,我只是想寻求帮助,想出一个比for 循环更好的解决方案,假设我应该在 R 中避免这种情况。但是,在写这个问题时,我现在同样感到困惑的是,我似乎无法为 for 循环生成有效的 MWE。上面的代码返回0,但是当我删除as.integer() 时它工作正常。我花了比我愿意承认的时间更长的时间试图弄清楚为什么会这样,但我很难过。
那么两个问题:
- 为什么上述 MWE 不起作用? (为什么没有
as.integer也能工作?) - 在 R 中实现模乘以避免溢出问题的好方法是什么?理想情况下,我会对基本 R 中的解决方案感到好奇,即没有像
gmp包这样的东西。我试过sapply/lapply,但到目前为止无济于事。
我发现了用其他语言提出的类似问题,但恐怕我很难解读用这些术语表达的答案。
【问题讨论】:
标签: r multiplication modular-arithmetic