\(\sum\)(シグマ)

\[\sum_{n=1}^9 n^2\]

R

f <- function(n) n^2

sum(f(1:9))
## [1] 285

Python

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

和の公式

和の公式を使うと直接的に合計値を計算するので逐次加算より大変効率的

  1. \[1+2+3+\dots+n+\dots+N=\sum_{n=1}^{N}n =\frac{1}{2}N(N+1)\]
  2. \[1^2+2^2+3^2+\dots+n^2+\dots+N^2=\sum_{n=1}^{N}n^2 =\frac{1}{6}N(N+1)(2N+1)\]
  3. \[1^3+2^3+3^3+\dots+n^3+\dots+N^3=\sum_{n=1}^{N}n^3 =\Big\{\frac{1}{2}N(N+1)\Big\}^2\]

R

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

Python

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')