如果我有一个像3.464102(2 * sqrt(3))的数字,我怎么能让R告诉我?例如,输出可能如下所示:
toRad(3.464102)
>> multiple: 2, root: 2, of: 3
这非常有用。有什么想法吗?
答案 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
,以使a
和b
为整数,abs(c)
尽可能小。
g
为f
的每个值调用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
>