如何使用 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

如果你想写自己的函数,你可能还是想看看这个函数——背后的逻辑很简单。