2017-02-13 4 views
1

Я пытаюсь найти квадратный корень большого целого числа в R-языке. Я использую пакет gmp, который предоставляет bigz для больших целых чисел, но кажется, что у него отсутствует функция для квадратного корня. Я открыт для использования другого пакета для больших целых чисел, если это необходимо.Как найти квадратный корень из большого целого в R-языке? (пакет gmp не имеет sqrt для bigz)

library(gmp) 
sqrt(as.bigz("113423713055421844361000443349850346743")) 
Error: 'Math.bigz' is not implemented yet 

В качестве альтернативы, я ищу способ реализовать sqrt с помощью bigz.

+0

Богатый, извините, я должен был использовать большее количество, чтобы избежать путаницы. Я отредактировал свой вопрос, чтобы это отразить. Да, sqrt работает для чисел, которые могут быть выражены стандартным образом R, но я ищу делать то же самое с большими числами (именно поэтому я использовал gmp/bigz). –

+0

Джозеф, спасибо, кажется, он работает! Кажется, я не могу просто сделать as.bigz (sqrt (a)), поэтому мне все равно нужно сделать еще немного исследований. Или мне нужно будет увидеть, влияет ли использование mpfr вместо bigz на производительность. –

+0

просто FYI ... 1. 'Rmpfr' в расширении' gmp'; 2. 'Rmpfr' предназначен специально для вычислений с плавающей запятой, тогда как' gmp' нацелен на целые и рациональные. Я хочу сказать, что они предназначены для очень специфических и очень разных задач, поэтому не для того, чтобы библиотека была более мощной для вычисления 'sqrt' (или любой арифметической операции, которая могла бы привести к иррациональным числам). Например 'log'), это больше, вы должны использовать' Rmpfr' для достижения желаемого результата. –

ответ

1

Этот тип проблемы - именно то, для чего был создан пакет Rmpfr.

library(Rmpfr) 
a <- mpfr("113423713055421844361000443349850346743", 128) ## specify the number of bits 
sqrt(a) 
1 'mpfr' number of precision 128 bits 
[1] 10650056950806500000.00000005163589039117 

Следует отметить, что для того, чтобы получить доступ к мощности этого пакета, вы должны сначала объявить переменную как mpfr объекта. Как только вы это сделаете, вы можете легко выполнить любое количество арифметических операций с любым количеством бит бит (до памяти).

0

Иногда вы можете использовать журналы для выполнения вычислений с большими числами. То есть x^y = exp (y * log (x)).

library(gmp) 
x <- 113423713055421844361000443349850346743 
as.bigz(exp(0.5*log(as.bigz(x)))) 
Big Integer ('bigz') : 
[1] 10650056950806493184 
+0

Спасибо, Михаил. Я попробовал x^0.5, но это не сработало. Я вижу, что идея вашего ответа работает, хотя точный пример, который вы дали, не работает: если вы умножите свой результат сам по себе, он даст другое число, чем исходный номер (я получил 113423713055421699179424088855838457856, сравните последние цифры). Чтобы исправить это, вам нужно использовать кавычки: x <- '113423713055421844361000443349850346743'. Иначе, из-за большего числа, чем то, что может обрабатывать R, R не сохранит его и впоследствии правильно передаст его функции as.bigz(). –

Смежные вопросы