2015/04/11

Raspberry Piで円周率の計算をやってみた

ラズベリー・パイで円周率πの計算(100万桁)をしてみました。

(1)実行環境について


マシン:Raspberry Pi B+
O S:RASPBIAN(2015-02-16版)

(2)円周率計算プログラムについて


GMPの「Compute billions of digits of π using GMP!」にあるgmp-chudnovsky.cを使用させて頂きました。

(3)GMPライブラリと円周率計算プログラムのダウンロード、コンパイル


作業フォルダ"pi"を作成し、そこにGMPライブラリと円周率計算プログラムをダウンロード、コンパイルします。

$ mkdir pi
$ cd pi
$ wget https://ftp.gnu.org/gnu/gmp/gmp-6.0.0a.tar.xz
$ tar xvf gmp-6.0.0a.tar.xz
$ cd gmp-6.0.0/
$ ./configure
$ make -j4
$ make -j4 check
$ cd ..
$ wget https://gmplib.org/download/misc/gmp-chudnovsky.c
$ cc -Wall -static -o gmp-chudnovsky gmp-chudnovsky.c -Igmp-6.0.0 -Lgmp-6.0.0/.libs -lgmp -lm
raspbianデフォルトの状態では"m4"が入っていないためconfigureがエラー終了します。その場合は"sudo apt-get install m4"でm4をインストールします。その後、もう一度./configureを実行します。

GMPのコンパイルは小一時間かかります。(Raspberry Pi B+の場合)

(4)円周率計算プログラムの実行


・円周率1,000桁

円周率表示ありで0.03秒でした。

$ time -p ./gmp-chudnovsky 1000 1
#terms=70, depth=8
sieve   time =  0.000
...................................................

bs      time =  0.010
   gcd  time =  0.000
div     time =  0.000
sqrt    time =  0.000
mul     time =  0.000
total   time =  0.010
   P size=1334 digits (1.334000)
   Q size=1327 digits (1.327000)
pi(0,70)=
0.314159265358979323846264338327950288419716939937510582097494459230781640628620899862803482534211706798214808651328230664709384460955058223172535940812848111745028410270193852110555964462294895493038196442881097566593344612847564823378678316527120190914564856692346034861045432664821339360726024914127372458700660631558817488152092096282925409171536436789259036001133053054882046652138414695194151160943305727036575959195309218611738193261179310511854807446237996274956735188575272489122793818301194912983367336244065664308602139494639522473719070217986094370277053921717629317675238467481846766940513200056812714526356082778577134275778960917363717872146844090122495343014654958537105079227968925892354201995611212902196086403441815981362977477130996051870721134999999837297804995105973173281609631859502445945534690830264252230825334468503526193118817101000313783875288658753320838142061717766914730359825349042875546873115956286388235378759375195778185778053217122680661300192787661119590921642019894e1
real 0.03
user 0.01
sys 0.00
・円周率100万桁
円周率表示なしの計算のみで14.74秒でした。

$ time -p ./gmp-chudnovsky 1000000
#terms=70513, depth=18
sieve   time =  0.150
..................................................

bs      time = 10.910
   gcd  time =  0.000
div     time =  1.800
sqrt    time =  0.970
mul     time =  0.730
total   time = 14.580
   P size=1455608 digits (1.455608)
   Q size=1455601 digits (1.455601)
real 14.74
user 14.58
sys 0.09

2014/12/23

RaspberryPi B+の立ち上げ

先日RaspberryPi B+を立ち上げた時に、キーボードの設定でつまづいたので備忘録として記録しておきます。

参考資料


1.用意するもの


ここを参考に準備しました。
  • マイクロSDカード(推奨:8GB class 4 SD card) - 手持ち品が2GBだったので近所のコンビニで8GB品を購入
  • キーボード&マウス(USBタイプ) - 手持ち品を利用
  • ディスプレイ&HDMIケーブル - 手持ち品を利用
  • 電源(マイクロUSBタイプ) - 手持ち品を利用

2.OSイメージの準備


