[英]prime factors of a radical number
这是一个基本的 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,我将逐步完成给出的前两个示例。
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
。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.