fortran90で、
\(a=(-1)^n, ~(n=0,1,\cdots, M)\)を計算する早いアルゴリズムは
a=1
if(mod(n,2).eq.1)a=-1
です。
物理、数学をやっていると至る所で\((-1)^n\)を見受けます。
これを数値計算する際に早い計算方法は何でしょうか?
試してみるのは以下のものです。
①
\(
(-1)^n
\)
②
\(
(-1)^n
\)
※①を倍精度型で計算
③
\(
e^{i\pi n}
\)
※\(i\)は虚数単位、\(\pi\)は円周率
④
\(
\begin{eqnarray}
\left\{
\begin{aligned}
& 1 ,~~(n=0,\mbox{偶数})\\
& -1 ,~~(n=\mbox{奇数})\\
\end{aligned}
\right.
\end{eqnarray}
\)
⑤
\(
a=-a
\)で逐次計算
使ったプログラムは以下のものです。
program main
implicit none
real::t0,t1
integer::k,j,Ns
double precision::a
double precision,parameter::pi=dacos(-1d0)
Ns=100000
do j=1,100
call cpu_time(t0)
do k=0,Ns
a=(-1)**k
enddo
call cpu_time(t1)
write(10,'(i5,f12.7,A)')j,(t1-t0)
call cpu_time(t0)
do k=0,Ns
a=(-1d0)**dble(k)
enddo
call cpu_time(t1)
write(11,'(i5,f12.7,A)')j,(t1-t0)
call cpu_time(t0)
a=1
do k=0,Ns
a=dble(exp(dcmplx(0d0,1d0)*pi*k))
enddo
call cpu_time(t1)
write(12,'(i5,f12.7,A)')j,(t1-t0)
call cpu_time(t0)
do k=0,Ns
a=1
if(mod(k,2).eq.1)a=-1
enddo
call cpu_time(t1)
write(13,'(i5,f12.7,A)')j,(t1-t0)
call cpu_time(t0)
do k=0,Ns
a=-a
enddo
call cpu_time(t1)
write(14,'(i5,f12.7,A)')j,(t1-t0)
enddo
stop
end program main