如何在R中获得激进?

时间:2015-09-17 18:38:23

标签: r math sqrt

如果我有一个像3.464102(2 * sqrt(3))的数字,我怎么能让R告诉我?例如,输出可能如下所示:

toRad(3.464102)
>> multiple: 2, root: 2, of: 3

这非常有用。有什么想法吗?

1 个答案:

答案 0 :(得分:1)

使用primeFactors库中的numbers函数,我编写了两个小函数:

library(numbers)

f <- function(x,n)
{
  p <- primeFactors(round(x^n))
  q <- unique(p)
  m <- sapply(q,function(q){sum(p==q)})

  a <- prod(q^(m%/%n))
  b <- prod(q^(m%%n))
  c <- x-a*b^(1/n)

  return(c(a,b,c))
}

g <- function(x,n.max)
{
  A <- sapply(1:n.max,function(n){f(x,n)})
  i <- which.min(abs(A[3,]))

  return(c(A[1,i],A[2,i],i,A[3,i]))
}

f尝试将x分解为a*b^(1/n)+c,以使ab为整数,abs(c)尽可能小。 gf的每个值调用n,直至绑定n.max并选择最佳选择。

没有上限n.max任何数字x都可以任意精确地分解。分解的错误 a*b^(1/n)来自x^n的小数位数,这些数字以1为界,而随着n的增加,整数部分增长到无穷大。

> g(3.464102,8)
[1] 2.000000e+00 3.000000e+00 2.000000e+00 3.848622e-07
> g(3.464102,12)
[1]  1.000000e+00  2.985988e+06  1.200000e+01 -1.844391e-09
> g(2*sqrt(3),12)
[1] 2 3 2 0
> g(123.45,5)
[1] 1.000000e+00 2.867183e+10 5.000000e+00 3.991403e-10
> g(pi,30)
[1] 1.000000e+00 2.614245e+14 2.900000e+01 0.000000e+00
>