展开多项式

Expanding polynomial

我想编写一个函数,以分解形式展开多项式。该函数应接受字符作为输入,并且 return 标准形式的扩展多项式(指数从最高到最低排序)。

输出应如下所示:

> function("(3x - 2)^2 (2x^3 -1)")
[1] "18x^{5} - 24x^{4} + 8x^{3} - 9x^{2} + 12x - 4

谢谢!

在因子之间插入一个 *,在数字和 x 之间插入一个,然后使用多项式对其进行计算。

如果我们可以假设因子用 * 分隔并且数字后跟 x 有 * 分隔它们,我们可以稍微缩短这个。在那种情况下,我们可以省略两个 gsub 调用。)

library(polynom)

run <- function(s) {
  s |>
    gsub(pattern = "[{}]", replacement = "") |>
    gsub(pattern = "([)0-9]) *([(])", replacement = "\1 * \2") |>
    gsub(pattern = "(\d)x", replacement = "\1*x") |>
    str2lang() |>
    eval(list(x=polynomial())) |>
    as.character(decreasing = TRUE) |>
    gsub(pattern = "\^(\d+)", replacement = "^{\1}")
}

p <- "(3x - 2)^2 (2x^3 -1)"
run(p)
## [1] "18*x^{5} - 24*x^{4} + 8*x^{3} - 9*x^{2} + 12*x - 4"

identical(run(run(p)), run(p))
## [1] TRUE

首先不使用字符串并使用 polynom 包的多项式 class 和约定会更容易。那么就是:

x <- polynomial()
(3*x - 2)^2 * (2*x^3 -1)
## -4 + 12*x - 9*x^2 + 8*x^3 - 24*x^4 + 18*x^5 

使用gmpoly包,您可以进行如下操作:

P1 <- gmpoly("3x^(1) - 2")
P2 <- gmpoly("2x^(3) - 1")
P1^2 * P2
# gmpoly object algebraically equal to
# -4 x^(0) + 12 x^(1) - 9 x^(2) + 8 x^(3) - 24 x^(4) + 18 x^(5)

gmpoly 的酷炫功能是您可以使用分数:

P1 * gmpoly("11/3 x^(2)")
# gmpoly object algebraically equal to
# -22/3 x^(2) + 11 x^(3)