繁体   English   中英

根数的质因数

[英]prime factors of a radical number

我已经设法用下面的代码找到了一个数字的主要因素:

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

但是,我正在寻找的是表示简化的根号。 例如

在此处输入图像描述

表示为

在此处输入图像描述

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

非常感谢您的帮助

这是一个基本的 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)

这将返回一个表达式 output:

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

更新

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

  1. sqrt(12) :来自fac <- gmp::factorize(12)的因子是 2、2、3。来自unq <- unique(fac)的唯一因子是 2 和 3。 n <- tabulate(match(fac, unq))返回每个唯一因子出现的次数,分别为 2 和 1。对于r = 2 ,我们取第二个(平方)根,因此每出现 2 次唯一因子(由商n %/% r = c(2, 1) %/% 2 = c(1, 0)给出) 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))返回每个唯一因子出现的次数,分别为 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语句用于清楚地格式化返回的表达式。

我想我创造了一些实用的东西。 下面的代码是在web上找到的一些想法合并整理的结果。代码不雅之处请见谅:

   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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM