2015-09-17 4 views
0

Если у меня есть номер, например, 3.464102 (это 2 * sqrt (3)), как я могу заставить R сказать мне это? Например, выход может выглядеть так:Как получить радикалы в R?

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

Это было бы очень полезно. Есть идеи?

+1

это возможно? иррациональные числа продолжаются вечно, так как вы можете быть уверены, что число на самом деле является числом, так сказать. – jenesaisquoi

+1

Поскольку для этого нет простого математического решения, похоже, для этого потребуется сценарий, чтобы попробовать все возможности. Кроме того, необходим неустойчивый фактор, поскольку иррациональные числа не могут быть введены точно, поэтому сценарий должен работать с неточными результатами. –

+1

Да, я думаю, у него может быть параметр epsilon, чтобы указать точность, и результатом может быть список радикальных выражений кандидата или, может быть, «наиболее сокращенный». – Hatshepsut

ответ

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 
> 

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

  • Нет связанных вопросов^_^