根数的质因数

prime factors of a radical number

我已经通过以下代码找到了一个数的质因数:

   library(gmp)
   typ <- match_exams_device()
   #--------------------------------------------------------
   pipa <- as.numeric(factorize(25))
   pipa

但是,我正在寻找的是表示简化的部首数字。例如

表示为

在这种情况下,获取保留在部首之外的因子,然后将它们相乘就足够了。相同的程序将应用于结果给出保留在部首

内的数字的因素

非常感谢您的帮助

这将return一个表达式作为输出:

radical_simplify <- function(x, r) {
  fac <- as.integer(gmp::factorize(x))
  unq <- unique(fac)
  n <- tabulate(match(fac, unq))
  rad <- prod(unq^(n %% r))
  if (rad == 1L) {
    parse(text = prod(unq^(n %/% r)))
  } else {
    mult <- prod(unq^(n %/% r))
    if (r == 2L) {
      if (mult == 1L) {
        parse(text = paste0("sqrt(", rad, ")"))
      } else {
        parse(text = paste0(mult, "*sqrt(", rad, ")"))
      }
    } else {
      if (mult == 1L) {
        parse(text = paste0("", rad, "^(1/", r, ")"))
      } else {
        parse(text = paste0(mult, "*", rad, "^(1/", r, ")"))
      }
    }
  }
}

用法示例:

radical_simplify(12L, 2L)
#> expression(2*sqrt(3))
radical_simplify(120L, 3L)
#> expression(2*15^(1/3))
identical(9375^(1/5), eval(radical_simplify(9375, 5)))
#> [1] TRUE

更新

为了解释函数,我将逐步完成给出的前两个示例。

  1. sqrt(12)fac <- gmp::factorize(12) 的因子是 2、2、3。unq <- unique(fac) 的唯一因子是 2 和 3。n <- tabulate(match(fac, unq)) return s 每个唯一因素出现的次数,分别为 2 和 1。对于 r = 2,我们取第二个(平方)根,因此每出现 2 次唯一因素(由商 n %/% r = c(2, 1) %/% 2 = c(1, 0)), 我们可以把它从部首里拉出来。将所有从部首中拉出的因数相乘得到外数:mult <- prod(unq^(n %/% r)) = 2^1*3^0 = 2。类似地,余数运算给出保留在部首内的每个唯一因子的计数:n %% r = c(2, 1) %% 2 = c(0, 1)。将保留在部首内的所有因数相乘得到里面的数:rad <- prod(unq^(n %% r)) = 2^0*3^1 = 3.
  2. 120^(1/3):来自 fac <- gmp::factorize(120) 的因子是 2, 2, 2, 3, 5。来自 unq <- unique(fac) 的唯一因子是 2, 3, 5。 n <- tabulate(match(fac, unq)) returns 每个唯一因素出现的次数,分别为 3、1 和 1。对于 r = 3,我们取三次(立方)根,因此每 3 次唯一因素因数出现(由商 n %/% r = c(3, 1, 1) %/% 3 = c(1, 0, 0) 给出),我们可以将它从部首中拉出来。将所有从部首中拉出的因数相乘得到外数:mult <- prod(unq^(n %/% r)) = 2^1*3^0*5^0 = 2。类似地,余数运算给出保留在部首内的每个唯一因子的计数:n %% r = c(3, 1, 1) %% 3 = c(0, 1, 1)。将保留在部首内的所有因数相乘得到里面的数:rad <- prod(unq^(n %% r)) = 2^0*3^1*5^1 = 15.

构成代码其余部分的 if 语句是为了干净地格式化得到 returned 的表达式。

我想我创造了一些实用的东西。下面的代码是对网上找到的一些想法进行合并整理的结果。请原谅代码中的不雅:

   library(exams)
   library(gmp)
   library(dplyr)
   library(plyr)

   typ <- match_exams_device()
   #--------------------------------------------------------
   pipadf <- count(as.numeric(factorize(10)))
   pipadf <- pipadf[order(pipadf$freq), ]
   pipadf
   pipa <- as.numeric(factorize(10))
   pipa
   kuantos <- length(pipa)
   kuantos <- kuantos + 1
   kuantos
   pases <- length(pipadf$freq)
   pases
   x <- 1
   nuevovektor <- vector()

   while(x <= pases){
   unovek <- rep(pipadf[x,1],pipadf[x,2])
   nuevovektor <- c(nuevovektor,unovek)
   x <- x+1
   }

   nuevovektor <- c(nuevovektor,1)
   nuevovektor

   i <- 1
   fderaiz <- vector()
   dderaiz <- vector()

   while(i <= kuantos-1){
   if(nuevovektor[i]==nuevovektor[i+1]){
   x <- nuevovektor[i]
   fderaiz <- c(fderaiz, x)
   i <- i+2
   }else {
    x <- nuevovektor[i]
    dderaiz <- c(dderaiz, x)
    i <- i+1
   }
   }
 
   fderaiz
   dderaiz

   sinrad <- prod(fderaiz)
   sinrad

   conrad <- prod(dderaiz)
   conrad

这是一个基本的 R 解决方案

f <- function(n, r) {
  k <- 2
  v <- c()
  while (n >= k) {
    if (!(n %% k)) {
      v <- c(v, k)
      n <- n / k
    } else {
      k <- k + 1
    }
  }
  d <- table(v)
  z <- as.integer(names(d))
  if (all(d %% r == 0)) {
    return(as.expression(prod(z^(d %/% r))))
  }
  if (all(d %/% r == 0)) {
    return(str2lang(sprintf("%s^(1/%s)", prod(z^(d %% r)), r)))
  }
  str2lang(sprintf("%s*%s^(1/%s)", prod(z^(d %/% r)), prod(z^(d %% r)), r))
}

我们可以看到

> f(1024, 4)
4 * 4^(1/4)

> f(24, 2)
2 * 6^(1/2)

> f(24, 3)
2 * 3^(1/3)

> f(23, 2)
23^(1/2)