BashでProject Euler(1) first step

Bash on Ubuntu on Windowsをインストールしたので、Project EulerBashで解いてみました。
元々、WindowsPythonで64ビット整数を扱おうとすると多倍長整数になってしまい32ビットの範囲で計算しているときよりかなり遅いという問題がありました。Linux版のPythonなら、整数は64ビットで計算するので、この問題は起こりません。Ubuntuで実行することで数倍速くなりました(通常のスクリプトなら速くならず、むしろ若干遅い印象)。メモリも2GBの壁がなくなり、ガーベージコレクタが適切に働いてくれないという問題も解決されます。

Bashのバージョンは、

$ bash --version
GNU bash, バージョン 4.3.11(1)-release (x86_64-pc-linux-gnu)

です。

さて、スクリプトを書いていきましょう。

Project Euler Problem 1

とりあえず、包除原理を使って書きます。N=1000として、
N未満の3の倍数の自然数の和s3=3[(N-1)/3][(N-1)/3+1]/2
N未満の5の倍数の自然数の和s5=5[(N-1)/5][(N-1)/5+1]/2
N未満の15の倍数の自然数の和s15=15[(N-1)/15][(N-1)/15+1]/2
s3+s5-s15
で答えが出ます。

#!/bin/bash
# e001.sh

N=$1
s3=$((((N-1)/3)*((N+2)/3)/2*3))
s5=$((((N-1)/5)*((N+4)/5)/2*5))
s15=$((((N-1)/15)*((N+14)/15)/2*15))
s=$((s3+s5-s15))
echo $s
$ ./e001.sh 1000

代入

代入は、

name=value

とします。例えば、

n=1

とすれば、変数nの値が1となります。
ここで、=の前後にスペースを入れてはいけません。入れると変数名や値にスペースがついてしまいます。
そして、それを標準出力するには、

echo $n

とします。変数に$をつけてはじめて値になります。

引数

スクリプトの引数は、$1、$2、…となります。

演算

2つ方法があります。一つはexprコマンドを使う方法です。

expr 1 + 1

もう一つは二重括弧を使う方法です。

((1 + 1))

二重括弧の中ではC言語と同様の整数演算ができます。変数に$をつけなくてもよいです。
想像が付くように、exprは恐らく別プロセスでコマンドを発行しているので、とても遅いです。exprを使うメリットはほぼ無いと思います。CentOSのexprは多倍長整数が使えると思ったのですが、Ubuntuでは64ビットまでの演算しかできないようです。