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

person dasf    schedule 22.06.2018    source источник


Ответы (1)


Я думаю, что мой общий совет заключается в том, чтобы не возвращаться к базовой 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 
person Hack-R    schedule 22.06.2018
comment
Это работает для примера с игрушкой. Но я не думаю, что это то решение, которое я ищу, поскольку я не могу легко выразить число со случайными цифрами как a ^ b, скажем, например, 693487563928456923569873549873658638579865348726988458. mod.bigz тогда ответ на мод 3 будет неправильным - это должно быть 0, так как сумма всех цифр равна 321, кратному 3. mod.bigz(693487563928456923569873549873658638579865348726988458,3) sum(as.integer(unlist(strsplit('693487563928456923569873549873658638579865348726988458','')))) - person dasf; 23.06.2018
comment
@dasf Нашел решение!! Это так просто, ха-ха. Просто дайте мне 1 минуту, чтобы обновить. - person Hack-R; 23.06.2018