整数の素数判定,素因子分解,約数     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

Made with Macintosh