目的 ユークリッドの互除法により最大公約数と最小公倍数を求める。 使用法 euclid(m, n) 引数 m, n 252 未満の整数 ソース インストールは,以下の 1 行をコピーし,R コンソールにペーストする source("http://aoki2.si.gunma-u.ac.jp/R/src/euclid.R", encoding="euc-jp") euclid <- function(m, n) # 2^52 未満の 2 つの整数 { limit <- 2^52 stopifnot(is.numeric(m) && is.numeric(n) && m == floor(m) && n == floor(n) && m < limit && n < limit) m0 <- m <- abs(m) n0 <- n <- abs(n) while ((temp <- n %% m) != 0) { n <- m m <- temp } lcm <- (m0/m)*n0 return(list(GCM=m, quotient=c(m0/m, n0/m), LCM=ifelse(lcm > limit, NA, lcm))) } 使用例 euclid(10, 12) euclid(1000000000, 272716261712) 出力結果例 > euclid(10, 12) $GCM # 最大公約数 [1] 2 $quotient [1] 5 6 # 引数を GCM で割った商 $LCM # 最小公倍数 [1] 60 > euclid(1000000000, 272716261712) $GCM [1] 16 $quotient [1] 62500000 17044766357 $LCM [1] NA # 答えが整数として表せる範囲を超えると NA を表示する > library(gmp) > gcd.bigz(1000000000, 272716261712) # Greatest Common Divisor = Greatest Common Measure Big Integer ('bigz') : [1] 16 > gcd(1000000000, 272716261712) [1] 16 > lcm.bigz(1000000000, 272716261712) # Least Common Multiple = Lowest Common Multiple Big Integer ('bigz') : [1] 17044766357000000000