Использование функции 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
>
это возможно? иррациональные числа продолжаются вечно, так как вы можете быть уверены, что число на самом деле является числом, так сказать. – jenesaisquoi
Поскольку для этого нет простого математического решения, похоже, для этого потребуется сценарий, чтобы попробовать все возможности. Кроме того, необходим неустойчивый фактор, поскольку иррациональные числа не могут быть введены точно, поэтому сценарий должен работать с неточными результатами. –
Да, я думаю, у него может быть параметр epsilon, чтобы указать точность, и результатом может быть список радикальных выражений кандидата или, может быть, «наиболее сокращенный». – Hatshepsut