首页 > 解决方案 > R:gmp:mod.bigz 的输出不准确

问题描述

我下载了 gmp 包以计算非常大的数字的模幂。但它的功能之一mod.bigz,似乎超出了一定的位数。例如,100...00 mod 3 的答案应该是 1,因为 99...99 可以被 3 整除。但我得到的答案有时是 0 或 2。有没有办法解决这个问题,或者 gmp 不是对非常大的数字准确吗?

https://cran.r-project.org/web/packages/gmp/index.html

#install.packages('gmp')
library(gmp)
mod.bigz(100000000000000000000000000000000000000000000000000,3)
# 2
mod.bigz(10000000000000000000000000000000000000000000000000000000,3)
# 0

标签: rgmplargenumbermod

解决方案


我认为我的总体建议是,当您的代码中有这些数字时,请避免在任何时候回退到基础 R。如果您在某个时候使用常规 R(或“大多数常规编程语言”),那么它就会中断。

对于原始示例,您可以将内部数字包装在pow.bigz

mod.bigz(pow.bigz(10,50), 3)
# 1
mod.bigz(pow.bigz(10,55),3)
# 1

对于我们在评论中讨论的更复杂的示例,即 693487563928456923569873549873658638579865348726988458,我们得到了真正的解决方案,即通过类避免使用 R 来获取数字character

mod.bigz("693487563928456923569873549873658638579865348726988458",3) # should be 0
# 0
mod.bigz("100000000000000000000000000000000000000000000000000",3) # should be 1
# 1 

推荐阅读