RaspberryPiはマイクロSDカードに格納されたOSイメージを読み込むことにより起動する仕組みのようです。従ってマイクロSDカードが必要です。
OSイメージは下記URLからダウンロードできます。 OSイメージは色々あるのですが、普段Debianを使用しているのでDebian/Wheezyベースの"RASPBIAN"にしました。
またSDカードへの書き込みもLinuxPC(Debian)ベースで行うことにしました。

以下、LinuxPC(Debian)での作業です。
$ wget http://downloads.raspberrypi.org/raspbian_latest
→ファイルサイズは934MByte。
$ mv raspbian_latest 2014-09-09-wheezy-raspbian.zip
→wgetがファイル名をraspbian_latestに変更してしまったので元に戻しました。

・SHA1の確認(951a9092dd160ea06195963d1afb47220588ed84)

$ sha1sum 2014-09-09-wheezy-raspbian.zip
951a9092dd160ea06195963d1afb47220588ed84  2014-09-09-wheezy-raspbian.zip
→合っている

・ファイルの解凍

$ unzip 2014-09-09-wheezy-raspbian.zip
Archive:  2014-09-09-wheezy-raspbian.zip
  inflating: 2014-09-09-wheezy-raspbian.img
2014-09-09-wheezy-raspbian.imgは約3.1GB。
マイクロSDカードをSDカードリーダに差し、SDカードリーダをLinuxPC(Debian)に接続。

・マイクロSDカードのデバイス名を確認。

$ dmesg |tail
[6822806.212809] sd 5:0:0:0: [sdb] Write Protect is off
[6822806.212818] sd 5:0:0:0: [sdb] Mode Sense: 03 00 00 00
[6822806.214045] sd 5:0:0:0: [sdb] No Caching mode page found
[6822806.214154] sd 5:0:0:0: [sdb] Assuming drive cache: write through
[6822806.218921] sd 5:0:0:0: [sdb] No Caching mode page found
[6822806.219032] sd 5:0:0:0: [sdb] Assuming drive cache: write through
[6822806.220504]  sdb: sdb1
[6822806.224348] sd 5:0:0:0: [sdb] No Caching mode page found
[6822806.224500] sd 5:0:0:0: [sdb] Assuming drive cache: write through
[6822806.224651] sd 5:0:0:0: [sdb] Attached SCSI removable disk
→SDカードリーダのデバイス名は/dev/sdb

・OSイメージをマイクロSDカードに書き込む(参考URL

$ sudo dd bs=4M if=2014-09-09-wheezy-raspbian.img of=/dev/sdb
[sudo] password for XXXX:
781+1 レコード入力
781+1 レコード出力
3276800000 バイト (3.3 GB) コピーされました、 758.91 秒、 4.3 MB/秒

これでマイクロSDカードの準備は完了です。

3.RaspberryPiB+起動


マイクロSDカードをRaspberryPiB+に挿入。HDMIコネクタにモニタ、USBポートにキーボードとマウスを接続し、マイクロUSBコネクタにACアダプタを接続して電源投入する。

起動メッセージが流れていくので少し待つ。
しばらくすると、Raspbianの基本的な設定を行う画面が表示されます。

私は、以下の設定をしました

  • ファイルシステム拡張 →実行
  • ユーザ"pi"のパスワード変更 →実行
  • Locale変更 →日本語(UTF-8)を追加
  • timezone変更 →Asia/Tokyo
  • キーボード変更 →106-Keyboardがない!迷った挙句デフォルト設定のままとした。
 →finish
 →再起動
 →ユーザ"pi"に新パスワードでログインする
 →"startx" (X環境に)
 →キーボードのキーアサインがおかしい
 →検索して下記URLを発見

 Raspberry Piクイックスタートアップガイド (日本語)の補足

なるほど、"Generic 105-key (Intl) PC → Other → Japanese"を選択すれば良いのか。。

$ sudo raspi-config
で、もう一度設定画面に入りキーボードの設定を実施。すぐには反映されないようで、RaspberreyPiを再起動したらキーボードのキーアサインが正常になった。

4.rootパスワードの変更


ユーザ"pi"でログイン後、以下のコマンドを実行し、新パスワードを入力するとrootのパスワードが変更されます。
$ sudo passwd

5.OSの最新化


RJ45コネクタにイーサケーブルを接続。(IPアドレスはDHCPで自動設定されるので、DHCPサーバの環境が必要)以下のコマンドを実行する。
$ sudo apt-get update
$ sudo apt-get upgrade

以上

2014/10/25

JJYシミュレータの試作(AVRマイコン)

 すこし前に購入した電波時計モジュール(40KHz) [MAS6180-40KHZ]を使って電波時計を作ってみることにしました。電波時計モジュールから出力されるパルス信号をAVRマイコンでデコードして7segLEDかLCDに表示するつもりです。
 ところが実際にデバッグを始めたところ困ったことが発生。電波時計モジュールから出力されるパルス信号がノイズだらけでデコードできないようなのです。電波時計モジュールとAVRマイコンを窓際に持っていくと正しいパルスが出てくるのですが、マイコンデバッグ用PCに接続するためにPCが設置されている場所まで持っていくと出力パルスが怪しくなります。原因として考えられるのは以下の2点です。

 1)電波が弱いため窓際でないと正しく受信できない。
 2)PCが出すノイズに邪魔される。

 PCの電源を落とすとだいぶ改善されるので2)の要因が大きいのだと思います。

 PCなしではマイコンのデバッグができないので、電波時計モジュールのパルス出力を疑似出力する「JJYシミュレータ」なるツールをAVRマイコンで試作することにしました。

