如何使用 R 中的最大公因数创建用于查找整数向量的最小公倍数的函数?
How do I create a function for finding the Least Common Multiple of a vector of integers using Greatest Common Factor in R?
假设我有一个函数 gcf(x,y) returns x 和 y 的最大公因数。所以,例如,
gcf(75,85) = 5
现在,我正在尝试创建一个函数 lcm(v),它采用整数向量和 returns 最小公倍数。
我从数学上知道它会是
lcd(a,b) = a*b/((gcf(a,b))
但是我有一个向量作为参数。我如何开始编写代码?
另外,如何确保向量至少有两个整数且不超过 100?
无需重新发明轮子。您可以尝试包 library(pracma)
和向量化函数 gcd
& Lcm
like
a1 = c(75, 30)
b1 = c(85, 10)
pracma::gcd(a1,b1)
[1] 5 10
pracma::Lcm(a1,b1)
[1] 1275 30
在 RStudio 中检查 View(pracma::gcd)
或点击 F2
以从源代码中学习。第二题是典型的if语句:
foo <- function(x, y){
require(pracma)
if(length(x) < 2 | length(x) > 100 ) return("Length of x must be at least 2 and not more than 100")
if(length(y) < 2 | length(y) > 100 ) return("Length of y must be at least 2 and not more than 100")
list(gcd=pracma::gcd(x,y),
lcm=pracma::Lcm(x,y))
}
foo(a1, b1)
$gcd
[1] 5 10
$lcm
[1] 1275 30
编辑
正如您评论的那样,您想找到三个或更多数字的最小公因数。因此,您可以开始并使用以下代码行,例如对于长度为六的向量。思路是测试所有长度为2的组合,最后从左到右缩减。
a =c(21, 45, 3 , 90, 72, 99)
combn(a, 2, simplify = F) %>%
map(~gcd(.[1], .[2])) %>%
Reduce(function(x,y) gcd(x, y),.)
但不保证结果的正确性。
包 numbers 包含数论函数,其中的函数 mLCM()
可以满足您的需求(我认为):
> numbers::mLCM(c(20,50,75))
[1] 300
如果你想写自己的函数,你可能还是想看看这个函数——背后的逻辑很简单。
假设我有一个函数 gcf(x,y) returns x 和 y 的最大公因数。所以,例如,
gcf(75,85) = 5
现在,我正在尝试创建一个函数 lcm(v),它采用整数向量和 returns 最小公倍数。
我从数学上知道它会是
lcd(a,b) = a*b/((gcf(a,b))
但是我有一个向量作为参数。我如何开始编写代码? 另外,如何确保向量至少有两个整数且不超过 100?
无需重新发明轮子。您可以尝试包 library(pracma)
和向量化函数 gcd
& Lcm
like
a1 = c(75, 30)
b1 = c(85, 10)
pracma::gcd(a1,b1)
[1] 5 10
pracma::Lcm(a1,b1)
[1] 1275 30
在 RStudio 中检查 View(pracma::gcd)
或点击 F2
以从源代码中学习。第二题是典型的if语句:
foo <- function(x, y){
require(pracma)
if(length(x) < 2 | length(x) > 100 ) return("Length of x must be at least 2 and not more than 100")
if(length(y) < 2 | length(y) > 100 ) return("Length of y must be at least 2 and not more than 100")
list(gcd=pracma::gcd(x,y),
lcm=pracma::Lcm(x,y))
}
foo(a1, b1)
$gcd
[1] 5 10
$lcm
[1] 1275 30
编辑
正如您评论的那样,您想找到三个或更多数字的最小公因数。因此,您可以开始并使用以下代码行,例如对于长度为六的向量。思路是测试所有长度为2的组合,最后从左到右缩减。
a =c(21, 45, 3 , 90, 72, 99)
combn(a, 2, simplify = F) %>%
map(~gcd(.[1], .[2])) %>%
Reduce(function(x,y) gcd(x, y),.)
但不保证结果的正确性。
包 numbers 包含数论函数,其中的函数 mLCM()
可以满足您的需求(我认为):
> numbers::mLCM(c(20,50,75))
[1] 300
如果你想写自己的函数,你可能还是想看看这个函数——背后的逻辑很简单。