2017-02-13 17 views
1

私はR言語で大きな整数の平方根を見つけようとしています。大きな整数のためにbigzを提供するパッケージgmpを使用していますが、平方根の関数がないようです。私は必要に応じて大きな整数のための別のパッケージを使用するように開いています。R言語で大きな整数の平方根を見つけるには? (パッケージgmpは、bigzのsqrtを持っていません)

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

また、私はbigzを使用してsqrtを実装する方法を探しています。

+0

リッチ、申し訳ありませんが、私は混乱を避けるために大きな番号を使用してください。私はそれを反映するために私の質問を編集しました。はい、sqrtはRで標準的な方法で表現できる数値に対しては機能しますが、大きな数値で同じことを探しています(これがgmp/bigzを使用した理由です)。 –

+0

Joseph、ありがとう、それは働いているようだ!私はまだas.bigz(sqrt(a))を行うことはできないようですので、もう少し研究をする必要があります。または、私はbigzの代わりにmpfrを使用することがパフォーマンスに大きな影響を与えるかどうかを確認する必要があります。 –

+0

ちょうどFYI ... 1. 'gmp'の拡張子の' Rmpfr'; 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

ありがとうMikhail。私はx^0.5を試しましたが、うまくいきませんでした。あなたが与えた正確な例がうまくいかなくても、答えの背後にあるアイデアはうまくいきます。結果を元に戻すと、元の数字とは違う数字が返ってきます(私は113423713055421699179424088855838457856、最後の数字を比較します)。これを修正するには、引用符を使用する必要があります:x < - '113423713055421844361000443349850346743'。そうでなければ、Rが扱うことができる数よりも多いため、Rはそれを格納せず、その後、適切にas.bigz()関数に渡します。 –

関連する問題