根数的质因数
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
更新
为了解释函数,我将逐步完成给出的前两个示例。
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
.
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)
我已经通过以下代码找到了一个数的质因数:
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
更新
为了解释函数,我将逐步完成给出的前两个示例。
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
.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)