簡體   English   中英

在{numbers}包中解釋[R]最大公約數(GCD)(和LCM)函數

[英]Interpreting [R] Greatest Common Divisor (GCD) (and LCM) Function in {numbers} package

我沒有編程的背景(除了與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部分, %%可能是模。

它說的是:

如果m或n不是數字,一個以上的數字或具有小數,則停止,然后返回消息“參數'n','m'必須為整數標量”。

如果它們均為零,則返回零。

從現在開始使用絕對值。

由於要在下一步中應用的算法,請確保n> m。 如果不是這種情況,請翻轉它們:首先將n放入臨時變量“ t”中,並將m分配給n,以便現在更大的數字位於(n,m)表達式的開頭。 此時,兩個初始(n,m)值都包含m。 通過檢索臨時變量中的值並將其分配給m來完成它。

現在,他們應用修改后的歐幾里得算法找到GCD-一種更高效的算法,可以簡化多次減法運算,而不是將兩個數中較大的數除以兩個數中的較小者,而用余數代替。

算法開始時較小的數字最終將在第一次迭代后變大,因此,我們將其分配給n以准備進行第二次迭代。 但是,要做到這一點,我們需要將當前的n賦給臨時變量t來消除它。 之后,我們得到的模數是將原來存儲的較大數字(n)除以較小的數字m而得到的,該數字現在存儲在t中。 結果將替換存儲在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)
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM