在{numbers}包中解释[R]最大公约数(GCD)(和LCM)函数

时间:2015-10-23 16:49:26

标签: r function

我没有编程背景(除了与R摔跤完成事情),我试图用语言表达R {numbers}包中更大公约数的公式试图在每一步。我需要帮助来理解函数中的步骤流程:

function (n, m) 
{
    stopifnot(is.numeric(n), is.numeric(m))
    if (length(n) != 1 || floor(n) != ceiling(n) || length(m) != 
        1 || floor(m) != ceiling(m)) 
        stop("Arguments 'n', 'm' must be integer scalars.")
    if (n == 0 && m == 0) 
        return(0)
    n <- abs(n)
    m <- abs(m)
    if (m > n) {
        t <- n
        n <- m
        m <- t
    }
    while (m > 0) {
        t <- n
        n <- m
        m <- t%%m
    }
    return(n)
}
<environment: namespace:numbers>

例如,在if (m > n) {}部分,n成为t,最终成为m?我不敢问,因为它可能很痛苦,但我不知道发生了什么。同样适用于,我猜,else等式%%可能是模数。

1 个答案:

答案 0 :(得分:1)

它说的是:

如果m或n不是数字,多个数字或具有小数,则停止并返回消息“Arguments'n','m'必须是整数标量。”

如果它们都为零,则返回零。

从现在开始使用绝对值。

确保n>因为算法我们最终将在下一步中应用。如果不是这种情况则翻转它们:首先将n置于临时变量“t”中,并将m分配给n,以便现在较大的数字位于(n,m)表达式的开头。此时,初始(n,m)值都包含m。通过检索临时变量中的值并将其分配给m。

来完成它

现在他们应用修改后的Euclidean algorithm来找到GCD - 一种更有效的算法版本,它可以快速删除多次减法,而不是将两个数字中较大的数字除以其余数除以两者中的较小者。 。

算法开头的较小数字最终会在第一次迭代后变大,因此我们将其分配给n以准备第二次迭代。但是,要做到这一点,我们需要将当前的n分配给临时变量t。之后,我们得到的模数是将原来的较大数字(n)除以现在存储在t中的较小数字m得到的。结果将替换存储在m。

中的数字

只要有一个余数(模数),这个过程就会继续进行,这次是最初的较小数字,m扮演大家伙的角色。如果没有余数,则返回该特定迭代中较小的数字。

附录:

现在我知道如何阅读这个函数,我发现它只限于函数输入中的两个数字。所以我自己整理了一个可以在输入中使用三个整数的函数:

require(numbers)

GCF <- function(x,y,z){
    tab.x <- tabulate(primeFactors(x))
    tab.y <- tabulate(primeFactors(y))
    tab.z <- tabulate(primeFactors(z))

    max.len <- max(length(tab.x), length(tab.y), length(tab.z))
    tab_x = c(tab.x, rep(0, max.len - length(tab.x)))
    tab_y = c(tab.y, rep(0, max.len - length(tab.y)))
    tab_z = c(tab.z, rep(0, max.len - length(tab.z)))

    GCD_elem <- numeric()
    for(i in 1:max.len){
        GCD_elem[i] <- min(tab_x[i], tab_y[i], tab_z[i]) * i
    }
    GCD_elem <- GCD_elem[!GCD_elem==0]
    GrCD <- prod(GCD_elem)
    print(GrCD)
}

同样适用于LCM:

LCM <- function(x,y,z){
    tab.x <- tabulate(primeFactors(x))
    tab.y <- tabulate(primeFactors(y))
    tab.z <- tabulate(primeFactors(z))

    max.len <- max(length(tab.x), length(tab.y), length(tab.z))
    tab_x = c(tab.x, rep(0, max.len - length(tab.x)))
    tab_y = c(tab.y, rep(0, max.len - length(tab.y)))
    tab_z = c(tab.z, rep(0, max.len - length(tab.z)))

    LCM_elem <- numeric()
    for(i in 1:max.len){
        LCM_elem[i] <- i^(max(tab_x[i], tab_y[i], tab_z[i]))
    }
    LCM_elem <- LCM_elem[!LCM_elem==0]
    LCM <- prod(LCM_elem)
    print(LCM)
}