数値計算をやってみた
はじめに
この記事は 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
最初期の設定としてはだいたいこれぐらいだと思う。あとは開発環境とか色々入れていくけど、それはそのうちやる。