読者です 読者をやめる 読者になる 読者になる

数値計算をやってみた

はじめに

この記事は NSEG Advent Calendar 2015 の21日目の記事です。

なんとなくプログラムを書きたくなりました。Advent Calendarの時期でもあるし、何かネタがないかなあと考えてみたら、昔よくやっていた数値計算を久々にやりたくなりました。
というわけで、円周率の計算をさらっと書いてみました。昔はC言語でしたが、今回はHaskellで。

ガウスルジャンドルの公式

円周率の計算といえばこれでしょう。おなじみの公式ですね。

-- Gauss-Legendre algorithm

a :: Double -> Double
a 0 = 1
a n = ((a(n-1))+(b(n-1))) / 2

b :: Double -> Double
b 0 = 1 / sqrt 2
b n = sqrt((a(n-1))*(b(n-1)))

t :: Double -> Double
t 0 = 1 / 4
t n = (t(n-1)) - (p(n-1)) * (a(n-1) - a n) ** 2

p :: Double -> Double
p 0 = 1
p n = 2 * p(n-1)

pi' :: Double -> Double
pi' n = (a n + b n)**2 / (4*t n)

main :: IO ()
main = print $ pi' 3

実行結果

3.141592653589794

数式がそのまま書ける感じだしそのままでも読みやすいし、とても素敵な公式。

ボールウェインの4次の収束公式

収束効率が高くて良い感じです。

-- Borwein's quartically convergent algorithm

a :: Double -> Double
a 0 = 6 - 4 * sqrt 2
a n = a(n-1) * (1+y n)**4
      - 2**(2*(n-1) + 3) * y n * (1+y n+(y n)**2)

y :: Double -> Double
y 0 = (sqrt 2) - 1
y n = (1 - (1 - (y(n-1)) ** 4) ** (1 / 4))
      / (1 + (1 - (y(n-1)) ** 4) ** (1 / 4))

pi' :: Double -> Double
pi' n = 1 / a n

main :: IO ()
main = print $ pi' 2

実行結果

3.1415926535897927

1つあたりの計算はごちゃごちゃやってるけど、それでもだいぶシンプル。

あとがき

プログラムについてはツッコミどころは大量にあるとは思いますが、そこはまあ即席なんで勘弁してください。

さくらインターネットのVPS

さくらのVPSを新規契約した

今まで大阪リージョンに1つ持っていたんだけど、だいぶ長いこと放置してたしいろいろやってみたいことができたので、石狩リージョンに新規契約してみた。ある程度うまくいきそうなら乗り換えってことで古い方は契約解除してしまう予定。

やったこと

契約

通常のさくらVPS 1Gプラン(石狩リージョン)を新規契約した。

カスタムOSインストール

メールが来てサーバが作成されたことを確認したら、早速OSを入れ替えた。

OS再インストールからカスタムOSインストールへと進み、今回はDebian 7 amd64を選択。 こことか、ここDebianのところあたりを多少参考にして普通にインストール。

インストールが完了したら、あとは通常の環境構築を行う。

ユーザ設定

インストール時に作成したユーザでsudoを行えるようにする。

$ su -
# apt-get update
# apt-get install sudo
# usermod -aG sudo $USER

ssh

大抵はsshから入って作業を行うので、基本的な初期設定を行う。

ここではlocalは作業を行なっている端末とする。他にも$USERだとかhostonameだとか、適当な書き方をしているので適宜読み替えてください。ポートはもっと良さそうなものを考えましょう。

local$ ssh-keygen -t dsa
local$ scp .ssh/id_dsa.pub sakura:/home/$USER/.ssh/
$ chmod 700 .ssh
$ chmod 600 .ssh/authorized_keys
$ sudoedit /etc/ssh/sshd_config
5c5
< Port 22
---
> Port 12345
51a52
> PasswordAuthentication no
$ sudo service ssh restart

あとは以下のようなファイルをlocalの ~/.ssh/config に作成する。

Host sakura-hostname
  User $USER
  Port 10022
  Hostname  aaa.bbb.ccc.ddd
  IdentityFile ~/.ssh/id_dsa.sakura-hostname
  TCPKeepAlive yes
  IdentitiesOnly yes
  ServerAliveInterval 60

DNS

インストール時には1つしか指定していなかったので、追記しておく。

$ sudoedit /etc/resolv.conf
search sakura.ne.jp
nameserver 133.242.0.3
nameserver 133.242.0.4

iptables

最低限のフィルタリングはしておきたいので、iptablesの設定をする。

$ sudo apt-get install iptables-persistent
$ sudoedit /etc/iptables/rules.v4
$ sudo service iptables-persistent start
$ sudo iptables -L

上記のrules.v4の内容は以下の通り。これも拾い物。v6はそのうち書く。

*filter

# Allows all loopback (lo0) traffic and drop all traffic to 127/8 that doesn't use lo0
-A INPUT -i lo -j ACCEPT
-A INPUT ! -i lo -d 127.0.0.0/8 -j REJECT

# Accepts all established inbound connections
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# Allows all outbound traffic
# You could modify this to only allow certain traffic
-A OUTPUT -j ACCEPT

# Allows HTTP and HTTPS connections from anywhere (the normal ports for websites)
-A INPUT -p tcp --dport 80 -j ACCEPT
-A INPUT -p tcp --dport 443 -j ACCEPT

# Allows SSH connections
# THE -dport NUMBER IS THE SAME ONE YOU SET UP IN THE SSHD_CONFIG FILE
-A INPUT -p tcp -m state --state NEW --dport 12345 -j ACCEPT

# Now you should read up on iptables rules and consider whether ssh access
# for everyone is really desired. Most likely you will only allow access from certain IPs.

# Allow ping
-A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT

# log iptables denied calls (access via 'dmesg' command)
-A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " --log-level 7

# Reject all other inbound - default deny unless explicitly allowed policy:
-A INPUT -j REJECT
-A FORWARD -j REJECT

COMMIT

git

gitのインストール及び、githubの設定などを行う。

$ sudo apt-get install git
$ git config --global user.name ""
$ git config --global user.email ""
$ git config --global github.user ""

$ ssh-keygen -t dsa
$ cat .ssh/config
Host github.com
  User git
  Port 22
  Hostname github.com
  IdentityFile ~/.ssh/id_dsa.github
  TCPKeepAlive yes
  IdentitiesOnly yes
$ cat .ssh/id_dsa.github.pub
$ ssh -T git@github.com

~/.gitconfig に適当な設定を追記。どれも拾い物。githubの時間ってどうなってるのか調べたら多分これらしいということで、dateとか入れてみたりしている。

[alias]
    co = checkout
    ci = commit
    st = status
    br = branch
    df = diff
    out = log --pretty=oneline --abbrev-commit --graph @{u}..
    in = !git fetch && git log --pretty=oneline --abbrev-commit --graph ..@{u}
    date = !TZ=PST date
[color]
    ui = true

最初期の設定としてはだいたいこれぐらいだと思う。あとは開発環境とか色々入れていくけど、それはそのうちやる。