https://github.com/cran/pracma
Tip revision: d5bfb0e3b7a3211ff2bbe2926e5ba31aa24e4df6 authored by HwB on 09 March 2012, 00:00:00 UTC
version 1.0.1
version 1.0.1
Tip revision: d5bfb0e
numbers.R
##
## n u m b e r s . R Functions from Number Theory
##
.isnatural <- function(n) {
if (is.numeric(n) && length(n) == 1 &&
floor(n) == ceiling(n) && n >= 1) {
TRUE
} else {
FALSE
}
}
eulersPhi <- function(n) {
if (!.isnatural(n))
stop("Arguments 'n' must be a single positive integers.")
m <- n
for (p in unique(factorize(n)))
m <- m * (1 - 1/p)
return(round(m))
}
moebiusFun <- function(n) {
if (!.isnatural(n))
stop("Arguments 'n' must be a single positive integers.")
R <- rle(factorize(n))
if (n == 1) {
r <- 1
} else if (max(R$lengths) > 1) {
r <- 0
} else {
r <- (-1)^length(R$values)
}
return(r)
}
mertensFun <- function(n) {
if (!.isnatural(n))
stop("Arguments 'n' must be a single positive integers.")
sum(sapply(1:n, moebiusFun))
}
sigma <- function(n, k = 1, proper = FALSE) {
if (!.isnatural(n))
stop("Arguments 'n' must be a single positive integers.")
if (!is.numeric(k) || length(k) != 1)
stop("Argument 'k' must be a numeric scalar.")
if (n == 1) return(if (proper) 0 else 1)
R <- rle(factorize(n))
P <- 1
for (i in 1:length(R$values)) {
ri <- R$values[i]
ai <- R$lengths[i]
P <- P * sum(rep(ri, ai+1)^seq(0, ai*k, length=ai+1))
}
if (proper) P <- P - n^k
return(P)
}
tau <- function(n) { # Ramanujan's tau function
if (!.isnatural(n))
stop("Arguments 'n' must be a single positive integers.")
if (n == 0) s <- 0
else if (n == 1) s <- 1
else {
s <- 0
for (k in 1:(n-1)) {
s <- s + sigma(k, 5)*sigma(n-k, 5)
}
s <- 65/756 * sigma(n, 11) + 691/756 * sigma(n, 5) - 691/3 * s
}
return(s)
}
omega <- function(n) {
if (!.isnatural(n))
stop("Arguments 'n' must be a single positive integers.")
if (n == 1) 0
else length(unique(factorize(n)))
}
Omega <- function(n) {
if (!.isnatural(n))
stop("Arguments 'n' must be a single positive integers.")
if (n == 1) 0
else sum(rle(factorize(n))$length)
}