構成


  • いつものAVRマイコン(ATmega168/328マイコンボードキット)を使用します。
  • ATmega168/328マイコンボードキットのPB5ピンにはLEDが実装されているので、このピンをパルス出力ピンにします。
  • パルス出力のフォーマットはNICTの長波JJY送信方法を参考にしました。
  • 時刻情報はタイマ1で生成した10Hzから生成します。
  • 時刻合わせ機能はありません(プログラム上で初期値を定義し、常に初期値からスタート)
  • タイマ0で40kHzを生成し、PD6(OC0A)ピンに出力します。このときパルス出力で送信OFF/ONを制御します。
  • パルス出力の状況はシリアル(RS232C)に出力します。
今回はパルス出力だけで良かったのですが、遊びで40kHz出力もつけてみました。

使ってみて


 まだ本来の目的(パルス出力を使って電波時計のデバッグ)は試していません。
 替わりに40kHz出力を試してみたところ見事に動きました。PD6ピンに15cmぐらいの線材を接続し市販電波時計に近づけてみたところ同期してくれました。10cmぐらい離しても同期します。
 本物のJJYの電波形式(A1B)とはちょっと違う40kHzの矩形波のON/OFFですがうまく動きました。
 頭では分かっているけど、実際に動いている所をみると電波は面白いというか不思議ですね。

シリアル出力例


<<< JJY Simulator >>>
 Copyright (c) 2014 Being. Ver0.1

00M 2016/02/29 23:14
M00100101M001000011M000000110M000000110M_________M000000000M 2016/02/29 23:15
M00100110M001000011M000000110M000000110M000010110M001000000M 2016/02/29 23:16
M00100111M001000011M000000110M000000100M000010110M001000000M 2016/02/29 23:17
M00101000M001000011M000000110M000000100M000010110M001000000M 2016/02/29 23:18
M00101001M001000011M000000110M000000110M000010110M001000000M 2016/02/29 23:19
M01000000M001000011M000000110M000000110M000010110M001000000M 2016/02/29 23:20

2014/10/07

黒部ダムに行ってきました(紅葉)

10/4(土)に黒部ダムに行ってきました。紅葉は色づき初めの段階で来週あたりから本番を迎えそうな感じでした。

黒部ダムの放水風景


放水を真上から見た図


紅葉


バーニングシップフラクタル

bsf.knit 今回は『バーニングシップフラクタル』についての備忘録です。 バーニングシップフラクタルとは? Wikipedia ...