整数の素数判定,素因子分解,約数 Last modified: Jun 10, 2008
目的
整数の約数を求める。素数かどうか判定する。素因子分解を行う。
使用法
is.prime(n) 素数かどうか判定する。
factorization(n, simple=TRUE) 素因子分解を行う。
divisor(n) 整数の約数を求める。
引数
n 整数(233 未満)
simple デフォルトでは単純な形式で表示する
ソース
インストールは,以下の 1 行をコピーし,R コンソールにペーストする
source("http://aoki2.si.gunma-u.ac.jp/R/src/divisor.R", encoding="euc-jp")
# 整数の約数を見つける
divisor <- function(n) # 整数
{
if (n >= 2^53) return(NA) # 限界を超えると NA を返す
else if (n %% 2 == 0) return(2)
else if(n %% 3 == 0) return(3)
maxitr <- as.integer(sqrt(n))
i <- 1
repeat {
i <- i+4
if (i > maxitr) return(n)
else if (n %% i == 0) return(i)
i <- i+2
if (i > maxitr) return(n)
else if (n %% i == 0) return(i)
}
}
# 素数の判定
is.prime <- function(n)
{
return(ifelse(n >= 2^53, NA, n == divisor(n))) # 限界を超えると NA を返す
}
# 素因子分解
factorization <- function(n, simple=TRUE)
{
if (n >= 2^53) return(NA) # 限界を超えると NA を返す
result <- NULL
repeat {
div <- divisor(n)
result <- append(result, div)
n <- n/div
if (n == 1) break
}
if (simple) {
return(result)
}
else {
result <- table(result)
result <- paste(as.integer(names(result)), "^", result, collapse=" * ")
result <- gsub("\\^ 1 ", "", result)
result <- sub(" \\^ 1$", "", result)
return(result)
}
}
使用例
is.prime(97)
is.prime(123456)
factorization(123456)
factorization(123456, simple=FALSE)
divisor(123456)
出力結果例
> is.prime(97)
[1] TRUE
> is.prime(123456)
[1] FALSE
> factorization(123456)
[1] 2 2 2 2 2 2 3 643
> factorization(123456, simple=FALSE)
[1] "2 ^ 6 * 3 * 643"
> divisor(123456)
[1] 2
> x <- 2:10000 # 10000 未満の素数のリスト
> x[sapply(x, is.prime)]
[1] 2 3 5 7 11 13 17 19 23 29
[11] 31 37 41 43 47 53 59 61 67 71
[21] 73 79 83 89 97 101 103 107 109 113
[31] 127 131 137 139 149 151 157 163 167 173
[41] 179 181 191 193 197 199 211 223 227 229
以下略
直前のページへ戻る
E-mail to Shigenobu AOKI