\[\sum_{n=1}^9 n^2\]
f <- function(n) n^2
sum(f(1:9))
## [1] 285
def f(n):
return n**2
def sigma(fr, to):
s = 0;
for i in range(fr, to + 1):
s += f(i)
return(s)
sigma(1, 9)
## 285
和の公式を使うと直接的に合計値を計算するので逐次加算より大変効率的
f1 <- function(n) n*(n + 1)/2
f2 <- function(n) n*(n + 1)*(2*n + 1)/6
f3 <- function(n) ( n*(n + 1)/2 )^2
f1(9)
## [1] 45
f2(9)
## [1] 285
f3(9)
## [1] 2025
def f1(n):
return n*(n + 1)/2
def f2(n):
return n*(n + 1)*(2*n + 1)/6
def f3(n):
return ( n*(n + 1)/2 )**2
f1(9)
## 45.0
f2(9)
## 285.0
f3(9)
## 2025.0
#install.packages('tictoc', 'microbenchmark')
library(tictoc)
library(microbenchmark)
N <- 1e6
#==============================================
tic('Programmer:逐次加算')
f <- function(n, a)
{
x <- 0
for (i in 1:n) x <- x + i^a
return(x)
}
f(N, 1)
## [1] 500000500000
f(N, 2)
## [1] 3.333338e+17
f(N, 3)
## [1] 2.500005e+23
toc()
## Programmer:逐次加算: 0.209 sec elapsed
#==============================================
tic('Data scientist:和の公式')
f1 <- function(n) n*(n + 1)/2
f2 <- function(n) n*(n + 1)*(2*n + 1)/6
f3 <- function(n) ( n*(n + 1)/2 )^2
f1(N)
## [1] 500000500000
f2(N)
## [1] 3.333338e+17
f3(N)
## [1] 2.500005e+23
toc()
## Data scientist:和の公式: 0.008 sec elapsed
tm <- microbenchmark(Programmer = f(N, 1), DataScientist = f1(N))
microbenchmark:::boxplot.microbenchmark(tm, main = 'Calc. Time')